Roslyn SyntaxTree Diff

3dG*_*ber 5 syntax diff abstract-syntax-tree roslyn roslyn-code-analysis

假设我有两个SyntaxTrees AB,
其中B是通过对A应用更改而生成.

我想获得以下信息:

  • 已从A中删除以生成B的语法节点和标记
  • 已添加到A以生成B的语法节点和标记

这有API吗?
如果没有,如何有效地计算?

这些信息必须可供Roslyn使用,
因为GreenNode树之间共享未更改的信息.

我能想到的一个解决方案是使用SyntaxTree.GetChangedSpans()
然后查找相交的令牌.
然而,感觉就像一个黑客,我不确定它是否总是准确的.
小的文本更改可能会对a产生很大影响SyntaxTree:(
例如*,+在表达式中替换可能会更改其顺序/优先级)

Jas*_*ski 2

我们内部有一个位于编译器层的差异,因此使用绿色节点,我们只是没有将其作为 API 公开。实际上,这就是我们用来驱动 GetChangedSpans 的内容。我们故意不直接公开绿色节点,因为这是一个实现细节。

API 没有公开的具体原因。我认为当这个问题出现时,我们担心人们如何真正规范行为是什么,或者您可以从差异中期望的最小“好处”是什么。那,我们没有一个激励场景来真正确保我们的工作有用。