6

ABの2 つSyntaxTreeの s があり、BAに変更を適用することによって生成されたとします。

次の情報を取得したいと思います。

  • Bを生成するためにAから削除された SyntaxNode とトークン
  • Bを生成するためにAに追加された SyntaxNode とトークン

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


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

私が考えることができる 1 つの解決策はSyntaxTree.GetChangedSpans()
、交差するトークンを使用してから検索することです。
ただし、それはハックのように感じられ、常に正確かどうかはわかりません。
小さなテキストの変更が : に大きな影響を与える可能性がありますSyntaxTree(
たとえば、式で を置き換える*+、その順序/優先順位が変わる可能性があります)。

4

1 に答える 1

2

内部的には、コンパイラ レイヤーに存在し、緑色のノードを使用する差分がありますが、それを API として公開していません。これは、実際に GetChangedSpans を駆動するために使用するものです。実装の詳細であるため、意図的に緑色のノードを直接公開しませんでした。

API を公開できなかった特定の理由はありません。これが登場したとき、実際にどのように動作するか、または差分から期待できる最小限の「良さ」をどのように仕様化するかについて、私たちは心配していたと思います。そして、私たちの仕事が実際に役立つかどうかを確認するための動機付けのシナリオがありませんでした.

于 2016-01-26T23:21:44.463 に答える