Usnadnění práce s kódem Java (použití CodeAssist)

Rozhraní API JDT poskytuje ostatním modulům plug-in službu Usnadnění práce s kódem nebo Výběr kódu pro určité prvky Java. Prvky umožňující takovouto manipulaci by měly implementovat ICodeAssist.

K dispozici jsou dva typy prováděných úkonů:

V modelu Java jsou dva prvky implementující toto rozhraní: IClassFile a ICompilationUnit.  Dokončování kódu a výběr kódu poskytují výsledky pro soubor třídy pouze, pokud je připojen ke zdroji.

Dokončování kódu

Dokončování kódu

Jediným způsobem dokončování kódu z programu je spuštění ICodeAssist.codeComplete. Zadáte počáteční polohu té části kompilační jednotky, ve které chcete dokončení kódu provést.  Rovněž musíte zřídit instanci ICompletionRequestor, jež zajistí přijetí možných dokončení.

Jednotlivé metody v ICompletionRequestor akceptují různé typy návrhů dokončení kódu.  Textové parametry jednotlivých metod popisují navrhovaný prvek (název, typ deklarace atd.), navrhovanou polohu jeho vložení do kompilační jednotky a jeho relevanci.  

Žadatel dokončení může přijímat různé typy dokončování včetně vkládání následujících prvků:

Žadatel dokončení musí být rovněž schopen přijímat chyby kompilace.  

Pokud váš modul plug-in nebude některý ze způsobů dokončování kódu používat, můžete CompletionRequestorAdapter použít k výběrové implementaci pouze takových typů dokončování, o které máte skutečně zájem.  Následující příklad předvádí adaptér, který je určen pouze k přijímání dokončování tříd.

// Získat kompilační jednotku
   ICompilationUnit unit = ...;
   
   // Získat ofset
   int offset = ...;
   
   // Vytvořit žadatele
   ICompletionRequestor requestor = new CompletionRequestorAdapter() {
      public void acceptClass(
         char[] packageName,
         char[] className,
         char[] completionName,
         int modifiers,
         int completionStart,
         int completionEnd,
         int relevance) {
         System.out.println("navrhnout třídu s názvem " + new String(className));
      }
   };
   
   // Výpočet návrhů
   unit.codeComplete(offset, requestor);

Relevance dokončování

Protože může být k dispozici více možných a vzájemně odlišných dokončení, používáme pojem relevance k porovnávání doporučeného dokončení s ostatními návrhy.  Relevance je reprezentována kladným celým číslem.  Hodnota nemá žádný implicitní význam a je určena výlučně k porovnávání s hodnotami ostatních návrhů.  Relevance kandidáta na dokončení kódu může být ovlivněna očekávaným typem výrazu, protože se vztahuje k typům použitým v okolním kódu, např. k typům proměnných, přetypovaným typům, návratovým typům atd.  Relevanci ovlivňuje rovněž přítomnost očekávané předpony či přípony v dokončení.

Volby dokončování kódu

Modul plug-in JDT Core definuje volby, které ovládají chování dokončování kódu.  Tyto volby lze měnit jinými moduly plug-in.  

Další volby umožňují zadávání předpon a přípon pro navržené dokončovací názvy polí, statických polí, lokálních proměnných a argumentů metod.  

Další informace o volbách Usnadnění práce s kódem a o jejich výchozích hodnotách naleznete v tématu  Volby usnadnění práce s kódem JDT Core.

Výběr kódu

Provedení výběru kódu

Výběr kódu se používá k vyhledání prvku Java představovaného úsekem textu (v typickém případě zvoleného textu) v kompilační jednotce.  Chcete-li provést výběr textu v programu, musíte spustit ICodeAssist.codeSelect. Musíte poskytnout počáteční polohu a délku výběru. Výsledkem je pole prvků Java. Většinu času je v poli pouze jediný prvek. Je-li však volba nejednoznačná, vrací všechny možné prvky.

V následujícím příkladu je volán výběr kódu pro kompilační jednotku.

   // Získat kompilační jednotku
   ICompilationUnit unit = ...;
   
   // Získat ofset a délku
   int offset = ...;
   int length = ...;
   
   // Provést volbu
   IJavaElement[] elements = unit.codeSelect(offset, length);
   System.out.println("vybrán je prvek" + element[0].getElementName());

Výběr na místě kurzoru

Je-li zvolena nulová délka výběru, bude výběr vypočten vyhledáním kompletního tokenu, jehož délka se shoduje se zadaným ofsetem.  Podívejte se na následující metodu:

   public void fooMethod(Object) {
   }

Zadáte-li ofset po prvním znaku fooMethod a zároveň nulovou délku,  bude výběr vypočten tak, aby byl zahrnut celý token fooMethod. Zadáte-li naopak délku 5, vypočte se výběr ooMet.