API JDT позволяет другим модулям выполнять для элементов Java операции по завершению или по выбору кода. Элементы, для которых можно выполнять эти действия, должны реализовать интерфейс ICodeAssist.
Существуют два рода действий:
В модели Java есть два элемента, реализующие этот интерфейс: IClassFile и ICompilationUnit. Операции завершения кода и выбора кода возвращают результат для файла класса только в том случае, если для него существует прикрепленный исходный код.
Метод ICodeAssist.codeComplete предоставляет единственный способ программного выполнения завершения кода. Необходимо указать позицию (offset) в единице компиляции, после которой требуется выполнить завершение кода. Необходимо также предоставить экземпляр интерфейса ICompletionRequestor для приема возможных вариантов завершения.
Каждый метод в ICompletionRequestor принимает свой вариант завершения кода. Параметры этого метода включают текст, описывающий предложенный элемент (его имя, объявляющий тип и т.д.), предлагаемую позицию для его вставки в единицу компиляции, а также его релевантность.
Инициатор завершения кода может принимать различные типы вариантов завершения, включая вставку следующих элементов:
Кроме того, инициатор завершения кода должен принимать сообщения об ошибках компиляции.
Если для вашего модуля не обязательно генерировать все типы завершения кода, то можно использовать CompletionRequestorAdapter; при этом потребуется реализовать только те типы завершения, которые нужны. Ниже приведен пример адаптера, который используется только для приема завершений классов.
// Получить единицу компиляции ICompilationUnit unit = ...; // Получить смещение int offset = ...; // Создать инициатор ICompletionRequestor requestor = new CompletionRequestorAdapter() { public void acceptClass( char[] packageName, char[] className, char[] completionName, int modifiers, int completionStart, int completionEnd, int relevance) { System.out.println("предлагать класс с именем " + new String(className)); } }; // Вычисление предложений unit.codeComplete(offset, requestor);
Поскольку может существовать несколько различных вариантов завершения кода, используется понятие релевантности для оценки уместности предложенного завершения по сравнению с другими вариантами. Релевантность представляется положительным целым числом. Эта величина не имеет никакого скрытого смысла; она используется только для сравнения данного предложения с другими предложениями. Релевантность варианта завершения кода может зависеть от ожидаемого типа выражения, так как он связан с типами, существующими в окружающем коде, например, с типами переменных, приведенными типами, возвращаемыми типами и т.п. Наличие в варианте завершения ожидаемого префикса или суффикса также влияет на его релевантность.
Модуль 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) {
}