¿Hay alguna API de refactorización de Eclipse a la que pueda llamar mediante progtwigción?

Necesito refactorizar el código en un amplio plazo. Sé que desde dentro del Eclipse IDE puedo refactorizar mis clases. Pero, ¿hay alguna API que pueda usar en un proyecto de Java para que pueda refactorizar proyectos de forma dinámica a través del código?


Necesito alguna idea sobre cómo lograr lo siguiente: ¡un progtwig que llama a todas las refactorizaciones de Eclipse para renombrar y mover en un bucle para refactorizar todo el proyecto de una vez!


No quiero introducir nuevos tipos de refactorización extendiendo las clases de refactorización. Solo quiero llamarlos programáticamente.

Algo como esto ?

Cualquiera que soporte un lenguaje de progtwigción en un IDE basado en Eclipse, tarde o temprano se le pedirá que ofrezca refactorizaciones automatizadas, de forma similar a las herramientas de desarrollo de Java (JDT). Desde el lanzamiento de Eclipse 3.1, al menos parte de esta tarea (que de ninguna manera es simple) es respaldada por una API independiente del idioma: el Kit de herramientas de idioma (LTK). ¿Pero cómo se usa esta API?

EDITAR:

Si desea ejecutar refactorizaciones mediante progtwigción sin utilizar la interfaz de usuario, RefactoringDescriptors (consulte el artículo ) se puede utilizar para completar los parámetros y ejecutar la refactorización mediante progtwigción. Si crea un complemento que depende de org.eclipse.core.runtime y agrega la extensión org.eclipse.core.runtime.applications , podrá ejecutar una clase IApplication de eclipse similar a una clase main(String[]) en aplicaciones simples de Java. Un ejemplo de llamar a la API se puede encontrar en la publicación .

 IComstacktionUnit cu = ... // an IComstacktionUnit to rename RefactoringContribution contribution = RefactoringCore.getRefactoringContribution(IJavaRefactorings .RENAME_COMPILATION_UNIT); RenameJavaElementDescriptor descriptor = (RenameJavaElementDescriptor) contribution.createDescriptor(); descriptor.setProject(cu.getResource().getProject().getName( )); descriptor.setNewName("NewClass"); // new name for a Class descriptor.setJavaElement(cu); RefactoringStatus status = new RefactoringStatus(); try { Refactoring refactoring = descriptor.createRefactoring(status); IProgressMonitor monitor = new NullProgressMonitor(); refactoring.checkInitialConditions(monitor); refactoring.checkFinalConditions(monitor); Change change = refactoring.createChange(monitor); change.perform(monitor); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Si tiene preguntas más detalladas sobre el uso de las API de JDT (AST, refactorización, etc.), le sugiero que pregunte en el foro de JDT .

La respuesta a continuación es genial, pero respondí con una perspectiva más amplia para las personas que necesitan un crujido más voluminoso y sabroso de este maravilloso cake :

  RefactoringStatus status = new RefactoringStatus(); IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot root = workspace.getRoot(); IProject[] projects = root.getProjects(); 

entonces:

 for (IComstacktionUnit unit : mypackage.getComstacktionUnits()) { IType primary = unit.findPrimaryType(); IMethod[] methods = primary.getMethods(); int i = 1; for (IMethod method : methods) { if (method.isConstructor()) { continue; } makeChangetoMethods(status, method,"changedMethodVersion_" + i); ++i; } } 

Después de esto:

 IProgressMonitor monitor = new NullProgressMonitor(); status = new RefactoringStatus(); Refactoring refactoring = performMethodsRefactoring(status, methodToRename, newName); 

entonces:

 Change change = refactoring.createChange(monitor); change.perform(monitor); 

encuentra debajo el código para configurar el descriptor :

 String id = IJavaRefactorings.RENAME_METHOD; RefactoringContribution contrib = RefactoringCore.getRefactoringContribution(id); RenameJavaElementDescriptor desc = contrib.createDescriptor(); desc.setUpdateReferences(true); desc.setJavaElement(methodToRename); desc.setNewName(newName); desc.createRefactoring(status);