我正在尝试替换Roslyn语法树中的节点,这只是工作,但有一种烦恼,感觉不应该成为一个问题。
语法树是从脚本生成的,我希望结果也是基于脚本的语法树 - 但由于某种原因,替换树中的节点会创建一个带有更改选项的新语法树:{{ 1}}变为Kind
而不是Regular
。这可以通过Script
解决,但如果我需要调用它,感觉就像我做错了。
示例程序:
SyntaxTree.WithRootAndOptions
(输出在评论中。)
这种解决方法实际上是否正确,或者是否有一些不同的方式我应该替换树中的节点?
答案 0 :(得分:1)
替换树中的节点时,将创建一个新的节点子树。实质上,这个新的子树不包含在SyntaxTree中。但是,如果您观察它,节点上的SyntaxTree属性会产生一个新属性。在它执行此操作时,原始的SyntaxTree早已不复存在,因此无法保留解析选项。即使有可能,保留选项也没有意义,因为您不再拥有解析器生成的树。
Roslyn创建此SyntaxTree的原因是,所有子树在技术上都包含在SyntaxTree实例中,因此Roslyn可以将诊断与其关联。如果您使用SemanticModel的探索性API来尝试绑定&获取当前不属于编译的树的片段的语义信息。诊断报告错误及其位置,表示它所在的树实例。