假设我有两个SyntaxTree
s A 和 B ,
通过将更改应用于 A 来生成 B 。
我想获得以下信息:
这是否有API?
如果没有,怎样才能有效地计算出来?
此信息必须提供给Roslyn,
因为在树之间共享未更改的GreenNode
。
我能想到的一个解决方案是使用SyntaxTree.GetChangedSpans()
然后查找相交的令牌
然而,这感觉就像一个黑客,我不确定它是否总是准确的
较小的文字更改可能会对SyntaxTree
产生很大影响:
(例如,在表达式中用*
替换+
可能会更改其顺序/优先级)
答案 0 :(得分:1)
我们internally have a differ位于编译器层中,因此使用绿色节点,我们只是没有将其作为API公开。实际上,这就是我们用来驱动GetChangedSpans的东西。我们故意没有直接暴露绿色节点,因为这是一个实现细节。
API无法公开没有具体原因。我认为当这个出现时,我们担心一个人如何确定行为是什么,或者你可以从diff中得到什么样的最小“善”。那,我们没有一个激励性的场景来确保我们的工作是有用的。