Roslyn 语法树差异
Roslyn SyntaxTree Diff
假设我有两个 SyntaxTree
s A 和 B,
其中 B 是通过对 A.
应用更改而生成的
我想获取以下信息:
- 已从 A 中删除以生成 B
的语法节点和标记
- 已添加到 A 以生成 B
的语法节点和标记
这个有API吗?
如果不是,如何有效计算?
Roslyn 必须可以使用此信息,
因为未更改的 GreenNode
在树之间共享。
我能想到的一个解决方案是使用SyntaxTree.GetChangedSpans()
然后查找相交的标记。
然而,这感觉像是一个 hack,我不确定它是否总是准确的。
一个小的文本更改可能会对 SyntaxTree
:
产生很大的影响
(例如,将表达式中的 *
替换为 +
可能会更改其 order/precedence)
我们 internally have a differ 位于编译器层,因此使用绿色节点,我们只是没有将其公开为 API。实际上,这就是我们用来驱动 GetChangedSpans 的东西。我们有意没有直接公开绿色节点,因为那是一个实现细节。
API 不能成为 public 没有具体原因。我认为当这个问题出现时,我们担心人们实际上如何说明行为是什么,或者您可以从差异中期望的最小 "goodness" 是什么。那,我们没有一个激励场景来真正确保我们的工作有用。
假设我有两个 SyntaxTree
s A 和 B,
其中 B 是通过对 A.
我想获取以下信息:
- 已从 A 中删除以生成 B 的语法节点和标记
- 已添加到 A 以生成 B 的语法节点和标记
这个有API吗?
如果不是,如何有效计算?
Roslyn 必须可以使用此信息,
因为未更改的 GreenNode
在树之间共享。
我能想到的一个解决方案是使用SyntaxTree.GetChangedSpans()
然后查找相交的标记。
然而,这感觉像是一个 hack,我不确定它是否总是准确的。
一个小的文本更改可能会对 SyntaxTree
:
产生很大的影响
(例如,将表达式中的 *
替换为 +
可能会更改其 order/precedence)
我们 internally have a differ 位于编译器层,因此使用绿色节点,我们只是没有将其公开为 API。实际上,这就是我们用来驱动 GetChangedSpans 的东西。我们有意没有直接公开绿色节点,因为那是一个实现细节。
API 不能成为 public 没有具体原因。我认为当这个问题出现时,我们担心人们实际上如何说明行为是什么,或者您可以从差异中期望的最小 "goodness" 是什么。那,我们没有一个激励场景来真正确保我们的工作有用。