[JAVA] Hinweise zur AST-Analyse

Was ist AST?

Ein abstrakter Syntaxbaum (AST). http://home.a00.itscom.net/hatada/c-tips/ast/ast01.html

AST im Programm

Analysieren Sie den Quellcode und generieren Sie einen Baum mit jedem Knoten als Blatt.

AST-Analysebibliothek

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

Wenn Sie die Bibliothek von com.sun.tools.javac.model verwenden, können Sie den Zwischen-AST zur Kompilierungszeit ändern ...? ??

Hinweis zu Java Parser

Perth

Um den Quellcode zu analysieren, analysieren Sie ihn mit dem folgenden Code und konvertieren Sie ihn in den CompilationUnit-Typ. In diesem Argument können Sie InputSteream, File usw. angeben.

JavaParser.parse([source]);

AST-Änderung

Nach der Konvertierung in CompilationUnit können Sie das Objekt abrufen, das jeden Knoten darstellt, und es von dort aus ändern.

Die Knoten, die direkt von der Kompilierungseinheit bezogen werden können, sind:

Wenn Sie die Knoten in Class (oder Interface) verarbeiten möchten, rufen Sie ClassOrInterfaceDeclaration möglicherweise einmal ab und ändern Sie sie.

Wenn Sie eine Methode erhalten möchten

targetclass.getMethodsByName("testMethod1")

Jetzt können Sie eine Liste der Knoten MethodDeclarations abrufen, die Methoden mit dem Namen "testMethod1" darstellen. (Wenn es denselben Namen gibt, wird er entsprechend zur Liste hinzugefügt.)

Modifikator bezieht sich auf privat oder so ähnlich

Auch, wenn Sie eine Methode mit einem Argument erhalten möchten.

//Sie können eine Methode mit String und int als Argumente mit dem Namen methodName abrufen.
ClassOrInterfaceDeclaration.getMethodsBySignature(String new methodName, new String[] {"String","int"});

Löschen Sie den Knoten

Wenn Sie remove () so wie es ist aufrufen, verschwindet es.

Ändern Sie den Namen.

Rufen Sie setName (String name) auf. Kann auch über das SimpleName-Objekt zugewiesen werden

Ändern Sie die Initialisierung.

Ändern Sie die Initialisierung mit setInitializer von VariableDeclarator. Das Argument ist vom Typ Ausdruck, der von JavaParser.parseExpression erstellt werden kann.

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

Fügen Sie eine Variable in Class ein

Verwenden Sie ClassOrInterfaceDeclaration wie zuvor. Durch Aufrufen von add *** dieses Objekts können Sie das Objekt abrufen, das den Knoten darstellt, sowie den Knoten hinzufügen.

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

Wenn Sie den an anderer Stelle erstellten VariableDeclarator in setVariable () dieses Feldobjekts einfügen, wird er unverändert eingegeben.

Vielleicht kann die Methode auch gehen, vielleicht.

Verschieben Sie Variablen aus Ihrer eigenen Quelle in eine andere Quelle

Holen Sie sich Ihre eigene Quelle und analysieren Sie

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

Auf diese Weise können Sie beliebige Deklarationen erhalten. Sie müssen also nur in eine andere Datei eintauchen.

Referenz

Ausführlicher Artikel über Java Parser https://qiita.com/opengl-8080/items/50ddee7d635c7baee0ab#%E5%8F%82%E8%80%83

AST-Konvertierung im Anmerkungsprozessor - Ändern Sie den Variablentyp zur Kompilierungszeit unter Bezugnahme auf Lombok http://fits.hatenablog.com/entry/2015/01/17/172651

Recommended Posts

Hinweise zur AST-Analyse
Grundlegende Verwendungshinweise für Jackson
Hinweise für Anfänger in der Android-Anwendungsentwicklung
In Liste sortieren, für persönliches Memo
Docker-bezogene Befehle (Erinnerungsnotizen für sich selbst)
Hinweise zur Verwendung von BLE in iOS-Apps
Richtlinieneinstellung zum Ausführen veralteter Applets Kampfnotizen
Kotlin-Lernnotiz (nützliche Funktionen für die Entwicklung)
Hinweise zum Erstellen eines Android-Plug-Ins für Unity