2012-04-13 9 views
4

Ich arbeite derzeit mit Eclipse AST, um Quellcode zu generieren. Anders als in den meisten Beispielen erzeuge ich den Quellcode von Grund auf neu und in einer eigenständigen Anwendung, im Gegensatz zu einem Eclipse-Plug-In.Eclipse JDT AST: Wie generiere ich AST in Java-Datei?

Wenn Sie von einem ASTParser eingelesen haben, können Sie Änderungen durch Aufruf von recordModifications() aktivieren, aber dies funktioniert nicht, wenn der AST von Grund auf neu erstellt wird, z. durch den Aufruf newCompilationUnit().

Daher ist das Schreiben der Quelle in eine Datei über Document und TextEdit nicht möglich - es gibt eine Ausnahme, die besagt, dass die Änderungsaufzeichnung nicht aktiviert wurde.
Irgendwelche Erfahrungen beim Erzeugen von AST von Grund auf neu und in Datei schreiben? Danke!

+0

Viele Erfahrung pretty übersetzbar Äste für Java, aber nicht mit Eclipse. Ist Eclipse eine Voraussetzung für Ihre Frage? –

+0

Warum möchten Sie den "generierten AST" in eine Datei schreiben?Vielleicht ist es nur die Phrasierung, aber ich habe den Eindruck, dass Sie prettyprinted Quelltext in eine Datei schreiben wollen, wo dieser Quelltext vom AST generiert wird. –

+0

Nun, ich benutze Eclipse, weil es weit verbreitet ist, und die "Java Development Tools" (JDT) AST-Implementierung ermöglicht Round-Trip-Engineering, so dass Sie entweder Code aus einem speicherinternen AST generieren können oder vorhandene modifizieren können Quellcode durch minimale Änderungen. "Generiert" bedeutet in diesem Fall, dass der AST programmatisch in den Speicher eingebaut ist. –

Antwort

2

Warum die Datei zuerst nicht schaffen, dann daraus ein AST erzeugen, wie folgt aus:

ICompilationUnit unit = JavaCore.createCompilationUnitFrom(file); 
ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setKind(ASTParser.K_COMPILATION_UNIT); 
parser.setResolveBindings(true); 
parser.setSource(unit); 
// Parse the source code and generate an AST. 
CompilationUnit ast = (CompilationUnit) parser.createAST(null); 

Wenn die Datei neu und leer erstellt wird, dann vermutlich die AST leer sein, können Sie dann die ersetzen Wurzel des ast Objekts und schreibe es in die Datei. Wenn Sie nicht an Eclipse gebunden sind, können Sie dasselbe tun, indem Sie den JSR199-Standard verwenden und diesen AST wie üblich in eine Datei schreiben. Eine Einführung finden Sie unter here.

+0

Können Sie ein Beispiel für die "Sie können dann die Wurzel des Ast-Objekts ersetzen und schreiben Sie es in die Datei." Teil? – sevenforce

+0

Hmm. Ich bin mir nicht sicher, ob ich da sehr klar war. Wenn Sie die Java-Code-Datei bereits generiert haben, ist 'Datei' in meinem obigen Code eine echte Java-Datei, dann sollte der Code, den ich hier angegeben habe, ihn genau analysieren und Ihnen einen AST geben, mit dem Sie arbeiten können ... – snim2

0

Wenn Sie die Quelle von Grund auf neu erstellen, könnten Sie vielleicht die minimale Quelle schreiben, die in eine temporäre Datei geparst werden kann, Ihre Änderungen am Ast anwenden und sie dann als Text in diese Datei schreiben mach es anders. Dann lies die Quelle. Sie können dies dann dorthin übertragen, wo Sie es möchten.

Es gibt wahrscheinlich eine elegantere Lösung, aber das kann funktionieren.

2

Vielen Dank für Ihre Vorschläge! In der Zwischenzeit habe ich eine Möglichkeit gefunden, den Quellcode über eine interne Klasse "ASTFlattener" zu senden, die eine String-Darstellung eines ASTs erzeugt. Das funktioniert ziemlich gut für mich ....

+0

Das ist die beste Antwort, weil Sie einen String bekommen und so die allgemeinere Frage "Wie bekommt man einen String von einem AST?" Beantwortet. Es ist besonders nützlich, wenn Sie keine Datei benötigen (zum Testen, als Zwischenergebnis, ...). – sevenforce

0

Nach seiner Erstellung einer Übersetzungseinheit von AST ich tue:

AST ast = AST.newAST(AST.JLS4);  
CompilationUnit unit = ast.newCompilationUnit(); 

... Kompilierungseinheit füllen und dann ...

package.createCompilationUnit(className + ".java", unit.toString(), true, null); 

Wo:
package = IPackageFragment
className = String (generierten Klassenname)
unit =>CompilationUnit ast
true => Kraft ersetzen
null => Fortschritt Monitor

1

Ich habe gerade versucht, die Antwort auf die gleiche Frage zu finden. Basierend auf den Antworten oben, die eleganteste Lösung, die ich bisher gefunden habe wie folgt aussieht:

ASTParser parser = ASTParser.newParser(AST.JLS4); 
parser.setCompilerOptions(....); 

Document document = new Document(""); 
parser.setSource(document.get().toCharArray()); 
CompilationUnit unit = (CompilationUnit)parser.createAST(null); 
unit.recordModifications(); 

TextEdit edits = unit.rewrite(document, null); 
edits.apply(document); 

// now write document.get() to file