Executar assistente de código num código Java

A API JDT permite que outros plug-ins executem uma assistência de código ou uma selecção de código em alguns elementos Java. Os elementos que permitem esta manipulação devem implementar ICodeAssist.

Existem duas espécies de manipulação:

No modelo Java, existem dois elementos que implementam esta interface: o IClassFile e o ICompilationUnit.   A conclusão de código e selecção de código só respondem resultados para um ficheiro de classes se tiver fonte anexada.

Conclusão de código

Executar uma conclusão de código

Uma forma de executar programaticamente a conclusão do código é invocar ICodeAssist.codeComplete. Especifique a distância na unidade de compilação para a qual deseja a conclusão de código.   o utilizador deve fornecer igualmente uma instância de CompletionRequestor para aceitar as conclusões possíveis.

O método em CompletionRequestor.accept aceita todos os tipos de propostas para conclusão de código.  Os métodos de CompletionProposal fornecem informações que descrevem o elemento proposto (nome e tipo de declaração respectivo, etc.), a respectiva posição de inserção na unidade de compilação e a respectiva relevância.   

Um solicitante de conclusões pode aceitar vários tipos diferentes de conclusões. Este tipo é fornecido por CompletionProposal.getKind.

Alguns dos tipos de conclusões possíveis são (A lista completa dos tipos de conclusões possíveis pode ser consultada em CompletionProposal):

O solicitante de conclusões deve igualmente conseguir aceitar erros de compilação.  

Relevância de conclusões

Como existem várias conclusões possíveis, a noção de relevância é utilizada para comparar a relevância de um conclusão sugerida com outras propostas.   A relevância é representada por um número inteiro positivo.   O valor só tem um significado implícito para ser utilizado em relação ao valor de outras propostas.   A relevância de um candidato a conclusão de código pode ser afectada pelo tipo esperado de expressão, pois está relacionado com os tipos no código envolvente, como tipos de variáveis, tipos de conversão, tipos de devolução, etc.  A presença de um prefixo ou sufixo esperado numa conclusão também afecta a respectiva relevância.

Opções de conclusão de código

O plug-in do Núcleo JDT define as opções que controlam o comportamento da conclusão do código.   Estas opções podem ser alteradas por outros plug-ins.   

Outras opções permitem especificar prefixos e sufixos para os nomes de conclusão propostos para campos, campos estáticos, variáveis locais e argumentos de métodos.   

Consulte  Opções de Assistente de Código de Núcleo JDT para obter mais informações sobre opções do assistente de código e respectivas predefinições.

Selecção de código

Executar uma selecção de código

A selecção de código é utilizada para encontrar o elemento Java representado por um intervalo de texto (normalmente o texto seleccionado) numa unidade de compilação.   Para efectuar de forma programática uma selecção de código, tem de invocar o ICodeAssist.codeSelect. Tem de fornecer a localização do índice remissivo inicial da selecção e respectivo comprimento. O resultado é uma tabela de elementos Java. Na maioria das vezes, só existe um elemento na tabela, mas se a selecção for ambígua são devolvidos todos os elementos possíveis.

No exemplo seguinte, é invocada um selecção de código para uma unidade de compilação.

      // Obter a unidade de compilação
   ICompilationUnit unit = ...;
   
   // Obter a distância e o comprimento
   int offset = ...;
   int length = ...;
   
   // executar a selecção
   IJavaElement[] elements = unit.codeSelect(offset, length);
   System.out.println("the selected element is " + element[0].getElementName());

Selecção na localização do cursor

Quando especifica 0 como comprimento da selecção, esta será calculada encontrando o sinal concluída que delimita a distância especificada.   Veja o método do exemplo seguinte:

   public void fooMethod(Object) {
   }

Se especificar uma distância depois do primeiro carácter de fooMethod e especificar um comprimento de 0,  a selecção será calculada para incluir todo o sinal fooMethod. Se, por outro lado, especificar um comprimento de 5, a selecção considera ooMet.