我正在开发Resharper插件,我在Deamon阶段和元素问题分析器之间没有意识到?
当我需要使用一个或另一个?如果他们都提供代码分析。
答案 0 :(得分:7)
仅为抽象语法树中的特定节点调用ElementProblemAnalyzer<T>
,而守护进程阶段将处理整个文件。您感兴趣的节点在ElementProblemAnalyzerAttribute
构造函数中注册,基类的T
参数是公共节点接口。如果您只对一个节点类型感兴趣,那么它就是该节点的界面,如果您对多个节点感兴趣,它将是最常见的基本类型,可能是ITreeNode
或ICSharpTreeNode
。
[ElementProblemAnalyzer(typeof(ICSharpArgument),…)]
public class MyAnalyzer : ElementProblemAnalyzer<ICSharpArgument>
{
// ...
}
如果您只需要检查特定节点而不查看文件的其余部分,则可以使用元素问题分析器。你仍然可以从你所处的节点导航(例如,给定一个方法调用,你可以有一个参数分析器,你可以从参数节点导航到方法调用节点,然后看看如果参数与默认值相同,则表示它是冗余代码。
如果您需要文件中的更多上下文,您将使用守护程序阶段,例如,类中所有方法的列表,或者更多地控制抽象语法树的步骤 - 您可以跳过子节点如果您对。中的陈述或表达不感兴趣,请提供方法声明。
如果有帮助,元素问题分析器实际上是作为守护进程实现的。它们仅受C#,VB,JS和XML支持。每种语言都有一个守护进程阶段,用于遍历AST以进行错误检查,并且在执行此操作时,为每个对树的每个节点类型感兴趣的分析器调用Run
。