C# Roslyn-如何在DiagnosticanAnalyzer类中获取变量的所有引用?

C# Roslyn-如何在DiagnosticanAnalyzer类中获取变量的所有引用?,c#,refactoring,roslyn,C#,Refactoring,Roslyn,我目前正试图与Roslyn一起定义代码修复。我有一个SyntaxNode变量 我想在我的DiagnosticAnalyzer类中查找该变量的所有引用。不幸的是,SymbolFinder.FindReferencesAsync方法需要一个Solution参数,如果我知道得很清楚,我无法从DiagnosticanAnalyzer类中获取当前解决方案 如何在DiagnosticanAnalyzer类中获取变量的所有引用?我实现了一个类似的分析器,算法如下(它在2000多行文档上运行约31ms,但几乎总

我目前正试图与Roslyn一起定义代码修复。我有一个
SyntaxNode
变量

我想在我的
DiagnosticAnalyzer
类中查找该变量的所有引用。不幸的是,
SymbolFinder.FindReferencesAsync
方法需要一个
Solution
参数,如果我知道得很清楚,我无法从
DiagnosticanAnalyzer
类中获取当前解决方案


如何在
DiagnosticanAnalyzer
类中获取变量的所有引用?

我实现了一个类似的分析器,算法如下(它在2000多行文档上运行约31ms,但几乎总是在10ms以下)

  • 迭代
    SemanticModel.GetRoot()中的所有节点,并收集表达式和本地声明
  • 获取相应标识符的符号
  • 检查它是否实现了
    IDisposable
    ,如果实现了,则存储在
    HashSet1
  • 在调用的方法是Dispose的地方迭代调用
  • 从调用中获取符号,存储在
    HashSet2
  • HashSet1
    中但不在
    HashSet2
    中的符号的第一个
    SyntaxReference
    上报告诊断

  • 这很有效,但遗憾的是,我不知道是否有更有效/更清洁的方法。如果您愿意,我可以共享部分代码。

    当您说“variable”时,您是指使用
    LocalDeclarationStatementSyntax
    声明的局部变量吗?如果是,则其范围仅限于声明它的成员。搜索所有用法应该很容易。也就是说,你需要它们做什么?您确定不能使用
    context.SemanticModel.AnalyzeDataFlow(localDeclaration)
    ?我说的“variable”是指IdentifierNameSyntax。我试图为遗忘的处置创建一个代码修复程序。但是在下面的场景中,我需要dispose检查的引用:myIDisposable=new myIDisposable();var tmp=MyIDisable;tmp.Dispose()<代码>IdentifierNameSyntax
    只是一个名称。我的问题是这个名字指的是什么。只有局部变量?考虑到您的用例,我假设您只需要查看局部变量,而不是字段或参数。这意味着您可以搜索封闭的成员。Sonarint在一次性物品上有两个分析器。总的来说,这个话题很难。如何处理从方法返回的一次性局部变量。你如何处理字段?您如何处理传递给其他一次性设备的一次性设备。。。