Unterstützung für Code bei Java-Code ausführen

Mit der JDT-API können andere Plug-ins die Unterstützung für den Code oder die Codeauswahl für einige Java-Elemente ausführen. Elemente, die diese Bearbeitung zulassen, sollten ICodeAssist implementieren.

Es gibt zwei Typen der Bearbeitung:

Im Java-Modell gibt es zwei Elemente, die diese Schnittstelle implementieren: IClassFile und ICompilationUnit.  Die Codefertigstellung und die Codeauswahl geben Ergebnisse für eine Klassendatei nur dann an, wenn die betreffende Klassendatei über eine zugeordnete Quelle verfügt.

Codefertigstellung

Codefertigstellung ausführen

Die einzige Möglichkeit, die Codefertigstellung programmgestützt auszuführen, ist der Aufruf von ICodeAssist.codeComplete. Sie geben die relative Position in der Kompiliereinheit an, nach der die Codefertigstellung erfolgen soll.  Sie müssen außerdem ein Exemplar von ICompletionRequestor zur Verfügung stellen, um die möglichen Fertigstellungen zu akzeptieren.

Jede Methode in ICompletionRequestor akzeptiert einen anderen Vorschlagstyp für die Codefertigstellung.  Die Parameter der einzelnen Methoden enthalten jeweils Text, der das vorgeschlagene Element (dessen Namen, deklarierenden Typ usw.),seine vorgeschlagene Position für das Einfügen in die Kompiliereinheit sowie seine Relevanz beschreibt.  

Das anfordernde Element einer Fertigstellung kann viele unterschiedliche Typen von Fertigstellungen akzeptieren, die das Einfügen der folgenden Elemente umfassen:

Die Komponente, die die Fertigstellung anfordert, muss außerdem in der Lage sein, Kompilierungsfehler zu akzeptieren.  

Falls für Ihr Plug-in nicht alle Typen der Codefertigstellung in Frage kommen, kann ein Element CompletionRequestorAdapter verwendet werden, damit Sie jeweils nur die Typen von Fertigstellungen implementieren müssen, die für Sie von Interesse sind.  Das folgende Beispiel zeigt einen Adapter, mit dem lediglich Klassenfertigstellungen akzeptiert werden.

   // Get the compilation unit
   ICompilationUnit unit = ...;
   
   // Get the offset
   int offset = ...;
   
   // Create the requester
   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));
      }
   };
   
   // Compute proposals
   unit.codeComplete(offset, requestor);

Fertigstellungsrelevanz

Da unter Umständen viele verschiedene Typen der Fertigstellung möglich sein können, wird eine vorgeschlagene Fertigstellung anhand der Relevanz mit anderen Vorschlägen verglichen.  Die Relevanz wird durch eine positive ganze Zahl dargestellt.  Der Wert hat keine implizite Bedeutung. Er wird lediglich in Relation zu den Werten anderer Vorschläge verwendet, um diese miteinander vergleichbar zu machen.  Die Relevanz einer vorgeschlagenen Codefertigstellung kann durch den erwarteten Ausdruckstyp beeinflusst werden, da sich dieser auf die Typen im umgebenden Code bezieht (z. B. Variablentypen, Umsetzungsausdruckstypen, Rückgabetypen usw.).  Das Vorhandensein eines erwarteten Präfixes oder Suffixes in einer Fertigstellung wirkt sich ebenfalls auf deren Relevanz aus.

Optionen der Codefertigstellung

Das JDT-Kern-Plug-in definiert Optionen, die das Verhalten der Codefertigstellung steuern.  Diese Optionen können durch andere Plug-ins geändert werden.  

Über zusätzliche Optionen können Sie Präfixe und Suffixe für die vorgeschlagenen Fertigstellungsnamen für Felder, statische Felder, lokale Variablen und Methodenargumente angeben.  

Weitere Informationen zu den Optionen und Standardwerten der Unterstützung für Code können Sie unter  JDT-Kernoptionen der Unterstützung für Code nachlesen.

Codeauswahl

Codeauswahl ausführen

Mit der Codeauswahl wird das Java-Element gesucht, das durch einen Textbereich (normalerweise den ausgewählten Text) in einer Kompiliereinheit dargestellt ist.  Um die Codeauswahl über das Programm durchzuführen, müssen Sie ICodeAssist.codeSelect aufrufen. Sie müssen die Ausgangsindexposition der Auswahl und die Länge der Auswahl angeben. Das Ergebnis besteht in einem Bereich von Java-Elementen. Meistens befindet sich in dem Bereich nur ein Element. Wenn die Auswahl jedoch mehrdeutig ist, werden alle möglichen Elemente zurückgegeben.

Im folgenden Beispiel wird die Codeauswahl für eine Kompiliereinheit aufgerufen:

   // 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());

Auswahl an der Cursorposition

Wenn die Auswahllänge mit dem Wert 0 angegeben ist, wird die Auswahl berechnet, indem das vollständige Token gesucht wird, das die angegebene relative Position einschließt.  Nehmen wir an, die folgende Beispielmethode wird verwendet:

   public void fooMethod(Object) {
   }

Falls Sie nach dem ersten Zeichen von fooMethod eine relative Position sowie die Länge 0 angeben, wird die  Auswahl so berechnet, dass das gesamte Token fooMethod eingeschlossen ist. Geben Sie stattdessen die Länge mit dem Wert 5 an, wird die Auswahl ooMet verwendet.