我正在尝试修改语法树,然后更新语义模型。这是我到目前为止所拥有的:
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);
甚至进行新的编译- 相同的异常。tree
GetTypeInfo()
那么我该如何更新SemanticModel
呢?(当然我可以得到修改后的源代码并从头开始做所有事情,但我想有更有效的方法)。
我敢肯定,我在这里遗漏了一些明显的东西,也许在某处创建了一个新的语法树?