2012-12-14 7 views
14

Ich möchte den SyntaxNode einer Zeile mit der Position (lineNumber) erhalten. Der folgende Code sollte selbsterklärend sein, aber lassen Sie mich wissen, wenn Sie Fragen haben.Get der SyntaxNode gegeben die linenumber in einem SyntaxTree

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?? 
     } 
+0

Was ist, wenn es keinen Knoten in dieser Zeile gibt? Was ist, wenn es mehr als eins gibt? – svick

+0

@svick Ich nehme idealen Fall an. –

Antwort

10

Zuerst TextSpan basierend auf einer Zeilennummer zu erhalten, können Sie den Indexer von Lines der von GetText() zurück SourceText verwenden können (aber vorsichtig, es zählt Linien von 0) gewonnen.

Um alle Knoten zu erhalten, die diesen Bereich schneiden, können Sie eine Überladung von DescendantNodes() verwenden.

Schließlich filtern Sie diese Liste, um den ersten Knoten zu erhalten, der vollständig in dieser Zeile enthalten ist.

In Code:

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)); 
} 

Wenn kein Knoten auf dieser Linie ist, wird dies eine Ausnahme werfen. Wenn es mehr als eins gibt, wird es das erste zurückgeben.

+0

Welche DLL enthält die GetLineFromLineNumber? –

+1

@ johnny5 Diese Antwort ist uralt, in der aktuellen Version von Roslyn gibt es kein 'GetLineFromLineNumber'. Ich habe die Antwort auf den Code aktualisiert, der jetzt für mich funktioniert. – svick

Verwandte Themen