Ejemplo n.º 1
0
        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);
        }