为什么SyntaxNode.ReplaceNode会更改SyntaxTree选项?

时间:2017-05-19 02:35:08

标签: c# roslyn

我正在尝试替换Roslyn语法树中的节点,这只是工作,但有一种烦恼,感觉不应该成为一个问题。

语法树是从脚本生成的,我希望结果也是基于脚本的语法树 - 但由于某种原因,替换树中的节点会创建一个带有更改选项的新语法树:{{ 1}}变为Kind而不是Regular。这可以通过Script解决,但如果我需要调用它,感觉就像我做错了。

示例程序:

SyntaxTree.WithRootAndOptions

(输出在评论中。)

这种解决方法实际上是否正确,或者是否有一些不同的方式我应该替换树中的节点?

1 个答案:

答案 0 :(得分:1)

替换树中的节点时,将创建一个新的节点子树。实质上,这个新的子树不包含在SyntaxTree中。但是,如果您观察它,节点上的SyntaxTree属性会产生一个新属性。在它执行此操作时,原始的SyntaxTree早已不复存在,因此无法保留解析选项。即使有可能,保留选项也没有意义,因为您不再拥有解析器生成的树。

Roslyn创建此SyntaxTree的原因是,所有子树在技术上都包含在SyntaxTree实例中,因此Roslyn可以将诊断与其关联。如果您使用SemanticModel的探索性API来尝试绑定&获取当前不属于编译的树的片段的语义信息。诊断报告错误及其位置,表示它所在的树实例。