L'API JDT permet aux autres plug-ins d'effectuer une assistance à la saisie de code ou une sélection de code sur certains éléments Java. Les éléments autorisant cette manipulation doivent implémenter ICodeAssist.
Il existe deux types de manipulation :
Le modèle Java contient deux éléments implémentant cette interface : IClassFile et ICompilationUnit. L'exécution et la sélection de code ne renvoient les résultats correspondants à un fichier classe que s'il est connecté à une source.
La seule façon d'exécuter le code par un programme est d'appeler ICodeAssist.codeComplete. Vous spécifiez le décalage dans l'unité de génération selon lequel le code doit être exécuté.Vous devez également fournir une instance de ICompletionRequestor pour accepter les exécutions possibles.
Chaque méthode dans ICompletionRequestor accepte un type de proposition différent pour l'exécution du code.Les paramètres de chaque méthode incluent un texte décrivant l'élément proposé (son nom, son type de déclaration, etc.), la position proposée pour son insertion dans l'unité de génération et sa pertinence.
Un demandeur d'exécution peut accepter plusieurs types d'exécution différents, y compris l'insertion des éléments suivants :
Le demandeur d'exécution doit être également en mesure d'accepter des erreurs de génération.
Si votre plug-in n'est pas intéressé par tous les types d'exécution de code, CompletionRequestorAdapter peut être utilisée de façon à ce que vous n'ayez qu'à implémenter les types qui vous intéressent.L'exemple suivant illustre un adaptateur utilisé uniquement pour accepter les exécutions de classe.
// Obtention de l'unité de compilation ICompilationUnit unit = ...; // Obtention du décalage int offset = ...; // Création du demandeur 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)); } }; // Calcul des propositions unit.codeComplete(offset, requestor);
Du fait qu'il peut y avoir de nombreuses exécutions différentes possibles, la notion de pertinence est utilisée pour comparer la pertinence d'une exécution suggérée par rapport à d'autres propositions.La pertinence est représentée par un entier positif.La valeur n'a aucune signification explicite, si ce n'est qu'elle doit être utilisée en fonction de la valeur d'autres propositions.La pertinence d'un candidat d'exécution de code peut être affectée par le type d'expression attendu, du fait qu'il est lié aux types du code environnant, tels que les types de variable, les types de transtypage, les types de retour, etc. La présence d'un préfixe ou d'un suffixe attendu dans une exécution affecte également sa pertinence.
Le plug-in de l'API principale JDT définit des options qui contrôlent le comportement d'exécution du code.Ces options peuvent être modifiées par d'autres plug-ins.
Des options supplémentaires permettent de spécifier les préfixes et les suffixes des noms d'exécution proposés pour les zones, les zones statiques, les variables locales et les arguments de méthode.
Pour plus d'informations sur les options de l'assistant de code et leurs valeurs par défaut, reportez-vous à la rubrique Options de l'assistant de code de l'API principale JDT.
La sélection de code permet de rechercher l'élément Java représenté par une plage de texte (généralement le texte sélectionné) dans une unité de compilation.Pour effectuer une sélection de code par programme, vous devez appeler ICodeAssist.codeSelect. Vous devez fournir l'emplacement de départ de l'index de la sélection et sa longueur. Le résultat est matérialisé par un tableau d'éléments Java. La plupart du temps, le tableau ne contient qu'un seul élément, mais si la sélection est ambiguë, tous les éléments possibles sont renvoyés.
Dans l'exemple suivant, la sélection de code est appelée pour une unité de compilation.
// Obtention de l'unité de compilation
ICompilationUnit unit = ...;
// Obtention du décalage et de la longueur
int offset = ...;
int length = ...;
// Exécution de la sélection
IJavaElement[] elements = unit.codeSelect(offset, length);
System.out.println("the selected element is " + element[0].getElementName());
Si la longueur de la sélection a pour valeur 0, une sélection est calculée en recherchant le jeton complet qui enferme le décalage spécifié.Considérons l'exemple de méthode suivant :
public void fooMethod(Object) {
}