【问题标题】:Roslyn Analyzer not clearing last diagnosticRoslyn Analyzer 未清除上次诊断
【发布时间】:2021-05-07 22:03:23
【问题描述】:

我创建了一个 Roslyn 分析器,它根据一组规则验证文本文件,并注意到当我修复最后一个问题时,诊断并没有消失。我创建了一个简单的示例来复制下面的问题。

[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class Analyzer1Analyzer : DiagnosticAnalyzer
{
    public const string DiagnosticId = "TestCompilationAnalyzer";

    private static readonly LocalizableString Title = "TestAnalyzer";
    private static readonly LocalizableString MessageFormat = "This message should always appear {0}";
    private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, "Test", DiagnosticSeverity.Warning, isEnabledByDefault: true);
    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }

    public override void Initialize(AnalysisContext context)
    {
        context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);
        context.EnableConcurrentExecution();
        context.RegisterAdditionalFileAction(AdditionalFileAction);
    }

    private void AdditionalFileAction(AdditionalFileAnalysisContext cxt)
    {
        var text = File.ReadAllText(cxt.AdditionalFile.Path);

        if (text.Contains("help"))
        {
            cxt.ReportDiagnostic(Diagnostic.Create(Rule, Location.None, $"help"));
        }

        if (text.Contains("test"))
        {
            cxt.ReportDiagnostic(Diagnostic.Create(Rule, Location.None, $"test"));
        }
    }
}

如果我将帮助和测试这两个词添加到我的附加文件中,则会出现两个诊断信息,但如果我删除这两个词,最后显示的内容不会消失。

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    我找到了使用代码生成器的解决方法

        [Generator]
        public class SchemaTestAnalyzer : ISourceGenerator
        {
    
            public const string DiagnosticId = "TestCompilationAnalyzer";
    
            private static readonly LocalizableString Title = "TestAnalyzer";
            private static readonly LocalizableString MessageFormat = "This message should always appear {0}";
            private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, "Test", DiagnosticSeverity.Warning, isEnabledByDefault: true);
    
            public void Execute(GeneratorExecutionContext context)
            {
                var additionalFile = context.AdditionalFiles.FirstOrDefault();
                if (additionalFile != null)
                {
                    var text = File.ReadAllText(additionalFile.Path);
                    if (text.Contains("help"))
                    {
                        context.ReportDiagnostic(Diagnostic.Create(Rule, Location.None, "help"));
                    }
    
                    if (text.Contains("test"))
                    {
                        context.ReportDiagnostic(Diagnostic.Create(Rule, Location.None, "test"));
                    }
                }
            }
    
            public void Initialize(GeneratorInitializationContext context) { }
        }
    

    这些工作按预期进行,最后一个问题在解决和重新分析后消失

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多