比方说,我有两个SyntaxTree
小号一个和乙,
其中乙已经将更改应用到一个生产。罗斯林SyntaxTree DIFF
我想获得以下信息:
- SyntaxNodes已经从一个去除产生乙
- SyntaxNodes已添加到一个到&令牌&令牌生产B
这是否有API?
如果没有,如何有效地计算?
此信息必须可用于Roslyn,
因为在树之间共享不变的GreenNode
。
我能想到的一个解决方案是使用SyntaxTree.GetChangedSpans()
然后查找相交的标记。
但是,这感觉像一个黑客,我不知道它是否总是准确。
小文本的变化可能对一个SyntaxTree
有很大的影响:
(例如用+
在表达式替换*
可能会改变其顺序/优先级)
如果你真的有两个AST并访问它们,这看起来很简单。列出A的节点,并且B.节点(A)的节点 - 绿色是那些已经被删除的节点。节点(B) - 绿色是已添加的那些节点。所有你需要做的是做一个树行走,建立一些集,并设置减法。我不是Rosyln的用户,但是这很难吗? –
由于技术原因,我认为不可能有效地做到这一点。 (由于节点的“unstable”'GetHashCode()'实现,所以不能使用'HashSets')。平等工作:'SyntaxNode.IsEquivalentTo()'。不过,我想避免将** A **中的每个节点与** B ** bcs O(n^2)中的每个节点进行比较。 – 3dGrabber
因此罗斯林令人失望。 (我建立了一个像Rosyln那样的系统,我建议的方法可以很好地工作;事实上,我们有一个“聪明的区别”,它以更加精确的方式比较树木的更加宏观的比较。生物)。 –