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