假设我有两个SyntaxTree,A和B,其中B是通过对A进行更改而生成的。
我想获取以下信息: - 从A到B删除的SyntaxNodes和Tokens - 添加到A以生成B的SyntaxNodes和Tokens
是否有API可用于此?如果没有,如何高效地计算?
这些信息必须对Roslyn可用,因为未更改的GreenNode在树之间共享。
我能想到的一个解决方案是使用SyntaxTree.GetChangedSpans(),然后查找相交的tokens。但是,这感觉像是一个hack,并且我不确定它是否总是准确的。一个小的文本更改可能会对SyntaxTree产生很大的影响: (例如,在表达式中用+替换*可能会改变其顺序/优先级)
我想获取以下信息: - 从A到B删除的SyntaxNodes和Tokens - 添加到A以生成B的SyntaxNodes和Tokens
是否有API可用于此?如果没有,如何高效地计算?
这些信息必须对Roslyn可用,因为未更改的GreenNode在树之间共享。
我能想到的一个解决方案是使用SyntaxTree.GetChangedSpans(),然后查找相交的tokens。但是,这感觉像是一个hack,并且我不确定它是否总是准确的。一个小的文本更改可能会对SyntaxTree产生很大的影响: (例如,在表达式中用+替换*可能会改变其顺序/优先级)
HashSets
,因为节点的“不稳定”GetHashCode()
实现)。相等性可以通过SyntaxNode.IsEquivalentTo()
来判断。然而,我想避免将A中的每个节点与B中的每个节点进行比较,因为时间复杂度为O(n^2)。 - 3dGrabber