5

のは、私は2つのSyntaxTreeBBに変更を適用することにより製造されている
があるとしましょう。ロスリンSyntaxTree差分

私は、次の情報を取得したいと思い:

  • SyntaxNodesにに追加されましたB
  • SyntaxNodes &トークンを生成するためにから削除されました&トークン生成物B

これに対応するAPIはありますか?
そうでない場合、どのようにこれを効率的に計算できますか?

この情報は、変更されていないGreenNodeがツリー間で共有されているため、Roslyn、
に利用可能である必要があります。

考えられる解決策の1つは、SyntaxTree.GetChangedSpans()
を使用し、次に交差するトークンを検索することです。
しかし、それはハックのように感じ、私はそれが常に正確かどうかは分かりません。コンパイラ層に住んでいるので、緑色のノードを使用しています
を(例えば式で+*を交換し、その順番/優先度を変更する場合があります)

+0

本当に2つのASTがあり、それらにアクセスできる場合は、これは簡単です。 Aのノードのリストを作成し、Bノードのノード(A)-Greenは削除されたノードを作成します。ノード(B)-Greenは追加されたものです。あなたがする必要があるのは、ツリーウォークを行い、いくつかのセットを構築し、減算を設定することだけです。私はRosylnのユーザーではありませんが、これは難しいですか? –

+0

私はこれを技術的な理由で効率的に行うことはできないと思います。 (ノードの "不安定な" 'GetHashCode()'実装のために 'HashSets'を使用することはできません)。等価は動作します: 'SyntaxNode.IsEquivalentTo()'。しかし、** A **のすべてのノードを** B ** bcs O(n^2)のすべてのノードと比較することは避けたい。 – 3dGrabber

+0

だからロザリンは失望している。 (私はRosylnのようなことをするシステムを構築し、私の提案された方法はうまくいくはずです;実際には、よりスマートな方法で、木をもっとはっきりと比較する "スマート差分"があります。バイオ)。 –

答えて

1

我々はinternally have a differ
小さなテキストの変更がSyntaxTreeに大きな影響を与える可能性がありますAPIとして公開していないだけです。これは実際にGetChangedSpansを駆動するために使用します。私たち意図的には実装の詳細なので、緑のノードを直接公開しませんでした。

APIを公開できない特別な理由はありません。私は、このことが起こったときに、実際にその行動がどのようにスペックアップされているか、またはdiffから期待できる最小限の "良い"ものが何であるか心配していたと思います。実際、私たちの仕事が有用であることを実際に確認する動機付けのシナリオはありませんでした。

+0

これは最初の質問に答えます。公開APIはありません。 'SyntaxDiffer'がパブリックになる可能性がありますか? (プルリクエスト?)。あるいは、 'SyntaxTree.GetChangedSpans'または' SyntaxTree.GetChanges'を使って回避できますか? – 3dGrabber

+0

その他:Roslyn APIに関する質問はどこで行うべきですか? SO、GitHub、MSDN? (たとえば、「SyntaxTree.GetChangedSpansとSyntaxTree.GetChangesの違いは何ですか?」 – 3dGrabber

+0

完全にプルリクエストを送信できます。最初にGitHubのバグを開いて、問題があることを知っているので、実際に作業を行っているという表現があることをお勧めします。それはまた、人々があなたがそれを公開する前に修正したいと思うことについて知っているどんな問題でもチャイムできるようにします。おそらく、このコードは実際にはすべてがバギーであるため、公開しなかったのです。アクセス修飾子をpublicに変更するだけのプルリクエストは、サポートされている、考え抜かれた、整形式のAPIを維持する必要があるため、拒否されます。 :-) –