2010-07-28 14 views
6

Recientemente he tenido la necesidad de modificar algunos códigos Java (agregar métodos, cambiar las firmas de algunos campos y eliminar métodos) y creo que todo esto puede lograrse mediante el uso de los SDK de Eclipse AST.Usando el Eclipse AST

Sé por alguna investigación cómo analizar en un archivo fuente, pero no sé cómo hacer las cosas mencionadas anteriormente. ¿Alguien conoce un buen tutorial o podría alguien darme una breve explicación sobre cómo resolver estos problemas?

Muchas gracias,

ExtremeCoder


Editar:

que han comenzado ahora a mirar más en la JCodeModel y creo que esto podría ser mucho más fácil de usar, pero me no sé si se puede cargar un documento existente en él?

Si esto podría funcionar, hágamelo saber;)

Gracias de nuevo.

Respuesta

4

No publicaré aquí el código fuente completo para este problema porque es bastante largo pero haré que la gente comience.

Todos los documentos que se necesitan son aquí:. 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(); 

que creará una unidad de compilación para usted desde el código fuente que se pasa en

Ahora bien, esta es una función simple que imprime todos los métodos dentro de las definiciones de clases en lo que ha pasado:

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

Esto debe llegar a todos ustedes a comenzar.

Toma un tiempo acostumbrarse a esto (mucho en mi caso). Pero funciona y es el mejor método que pude tener.

Buena suerte;)

ExtremeCoder


Editar:

Antes de que me olvide, estas son las importaciones que he utilizado para conseguir este trabajo (que tomó un poco de tiempo para organizarlos):

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 

Donde xxxx representa un número de versión.

1

Puede hacer esto con Eclipse llamando a las API que le permiten manipular los AST.

O puede aplicar transformaciones de programa para lograr su efecto de manera que no dependa de los detalles microscópicos del AST.

A modo de ejemplo se podría escribir la siguiente transformación de programas:

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

para añadir un parámetro entero con un nombre arbitrario a una lista de parámetros. Esto logra el mismo efecto que un conjunto completo de llamadas API, pero es mucho más legible porque está en la sintaxis superficial de su idioma (en este caso, Java).

Nuestra DMS Software Reengineering Toolkit puede aceptar tales program transformations y aplicarlos a muchos idiomas, incluido Java.