A API do JDT permite que outros plug-ins efetuem assistência ao código ou seleção de código em alguns elementos Java. Os elementos que permitem esta manipulação devem implementar ICodeAssist.
Há dois tipos de manipulação:
No gabarito Java há dois elementos que implementam esta interface: IClassFile e ICompilationUnit. A conclusão e a seleção de código só fornecem resultados para um arquivo de classe se ele tiver a origem conectada.
A única maneira de executar a conclusão de código, através de programação, é chamar ICodeAssist.codeComplete. Você especifica o deslocamento na unidade de compilação de acordo com a qual a conclusão de código é desejada. Você também deve fornecer uma instância de ICompletionRequestor para aceitar as possíveis conclusões.
Cada método em ICompletionRequestor aceita um tipo diferente de proposta para conclusão de código. Os parâmetros de cada método incluem textos que descrevem o elemento proposto (seu nome, tipo de declaração, etc.), sua posição proposta para inserção na unidade de compilação e sua importância.
Um solicitante de conclusão pode aceitar vários tipos diferentes de conclusões, incluindo a inserção dos seguintes elementos:
O solicitante da conclusão também deve estar apto a aceitar erros de compilação.
Se o plug-in não estiver interessado em todos os tipos de conclusão de código, um CompletionRequestorAdapter pode ser utilizado para que você só precise implementar os tipos de conclusões nos quais estiver interessado. O exemplo a seguir mostra um adaptador que é utilizado apenas para aceitar conclusões de classe.
// 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);
Como pode haver várias conclusões possíveis diferentes, o conceito de importância é utilizado para comparar a importância de uma conclusão sugerida a outras propostas. A importância é representada por um inteiro positivo. O valor não tem significado implícito exceto para ser utilizado comparativamente ao valor de outras propostas. A importância de um candidato à conclusão de código pode ser afetada pelo tipo esperado da expressão, a medida que se relaciona aos tipos no código vizinho, tais como tipos de variável, tipos de cast, tipos de retorno, etc. A presença de um prefixo ou sufixo esperado em uma conclusão também afeta sua importância.
O plug-in Núcleo do JDT define opções que controlam o comportamento da conclusão de código. Estas opções podem ser alteradas por outros plug-ins.
Opções adicionais permitem especificar prefixos e sufixos para os nomes de conclusão propostos de campos, campos estáticos, variáveis locais e argumentos de métodos.
Consulte Opções de Assistência ao Código do Núcleo do JDT para obter informações adicionais sobre as opções de assistência ao código e seus padrões.
A seleção de código é utilizada para localizar o elemento Java representado por uma faixa de texto (geralmente, o texto selecionado) em uma unidade de compilação. Para efetuar a seleção de código, através de programação,é preciso chamar ICodeAssist.codeSelect. Você deve fornecer a localização inicial do índice da seleção e seu 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.
No exemplo a seguir, a seleção de
código é chamada para uma unidade de compilação.
// 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());
Quando o comprimento da seleção é especificado como 0, uma seleção será computada através da localização do token completo que envolve o deslocamento especificado. Considere o seguinte exemplo de método:
public void fooMethod(Object) {
}