Getting node from line number in Roslyn

前端 未结 2 555
忘掉有多难
忘掉有多难 2021-02-15 15:43

How can I get a SyntaxNode based on a line number? Else if its possible to get LineSpan of that line number then to node.

相关标签:
2条回答
  • 2021-02-15 16:20
    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);
    
    0 讨论(0)
  • 2021-02-15 16:30

    You can get the span of a line from the document text. From there, you can find all nodes that intersect with the span of the line. This will return multiple syntax nodes, which you can then use your criteria to pull out the one you are looking for:

        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();
        }
    
    0 讨论(0)
提交回复
热议问题