Din plugin kan bruge JDT API'et til at søge i Java-projekter på arbejdsområdet for Java-elementer, f.eks. metodereferencer, felterklæringer, implementorer af en grænseflade osv.
Indgangspunktet for Java-søgning er klassen SearchEngine. Du kan søge efter bestemte mønstre i et Java-element og angive søgeomfanget til bestemte elementer. Søgemønstre kan oprettes ved hjælp af createPattern. Omfanget af et mønster angives ved hjælp af createJavaSearchScope. Når først der er defineret et mønster og omfang, bruges metoden search til at indsamle resultaterne.
Søgeresultater rapporteres til en SearchRequestor, som du skal udvide for at få adgang til resultaterne.
Til en søgefunktion bruges både et mønster til at beskrive søgetypen og et omfang til at afgrænse søgeområdet.
Et søgemønster definerer, hvordan søgeresultater findes. Du kan enten oprette et søgemønster fra et Java-element (se createPatternPattern(IJavaElement, int)) eller fra en streng (se createPattern(String, int, int, int).) Den sidste metode understøtter brugen af jokertegn (*) og kan bruges til at udvide søgeresultaterne.
Gør følgende, hvis du f.eks. vil oprette et søgemønster for at søge efter referencer til en given metode:
// Hent metoden IMethod method = ...; // Opret søgemønster SearchPattern pattern = SearchPattern.createPattern(method, IJavaSearchConstants.REFERENCES);
Eller hvis du vil oprette et søgemønster for at søge efter erklæringer af alle typer, der starter med "Obj":
// Opret søgemønster SearchPattern pattern = SearchPattern.createPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);
Følgende søgemønstre understøttes:
Hvis du er interesseret i søgeresultater i et givet projekt eller endog i en given pakke, eller hvis du ved, at søgeresultater kun vil være placeret i hierarkiet for en given type, kan du oprette det relevante søgeomfang ved hjælp af createJavaSearchScope(IJavaElement[]) eller createHierarchyScope(IType).
Gør følgende, hvis du f.eks. vil oprette et søgeomfang i en given pakke:
// Hent pakken IPackageFragment pkg = ...; // Opret søgeomfang IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});
Eller hvis du vil oprette et søgeomfang i et hierarki af en given type:
// Hent typen IType type = ...; // Opret søgeomfang IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);
Endelig kan du oprette et søgeomfang, der omfatter hele arbejdsområdet, vha. createWorkspaceScope:
// Opret søgeomfang IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
Når du har oprettet et søgemønster og et søgeomfang, og du har udvidet SearchRequestor, kan du starte en søgeforespørgsel på denne måde:
// Hent søgemønster SearchPattern pattern = ...; // Hent søgeomfang IJavaSearchScope scope = ...; // Hent anmoderen af søgningen SearchRequestor requestor = ...; // Søg SearchEngine searchEngine = new SearchEngine(); searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null);
Der sendes en besked til søgeanmoderen om, at søgningen starter, ved hjælp af metoden beginReporting. Derefter rapporteres hvert søgeresultat ved hjælp af metoden acceptSearchMatch. Endelig angiver endReporting, at søgningen er afsluttet.
Søgeresultater rapporteres ved hjælp af metoden acceptSearchMatch(SearchMatch). I næste afsnit beskrives nogle SearchMatch-funktioner.
Et søgeresultat kan svare til et Java-element (dvs. en typeerklæring), eller det kan være indeholdt i et Java-element (f.eks. en reference til en type i en metode). Søgeprogrammet forsøger altid at finde det inderste Java-element, som svarer til eller indeholder søgeresultatet. Når der f.eks. søges efter referencer til en metode, kan en sådan reference måske findes i en initialiseringsfunktion. Den initialiseringsfunktion, som indeholder metodereferencen, er søgematchens element.
Søgeprogrammet prøver også at finde den ressource, som indeholder Java-elementet. Hvis Java-elementet er indeholdt i en kompileringsenhed eller en klassefil, er ressourcen den tilsvarende IFile. Hvis Java-elementet er indeholdt i en .jar-fil, er den returnerede ressource lig med .jar-filen, ellers NULL.
Kildepositionerne getOffset og getLength angives i forhold til den kompileringsenhed, der indeholder søgeresultatet. Hvis søgeresultatet er indeholdt i en .JAR-fil, er kildepositionerne relative i forhold til den tilknyttede kilde. De er (-1, -1), hvis der ikke er knyttet nogen kilde til .JAR-filen.
I de fleste tilfælde er søgeresultaterne nøjagtige, dvs. at søgeprogrammet har været i stand til at fastslå, at den givne match er den, der er blevet bedt om. I visse tilfælde kan søgeprogrammet dog ikke fastslå dette, hvilket gør matchen unøjagtig. Et par af årsagerne til, at en match er unøjagtig, kan være: