JDT API は、他のプラグインがいくつかの Java エレメントに対してコード・アシストまたはコード選択を行うことができるようにします。 この操作を許可するエレメントは ICodeAssist を実装します。
操作には次の 2 種類があります。
Java モデルには、このインターフェースを実装する 2 つのエレメント、 IClassFile および ICompilationUnit があります。 コード完了とコード選択は、クラス・ファイルに添付ソースがある場合にのみ、 クラス・ファイルの結果として生じます。
プログラマチックにコード完了を実行するには、 ICodeAssist.codeComplete を呼び出すのが唯一の方法です。 その後にコード完了を行いたいオフセットをコンパイル単位で指定します。 また、可能な完了を受け入れるために ICompletionRequestor のインスタンスを指定する必要もあります。
ICompletionRequestor 内のそれぞれのメソッドは、コード完了の別の種類のプロポーザルを受け入れます。 各メソッドのパラメーターは、提案されたエレメント (その名前、宣言型など)、 コンパイル単位での提案された挿入位置、およびその相関を記述するテキストを組み込みます。
完了要求者は、以下のエレメントの挿入を組み込む、 多くのさまざまなタイプの完了を受け入れることができます。
完了要求者は、コンパイル・エラーも受け入れ可能でなければなりません。
プラグインが一部の種類のコード完了にのみ関与する場合、関与する種類の完了のみを実装すればよいように CompletionRequestorAdapter を使用できます。 次のサンプルは、クラス完了を受け入れるためにのみ使用されるアダプターを示しています。
// Get the compilation unit ICompilationUnit unit = ...; // Get the offset int offset = ...; // Create the requester ICompletionRequestor requestor = new CompletionRequestorAdapter() { public void acceptClass( char[] packageName, char[] className, char[] completionName, int modifiers, int completionStart, int completionEnd, int relevance) { System.out.println("propose a class named " + new String(className)); } }; // Compute proposals unit.codeComplete(offset, requestor);
多くのさまざまな完了がある可能性があるため、相関という概念を使用して、 提案された完了とその他のプロポーザルの相関を比較します。 相関は正の整数によって表されます。 他のプロポーザルの値に相対的に使用されるということを除いて、値には暗黙的な意味はありません。 コード完了候補の相関は、変数型、キャスト型、戻りの型など、 周りのコードの型に関連付けられるときに、式の期待される型によって影響を受けることがあります。 期待される接頭部または接尾部が完了に存在する場合、これも相関に影響を与えます。
JDT コア・プラグインは、コード完了の振る舞いを制御するオプションを定義します。 これらのオプションは、他のプラグインによって変更できます。
その他のオプションを使用して、フィールド、static フィールド、ローカル変数、 およびメソッド引数用に提案された完了名に接頭部および接尾部を指定することができます。
コード・アシスト・オプションとそのデフォルトについて詳しくは、『JDT コア・オプション』を参照してください。
コード選択は、コンパイル単位でのテキストの範囲 (一般に、選択されたテキスト) で表される Java エレメントを見つけるために使用します。 コード選択をプログラマチックに実行するには、ICodeAssist.codeSelect を呼び出す必要があります。 選択の開始索引ロケーションとその長さを指定する必要があります。 結果は、Java エレメントの配列になります。 多くの場合、配列内のエレメントは 1 つのみですが、選択があいまいな場合は、 考えられるすべてのエレメントが戻されます。
次のサンプルでは、コンパイル単位でコード選択が呼び出されます。
// Get the compilation unit
ICompilationUnit unit = ...;
// Get the offset and length
int offset = ...;
int length = ...;
// perform selection
IJavaElement[] elements = unit.codeSelect(offset, length);
System.out.println("the selected element is " + element[0].getElementName());
選択の長さを 0 に指定すると、 指定されたオフセットを囲む完全なトークンを見つけることによって選択が計算されます。 次のサンプル・メソッドを検討してください。
public void fooMethod(Object) {
}