我正在尝试在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
,则会成功检索到该符号!
我做错了什么?