Použití vyhledávače Java

Uživatelský modul plug-in může používat rozhraní API JDT k prohledávání projektů Java v pracovním prostoru za účelem nalezení odkazů na metody, deklarací polí, implementátorů rozhraní atd.

Vstupním bodem hledání Java je třída SearchEngine. Můžete vyhledávat určité vzory uvnitř určitých prvků Java.  Vzor vyhledávání lze vytvořit s použitím createPattern.  Rozsah vyhledávání vzoru se stanovuje pomocí createJavaSearchScope.  Po definování vzoru a rozsahu hledání metoda search získá výsledky.

Výsledky hledání jsou odesílány do SearchRequestor, který musíte pro přístup k těmto výsledkům rozšířit.

Příprava hledání

Vyhledávání používá vzor popisující vyhledávaný řetězec a rozsah omezující rozsah hledání.

Vytváření vzorku pro hledání v kódu Java

Vzorek vyhledávání definuje způsob nalezení výsledků. Vzorek vyhledávání můžete vytvořit z prvku Java (viz createPatternPattern(IJavaElement, int)) nebo z řetězce (viz createPattern(String, int, int, int).) Druhý způsob umožňuje použití zástupných znaků (tj. '*') a lze jej použít ke zvětšení počtu výsledků hledání.

Například při vytváření vzoru vyhledávání odkazů na určitou metodu postupujte tímto způsobem:

    // Získat metodu
    IMethod method = ...;
    
    // Vytvořit vzor vyhledávání
    SearchPattern pattern = SearchPattern.createPattern(method, IJavaSearchConstants.REFERENCES);

Nebo vytvoření vzoru vyhledávání deklarací všech typů, jejichž název začíná řetězcem "Obj":

    // Vytvořit vzor vyhledávání
    SearchPattern pattern = SearchPattern.createPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);

Podporovány jsou tyto vzory vyhledávání:

Vytváření rozsahu hledání v kódu Java

Chcete-li vyhledávat výsledky pouze v určitém projektu, nebo dokonce v určitém balíčku nebo pokud víte, že se hledané výsledky nalézají v hierarchii určitého typu, můžete vytvořit vhodný rozsah hledání s použitím createJavaSearchScope(IJavaElement[]) nebo createHierarchyScope(IType).

Následuje příklad vytvoření rozsahu hledání pro určitý balíček:

    // Získat balíček
    IPackageFragment pkg = ...;

    // Vytvořit rozsah vyhledávání
    IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});

Nebo vytvoření rozsahu vyhledávání pro hierarchii daného typu:

    // Získat typ
    IType type = ...;

    // Vytvořit rozsah vyhledávání
    IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);

Samozřejmě lze vytvořit rozsah vyhledávání pro celý pracovní prostor:

    // Vytvořit rozsah vyhledávání
    IJavaSearchScope scope = SearchEngine.createWorkspaceScope();

Hledání

Po vytvoření vzoru a rozsahu vyhledávání a po přidání SearchRequestor můžete následujícím způsobem zadat vyhledávací dotaz a spustit vyhledávání:

    // Získat vzor vyhledávání
    SearchPattern pattern = ...;

    // Získat rozsah vyhledávání
    IJavaSearchScope scope = ...;

    // Získat klienta hledání
    SearchRequestor requestor = ...;

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

Vašemu klientovi hledání bude odesláno upozornění na spuštění vyhledávání s použitím metody beginReporting.  Poté budou jednotlivé výsledky hledání signalizovány s použitím metody acceptSearchMatch. Metoda endReporting signalizuje ukončení vyhledávání.

Shromažďování výsledků hledání

Výsledky hledání jsou signalizovány s použitím metody acceptSearchMatch. Následující odstavce se věnují shodě hledání.

Prostředky a prvky Java

Výsledek hledání může odpovídat prvku Java (např. deklaraci typu) nebo může být obsažen v prvku Java (např. odkaz na typ uvnitř metody). Vyhledávač se vždy pokouší nalézt nejvnitřnější prvek Java, který odpovídá výsledku hledání nebo který jej obsahuje. Například vyhledávání odkazů na metodu může takovýto odkaz vyhledat v inicializátoru. Inicializátor obsahující odkaz na metodu je prvkem, který se shoduje s hledáním.

Vyhledávač se pokouší rovněž o vyhledání prostředků, které obsahují prvek Java. Je-li tedy prvkem Java metoda v kompilační jednotce, prostředkem je příslušný IFile. Je-li prvek v souboru .jar, je prostředkem soubor .jar, je-li takovýto soubor .jar v pracovním prostoru. Jde-li o externí soubor .jar, je prostředek null.

Pozice zdroje

Pozice zdroje se udávají relativně ke kompilační jednotce, která obsahuje výsledek hledání. Je-li výsledek hledání obsažen v souboru .jar, jsou pozice zdroje relativní k připojenému zdroji. Není-li k souboru .jar připojen žádný zdroj, jde o pozice (-1, -1).

Přesné a nepřesné výsledky hledání

Ve většině případů jsou výsledky hledání přesné, což znamená, že vyhledávač byl schopen určit, zda je skutečně požadována daná shoda. V některých případech je shoda nepřesná. Některé příčiny nepřesné shody: