16

場所(lineNumber)を指定して行のSyntaxNodeを取得したい。以下のコードは一目瞭然ですが、ご不明な点がありましたらお知らせください。

static void Main()
        {
            string codeSnippet = @"using System;
                                        class Program
                                        {
                                            static void Main(string[] args)
                                            {
                                                Console.WriteLine(""Hello, World!"");
                                            }
                                        }";

            SyntaxTree tree = SyntaxTree.ParseCompilationUnit(codeSnippet);
            string[] lines = codeSnippet.Split('\n');
            SyntaxNode node = GetNode(tree, 6); //How??
        }

        static SyntaxNode GetNode(SyntaxTree tree,int lineNumber)
        {
            throw new NotImplementedException();
            // *** What I did ***
            //Calculted length from using System... to Main(string[] args) and named it (totalSpan)
            //Calculated length of the line(lineNumber) Console.Writeline("Helllo...."); and named it (lineSpan)
            //Created a textspan : TextSpan span = new TextSpan(totalSpan, lineSpan);
            //Was able to get back the text of the line : tree.GetLocation(span);
            //But how to get the SyntaxNode corresponding to that line??
        }
4

1 に答える 1

12

まず、TextSpan行番号に基づいて取得するにLinesは、SourceText返された のインデクサーを使用できますGetText()(ただし、0 から行をカウントすることに注意してください)。

次に、そのスパンと交差するすべてのノードを取得するには、 のオーバーロードを使用できますDescendantNodes()

最後に、そのリストをフィルタリングして、その行に完全に含まれる最初のノードを取得します。

コード内:

static SyntaxNode GetNode(SyntaxTree tree, int lineNumber)
{
    var lineSpan = tree.GetText().Lines[lineNumber - 1].Span;
    return tree.GetRoot().DescendantNodes(lineSpan)
        .First(n => lineSpan.Contains(n.Span));
}

その行にノードがない場合、例外がスローされます。複数ある場合は、最初のものを返します。

于 2012-12-15T00:14:19.863 に答える