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); } } }
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); } }