2012-12-14 8 views
14

में लिनेनंबर दिया गया है, मैं स्थान (lineNumber) को दी गई रेखा के सिंटेक्स नोड प्राप्त करना चाहता हूं। नीचे दिया गया कोड आत्म-स्पष्टीकरण होना चाहिए, लेकिन मुझे किसी भी प्रश्न के बारे में बताएं।सिंटैक्स नोड को सिंटेक्सट्री

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

क्या होगा यदि उस रेखा पर कोई नोड न हो? यदि एक से अधिक है तो क्या होगा? – svick

+0

@svick मैं आदर्श मामला मान रहा हूं। –

उत्तर

10

पहले, प्राप्त करने के लिए TextSpan एक लाइन संख्या के आधार पर, आप SourceTextGetText() द्वारा वापस की Lines की इंडेक्सर उपयोग कर सकते हैं (लेकिन सावधान, यह 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)); 
} 

अगर वहाँ है कि लाइन पर कोई नोड है, यह एक अपवाद फेंक देते हैं। यदि एक से अधिक है, तो यह पहला लौटाएगा।

+0

GetLineFromLineNumber क्या डीएलएल है? –

+1

@ जॉनी 5 यह उत्तर प्राचीन है, Roslyn के वर्तमान संस्करण में 'GetLineFromLineNumber' नहीं है। मैंने कोड के उत्तर को अद्यतन किया है जो अब मेरे लिए काम करता है। – svick

संबंधित मुद्दे