API JDT позволяет другим модулям выполнять для элементов Java операции по завершению или по выбору кода. Элементы, для которых можно выполнять эти действия, должны реализовать интерфейс ICodeAssist.
Существуют два рода действий:
В модели Java есть два элемента, реализующие этот интерфейс: IClassFile и ICompilationUnit. Операции завершения кода и выбора кода возвращают результат для файла класса только в том случае, если для него существует прикрепленный исходный код.
Метод ICodeAssist.codeComplete предоставляет способ программного выполнения завершения кода. Необходимо указать позицию (offset) в единице компиляции, после которой требуется выполнить завершение кода. Необходимо также предоставить экземпляр интерфейса CompletionRequestor для приема возможных вариантов завершения.
Метод в CompletionRequestor.accept принимает все типы предложений выполнения кода. Методы CompletionProposal содержат информацию, описывающую предложенный элемент (его имя, объявляющий тип и т.д.), предлагаемую позицию для его вставки в единицу компиляции, а также его релевантность.
Инициатор завершения кода может принимать различные типы вариантов завершения. Этот тип задается CompletionProposal.getKind.
Ниже приведены некоторые другие возможные типы завершения кода (полный список возможных типов завершения приведен в разделе CompletionProposal):
Кроме того, инициатор завершения кода должен принимать сообщения об ошибках компиляции.
Поскольку может существовать несколько различных вариантов завершения кода, используется понятие релевантности для оценки уместности предложенного завершения по сравнению с другими вариантами. Релевантность представляется положительным целым числом. Эта величина не имеет никакого скрытого смысла; она используется только для сравнения данного варианта с другими вариантами. Релевантность варианта завершения кода может зависеть от ожидаемого типа выражения, так как он связан с типами, существующими в окружающем коде, например, с типами переменных, приведенными типами, возвращаемыми типами и т.п. Наличие в варианте завершения ожидаемого префикса или суффикса также влияет на его релевантность.
Модуль JDT Core определяет опции, управляющие поведением завершения кода. Эти опции могут быть изменены другими модулями.
Дополнительные опции позволяют задавать префиксы и суффиксы для предлагаемых вариантов завершения имен полей, статических полей, локальных переменных и параметров методов.
За дополнительной информацией об опциях помощника по работе с кодом и их значениях по умолчанию обратитесь к документу Опции помощника по работе с кодом JDT Core.
Операция выбора кода применяется для поиска элемента Java, представленного фрагментом текста (обычно - выделенным текстом) в единице компиляции. Для программного выполнения операции выбора кода следует вызывать метод ICodeAssist.codeSelect. Необходимо задать расположение начального индекса и длину выбранного фрагмента. Результат представляется в виде массива элементов Java. Чаще всего этот массив содержит единственный элемент, однако если выделение неоднозначно, то возвращаются все возможные элементы.
Приведенный ниже пример содержит вызов метода выбора кода для
единицы компиляции.
// Получить единицу компиляции
ICompilationUnit unit = ...;
// Получить начальную позицию (offset) и длину
int offset = ...;
int length = ...;
// выполнить выбор
IJavaElement[] elements = unit.codeSelect(offset, length);
System.out.println("выбранный элемент: " + element[0].getElementName());
Если для длины выделенного фрагмента текста задано нулевое значение, то длина принимается равной длине законченной лексемы, включающей начальную позицию. Рассмотрим следующий пример метода:
public void fooMethod(Object) {
}