Roslyn SymbolFinder 将位置转换为语法节点
Roslyn SymbolFinder Convert Location to Syntax Node
我正在使用 SymbolFinder 查找对变量的所有引用。我想检查一下这个 Field 是否被分配到它的定义之外。
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?
}
如何将位置转换为语法节点,然后检查该节点是否为赋值?
我为此创建了一个扩展方法:
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));
}
您可以使用FindNode()
which accepts a TextSpan
所以你的例子看起来像:
var node = location.SourceTree.GetRoot().FindNode(location.SourceSpan);
我正在使用 SymbolFinder 查找对变量的所有引用。我想检查一下这个 Field 是否被分配到它的定义之外。
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?
}
如何将位置转换为语法节点,然后检查该节点是否为赋值?
我为此创建了一个扩展方法:
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));
}
您可以使用FindNode()
which accepts a TextSpan
所以你的例子看起来像:
var node = location.SourceTree.GetRoot().FindNode(location.SourceSpan);