A API do JDT permite que outros plug-ins executem codeassist ou codeselect em alguns elementos Java. Os elementos que permitem esta manipulação implementam ICodeAssist. No gabarito Java há dois elementos que implementam esta interface: IClassFile e ICompilationUnit.
Há dois tipos de manipulação:
Nota: a conclusão e a seleção fornecerão resultados para um arquivo de classe apenas se ele tiver a origem conectada.
A única maneira de executar conclusão de código através de programação é utilizar ICodeAssist.codeComplete. Você especifica a localização da conclusão na unidade e fornece uma instância de ICompletionRequestor para aceitar as conclusões possíveis.
Cada tipo de proposta é aceita por um método do solicitante. Os parâmetros desses métodos descrevem o elemento (nome, parâmetros, tipo de declaração, ...) e sua posição, assim como a importância da proposta no contexto atual.
Quando não estiver interessado em todos os tipos de resultados, uma maneira simples de executar a conclusão de código é utilizar CompletionRequestorAdapter.
// Obter a unidade de compilação
ICompilationUnit unit = ...;
// Obter o deslocamento
int offset = ...;
// Criar o solicitante
ICompletionRequestor requestor = new CompletionRequestorAdapter() {
public void acceptClass(
char[] packageName,
char[] className,
char[] completionName,
int modifiers,
int completionStart,
int completionEnd,
int relevance) {
System.out.println("propor uma classe chamada " + new String(className));
}
};
// Calcular propostas
unit.codeComplete(offset, requestor);
As opções da conclusão de código podem ser alteradas por outros plug-ins. É possível modificar as opções do Núcleo do JDT para alterar o comportamento da conclusão.
Há duas opções:
Para saber como modificar as opções do Núcleo do JDT, consulte: O que são opções do Núcleo do JDT?
Para executar seleção de código através de programação, o método a ser utilizado é ICodeAssist.codeSelect. Este método precisa conhecer a localização inicial da seleção e o comprimento.
O resultado é uma matriz de elementos Java. Na maior parte do tempo, há apenas um elemento na matriz, mas, se a seleção for ambígua, todos os elementos possíveis serão retornados.
// Obter a unidade de compilação
ICompilationUnit unit = ...;
// Obter o deslocamento e o comprimento
int offset = ...;
int length = ...;
// executar seleção
IJavaElement[] elements = unit.codeSelect(offset, length);
System.out.println("o elemento selecionado é " + element[0].getElementName());
Se o comprimento da seleção for igual a 0, a seleção será calculada com o token de inclusão da conclusão.
public void fooMethod(Object) { }Quando o deslocamento estiver depois do primeiro caractere de fooMethod e o comprimento for 0, a seleção será fooMethod. Porém, se o comprimento for 5, a seleção será ooMet.