2010-07-28 6 views
6

J'ai récemment eu besoin de modifier du code Java (en ajoutant des méthodes, en modifiant les signatures de certains champs et en supprimant des méthodes) et je pense que tout cela peut être accompli grâce à l'utilisation du SDK Eclipse AST.Utilisation de l'Eclipse AST

Je sais par certaines recherches comment analyser dans un fichier source, mais je ne sais pas comment faire les choses mentionnées ci-dessus. Est-ce que quelqu'un sait un bon tutoriel ou quelqu'un pourrait-il me donner une brève explication sur la façon de résoudre ces problèmes?

Merci beaucoup,

ExtremeCoder


Edit:

J'ai maintenant commencé à regarder de plus dans le JCodeModel et je pense que cela pourrait être beaucoup plus facile à utiliser, mais je Je ne sais pas si un document existant peut y être chargé?

Si cela pouvait travailler me le faire savoir;)

Merci encore.

Répondre

4

Je ne publierai pas le code source complet à ce problème ici, car il est assez long, mais je vais commencer les gens.

Tous les documents dont vous aurez besoin sont ici. http://publib.boulder.ibm.com/infocenter/iadthelp/v6r0/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-summary.html

Document document = new Document("import java.util.List;\n\nclass X\n{\n\n\tpublic void deleteme()\n\t{\n\t}\n\n}\n"); 
ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setSource(document.get().toCharArray()); 
CompilationUnit cu = (CompilationUnit)parser.createAST(null); 
cu.recordModifications(); 

Cela va créer une unité de compilation pour vous à partir du code source que vous passez

Maintenant, c'est une fonction simple imprime toutes les méthodes dans les définitions de classe dans ce que vous avez passé:

List<AbstractTypeDeclaration> types = cu.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("method declaration: "); 
       System.out.println("name: " + method.getName().getFullyQualifiedName()); 
       System.out.println("modifiers: " + method.getModifiers()); 
       System.out.println("return type: " + method.getReturnType2().toString()); 
      } 
     } 
    } 
} 

Cela devrait vous aider à démarrer.

Il faut un certain temps pour s'y habituer (beaucoup dans mon cas). Mais cela fonctionne et est la meilleure méthode que je pourrais mettre la main sur.

Bonne chance;)

ExtremeCoder


Edit:

Avant d'oublier, ce sont les importations que je l'habitude d'obtenir ce travail (j'ai pris un peu de temps pour obtenir ces organisés):

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 

Où xxxx représente un numéro de version.

1

Vous pouvez le faire avec Eclipse en appelant des API qui vous permettent de manipuler les AST.

Ou vous pouvez appliquer des transformations de programme pour obtenir votre effet de manière à ne pas dépendre des détails microscopiques de l'AST.

Par exemple, vous pouvez écrire la transformation du programme suivant:

add_int_parameter(p:parameter_list, i: identifier): parameters -> parameters 
    " \p " -> " \p , int \i"; 

pour ajouter un paramètre entier avec un nom arbitraire à une liste de paramètres. Cela a le même effet que tout un ensemble d'appels d'API, mais il est beaucoup plus lisible car il est dans la syntaxe de surface de votre langage (dans ce cas, Java).

Notre DMS Software Reengineering Toolkit peut accepter tel program transformations et les appliquer à de nombreuses langues, y compris Java.

Questions connexes