2014-10-20 12 views
5

रोज़लिन का उपयोग स्रोत कोड को कैसे संशोधित करता है? मैं SyntaxNode नहीं बना सकता और SyntaxTree में सम्मिलित कर सकता हूं। या विकल्पों का उपयोग करें (Antrl, NRefactory या कुछ और)?Roslyn का उपयोग कर स्रोत कोड को कैसे संशोधित करें?

उत्तर

3

आप एस SyntaxFactory का उपयोग कर बना सकते हैं।

और आप मौजूदा सिंटैक्स पेड़ को संशोधित नहीं कर सकते (क्योंकि यह अपरिवर्तनीय है), लेकिन आप अपना नोड युक्त एक नया बना सकते हैं। With- और Add- विधियों, ReplaceNode और CSharpSyntaxVisitor पर देखें। यह कहना मुश्किल है कि इनमें से कौन सा आपकी आवश्यकताओं को सबसे ज्यादा फिट करता है।

+0

उत्तर के लिए धन्यवाद। मुझे नोडऑरोकॉर्नलिस्ट मिला। NodeOrTokenList को SyntaxNode कैसे डाला? – user3382135

+1

@ user3382135 आप नहीं करते हैं और मुझे समझ में नहीं आता कि आप ऐसा क्यों करना चाहते हैं। मुझे लगता है कि आपको एक नया प्रश्न पूछना चाहिए, यह बताते हुए कि आप क्या करना चाहते हैं और आपको ऐसा क्यों लगता है कि आपको इसके लिए नोडऑरोकॉर्नलिस्ट की आवश्यकता है। – svick

2

कैसे svick ने आपको उत्तर दिया - आप मौजूदा वाक्यविन्यास पेड़ को संशोधित नहीं कर सकते हैं। Sytnax पेड़ अपरिवर्तनीय है लेकिन आप मौजूदा के आधार पर एक और बना सकते हैं। इस उद्देश्य के लिए आपको नोड बनाना और मौजूदा एक को बदलना है। नीचे आप कर सकते हैं सरल उदाहरण (का उपयोग कर बदल):

रोसलिन एपीआई की एक मौलिक सिद्धांत अचल स्थिति है:

var name = Syntax.QualifiedName(Syntax.IdentifierName("System"), Syntax.IdentifierName("Collections")); 
name = Syntax.QualifiedName(name, Syntax.IdentifierName("Generic")); 


SyntaxTree tree = SyntaxTree.ParseText(
@"using System; 
using System.Collections; 
using System.Linq; 
using System.Text; 

namespace HelloWorld 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(""Hello, World!""); 
     } 
    } 
}"); 

var root = (CompilationUnitSyntax)tree.GetRoot(); 

var oldUsing = root.Usings[1]; 
var newUsing = oldUsing.WithName(name); 

root = root.ReplaceNode(oldUsing, newUsing); 

Console.WriteLine(root.GetText()); 

यहाँ अपरिवर्तनीय के मामले में शुरू कर दिया दस्तावेज़ हो रही से एक नोट है। चूंकि अपरिवर्तनीय डेटा संरचनाओं को उनके निर्माण के बाद बदला नहीं जा सकता है, इसलिए उन्हें एक साथ कई उपभोक्ताओं द्वारा सुरक्षित रूप से साझा और विश्लेषण किया जा सकता है, बिना किसी अप्रत्याशित तरीकों से किसी एक को प्रभावित करने वाले उपकरण के खतरे के बिना। कोई ताले या अन्य समवर्ती उपायों की आवश्यकता नहीं है। यह Roslyn एपीआई में वाक्यविन्यास पेड़, संकलन, प्रतीकों, अर्थात् मॉडल, और हर अन्य डेटा संरचना पर लागू होता है। संशोधन के बजाय, पुराने ऑब्जेक्ट्स में निर्दिष्ट अंतरों के आधार पर नई ऑब्जेक्ट्स बनाई गई हैं। पेड़ परिवर्तन बनाने के लिए आप इस अवधारणा को सिंटैक्स पेड़ों पर लागू करेंगे!

+0

मुझे लगता है कि इस कोड को एक उपयोग कथन की आवश्यकता है जैसे 'Syntax = Microsoft.CodeAnalysis.CSharp.SyntaxFactory;' संकलित करने के लिए। – Anssssss

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