private static void HandleIdentifierNameImpl(SyntaxNodeAnalysisContext context, IdentifierNameSyntax nameExpression) { if (nameExpression == null) { return; } if (!HasThis(nameExpression)) { return; } SymbolInfo symbolInfo = context.SemanticModel.GetSymbolInfo(nameExpression, context.CancellationToken); ImmutableArray<ISymbol> symbolsToAnalyze; if (symbolInfo.Symbol != null) { symbolsToAnalyze = ImmutableArray.Create(symbolInfo.Symbol); } else if (symbolInfo.CandidateReason == CandidateReason.MemberGroup) { // analyze the complete set of candidates, and use 'this.' if it applies to all symbolsToAnalyze = symbolInfo.CandidateSymbols; } else { return; } foreach (ISymbol symbol in symbolsToAnalyze) { if (symbol is ITypeSymbol) { return; } if (symbol.IsStatic) { return; } if (!(symbol.ContainingSymbol is ITypeSymbol)) { // covers local variables, parameters, etc. return; } IMethodSymbol methodSymbol = symbol as IMethodSymbol; if (methodSymbol != null && methodSymbol.MethodKind == MethodKind.Constructor) { return; } } // Prefix local calls with this context.ReportDiagnostic(Diagnostic.Create(Descriptor, nameExpression.GetLocation())); }