構文ツリーを変更して、セマンティック モデルを更新しようとしています。これが私がこれまでに持っているものです:
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
ますか? (もちろん、修正したソースを入手して最初からすべてを行うこともできますが、もっと効率的な方法があると思います)。
ここで明らかな何かが欠けていると思います。おそらく、新しい構文ツリーがどこかに作成されているのでしょうか?