Java 検索エンジンの使用

プラグインは JDT API を使用して、メソッド参照、フィールド宣言、インターフェースの実装などの Java エレメントのワークスペースで、Java プロジェクトを検索できます。

Java 検索のエントリー・ポイントは SearchEngine クラスです。 Java エレメント内の特定パターンを検索したり、検索を特定のエレメントに限定することができます。  検索パターンは、createPattern を使用して作成できます。パターンは createJavaSearchScope を使用して有効範囲を決めることができます。  パターンと有効範囲を定義したら、search メソッドを使用して結果を収集します。

検索結果は、SearchRequestor に報告されます。 結果にアクセスするためには、これを展開する必要があります。

検索の準備

検索操作では、検索の性質を記述するためのパターンと、調査の範囲を制限するための有効範囲の両方が使用されます。

Java 検索パターンの作成

検索パターンは、検索結果を見つける方法を定義します。 検索パターンは、Java エレメント (createPatternPattern(IJavaElement, int) を参照) またはストリング (createPattern(String, int, int, int) を参照) のどちらからでも作成できます。 後者の方法はワイルドカード ('*' など) をサポートし、幅広い検索結果を得るために使用できます。

例えば、指定のメソッドへの参照を検索するための検索パターンは、次のように作成します。

    // Get the method
    IMethod method = ...;
    
    // Create search pattern
    SearchPattern pattern = SearchPattern.createPattern(method, IJavaSearchConstants.REFERENCES);

また、"Obj" で始まるすべての型の宣言を検索するための検索パターンは、次のように作成します。

    // Create search pattern
    SearchPattern pattern = SearchPattern.createPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);

サポートされている検索パターンは以下のとおりです。

Java 検索範囲の作成

指定のプロジェクトまたは指定のパッケージの検索結果を知りたい場合、 あるいは検索結果が指定の型の階層にのみ含まれていることがわかっている場合、 createJavaSearchScope(IJavaElement[]) または createHierarchyScope(IType) を使用して適切な検索範囲を作成できます。

例えば、指定のパッケージの検索範囲は、次のように作成します。

    // Get the package
    IPackageFragment pkg = ...;

    // Create search scope
    IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});

また、指定の型の階層の検索範囲は、次のように作成します。

    // Get the type
    IType type = ...;

    // Create search scope
    IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);

ワークスペース全体の検索範囲も作成できます。

    // Create search scope
    IJavaSearchScope scope = SearchEngine.createWorkspaceScope();

検索

検索パターンと検索範囲の作成が済み、 SearchRequestor の展開が終わったら、以下のように検索クエリーを開始できます。

    // Get the search pattern
    SearchPattern pattern = ...;

    // Get the search scope
    IJavaSearchScope scope = ...;

    // Get the search requestor
    SearchRequestor requestor = ...;

    // Search
    SearchEngine searchEngine = new SearchEngine();
    searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null);

検索が開始されたという通知が、beginReporting メソッドを使用して検索リクエスターに送信されます。  その後で、各検索結果が、 acceptSearchMatch メソッドを使用して報告されます。 最後に、endReporting により、検索が終了したことが示されます。

検索結果の収集

検索結果は、acceptSearchMatch メソッドを使用して報告されます。 以下の段落で、検索の突き合わせについて詳しく説明します。

リソースおよび Java エレメント

検索結果は Java エレメント (型宣言など) に一致するか、または Java エレメント (メソッド内の型への参照など) に組み込まれています。 検索エンジンは常に、検索結果に一致する、または検索結果を含む、最も深い所にある Java エレメントを見つけようとします。 たとえば、メソッドへの参照を検索すると、そのような参照がイニシャライザーで見つかる可能性があります。 このメソッド参照を含むイニシャライザーは、検索の突き合わせのエレメントです。

また、検索エンジンは、Java エレメントを含むリソースを見つけようとします。 このため、Java エレメントがコンパイル単位内のメソッドの場合、リソースは対応する IFile になります。 エレメントが .jar ファイルに含まれている場合、リソースは .jar ファイルになり、この場合、この .jar ファイルはワークスペース内にあります。 これが外部 .jar ファイルの場合、リソースは ヌルです。

ソース位置

ソース位置は、検索結果を含むコンパイル単位に対する相対位置として与えられます。 検索結果が .jar ファイルに含まれる場合、ソース位置は添付されたソースに対する相対位置です。 .jar ファイルにソースが添付されていない場合、相対位置は (-1, -1) です。

正確な検索結果と不正確な検索結果

多くの場合、検索結果は正確で、検索エンジンは意図どおりの判別ができたことになります。 ただし、検索エンジンがこの判別を行うことができない場合もあり、この場合、一致は不正確なものになります。 一致が不正確である理由については、以下が考えられます。