2009-06-08 5 views

Répondre

26

Voici le code que je l'habitude de le faire étant donné un fichier Java 1.5. Je suis très nouveau à ce sujet et j'ai passé la journée à naviguer et à essayer de faire fonctionner le code ci-dessous.

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

Cela nécessite les bibliothèques suivantes:

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

vous Rock - J'ai dupliqués ne et le mettre sur github ici: https: //github.com/juliangamble/ASTTest – hawkeye

+0

@hawkeye: excellent. +1 pour une solution beaucoup plus à jour. – VonC

+0

comment puis-je obtenir les bocaux requis autres que commons-io? –

4

Selon ce old article, vous devriez pouvoir appeler AST parser indépendamment de votre contexte d'application (plugin eclipse ou non).

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 cette bug entry:

ASTParser dans la version 3.0 peut être utilisé dans un autre programme autonome pour créer Eclipse Eclipse sans RSHS en cours d'exécution en fait. Comme la documentation dit:

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

D'où this thread tente d'analyser une source java très courte:

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

C'est si vieux que vous ne pouvez pas l'obtenir pour travailler plus – hawkeye

Questions connexes