Pergunta

É possível acessar o Abstract Syntax Tree (AST) no interior do javac.exe programação? Você poderia dar um exemplo?

Foi útil?

Solução

Sim, é possível, mas somente a partir de Java 6. Peter von der Ahe fala sobre os dois JSRs em esta entrevista . Da JSR 199:

O JSR 199 Compiler API consiste em três coisas: A primeira basicamente permite que você invocar um compilador por meio da API. Em segundo lugar, a API permite personalizar a forma como os achados do compilador e escreve arquivos. Quero dizer arquivos no sentido abstrato, já que os arquivos o compilador trata não são necessariamente no sistema de arquivos. abstração de arquivo de JSR 199 permite que você tenha arquivos em um banco de dados e para gerar a saída diretamente para a memória, por exemplo. Finalmente, a API JSR 199 permite coletar diagnósticos do compilador de uma forma estruturada de forma que você pode facilmente transformar mensagens de erro, por exemplo, em linhas no editor de um IDE.

JSR 269 é a API de processamento de anotação.

Este artigo dá uma excelente visão geral de acessar a API Compiler Árvore . A seção " Acessando a árvore de sintaxe Resumo: a API Compiler árvore " parece particularmente adequado para a sua pergunta.

Dependendo do que você está fazendo, você também pode querer olhar para o Jackpot regra Idioma , que é um autônomo refatoração motor que plugins para a árvore Compiler.

Outras dicas

compilar e executar este com -cp tools.jar (onde você tem que especificar a localização do seu tools.jar, obviamente).

import com.sun.source.util.Trees;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class JCTreeTest {
    private static final JavaCompiler javac
            = ToolProvider.getSystemJavaCompiler();

    public static void main(String[] args) {
        final StandardJavaFileManager jfm
                = javac.getStandardFileManager(null, null, null);
        final JavaCompiler.CompilationTask task
                = javac.getTask(null, jfm, null, null, null,
                  jfm.getJavaFileObjects(args));
        final Trees trees = Trees.instance(task);
        // Do stuff with "trees"
    }
}

Ele compila e corre para mim, embora eu não tenha jogado com as árvores me coisas, então você vai ter que ler o javadoc si mesmo. :-) Boa sorte!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top