Esecuzione dell'assistente al codice sul codice Java

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.

Completamento di codice

Esecuzione di un completamento di codice

One way to programmatically perform code completion is to invoke ICodeAssist.codeComplete. Nell'unità di compilazione viene specificato l'offset dopo il quale si desidera eseguire il completamento del codice.  You must also supply an instance of CompletionRequestor to accept the possible completions.

The method in CompletionRequestor.accept accepts all kinds of proposals for code completion.  The methods of CompletionProposal give information that describes the proposed element (its name, declaring type, etc.), la posizione proposta per l'inserimento nell'unità di compilazione e la relativa pertinenza.  

A completion requestor can accept many different kinds of completions. This kind is given by CompletionProposal.getKind.

Some of the possible completion kinds are (The complete list of possible completion kinds can be seen on CompletionProposal):

Il richiedente di completamento deve essere inoltre in grado di accettare gli errori di compilazione.  

Pertinenza del completamento

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.

Opzioni di completamento codice

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.

Selezione di codice

Esecuzione di una selezione di codice

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.

   // Get the compilation unit
   ICompilationUnit unit = ...;
   
   // Get the offset and length
   int offset = ...;
   int length = ...;
   
   // perform selection
   IJavaElement[] elements = unit.codeSelect(offset, length);
   System.out.println("the selected element is " + element[0].getElementName());

Selezione nella posizione del cursore

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) {
   }

Se dopo il primo carattere di fooMethod si specifica un offset e si indica una lunghezza pari a 0,  la selezione verrà calcolata in modo da includere l'intero token fooMethod. Se, invece, viene specificata una lunghezza pari a 5, la selezione verrà considerata come ooMet.