private void AnalyzeInvocation(SyntaxNodeAnalysisContext syntaxNodeContext)
        {
            var invocationExpression = (TInvocationExpressionSyntax)syntaxNodeContext.Node;
            var methodSymbolInfo     = syntaxNodeContext.SemanticModel.GetSymbolInfo(invocationExpression);

            if (methodSymbolInfo.Symbol?.Kind != SymbolKind.Method)
            {
                return;
            }

            var methodSymbol = (IMethodSymbol)methodSymbolInfo.Symbol;

            if (IsReturnsLikeMethod(syntaxNodeContext, invocationExpression, methodSymbol.Name) == false)
            {
                return;
            }

            var allArguments         = ExtractArguments(invocationExpression);
            var argumentsForAnalysis = methodSymbol.MethodKind == MethodKind.ReducedExtension ? allArguments : allArguments.Skip(1);

            foreach (var argument in argumentsForAnalysis)
            {
                var reentrantSymbol = _reEntrantCallFinder.GetReEntrantCalls(syntaxNodeContext.Compilation, invocationExpression, argument).FirstOrDefault();
                if (reentrantSymbol != null)
                {
                    var diagnostic = Diagnostic.Create(
                        DiagnosticDescriptorsProvider.ReEntrantSubstituteCall,
                        argument.GetLocation(),
                        methodSymbol.Name,
                        reentrantSymbol.Name,
                        argument.ToString());

                    syntaxNodeContext.ReportDiagnostic(diagnostic);
                }
            }
        }
Пример #2
0
        private void AnalyzeExpression(
            SyntaxNodeAnalysisContext syntaxNodeContext,
            SyntaxNode argumentExpression,
            TInvocationExpressionSyntax invocationExpression,
            IMethodSymbol methodSymbol)
        {
            var reentrantSymbol = _reEntrantCallFinder.GetReEntrantCalls(
                syntaxNodeContext.Compilation,
                syntaxNodeContext.SemanticModel,
                invocationExpression,
                argumentExpression).FirstOrDefault();

            if (reentrantSymbol != null)
            {
                var diagnostic = Diagnostic.Create(
                    DiagnosticDescriptorsProvider.ReEntrantSubstituteCall,
                    argumentExpression.GetLocation(),
                    methodSymbol.Name,
                    reentrantSymbol.Name,
                    argumentExpression.ToString());

                syntaxNodeContext.ReportDiagnostic(diagnostic);
            }
        }