是否有可以通过编程方式调用的Eclipse重构API?

时间:2012-02-03 13:53:53

标签: java eclipse refactoring

我需要在很长一段时间内重构代码。我知道从Eclipse IDE里面我可以重构我的类。但是我可以在java项目中使用任何API,以便我可以通过代码动态重构项目吗?


我需要了解如何实现以下内容:一个程序调用所有Eclipse重构来重命名并在循环中移动以一次重构整个项目!


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

2 个答案:

答案 0 :(得分:15)

类似于this

  

任何在基于Eclipse的IDE中支持编程语言的人   迟早会被要求提供自动化重构 -   类似于Java开发工具(JDT)提供的内容。以来   Eclipse 3.1的发布,至少是这个任务的一部分(没有   意味着简单)由语言中立的API支持:语言   工具包(LTK)。但是这个API是如何使用的?

修改

如果要在不使用UI的情况下以编程方式运行重构,可以使用RefactoringDescriptors(请参阅article)填写参数并以编程方式执行重构。如果您创建一个依赖于org.eclipse.core.runtime并添加org.eclipse.core.runtime.applications扩展名的插件,您将能够在eclipse中运行类似于普通java中的IApplication类的main(String[])类应用。可以在post上找到调用API的示例。

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,重构等)的更详细的问题,我建议您在JDT Forum上询问。

答案 1 :(得分:7)

下面的答案非常棒,但我更广泛地回答了那些需要更加笨重和美味的人们{$ 1}}

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); 的代码:

descriptor