23 Stimmen

Wie kann ich den java Eclipse Abstract Syntax Tree in einem Projekt außerhalb von Eclipse verwenden? (d.h. nicht ein Eclipse-Plugin)

Wie kann ich den java Eclipse Abstract Syntax Tree in einem Projekt außerhalb von Eclipse verwenden? (d.h. nicht ein Eclipse-Plugin)

Alle Eclipse AST Beispiele, die ich gesehen habe, sind für Eclipse Plugins. Gibt es eine Möglichkeit (dh ein Beispiel) eines Projekts, das die Eclipse AST für eine nicht-Eclipse-Projekt verwendet.

29voto

kfox Punkte 1154

Unten ist der Code, den ich verwendet habe, um dies in einer Java 1.5-Datei zu tun. Ich bin sehr neu in diesem und verbrachte heute rund um Surfen, und Dinge ausprobieren, um den Code unten arbeiten.

public void processJavaFile(File file) {
    String source = FileUtils.readFileToString(file);
    Document document = new Document(source);
    ASTParser parser = ASTParser.newParser(AST.JLS3);
    parser.setSource(document.get().toCharArray());
    CompilationUnit unit = (CompilationUnit)parser.createAST(null);
    unit.recordModifications();

    // to get the imports from the file
    List<ImportDeclaration> imports = unit.imports();
    for (ImportDeclaration i : imports) {
        System.out.println(i.getName().getFullyQualifiedName());
    }

    // to create a new import
    AST ast = unit.getAST();
    ImportDeclaration id = ast.newImportDeclaration();
    String classToImport = "path.to.some.class";
    id.setName(ast.newName(classToImport.split("\\.")));
    unit.imports().add(id); // add import declaration at end

    // to save the changed file
    TextEdit edits = unit.rewrite(document, null);
    edits.apply(document);
    FileUtils.writeStringToFile(file, document.get());

    // to iterate through methods
    List<AbstractTypeDeclaration> types = unit.types();
    for (AbstractTypeDeclaration type : types) {
        if (type.getNodeType() == ASTNode.TYPE_DECLARATION) {
            // Class def found
            List<BodyDeclaration> bodies = type.bodyDeclarations();
            for (BodyDeclaration body : bodies) {
                if (body.getNodeType() == ASTNode.METHOD_DECLARATION) {
                    MethodDeclaration method = (MethodDeclaration)body;
                    System.out.println("name: " + method.getName().getFullyQualifiedName());
                }
            }
        }
    }
}

Dazu sind die folgenden Bibliotheken erforderlich:

commons-io-1.4.jar
org.eclipse.jdt.core_xxxx.jar
org.eclipse.core.resources_xxxx.jar
org.eclipse.core.jobs_xxxx.jar
org.eclipse.core.runtime_xxxx.jar
org.eclipse.core.contenttype_xxxx.jar
org.eclipse.equinox.common_xxxx.jar
org.eclipse.equinox.preferences_xxxx.jar
org.eclipse.osgi_xxxx.jar
org.eclipse.text_xxxx.jar

2 Stimmen

Sie rocken - ich habe das dupliziert und hier auf github gestellt: github.com/juliangamble/ASTTest

0 Stimmen

Woher bekomme ich die benötigten Jars, außer von commons-io?

0 Stimmen

Gefunden in einem Eclipse-Plugins-Ordner, wie vorgeschlagen unter stackoverflow.com/questions/93728/

4voto

VonC Punkte 1117238

Nach diesem alter Artikel sollten Sie in der Lage sein, den AST-Parser unabhängig von Ihrem Anwendungskontext (Eclipse-Plugin oder nicht) aufzurufen.

ASTParser parser = ASTParser.newParser(AST.JLS2);
parser.setSource("".toCharArray());
CompilationUnit unit = (CompilationUnit) parser.createAST(null); 
unit.recordModifications();
AST ast = unit.getAST(); 

alt text
(Quelle: <a href="http://www.ibm.com/developerworks/opensource/library/os-ast/astexplorer.gif" rel="nofollow noreferrer">ibm.de </a>)


Von diesem Fehlereintrag :

ASTParser in 3.0 kann in einem anderen eigenständigen Programm verwendet werden, um Eclipse ASTs zu erstellen, ohne Eclipse zu starten. Wie die Dokumentation sagt:

  char[] source = ...;
  ASTParser parser = ASTParser.newParser(AST.JLS2);  // handles JLS2 (J2SE 1.4)
  parser.setSource(source);
  CompilationUnit result = (CompilationUnit) parser.createAST(null);

Daher dieses Thema versucht, einen sehr kurzen Java-Quelltext zu parsen:

import org.eclipse.jdt.core.dom.*;
import org.eclipse.jface.text.Document;
import org.eclipse.text.edits.TextEdit;

public class Test{

public static void main(String[] args){
 Test t= new Test();
 t.runtest();
}

 void runtest(){
  Document doc = new Document("import java.util.List;\nclass X {}\n");
  ASTParser parser = ASTParser.newParser(AST.JLS3);
  parser.setResolveBindings(true);
  parser.setSource(doc.get().toCharArray());
  CompilationUnit cu = (CompilationUnit) parser.createAST(null);
  cu.recordModifications();
  AST ast = cu.getAST();
  ImportDeclaration id = ast.newImportDeclaration();
  id.setName(ast.newName(new String[] {"java", "util", "Set"}));
  cu.imports().add(id); // add import declaration at end
  TextEdit edits = cu.rewrite(doc, null);
 }

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X