Question

Est-il possible d’accéder par programme à l’arbre de syntaxe abstraite (AST) à l’intérieur du fichier javac.exe? Pourriez-vous donner un exemple?

Était-ce utile?

La solution

Oui, c'est possible, mais uniquement depuis Java 6. Peter von der Ah & # 233; parle des deux JSR dans cette interview . De la JSR 199:

  

L’API du compilateur JSR 199 se compose de trois choses: La première vous permet d’appeler un compilateur via l’API. Deuxièmement, l'API vous permet de personnaliser la manière dont le compilateur trouve et écrit des fichiers. Je veux dire les fichiers au sens abstrait, car les fichiers traités par le compilateur ne sont pas nécessairement sur le système de fichiers. L'abstraction de fichier de JSR 199 vous permet d'avoir des fichiers dans une base de données et de générer une sortie directement en mémoire, par exemple. Enfin, l’API JSR 199 vous permet de collecter les diagnostics du compilateur de manière structurée, de manière à pouvoir facilement transformer les messages d’erreur, par exemple, en lignes dans l’éditeur de l’EDI.

JSR 269 est l’API de traitement des annotations.

Cet article donne un excellent aperçu de l'accès au API de l'arborescence du compilateur . La section " Accéder à l'arbre de syntaxe abstraite: L'API de l'arborescence du compilateur " semble particulièrement adapté à votre question.

En fonction de vos activités, vous pouvez également consulter le Jackpot. Rule Language , qui est un moteur de refactoring autonome qui s’insère dans l’arbre du compilateur.

Autres conseils

Compilez et exécutez ceci avec -cp tools.jar (où vous devez bien sûr spécifier l'emplacement de votre tools.jar .)

.
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"
    }
}

Il compile et fonctionne pour moi, bien que je n’ai pas joué moi-même avec les arbres, vous devrez donc lisez le javadoc vous-même. :-) Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top