Roslyn 语法树差异

Roslyn SyntaxTree Diff

假设我有两个 SyntaxTrees AB,
其中 B 是通过对 A.

应用更改而生成的

我想获取以下信息:

这个有API吗?
如果不是,如何有效计算?

Roslyn 必须可以使用此信息,
因为未更改的 GreenNode 在树之间共享。

我能想到的一个解决方案是使用SyntaxTree.GetChangedSpans()
然后查找相交的标记。
然而,这感觉像是一个 hack,我不确定它是否总是准确的。
一个小的文本更改可能会对 SyntaxTree:
产生很大的影响 (例如,将表达式中的 * 替换为 + 可能会更改其 order/precedence)

我们 internally have a differ 位于编译器层,因此使用绿色节点,我们只是没有将其公开为 API。实际上,这就是我们用来驱动 GetChangedSpans 的东西。我们有意没有直接公开绿色节点,因为那是一个实现细节。

API 不能成为 public 没有具体原因。我认为当这个问题出现时,我们担心人们实际上如何说明行为是什么,或者您可以从差异中期望的最小 "goodness" 是什么。那,我们没有一个激励场景来真正确保我们的工作有用。