public void Track(TrackerInput input, params Condition[] conditions) { input.Context.RegisterCompilationStartAction(c => { if (input.IsEnabled(c.Options)) { c.RegisterSymbolAction(TrackMethodDeclaration, SymbolKind.Method); } }); void TrackMethodDeclaration(SymbolAnalysisContext c) { if (IsTrackedMethod((IMethodSymbol)c.Symbol, c.Compilation)) { foreach (var declaration in c.Symbol.DeclaringSyntaxReferences) { var methodIdentifier = GetMethodIdentifier(declaration.GetSyntax()); if (methodIdentifier.HasValue) { c.ReportDiagnosticWhenActive(Diagnostic.Create(input.Rule, methodIdentifier.Value.GetLocation())); } } } } bool IsTrackedMethod(IMethodSymbol methodSymbol, Compilation compilation) { var conditionContext = new MethodDeclarationContext(methodSymbol, compilation); return(conditions.All(c => c(conditionContext))); } }