Ditt insticksprogram kan använda JDT API till att söka efter Java-element i Java-projekt på arbetsytan, t.ex. metodhänvisningar, fältdeklarationer, implementatorer av ett gränssnitt, etc.
Ingångspunkten för Java-sökningen är klassen SearchEngine. Du kan söka efter särskilda mönster i ett Java-element och ange att sökningen ska omfatta vissa element. Du kan skapa sökmönster med createPattern. Ett mönsters omfattning anges med createJavaSearchScope. När ett mönster och en omfattning har definierats används metoden search till att samla in resultaten.
Sökresultat rapporteras till en SearchRequestor som du måste utöka för att få åtkomst till resultaten.
En sökoperation använder både ett mönster som beskriver sökningens natur och en omfattning som begränsar det intervall som undersöks.
Ett sökmönster definierar hur sökresultat hittas. Du kan antingen skapa ett sökmönster från ett Java-element (se createPatternPattern(IJavaElement, int)) eller från en sträng (se createPattern(String, int, int, int).) Den senaste metoden stöder jokertecken (t.ex. '*') och kan användas till att bredda sökresultaten.
Ett exempel: så här skapar du ett sökmönster för sökning efter hänvisningar till en given metod:
// Get the method IMethod method = ...; // Create search pattern SearchPattern pattern = SearchPattern.createPattern(method, IJavaSearchConstants.REFERENCES);
Du kan också skapa ett sökmönster för sökning efter deklarationen av alla typer som börjar på "Obj":
// Create search pattern SearchPattern pattern = SearchPattern.createPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);
Följande sökmönster kan användas:
Om du är intresserad av sökresultat i ett givet projekt eller till och med i ett givet paket, eller om du vet att sökresultaten bara kan finnas i hierarkin av en given typ, kan du skapa sökomfånget med createJavaSearchScope(IJavaElement[]) eller createHierarchyScope(IType).
Ett exempel: så här skapar du ett sökomfång för ett givet paket:
// Get the package IPackageFragment pkg = ...; // Create search scope IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});
Eller så kan du skapa ett sökomfång för hierarkin för en given typ:
// Get the type IType type = ...; // Create search scope IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);
Slutligen kan du skapa ett sökomfång som omfattar hela arbetsytan genom att använda createWorkspaceScope:
// Create search scope IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
När du har skapat ett sökmönster och ett sökomfång, samt utökatSearchRequestor, kan du starta en sökfråga på följande sätt:
// 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);
Ett meddelande om att sökningen startar skickas till den som begärde sökningen via metoden beginReporting. Sedan rapporteras alla sökresultat via metoden acceptSearchMatch. Slutligen anger endReporting att sökningen har avslutats.
Sökresultaten rapporteras med metoden acceptSearchMatch(SearchMatch). Nedan belyses en del funktioner hos SearchMatch.
Ett sökresultat kan motsvara ett Java-element (t.ex. en typdeklaration) eller så kan det finnas i ett Java-element (t.ex. en hänvisning till en typ i en metod). Sökmotorn försöker alltid hitta det innersta Java-element som motsvarar eller innehåller sökresultat. Ett exempel: om du söker efter hänvisningar till en metod kan det hända att du hittar en sådan hänvisning i en initierare. Initieraren som innehåller denna metodhänvisning är elementet för sökmatchningen.
Sökmotorn försöker också hitta den resurs som innehåller Java-elementet. Om Java-elementet innehåller en kompileringsenhet eller en klassfil, är resursen den motsvarande IFile. Om Java-elementet finns i en .jar.fil, är den returnerade resursen denna .jar-fil om den finns i arbetsytan, i annat fall null.
Källpositionerna getOffset och getLength anges i förhållande till den kompileringsenhet som innehåller sökresultatet. Om sökresultatet finns i en .jar-fil, anges källpositionerna i förhållanden till den anslutna källan. De är (-1, -1) om det inte finns någon källa ansluten till .jar-fil.
I de flesta fall är sökresultaten korrekta, vilket innebär att sökmotorn kunde fastställa att den givna träffen var vad som eftersöktes. Däremot kan det hända att sökmotorn inte kan göra detta. I så fall kallas träffen för inkorrekt. Möjliga orsaker till detta är: