Roslyn SyntaxTree Diff

时间:2016-01-22 10:57:01

标签: syntax diff abstract-syntax-tree roslyn roslyn-code-analysis

假设我有两个SyntaxTree s A B
通过将更改应用于 A 来生成 B

我想获得以下信息:

  • SyntaxNodes&已从 A 中删除以生成 B
  • 的代币
  • SyntaxNodes&已添加到 A 以生成 B
  • 的标记

这是否有API?
如果没有,怎样才能有效地计算出来?

此信息必须提供给Roslyn,
因为在树之间共享未更改的GreenNode

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

1 个答案:

答案 0 :(得分:1)

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

API无法公开没有具体原因。我认为当这个出现时,我们担心一个人如何确定行为是什么,或者你可以从diff中得到什么样的最小“善”。那,我们没有一个激励性的场景来确保我们的工作是有用的。