【问题标题】:Roslyn SymbolFinder Convert Location to Syntax NodeRoslyn SymbolFinder 将位置转换为语法节点
【发布时间】:2021-06-07 11:51:18
【问题描述】:

我正在使用 SymbolFinder 来查找对变量的所有引用。我想检查这个字段是否被分配到其定义之外。

var references = await SymbolFinder.FindReferencesAsync(equivalentSymbol, 
                              context.GetSolution(), cancellationToken);
//Reference is grouped by variable name 
var reference = references.FirstOrDefault();

foreach (var location in reference.Locations)
{
   //How Do I check if the reference is an assignment?               
}

如何将位置转换为语法节点,然后检查该节点是否为赋值?

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    您可以使用FindNode(),它接受TextSpan

    所以你的例子看起来像:

    var node = location.SourceTree.GetRoot().FindNode(location.SourceSpan);
    

    【讨论】:

      【解决方案2】:

      我为此创建了一个扩展方法:

      public static SyntaxNode GetNodeFromLocation(this SyntaxTree tree, ReferenceLocation location)
      { 
          var lineSpan = location.Location.GetLineSpan();
          return tree.GetRoot().DescendantNodes().FirstOrDefault(n => n.GetLocation().GetLineSpan().IsEqual(lineSpan));
      }
      

      【讨论】:

      • 我想你也可以使用:location.SourceTree.GetRoot().FindNode(location.SourceSpan)
      • @JoshVarty 我一直在挖掘博客人,谢谢你是对的,它适用于参考位置的位置。如果您将其放入答案中,我会将您的答案标记为正确
      猜你喜欢
      • 2021-08-17
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多