【问题标题】:Roslyn - CodeFixProvider is being fired but DiagnosticAnalyzer not for class destructorRoslyn - CodeFixProvider 正在被解雇,但 DiagnosticAnalyzer 不适用于类析构函数
【发布时间】:2019-01-25 00:41:14
【问题描述】:

我的分析器的伪代码

我的测试课:

public class TestClass
{
     ~TestClass()
     {
     }
}

我的带有分析方法的诊断分析器类:

public class TestClassAnalyzer : DiagnosticAnalyzer
{
     public const string AnalyzerId = "TestId";

     ...

     private static void AnalyzeSymbol(SymbolAnalysisContext context)
     {
           var methodDeclaration = (IMethodSymbol)context.Symbol;

           if (methodDeclaration.MethodKind == MethodKind.Destructor)
           {
               return;
           }

           context.ReportDiagnostic(Diagnostic.Create(...));
     }
}

我的带有修复方法的代码修复提供程序:

public class TestClassCodeFixProvider : CodeFixProvider
{
     public sealed override ImmutableArray<string> FixableDiagnosticIds =>
          ImmutableArray.Create(TestClassAnalyzer.AnalyzerId);


     ...

     private async Task<Solution> PerformFixAsync(Document document, ...)
     {
          ...

          return await Renamer.RenameSymbolAsync(...)
     }
}

如果我在 TestClassAnalyzer 类中检查析构函数的行之后放置一个断点,那么我的代码永远不会停止/中断,这对我来说很有意义,因为我使用 return 关键字跳出了方法。 尽管如此,我的代码修复正在被触发(我可以在 PerformFixAnync 方法中放置断点,代码在那里停止/中断)并且我可以看到红色的波浪线。

有人知道为什么代码修复会被触发,尽管它不应该被触发吗?

【问题讨论】:

    标签: c# .net roslyn roslyn-code-analysis


    【解决方案1】:

    我猜你的分析器会因为条件错误而提前返回析构函数:

    if (methodDeclaration.MethodKind == MethodKind.Destructor)
    {
        return;
    }
    
    context.ReportDiagnostic(Diagnostic.Create(...));
    

    在 then-block 中否定条件或报告条件:

    if (methodDeclaration.MethodKind != MethodKind.Destructor)
    {
        return;
    }
    
    context.ReportDiagnostic(Diagnostic.Create(...));
    

    【讨论】:

      【解决方案2】:

      事实证明,我的解决方案包含另一个隐藏在文件夹之间某处的类,其中包含一些没有析构函数检查条件的旧代码,这导致了麻烦。此类不是 TFS 源代码中的事件部分 ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-24
        • 2015-09-22
        • 2012-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-06
        相关资源
        最近更新 更多