6

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

我想获得以下信息:

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

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

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

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

4

1 回答 1

2

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

API 不能公开并没有特定的原因。我认为当这个问题出现时,我们担心一个人实际上如何指定行为是什么,或者你可以从差异中期望什么是最小的“善良”。那个,我们没有一个激励场景来真正确保我们的工作是有用的。

于 2016-01-26T23:21:44.463 回答