L'API JDT consente ad altri plugin di eseguire l'assistente al codice o la selezione del codice su alcuni elementi Java. Gli elementi che consentono questa manipolazione devono implementare ICodeAssist.
Esistono due tipi di manipolazione:
Nel modello Java sono presenti due elementi che implementano questa interfaccia: IClassFile e ICompilationUnit. Il completamento di codice e la selezione di codice forniscono dei risultati per un file di classe solo se hanno un'origine collegata.
L'unico modo per eseguire il completamento di codice in modo programmatico consiste nel richiamare ICodeAssist.codeComplete. Nell'unità di compilazione viene specificato l'offset dopo il quale si desidera eseguire il completamento del codice. Per accettare i possibili completamenti, è necessario inoltre fornire un'istanza di ICompletionRequestor.
Ciascun metodo in ICompletionRequestor accetta un tipo diverso di proposta per il completamento del codice. I parametri di ciascun metodo includono il testo che descrive l'elemento proposto (il nome, il tipo di dichiarazione, ecc.), la posizione proposta per l'inserimento nell'unità di compilazione e la relativa pertinenza.
Un richiedente di completamento può accettare tipi diversi di completamento, incluso l'inserimento dei seguenti elementi:
Il richiedente di completamento deve essere inoltre in grado di accettare gli errori di compilazione.
Se per il plugin non si desidera eseguire tutti i tipi di codice di completamento, può essere utilizzato un CompletionRequestorAdapter, in modo da implementare solo i tipi di completamento desiderati. L'esempio di seguito riportato mostra un adattatore utilizzato solo per accettare i completamenti delle classi.
// Ottenere l'unità di compilazione ICompilationUnit unit = ...; // Ottenere l'offset int offset = ...; // Creare il richiedente 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)); } }; // Elaborare proposte unit.codeComplete(offset, requestor);
Poiché i tipi di completamento possibili sono diversi, la nozione di pertinenza viene utilizzata per confrontare la pertinenza di un completamento consigliato con altre proposte. La pertinenza viene rappresentata da un numero intero positivo. Il valore non ha alcun significato implicito, eccetto il fatto di essere utilizzato in relazione ad altre proposte. La pertinenza di un possibile completamento di codice, essendo correlata ai tipi presenti nel codice circostante, ad esempio i tipi di variabile, i tipi di cast, i tipi di restituzione e così via, può essere influenzata dal tipo di espressione previsto. Anche la presenza di un prefisso o suffisso in un completamento influenza la relativa pertinenza.
Il plugin principale di JDT definisce opzioni che controllano il comportamento del completamento di codice. Queste opzioni possono essere modificare da altri plugin.
Opzioni supplementari consentono di specificare prefissi e suffissi per nomi di completamento proposti per campi, campi statici, variabili locali e argomenti di metodo.
Per ulteriori informazioni sulle opzioni di assistente al codice e sui relativi valori predefiniti, consultare la sezione relativa alle opzioni di assistente al codice principale di JDT.
La selezione di codice viene utilizzata per ricercare l'elemento Java rappresentato da un intervallo di testo (in genere il testo selezionato) in un'unità di compilazione. Per eseguire in modo programmatico la selezione di codice, è necessario richiamare ICodeAssist.codeSelect. È necessario fornire il percorso dell'indice di inizio della selezione e la relativa lunghezza. Il risultato è una matrice di elementi Java. Per la maggior parte del tempo, nella matrice è presente un unico elemento ma, se la selezione è ambigua, vengono restituiti tutti gli elementi possibili.
Nell'esempio di seguito riportato, la selezione di codice viene richiamata per un'unità di compilazione.
// Ottenere l'unità di compilazione
ICompilationUnit unit = ...;
// Ottenere l'offset e la lunghezza
int offset = ...;
int length = ...;
// eseguire la selezione
IJavaElement[] elements = unit.codeSelect(offset, length);
System.out.println("the selected element is " + element[0].getElementName());
Quando per la lunghezza della selezione viene specificato 0, la selezione verrà calcolata mediante la ricerca di un token completo che racchiude l'offset specificato. Si consideri il seguente metodo di esempio:
public void fooMethod(Object) {
}