2010-07-28 20 views
6

Sono recentemente entrato nella necessità di modificare del codice Java (aggiungendo metodi, cambiando le firme di alcuni campi e rimuovendo metodi) e penso che tutto ciò possa essere ottenuto usando l'SDK di Eclipse AST.Utilizzo di Eclipse AST

So da alcune ricerche come analizzare in un file sorgente ma non so come fare le cose di cui sopra. Qualcuno conosce un buon tutorial o qualcuno potrebbe darmi una breve spiegazione su come risolvere questi problemi?

Grazie mille,

ExtremeCoder


Edit:

ho iniziato a guardare più in JCodeModel e penso che questo potrebbe essere molto più facile da usare, ma io non so se un documento esistente può essere caricato in esso?

Se questo potrebbe funzionare fammi sapere;)

Grazie ancora.

risposta

4

Non invierò l'intero codice sorgente a questo problema qui perché è piuttosto lungo ma avrò iniziato la gente.

Tutti i documenti che si ha bisogno sono qui:. 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(); 

che creerà un unità di compilazione per voi dal codice sorgente che si passa in

Ora questa è una funzione semplice che stampa tutti i metodi all'interno delle definizioni di classe in quello che hai passato:

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

Questo dovrebbe iniziare.

Ci vuole del tempo per abituarsi a questo (molto nel mio caso). Ma funziona ed è il metodo migliore su cui potrei mettere le mani.

Buona fortuna;)

ExtremeCoder


Edit:

Prima che mi dimentichi, queste sono le importazioni che ho usato per ottenere questo lavoro (ho preso un po 'di tempo per organizzarsi):

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 

Dove xxxx rappresenta un numero di versione.

1

È possibile farlo con Eclipse chiamando le API che consentono di manipolare gli AST.

Oppure puoi applicare le trasformazioni del programma per ottenere il tuo effetto in modo che non dipenda dai dettagli microscopici dell'AST.

A titolo di esempio, si potrebbe scrivere il seguente programma di trasformazione:

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

per aggiungere un parametro intero con un nome arbitrario a una lista di parametri. Questo ha lo stesso effetto di un intero set di chiamate API ma è molto più leggibile perché si trova nella sintassi di superficie della tua lingua (in questo caso, Java).

Il nostro DMS Software Reengineering Toolkit può accettare tali program transformations e applicarli a molte lingue, tra cui Java.