有没有我可以以编程方式调用的任何Eclipse重构API?

我需要从广义上重构代码。 我知道从Eclipse IDE里面我可以重构我的类。 但有什么API,我可以在一个Java项目中使用,以便我可以通过代码dynamic重构项目?


我需要一些关于如何实现以下内容的想法:一个调用所有Eclipse重构的程序,用于重命名和移动循环,以一次性重构整个项目!


我不想通过扩展重构类来引入新的重构types。 我只是想以编程方式调用它们。

像这样的东西?

任何在基于Eclipse的IDE中支持编程语言的人都会被要求迟早提供自动重构 – 类似于Java开发工具(JDT)提供的。 自Eclipse 3.1发布以来,至less有一部分任务(绝非简单)由语言中立的API:Language Toolkit(LTK)支持。 但是如何使用这个API?

编辑:

如果您想以编程方式运行重构而不使用UI,则可以使用RefactoringDescriptors(请参阅文章 )填写参数并以编程方式执行重构。 如果你创build一个依赖于org.eclipse.core.runtime的插件并添加org.eclipse.core.runtime.applications扩展,你将能够在eclipse中运行一个类似于main(String[])类的IApplication类在普通的Java应用程序。 调用API的示例可以在post中find。

 ICompilationUnit cu = ... // an ICompilationUnit 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(); } 

如果您对使用JDT API(AST,重构等)有更详细的问题,我build议您在JDT论坛上提问。

下面的答案是很好的,但是我以更广泛的视angular回答了那些需要更加庞大而美味的这个美味cake

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

然后:

 for (ICompilationUnit unit : mypackage.getCompilationUnits()) { 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; } } 

之后:

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

然后:

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

在下面find设置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);