From e7e33e1daf131f9249eff7963928206a8c0a88cd Mon Sep 17 00:00:00 2001 From: therzok Date: Sun, 7 May 2017 18:38:52 +0300 Subject: [C#] Don't inspect MonoTODO unless MonoTODO exists. --- .../MonoTODO/MonoTODODiagnosticAnalyzer.cs | 34 +++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) (limited to 'main') diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Diagnostics/MonoTODO/MonoTODODiagnosticAnalyzer.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Diagnostics/MonoTODO/MonoTODODiagnosticAnalyzer.cs index a4da73f782..0c3c81a7e9 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Diagnostics/MonoTODO/MonoTODODiagnosticAnalyzer.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Diagnostics/MonoTODO/MonoTODODiagnosticAnalyzer.cs @@ -26,6 +26,7 @@ using System.Collections.Generic; using System.Collections.Immutable; +using System.Linq; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; @@ -58,15 +59,34 @@ namespace MonoDevelop.CSharp.Diagnostics.MonoTODODiagnostic } } + static IEnumerable GetSearchAssemblies(Compilation compilation) + { + yield return compilation.Assembly; + foreach (var reference in compilation.References) { + var symbol = compilation.GetAssemblyOrModuleSymbol (reference); + if (symbol is IAssemblySymbol assemblySymbol) + yield return assemblySymbol; + } + } + + const string MonoTODOAttributeName = "System.MonoTODOAttribute"; public override void Initialize(AnalysisContext context) { - context.RegisterSyntaxNodeAction( - (nodeContext) => { - Diagnostic diagnostic; - if (TryFindMonoTODO(nodeContext.SemanticModel, nodeContext.Node, out diagnostic, nodeContext.CancellationToken)) - nodeContext.ReportDiagnostic (diagnostic); - }, - syntaxKindsOfInterest); + context.RegisterCompilationStartAction (compilationContext => { + var compilation = compilationContext.Compilation; + var monoTodoAttributeExists = GetSearchAssemblies (compilation) + .Any (assemblySymbol => assemblySymbol.GetTypeByMetadataName (MonoTODOAttributeName) != null); + if (!monoTodoAttributeExists) + return; + + compilationContext.RegisterSyntaxNodeAction( + (nodeContext) => { + Diagnostic diagnostic; + if (TryFindMonoTODO(nodeContext.SemanticModel, nodeContext.Node, out diagnostic, nodeContext.CancellationToken)) + nodeContext.ReportDiagnostic (diagnostic); + }, + syntaxKindsOfInterest); + }); } static readonly Dictionary attributes = new Dictionary { -- cgit v1.2.3