9

構文ツリーを変更して、セマンティック モデルを更新しようとしています。これが私がこれまでに持っているものです:

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);か、新しいコンパイルを作成しようとすると、同じ例外が発生します。treeGetTypeInfo()

では、どうすれば更新されSemanticModelますか? (もちろん、修正したソースを入手して最初からすべてを行うこともできますが、もっと効率的な方法があると思います)。

ここで明らかな何かが欠けていると思います。おそらく、新しい構文ツリーがどこかに作成されているのでしょうか?

4

1 に答える 1

15

Roslyn の型は不変であるため、 の newSyntaxTreeを作成しnewRootNode、 を呼び出しcompilation.UpdateSyntaxTreeて new を取得する必要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();
于 2012-08-28T23:05:41.913 に答える