В чем разница между DaemonStage и ElementProblemAnalyzer?

Я разрабатываю плагин Resharper, и я не понимаю, между Deamon Stages и Element Problem Analyzers?

Когда мне нужно использовать тот или иной? Если они оба обеспечивают анализ кода.

1 ответ

Решение

ElementProblemAnalyzer<T> будет вызываться только для определенных узлов в абстрактном синтаксическом дереве, в то время как этап демона обрабатывает весь файл. Интересующие вас узлы зарегистрированы в ElementProblemAnalyzerAttribute конструктор, а T Параметром базового класса является интерфейс общего узла. Если вас интересует только один тип узла, это интерфейс для этого узла, если вас интересует несколько, это будет наиболее распространенный базовый тип, возможно, ITreeNode или же ICSharpTreeNode,

[ElementProblemAnalyzer(typeof(ICSharpArgument),…)]
public class MyAnalyzer : ElementProblemAnalyzer<ICSharpArgument>
{
  // ...
}

Вы бы использовали анализатор проблем элементов, если вам нужно только проверить определенный узел, не просматривая остальную часть файла. Вы по-прежнему можете перемещаться от узла, в котором находитесь (например, при вызове метода у вас может быть анализатор для аргумента, в котором вы перемещаетесь от узла аргумента до узла вызова метода и смотрите, Аргумент совпадает со значением по умолчанию, что означает избыточный код).

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

Если это помогает, анализаторы проблем элементов фактически реализуются как этапы демона. Они поддерживаются только C#, VB, JS и XML. У каждого языка есть стадия демона, которая обходит AST для проверки ошибок и при этом вызывает Run для каждого анализатора, который заинтересован в каждом типе узла дерева.

Другие вопросы по тегам