Efetuando Assistência ao Código em Código Java

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 modelo 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.

Conclusão de Código

Executando uma Conclusão de Código

Uma maneira de desempenhar programaticamente a conclusão de código é 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 CompletionRequestor para aceitar as conclusões possíveis.

O método em CompletionRequestor.accept aceita todos os tipos de sugestões para conclusão de código.  Os métodos de CompletionProposal fornecem informações que descrevem o elemento sugerido (seu nome, tipo de declaração, etc.), sua posição sugerida para inserção na unidade de compilação e sua importância.  

Um solicitante da conclusão pode aceitar vários tipos diferentes de conclusões. Esse tipo é concedido por CompletionProposal.getKind.

Alguns dos tipos possíveis de conclusão são (a lista completa de tipos possíveis de conclusão pode ser vista em CompletionProposal):

O solicitante da conclusão também deverá estar apto a aceitar erros de compilação.  

Importância da conclusão

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.

Opções da Conclusão de Código

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.

Seleção de Código

Executando uma Seleção de Código

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());

Seleção na localização do cursor

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) {
   }

Se você especificar um deslocamento após o primeiro caractere de fooMethod e especificar um comprimento de 0,  a seleção será computada para incluir o token fooMethod inteiro. Se ao invés disso, você especificar um comprimento de 5, a seleção será considerada como ooMet.