6

Eclipse のドキュメントで示唆されているように、org.eclipse.core.resources.IncrementalProjectBuilder各ソース ファイルをコンパイルする があり、個別にorg.eclipse.ui.editors.text.TextEditor各ソース ファイルを編集できる もあります。各ソース ファイルは独自のコンパイル ユニットにコンパイルされますが、他の (既にコンパイルされた) ソース ファイルから型を参照できます。

これが重要な 2 つのタスクは次のとおりです。

  1. コンパイル (使用している型が実際に存在することを確認するため)
  2. オートコンプリート (タイプを調べて、そこに存在するプロパティ/メソッドを確認できるようにするため)

これを実現するために、コンパイルされたすべての型の表現をメモリに格納します (以下、「型ストア」と呼びます)。

私の質問は 2 つあります。

  1. 上記のタスク 1 はビルダーによって実行され、タスク 2 はエディターによって実行されます。両方がこの型ストアにアクセスできるようにするには、両方がアクセスできる静的ストアをどこかに作成する必要がありますか、または Eclipse はこの問題に対処するためのより適切な方法を提供しますか? 必要なときにビルダーとエディターをインスタンス化するのは、私ではなくEclipseであることに注意してください。

  2. Eclipse を開くときに、タイプ ストアを再作成できるようにするためだけに、プロジェクト全体を再構築する必要はありません。これまでの私の最善の解決策は、このデータをどこかに保持し、そこからストアを再作成することです (おそらくプロジェクトを開いたときに)。これは、他のインクリメンタル コンパイラが通常行う方法ですか? Java のアプローチは、クラス ファイルからこのデータを効率的に抽出する特別なパーサーを使用することだと思います。

どんな洞察も本当に高く評価されます。これは私の最初の DSL です。

4

1 に答える 1

2

これは興味深い質問であり、簡単な解決策はありません。考えられる解決策を説明し、JDT がインクリメンタル コンパイルをどのように達成するかをもう少し詳しく説明します。

まず、JDT について少し説明します。

はい、JDT は一部の情報についてクラス ファイルを読み取りますが、ソース コードを持たないライブラリに対してのみです。この情報は、実際には編集支援 (コンテンツ支援、ナビゲーションなど) にのみ使用されます。

JDT は、コンパイル時にコンパイル単位間の依存関係を追跡することにより、増分コンパイルを計算します。この状態情報はディスクに保存され、各コンパイル後に取得および更新されます。

より完全な例として、完全なビルドの後、A.java が B.java に依存し、B.java が C.java に依存していると JDT が判断したとします。

C.java に構造上の変更がある場合(構造上の変更とは、外部のファイルに影響を与える可能性のある変更です (非プライベート フィールドまたはメソッドの追加/削除など))、B.java が再コンパイルされます。B.java には構造上の変更がないため、A.java は再コンパイルされません。

JDT がどのように機能するかについて少し説明した後、質問に対するいくつかの可能な回答を以下に示します。

  1. はい。これは、静的にアクセス可能なグローバル オブジェクトを通じて行う必要があります。JDT は、JavaCore および JavaModelManager オブジェクトを介してこれを行います。グローバル シングルトンを使用したくない場合は、プラグインのバンドル アクティベーター インスタンスを介して利用可能なタイプ ストアにアクセスできます。e4 プロジェクトは依存性注入を許可しますが、これはおそらくさらに優れています (ただし、実際にはコア Eclipse API の一部ではありません)。
  2. ファイル システムに情報を永続化するのが最善の策だと思います。インクリメンタル コンパイルの依存関係を特定する唯一の現実的な方法は、完全なビルドを実行することです。そのため、情報をどこかに永続化する必要があります。繰り返しますが、これが JDT のやり方です。情報は.metadata、org.eclipse.core.resources プラグインのどこかにあるワークスペースのディレクトリに保存されます。org.eclipse.jdt.internal.core.builder.Stateクラスを見て実装を確認できます。

したがって、これはあなたが探している答えではないかもしれませんが、これがあなたの問題に取り組むための最も有望な方法だと思います.

于 2011-04-23T21:22:37.123 に答える