Типы Roslyn неизменяемы, поэтому вам нужно построить новый SyntaxTree
для вашего newRootNode
, а затем вызвать compilation.UpdateSyntaxTree
, чтобы получить новый Compilation
, а затем вы можете вызвать newCompilation.GetSemanticModel(newTree)
, чтобы получить новый SemanticModel
.
Рассмотрите возможность перехода на уровень обслуживания и вместо этого используйте ISolution. Что-то вроде:
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();