比方說,我有兩個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那樣的系統,我建議的方法可以很好地工作;事實上,我們有一個「聰明的區別」,它以更加精確的方式比較樹木的更加宏觀的比較。生物)。 –