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 (SupportsCallInfo(syntaxNodeContext, invocationExpression, methodSymbol) == false) { return; } var substituteCallParameters = GetSubstituteCallArgumentOperations(syntaxNodeContext, methodSymbol, invocationExpression); if (substituteCallParameters == null) { return; } foreach (var argumentExpressionSyntax in GetArgumentExpressions(invocationExpression)) { var callInfoContext = _callInfoFinder.GetCallInfoContext(syntaxNodeContext.SemanticModel, argumentExpressionSyntax); AnalyzeArgAtInvocations(syntaxNodeContext, callInfoContext, substituteCallParameters); AnalyzeArgInvocations(syntaxNodeContext, callInfoContext, substituteCallParameters); AnalyzeIndexerInvocations(syntaxNodeContext, callInfoContext, substituteCallParameters); } }
private IEnumerable <TIndexerExpressionSyntax> FindCallInfoIndexers(SyntaxNodeAnalysisContext syntaxNodeContext, TInvocationExpressionSyntax invocationExpressionSyntax) { // perf - dont use linq in hotpaths foreach (var argumentExpression in GetArgumentExpressions(invocationExpressionSyntax)) { foreach (var indexerExpressionSyntax in _callInfoFinder.GetCallInfoContext(syntaxNodeContext.SemanticModel, argumentExpression).IndexerAccesses) { if (IsAssigned(syntaxNodeContext, indexerExpressionSyntax)) { yield return(indexerExpressionSyntax); } } } }
private IEnumerable <TIndexerExpressionSyntax> FindCallInfoIndexers(SyntaxNodeAnalysisContext syntaxNodeContext, TInvocationExpressionSyntax invocationExpressionSyntax) { return(GetArgumentExpressions(invocationExpressionSyntax).SelectMany(argument => _callInfoFinder.GetCallInfoContext(syntaxNodeContext.SemanticModel, argument).IndexerAccesses) .Where(indexerExpression => IsAssigned(syntaxNodeContext, indexerExpression))); }