Roslyn - CodeFixProvider запускается, но DiagnosticAnalyzer не для деструктора класса - PullRequest
0 голосов
/ 10 декабря 2018

Псевдокод для моего анализатора

Мой тестовый класс:

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, то мой код никогда не останавливается / не прерывается, что имеет смысл для меня, потому что я выпрыгиваю из метода с возвратомключевое слово.Тем не менее, мое исправление кода запускается (я могу поместить точку останова в метод PerformFixAnync, и код останавливается / прерывается там), и я вижу красный волнистый характер.

CodeFixProvider

Кто-нибудь имеет представление о том, почему исправление кода запускается, хотя не должно?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Оказалось, что мое решение содержало другой класс, похороненный где-то между папками со старым кодом без условия проверки деструктора, и это вызывало проблемы.Этот класс не был частью события исходного кода в TFS ...

0 голосов
/ 21 января 2019

Я полагаю, ваш анализатор возвращается рано для дескрипторов, поскольку условие неверно:

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

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

отменить условие или сообщить о состоянии в блоке then:

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

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