簡體   English   中英

羅斯林-CodeFixProvider被解雇,但DiagnosticAnalyzer不用於類析構函數

[英]Roslyn - CodeFixProvider is being fired but DiagnosticAnalyzer not for class destructor

分析儀的偽代碼

我的測試課:

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方法內,並在其中停止/中斷代碼),並且可以看到紅色的波浪狀。

CodeFixProvider

有人知道為什么不啟動代碼修復程序嗎?

我猜您的分析儀由於條件錯誤而早日返回了描述者:

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

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

在條件塊中否定條件或報告條件:

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

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

事實證明,我的解決方案包含一個埋在文件夾之間某個地方的類,該類中帶有一些沒有析構函數檢查條件的舊代碼,這引起了麻煩。 此類不是TFS中源事件的一部分...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM