2012-08-28 14 views
7

प्राप्त करें मैं वाक्यविन्यास पेड़ को संशोधित करने की कोशिश कर रहा हूं और फिर अर्थात् मॉडल अद्यतन कर रहा हूं। - एक ही अपवादसिंटैक्स पेड़ को संशोधित करें, फिर अद्यतन अर्थात् मॉडल

var tree = Roslyn.Compilers.CSharp.SyntaxTree.ParseCompilationUnit(code); 
var compilation = Roslyn.Compilers.CSharp.Compilation.Create(
         "MyCompilation", 
         syntaxTrees: new[] { tree }, 
         references: new[] { mscorlib }); 
var semanticModel = compilation.GetSemanticModel(tree); 
... 
var oldStatementNode = (parent as ExpressionStatementSyntax); //some SyntaxNode in the tree 
var oldExpressionNode = oldStatementNode.Expression; 
var newExpressionNode = Syntax.ParenthesizedExpression(oldExpressionNode); 
var newRootNode = tree.GetRoot().ReplaceNode(oldExpressionNode, newExpressionNode); 

var semanticInfo = semanticModel.GetTypeInfo(newExpressionNode); //throws exception "Syntax node is not within syntax tree" 

अगर मैं semanticModel = compilation.GetSemanticModel(tree); फोन या यहाँ तक कि GetTypeInfo() कॉल करने से पहले tree के साथ नए संकलन करने की कोशिश: यहाँ क्या मैं अब तक है।

तो मैं SemanticModel अपडेट कैसे प्राप्त करूं? (बेशक मैं संशोधित स्रोत प्राप्त कर सकता हूं और इसके साथ सब कुछ शुरू करने से कर सकता हूं, लेकिन मुझे लगता है कि वहां अधिक कुशल तरीका है)।

मुझे कुछ स्पष्ट याद आ रही है मुझे यकीन है, शायद कहीं नया सिंटैक्स पेड़ बनाया गया है?

उत्तर

14

रोसलिन प्रकार अपरिवर्तनीय हैं, तो आप अपने newRootNode के लिए एक नया SyntaxTree का निर्माण, और फिर फोन compilation.UpdateSyntaxTree एक नया Compilation पाने के लिए की जरूरत है, और फिर आप newCompilation.GetSemanticModel(newTree) फोन एक नया SemanticModel प्राप्त करने के लिए कर सकते हैं।

सेवा स्तर तक जाने और इसके बजाय एक इशोल्यूशन का उपयोग करने पर विचार करें। कुछ ऐसा:

var doc = Solution.Create(SolutionId.CreateNewId()).AddCSharpProject("MyCompilation", "MyCompilation").AddMetadataReference(mscorlib).AddDocument("MyFile", code); 

var semanticModel = (SemanticModel)doc.GetSemanticModel(); 
var root = (CompilationUnitSyntax)doc.GetSyntaxRoot(); 

SyntaxNode parent = null; 
var oldStatementNode = (parent as ExpressionStatementSyntax); //some SyntaxNode in the tree 
var oldExpressionNode = oldStatementNode.Expression; 
var newExpressionNode = Syntax.ParenthesizedExpression(oldExpressionNode); 
var newRootNode = root.ReplaceNode(oldExpressionNode, newExpressionNode); 

doc = doc.UpdateSyntaxRoot(newRootNode); 
semanticModel = (SemanticModel)doc.GetSemanticModel(); 
संबंधित मुद्दे