예제 #1
0
        internal ProgramState ProcessInvocation()
        {
            var symbol = semanticModel.GetSymbolInfo(invocation).Symbol;

            var methodSymbol        = symbol as IMethodSymbol;
            var invocationArgsCount = invocation.ArgumentList?.Arguments.Count ?? 0;

            if (IsInstanceEqualsCall(methodSymbol))
            {
                return(HandleInstanceEqualsCall());
            }

            if (IsStaticEqualsCall(methodSymbol))
            {
                return(HandleStaticEqualsCall());
            }

            if (IsReferenceEqualsCall(methodSymbol))
            {
                return(HandleReferenceEqualsCall());
            }

            if (IsStringNullCheckMethod(methodSymbol))
            {
                return(HandleStringNullCheckMethod());
            }

            if (methodSymbol != null &&
                ValidatesNotNull(methodSymbol, out var validatedArgumentIndex))
            {
                return(HandleNullValidationMethod(validatedArgumentIndex, invocationArgsCount));
            }

            if (invocation.IsNameof(semanticModel))
            {
                return(HandleNameofExpression());
            }

            return(programState
                   .PopValues(invocationArgsCount + 1)
                   .PushValue(new SymbolicValue()));
        }
        private static ProgramState VisitInitializer(SyntaxNode instruction, ExpressionSyntax parenthesizedExpression, ProgramState programState)
        {
            var init            = (InitializerExpressionSyntax)instruction;
            var newProgramState = programState.PopValues(init.Expressions.Count);

            if (!(parenthesizedExpression.Parent is ObjectCreationExpressionSyntax) &&
                !(parenthesizedExpression.Parent is ArrayCreationExpressionSyntax) &&
                !(parenthesizedExpression.Parent is AnonymousObjectCreationExpressionSyntax) &&
                !(parenthesizedExpression.Parent is ImplicitArrayCreationExpressionSyntax))
            {
                newProgramState = newProgramState.PushValue(new SymbolicValue());
            }

            return(newProgramState);
        }