[JAVA] Notes pour l'analyse AST

Qu'est-ce que AST

Un arbre de syntaxe abstraite (AST). http://home.a00.itscom.net/hatada/c-tips/ast/ast01.html

AST dans le programme

Analysez le code source et générez une arborescence avec chaque nœud comme feuille.

Bibliothèque analysable AST

JavaPerser https://github.com/javaparser/javaparser/wiki

Si vous utilisez la bibliothèque de com.sun.tools.javac.model, vous pouvez changer l'AST intermédiaire au moment de la compilation ...? ??

Remarque sur l'analyseur Java

Perth

Pour analyser le code source, analysez-le avec le code suivant et convertissez-le en type CompilationUnit. Vous pouvez spécifier InputSteream, File, etc. dans cet argument.

JavaParser.parse([source]);

Changement AST

Une fois converti en CompilationUnit, vous pouvez obtenir l'objet qui représente chaque nœud, afin de pouvoir le modifier à partir de là.

Les nœuds pouvant être obtenus directement à partir de l'unité de compilation sont:

Peut-être que si vous souhaitez traiter les nœuds dans Class (ou Interface), obtenez une fois ClassOrInterfaceDeclaration et modifiez-le.

Si vous souhaitez obtenir une méthode

targetclass.getMethodsByName("testMethod1")

Vous pouvez maintenant obtenir une liste de noeuds MethodDeclarations qui représentent des méthodes avec le nom "testMethod1". (S'il y a le même nom, il sera ajouté à la liste en conséquence)

Le modificateur fait référence à privé ou à quelque chose du genre

Aussi, si vous souhaitez obtenir une méthode avec un argument.

//Vous pouvez obtenir une méthode avec String et int comme arguments avec le nom methodName.
ClassOrInterfaceDeclaration.getMethodsBySignature(String new methodName, new String[] {"String","int"});

Effacer le nœud

Si vous appelez remove () tel quel, il disparaît.

Changez le nom.

Appelez setName (nom de chaîne). Peut également être affecté à l'aide de l'objet SimpleName

Modifiez l'initialisation.

Modifiez l'initialisation avec setInitializer de VariableDeclarator. L'argument est de type Expression, qui peut être créé par JavaParser.parseExpression.

VariableDeclarator.setInitializer(JavaParser.parseExpression(content));

Mettre une variable en classe

Utilisez ClassOrInterfaceDeclaration comme avant. Vous pouvez appeler add *** sur cet objet pour obtenir l'objet qui représente ce nœud lors de son ajout.

//private ScanSize[] aaa;Ajouter
FieldDeclaration field = targetclass.addField(ScanSize[].class, "aaa", Modifier.PRIVATE);

Si vous placez le VariableDeclarator créé ailleurs dans setVariable () de cet objet de champ, il sera entré tel quel.

Peut-être que la méthode peut aussi bien fonctionner.

Transférer des variables de votre propre source vers une autre source

Obtenez votre propre source et analysez

Path selfSource = Paths.get("[Chemin source]");

En faisant cela, vous pouvez obtenir des déclarations arbitraires etc., donc tout ce que vous avez à faire est de plonger dans un autre fichier

référence

Article détaillé sur Java Parser https://qiita.com/opengl-8080/items/50ddee7d635c7baee0ab#%E5%8F%82%E8%80%83

Conversion AST dans le processeur d'annotations - changer le type de variable au moment de la compilation en référence à Lombok http://fits.hatenablog.com/entry/2015/01/17/172651

Recommended Posts

Notes pour l'analyse AST
Notes d'utilisation de base pour Jackson
Notes pour les débutants en développement d'applications Android
Trier dans la liste, pour mémo personnel
Commandes liées à Docker (notes commémoratives pour vous-même)
Remarques sur l'utilisation de BLE dans les applications iOS
Paramètre de stratégie pour exécuter des applets obsolètes Notes de combat
Mémo d'apprentissage Kotlin (fonctionnalités utiles pour le développement)
Remarques sur la création d'un plug-in Android pour Unity