Plugin-modulen kan bruke JDT-APIet til å søke i Java-prosjekter i arbeidsområdet etter Java-elementer, for eksempel metodereferanser, feltdeklarasjoner, implementerere for et grensesnitt osv.
Inngangspunktet for Java-søk er klassen SearchEngine. Du kan søke etter bestemte mønstre i et Java-element og avgrense søket til spesifikke elementer. Søkemønstrene kan opprettes ved hjelp av createPattern. Et mønster avgrenses med createJavaSearchScope. Når et mønster og omfang er definert, brukes metoden search til å samle inn resultatene.
Søkeresultatene rapporteres til en SearchRequestor, som du må utvide for å få tilgang til resultatene.
En søkeoperasjon vil bruke både et mønster for å beskrive søkets natur og et omfang for å begrense området for undersøkelse.
Et søkemønster definerer hvordan søkeresultatene finnes. Du kna opprette et søkemønster ut fra et Java-element (se createPatternPattern(IJavaElement, int)) eller ut fra en streng (se createPattern(String, int, int, int).) Siste metode støtter jokertegn (dvs. '*') og kan brukes til å utvide søkeresultatene.
For eksempel lages et søkemønster for søk etter referanser til en gitt metode som følger:
// Hent metode IMethod method = ...; // Opprett søkemønster SearchPattern pattern = SearchPattern.createPattern(method, IJavaSearchConstants.REFERENCES);
Eller du kan lage et søkemønster for søk etter deklarasjoner av alle typer som begynner med "Obj":
// Opprett søkemønster SearchPattern pattern = SearchPattern.createPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);
Følgende søkemønstre støttes:
Hvis du er interessert i søkeresultater i et gitt prosjekt eller i en gitt pakke, eller hvis du vet at søkeresultatene bare kan finnes i hierarkiet av en gitt type, kan du opprette et hensiktsmessig søkeomfang ved hjelp av createJavaSearchScope(IJavaElement[]) eller createHierarchyScope(IType).
For eksempel opprettes et søkeomfang for en gitt pakke som følger:
// Hent pakke IPackageFragment pkg = ...; // Opprett søkeomfang IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});
Eller du kan opprette et søkeomfang for hierarkiet til en gitt type:
// Hent type IType type = ...; // Opprett søkeomfang IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);
Dessuten kan du opprette et søkeomfang som omfatter hele arbeidsområdet med createWorkspaceScope:
// Opprett søkeomfang IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
Når du har laget et søkemønster og et søkeomfang, og du har utvidet SearchRequestor, kan du starte en søkespørring som følger:
// Hent søkemønster SearchPattern pattern = ...; // Hent søkeomfang IJavaSearchScope scope = ...; // Hent søkebestiller SearchRequestor requestor = ...; // Søk SearchEngine searchEngine = new SearchEngine(); searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null);
Et varsel om at søket begynner, sendes til søkebestilleren ved hjelp av metoden beginReporting. Så rapporteres hvert søk ved hjelp av metoden acceptSearchMatch.Endelig viser endReporting at søket er ferdig.
Søkeresultatene rapporteres ved hjelp av metoden acceptSearchMatch(SearchMatch). Avsnittene nedenfor omhandler noen av funksjonene i SearchMatch.
Et søkeresultat kan tilsvare et Java-element (f.eks. en typedeklarasjon), eller det kan inneholdes i et Java-element (f.eks. en referanse til en type i en metode). Søkemotoren prøver alltid å finne det innerste Java-elementet som svarer til eller inneholder søkeresultatet. For eksempel kan søk etter referanser til en metode finnes en slik referanse i en initialiserer. Initialisereren som inneholder denne metodereferansen, er elementet for søketreffet.
Søkemotoren prøver også å finne ressursen som inneholder Java-elementet. Hvis Java-elementet er i en kompileringsenhet eller en klassefil, er ressursen tilsvarende IFile. Hvis Java-elementet er inneholdt i en .jar-fil, er den returnerte ressursen denne .jar-filen hvis den er i arbeidsområdet, ellers null.
Kildeposisjonene getOffset og getLength gis relativt i forhold til kompileringsenheten som inneholder søkeresultatet. Hvis søkeresultatet er inneholdt i en JAR-fil, er kildeposisjonene relative i forhold til den tilknyttede kilden. De er (-1, -1) hvis det ikke er noen kilde knyttet til JAR-filen.
I de fleste tilfeller er søkeresultatene nøyaktige. Det vil si at søkemotoren klarte å bestemme at gitt samsvar er det det ble spurt om. I noen tilfeller klarer imidlertid ikke søkemotoren dette, og i slike tilfeller er søkeresultatet unøyaktig. Noen mulige årsaker til unøyaktigheten er: