のは、私は2つのSyntaxTree
のとB、Bがに変更を適用することにより製造されている
があるとしましょう。ロスリンSyntaxTree差分
私は、次の情報を取得したいと思い:
- SyntaxNodesにに追加されましたB
- SyntaxNodes &トークンを生成するためにから削除されました&トークン生成物B
これに対応するAPIはありますか?
そうでない場合、どのようにこれを効率的に計算できますか?
この情報は、変更されていないGreenNode
がツリー間で共有されているため、Roslyn、
に利用可能である必要があります。
考えられる解決策の1つは、SyntaxTree.GetChangedSpans()
を使用し、次に交差するトークンを検索することです。
しかし、それはハックのように感じ、私はそれが常に正確かどうかは分かりません。コンパイラ層に住んでいるので、緑色のノードを使用しています
を(例えば式で+
で*
を交換し、その順番/優先度を変更する場合があります)
本当に2つのASTがあり、それらにアクセスできる場合は、これは簡単です。 Aのノードのリストを作成し、Bノードのノード(A)-Greenは削除されたノードを作成します。ノード(B)-Greenは追加されたものです。あなたがする必要があるのは、ツリーウォークを行い、いくつかのセットを構築し、減算を設定することだけです。私はRosylnのユーザーではありませんが、これは難しいですか? –
私はこれを技術的な理由で効率的に行うことはできないと思います。 (ノードの "不安定な" 'GetHashCode()'実装のために 'HashSets'を使用することはできません)。等価は動作します: 'SyntaxNode.IsEquivalentTo()'。しかし、** A **のすべてのノードを** B ** bcs O(n^2)のすべてのノードと比較することは避けたい。 – 3dGrabber
だからロザリンは失望している。 (私はRosylnのようなことをするシステムを構築し、私の提案された方法はうまくいくはずです;実際には、よりスマートな方法で、木をもっとはっきりと比較する "スマート差分"があります。バイオ)。 –