構文ツリーを変更して意味モデルを更新しようとしています。 - 同じ例外を構文ツリーを変更してセマンティックモデルを更新する
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
? (もちろん、修正されたソースを取得して、最初からすべてを行うこともできますが、より効率的な方法があると思います)。
私は確かに何かが分からないのですが、どこかに新しい構文ツリーが作成されているのでしょうか?