Resharper 守护进程和ElementProblemAnalyzer之间有什么区别?

Resharper 守护进程和ElementProblemAnalyzer之间有什么区别?,resharper,resharper-sdk,Resharper,Resharper Sdk,我正在开发Resharper插件,但我没有意识到Deamon阶段和元素问题分析器之间的关系 什么时候我需要使用一个或另一个?如果它们都提供代码分析。将仅为抽象语法树中的特定节点调用ElementProblemAnalyzer,而守护进程阶段将处理整个文件。您感兴趣的节点注册在ElementProblemAnalyzerAttribute构造函数中,基类的T参数是公共节点接口。如果您只对一种节点类型感兴趣,它就是该节点的接口;如果您对几种节点类型感兴趣,它将是最常见的基本类型,可能是ITreeNo

我正在开发Resharper插件,但我没有意识到Deamon阶段和元素问题分析器之间的关系


什么时候我需要使用一个或另一个?如果它们都提供代码分析。

将仅为抽象语法树中的特定节点调用
ElementProblemAnalyzer
,而守护进程阶段将处理整个文件。您感兴趣的节点注册在
ElementProblemAnalyzerAttribute
构造函数中,基类的
T
参数是公共节点接口。如果您只对一种节点类型感兴趣,它就是该节点的接口;如果您对几种节点类型感兴趣,它将是最常见的基本类型,可能是
ITreeNode
ICSharpTreeNode

[ElementProblemAnalyzer(类型化(ICSharpArgument),…)]
公共类MyAnalyzer:ElementProblemAnalyzer
{
// ...
}
如果只需要检查特定节点,而不查看文件的其余部分,则可以使用元素问题分析器。您仍然可以从所处的节点导航(例如,给定一个方法调用,您可以使用参数分析器,从参数节点导航到方法调用节点,并查看参数是否与默认值相同,这意味着它是冗余代码)

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


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

只为抽象语法树中的特定节点调用
ElementProblemAnalyzer
,而守护进程阶段则处理整个文件。您感兴趣的节点注册在
ElementProblemAnalyzerAttribute
构造函数中,基类的
T
参数是公共节点接口。如果您只对一种节点类型感兴趣,它就是该节点的接口;如果您对几种节点类型感兴趣,它将是最常见的基本类型,可能是
ITreeNode
ICSharpTreeNode

[ElementProblemAnalyzer(类型化(ICSharpArgument),…)]
公共类MyAnalyzer:ElementProblemAnalyzer
{
// ...
}
如果只需要检查特定节点,而不查看文件的其余部分,则可以使用元素问题分析器。您仍然可以从所处的节点导航(例如,给定一个方法调用,您可以使用参数分析器,从参数节点导航到方法调用节点,并查看参数是否与默认值相同,这意味着它是冗余代码)

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

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