在Roslyn中如何通过行号获取节点

9

如何根据行号获取SyntaxNode?如果可以获取该行号的LineSpan,则获取节点。

2个回答

10
您可以从文档文本中获取一行的跨度。然后,您可以找到与该行跨度相交的所有节点。这将返回多个语法节点,然后您可以使用自己的标准来提取您要查找的节点。
    static void Main(string[] args)
    {
        var code = @"
using System;

namespace ConsoleApplication1
{
    class TypeName
    {   
         public int Add(int x, int y) 
         {
             return x+y;
         }
     }
}";
        var st = SourceText.From(code);
        var sf = SyntaxFactory.ParseSyntaxTree(st);

        var span = sf.GetText().Lines[9].Span;
        var nodes = sf.GetRoot().DescendantNodes().Where(x => x.Span.IntersectsWith(span));

        Console.WriteLine(nodes.Last().ToString());
        Console.ReadKey();
    }

6
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Text;

var s =  @"class M
{
    public void P() { }
}";
var text = SourceText.From(s);
var lineIndex = 2;
var lineSpan = text.Lines[lineIndex].Span;
var tree = SyntaxFactory.ParseSyntaxTree(text);
var node = tree.GetRoot().FindNode(lineSpan);
// or if you want a all nodes related to the span
var node = tree.GetRoot().DescendantNodesAndSelf(lineSpan);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接