2009-06-08 8 views

Respuesta

26

A continuación se muestra el código Solía ​​hacer esto da un archivo Java 1.5. Soy muy nuevo en esto y pasé el día explorando e intentando hacer funcionar el código siguiente.

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()); 
       } 
      } 
     } 
    } 
} 

Esto requiere las siguientes bibliotecas:

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

roca - He duplicado esto y lo puso en github aquí: https: //github.com/juliangamble/ASTTest – hawkeye

+0

@hawkeye: excelente. +1 para una solución mucho más actualizada. – VonC

+0

¿cómo puedo obtener los frascos necesarios aparte de los comunes-io? –

4

Según este old article, debería poder llamar al analizador AST independientemente del contexto de su aplicación (plugin eclipse o no).

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

alt text http://www.ibm.com/developerworks/opensource/library/os-ast/astexplorer.gif


De esta bug entry:

ASTParser en 3.0 se puede utilizar en otro programa independiente para crear Eclipse AST sin ejecutar Eclipse. A medida que la documentación dice:

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

De ahí this thread intenta analizar una fuente de Java muy corto:

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); 
} 

} 
+0

Eso es tan viejo que no puede conseguir que funcione ya que – hawkeye

Cuestiones relacionadas