Interfejs API JDT umożliwia innym modułom dodatkowym wykonywanie operacji asystenta kodu lub operacji wyboru kodu dla niektórych elementów Java. Elementy pozwalające na takie manipulacje powinny implementować interfejs ICodeAssist.
Istnieją dwa rodzaje manipulacji:
W modelu Java istnieją dwa elementy implementujące ten interfejs: IClassFile i ICompilationUnit. Funkcje uzupełniania kodu i wyboru kodu zwracają wyniki dla pliku CLASS tylko wtedy, gdy zostało do niego przyłączone źródło.
Jedynym sposobem programowego wykonywania uzupełnienia kodu jest wywołanie metody ICodeAssist.codeComplete. Należy określić przesunięcie w jednostce kompilacji wskazujące miejsce, w którym ma być wstawione uzupełnienie kodu. Należy także udostępnić instancję klasy implementującej interfejs ICompletionRequestor, która będzie akceptować możliwe uzupełnienia.
Każda metoda interfejsu ICompletionRequestor akceptuje inny rodzaj propozycji uzupełnienia kodu. Za pomocą parametrów każdej z tych metod przekazywane są następujące dane: tekst opisujący proponowany element (jego nazwa, typ deklarujący itd.), proponowane miejsce wstawienia uzupełnienia w jednostce kompilacji oraz jego istotność.
Requester uzupełnień może akceptować wiele różnych typów uzupełnień, w tym następujące elementy:
Requester uzupełnień musi również być w stanie akceptować błędy kompilacji.
Jeśli moduł dodatkowy nie musi obsługiwać wszystkich rodzajów uzupełnień kodu, można użyć klasy adaptacyjnej CompletionRequestorAdapter, dzięki której można zaimplementować tylko wybrane rodzaje uzupełnień. Poniższy przykład przedstawia klasę adaptacyjną, która jest używana tylko do akceptowania uzupełnień klas.
// Pobieranie jednostki kompilacji ICompilationUnit unit = ...; // Pobieranie przesunięcia int offset = ...; // Tworzenie requestera ICompletionRequestor requestor = new CompletionRequestorAdapter() { public void acceptClass( char[] packageName, char[] className, char[] completionName, int modifiers, int completionStart, int completionEnd, int relevance) { System.out.println("propose a class named " + new String(className)); } }; // Obliczanie propozycji unit.codeComplete(offset, requestor);
Jeśli istnieje wiele możliwych uzupełnień, informacja o istotności jest używana w celu oceny użyteczności proponowanego uzupełnienia w porównaniu z innymi propozycjami. Istotność jest reprezentowana przez dodatnią liczbę całkowitą. Wartość ta nie ma żadnego dodatkowego znaczenia - jest ona po prostu porównywana z wartościami innych propozycji. Na istotność proponowanego uzupełnienia kodu może mieć wpływ oczekiwany typ wyrażenia, ponieważ jest on powiązany z typami w otaczającym kodzie, takimi jak typy zmiennych, typy rzutowania, typy zwracanych wartości itd. Obecność oczekiwanego przedrostka lub przyrostka w uzupełnieniu również wpływa na jego istotność.
Moduł dodatkowy podstawowego modułu JDT definiuje opcje sterujące zachowaniem funkcji uzupełniania kodu. Te opcje mogą być zmieniane przez inne moduły dodatkowe.
Dodatkowe opcje umożliwiają określenie przedrostków i przyrostków nazw proponowanych uzupełnień dla pól, pól static, zmiennych lokalnych i argumentów metod.
Więcej informacji na temat opcji asystenta kodu i ich wartości domyślnych można znaleźć w sekcji Opcje asystenta kodu podstawowego modułu JDT.
Funkcja wyboru kodu jest używana do wyszukiwania elementu Java reprezentowanego przez dany zakres tekstu (zwykle zaznaczony tekst) w jednostce kompilacji. Do programowego przeprowadzania wyboru kodu służy metoda ICodeAssist.codeSelect. Konieczne jest podanie początkowego położenia indeksu zaznaczenia oraz jego długości. Wynikiem jest tablica elementów Java. W większości przypadków tablica ta zawiera tylko jeden element, ale jeśli wybór jest niejednoznaczny, zwracane są wszystkie możliwe elementy.
W poniższym przykładzie wybór kodu jest wywoływany dla jednostki kompilacji.
// Pobieranie jednostki kompilacji
ICompilationUnit unit = ...;
// Pobieranie przesunięcia i długości
int offset = ...;
int length = ...;
// dokonywanie wyboru
IJavaElement[] elements = unit.codeSelect(offset, length);
System.out.println("the selected element is " + element[0].getElementName());
Jeśli długość zaznaczenia jest określona jako 0, wybór zostanie ustalony przez wyszukanie pełnego elementu, który obejmuje określone przesunięcie. Można rozważyć następującą przykładową metodę:
public void fooMethod(Object) {
}