如何在更改SyntaxTree后更新Roslyn中的SemanticModel?

时间:2016-11-24 18:42:09

标签: c# .net abstract-syntax-tree roslyn

我正在尝试在Roslyn中执行语法转换。 AST重新安排工作正常,但是,当我更改内容时,我需要获得反映SemanticModel新结构的更新SyntaxTree

转换树

这部分工作,我可以说,因为我做了大量的调试。

CSharpSyntaxTree tree = RetrieveTree(); // Just successfully gets the original tree
CSharpCompilation compilation = CSharpCompilation.Create(...); // Retrieves the compilation object

CompilationUnitSyntax node = tree.GetRoot();

// Doing stuff to change the tree
node = node.RemoveNodes(...);
node = node.AddMembers(...);

所以我可以得到新树:

CSharpSyntaxTree newTree = node.SyntaxTree as CSharpSyntaxTree;

通过调试,我可以看到newTree具有新结构,而tree具有旧结构。我也可以成功遍历newTree并对AST进行操作。所以转型是成功的。

更新树和语义

当我尝试更新CSharpCompilation时以及当我从中获取SemanticModel时,我认为问题从此处开始

CSharpCompilation newCompilation = compilation.ReplaceSyntaxTree(tree, newTree);
SemanticModel newSemanticModel = newCompilation.GetSemanticModel(newTree);

因为当我尝试:

TypeSyntax myClassTypeNode = GetSourceCodeClassTypeNode(); // Just successfully gets a node
var symbol = newSemanticModel.getSymbolInfo(myClassTypeNode).Symbol;

然后symbol为空。当然,如果我尝试使用原始的null,它仍然是SemanticModel

没有转换就行了如果我不执行转换并使用旧的SemanticModel,则会成功检索到该符号!

我做错了什么?

0 个答案:

没有答案