1

我正在开发 Resharper 插件,但我没有意识到在 Deamon Stages 和 Element Problem Analyzers 之间?

当我需要使用一个或另一个?如果他们都提供代码分析。

4

1 回答 1

7

AnElementProblemAnalyzer<T>只会被抽象语法树中的特定节点调用,而守护进程会处理整个文件。ElementProblemAnalyzerAttribute在构造函数中注册了你感兴趣的节点T,基类的参数是公共节点接口。如果您只对一种节点类型感兴趣,它是该节点的接口,如果您对几种感兴趣,它将是最常见的基本类型,也许是ITreeNodeICSharpTreeNode

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

如果您只需要检查特定节点而不查看文件的其余部分,则可以使用元素问题分析器。你仍然可以从你所在的节点导航(例如,给定一个方法调用,你可以有一个参数分析器,在其中你从参数节点导航到方法调用节点,并查看是否参数与默认值相同,这意味着它是冗余代码)。

如果您需要文件中的更多上下文,您将使用守护程序阶段,例如,类中所有方法的列表,或者对抽象语法树的遍历方式进行更多控制 - 您可以跳过方法声明的子节点如果您对其中的语句或表达式不感兴趣。

如果有帮助,元素问题分析器实际上是作为守护进程实现的。它们仅受 C#、VB、JS 和 XML 支持。每种语言都有一个守护程序阶段,它遍历 AST 进行错误检查,并且在这样做时,会调用Run对树的每个节点类型感兴趣的每个分析器。

于 2014-09-24T08:37:24.963 回答