Manipulando o Código Java

O seu plug-in pode utilizar a API do JDT para criar classes ou interfaces, incluir métodos em tipos existentes ou alterar os métodos dos tipos.

O modo mais simples de alterar os objetos Java é utilizar a API de elementos Java. Técnicas mais gerais podem ser utilizadas para trabalhar com o código fonte bruto de um elemento Java.

Modificação de Código Utilizando Elementos Java

Gerando uma Unidade de Compilação

O modo mais fácil de gerar uma unidade de compilação de maneira programática, é utilizar IPackageFragment.createCompilationUnit. Você especifica o nome e o conteúdo da unidade de compilação. A unidade de compilação será criada dentro do pacote e a nova ICompilationUnit será retornada.

Uma unidade de compilação pode ser criada genericamente, criando-se um recurso de arquivo cuja extensão seja ".java" na pasta apropriada que corresponda ao diretório do pacote. A utilização da API de recursos genéricos fica na "retaguarda" das ferramentas Java, portanto, o gabarito Java não é atualizado até que os atendentes de alteração de recurso genérico sejam notificados e os atendentes JDT atualizem o gabarito Java com a nova unidade de compilação.

Modificando uma Unidade de Compilação

As modificações mais simples da origem Java podem ser feitas utilizando a API de elementos Java.

Por exemplo, você pode consultar um tipo a partir de uma unidade de compilação. Tendo o IType, você pode utilizar um protocolo, tal como createField, createInitializer, createMethod ou createType, para incluir membros de código fonte no tipo. O código fonte e as informações sobre a localização do membro são fornecidos nesses métodos.

A interface ISourceManipulation define manipulações origem comum para elementos java. Isso inclui métodos para renomear, mover, copiar ou excluir um membro do tipo.

Modificação Genérica de Código Fonte

Algumas modificações de código fonte não são fornecidas por meio da API de elementos Java. Um modo mais geral de editar o código fonte (como alterar o código fonte para elementos existentes) é feito utilizando o código fonte bruto da unidade de compilação e o DOM Java.

Essas técnicas incluem o seguinte:

// obter a origem de uma unidade de compilação
Conteúdo da cadeia = myCompilationUnit.getBuffer().getContents();

// Criar um JDOM editável
myJDOM = new DOMFactory();
myDOMCompilationUnit = myJDOM.createCompilationUnit(contents, "MyClass");

// Navegue e edite a estrutura de unidade de compilação utilizando
// o protocolo de nó JDOM. 
...
// Depois que as modificações forem feitas em todos os nós,
// extraia de volta a origem do nó DOM da unidade de compilação.
String newContents = myDOMCompilationUnit.getContents();

// Defina esse código de volta para dentro do elemento da unidade de compilação
myCompilationUnit.getBuffer().setContents(newContents);

// Salve o buffer no arquivo.
myCompilationUnit.save();

Essa técnica pode resultar em marcadores de problemas associados a números de linha incorretos, uma vez que os elementos Java não foram atualizados diretamente.

O gabarito de elementos Java não é mais apurado que os métodos e campos. A AST (árvore de sintaxe abstrata) utilizada pelo compilador não está disponível como API, portanto, as técnicas utilizadas pelo JDT para analisar a origem em estruturas programáticas não estão atualmente disponíveis como API.

Respondendo a Alterações em Elementos Java

Se o seu plug-in precisar tomar conhecimento das alterações dos elementos Java após o fato, você poderá registrar um IElementChangedListener Java com JavaCore.

JavaCore.addElementChangedListener(new MyJavaElementChangeReporter());.

Os atendentes de alteração de elementos Java são semelhantes em conceito aos atendentes de alteração de recursos (descritos em Rastreando Alterações de Recursos). O trecho a seguir implementa um relator de alteração de elementos Java que imprime os deltas de elementos no console do sistema.

public class MyJavaElementChangeReporter implements IElementChangedListener {
    public void elementChanged(ElementChangedEvent event) {
        IJavaElementDelta delta= event.getDelta();
        if (delta != null) {
            System.out.println("delta received: ");
            System.out.print(delta);
        }
    }
)

O IJavaElementDelta inclui o elemento que foi alterado e os flags que descrevem o tipo de alteração que ocorreu.