public static List <ExpressionSyntax> GetValuesPossiblyInjectedInto(SemanticModel semanticModel, ILocalSymbol variable, SyntaxNode containingBlockNode, KnownSymbols knownSymbols, RecursiveState recursiveState) { var usages = containingBlockNode .DescendantNodes() .OfType <IdentifierNameSyntax>() .Where(x => x.Identifier.Text == variable.Name) .Where(x => semanticModel.GetSymbolInfo(x).Symbol?.Equals(variable) ?? false) .Select(x => x.Parent) .ToList(); List <ExpressionSyntax> result = new List <ExpressionSyntax>(); void HandleMemberAccess(MemberAccessExpressionSyntax usage) { if (usage.Parent is AssignmentExpressionSyntax assignment) { result.Add(assignment.Right); } else if (usage.Parent is InvocationExpressionSyntax invocation) { if (semanticModel.GetSymbolInfo(invocation.Expression).Symbol is IMethodSymbol invokedMethod) { var purityType = ImpuritiesFinder.GetMethodPurityType(semanticModel, knownSymbols, invokedMethod, recursiveState); if (purityType.HasValueAnd(x => x.Equals(PurityType.PureExceptLocally))) { result.AddRange(invocation.ArgumentList.Arguments.Select(x => x.Expression)); } } } else if (usage.Parent is MemberAccessExpressionSyntax memberAccess) { HandleMemberAccess(memberAccess); } } foreach (var usage in usages) { if (usage is MemberAccessExpressionSyntax memberAccess) { HandleMemberAccess(memberAccess); } else if (usage is ElementAccessExpressionSyntax elementAccess) { if (elementAccess.Parent is AssignmentExpressionSyntax assignment) { result.Add(assignment.Right); } } } return(result); }
public static IEnumerable <Impurity> GetImpurities( SyntaxNode methodDeclaration, SemanticModel semanticModel, KnownSymbols knownSymbols, RecursiveState recursiveState, PurityType purityType = PurityType.Pure, Maybe <PureLambdaConfig> pureLambdaConfig = default) { var impuritiesFinder = new ImpuritiesFinder(semanticModel, purityType, knownSymbols); return(impuritiesFinder.GetImpurities(methodDeclaration, recursiveState, pureLambdaConfig)); }
ChangeAcceptedPurityTypeBasedOnWhetherExpressionRepresentsANewObjectOrParameterBasedExpression( PurityType currentAcceptedPurityType, ExpressionSyntax node, KnownSymbols knownSymbols, SemanticModel semanticModel, RecursiveState recursiveState) { if (Utils.IsNewlyCreatedObject(semanticModel, node, knownSymbols, RecursiveIsNewlyCreatedObjectState.Empty(), recursiveState)) { return(PurityType.PureExceptLocally); } else if (ImpuritiesFinder.IsParameter(semanticModel, node)) { return(PurityType.PureExceptReadLocally); } return(currentAcceptedPurityType); }