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

2022-09-03 13:24:18

我需要从广义上重构代码。我知道从Eclipse IDE内部,我可以重构我的类。但是,是否有任何可以在Java项目中使用的API,以便我可以通过代码动态重构项目?


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


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


答案 1

这样的东西

任何在基于Eclipse的IDE中支持编程语言的人迟早都会被要求提供自动重构 - 类似于Java开发工具(JDT)提供的功能。自Eclipse 3.1发布以来,该任务的至少一部分(绝不简单)由一个与语言无关的API支持:语言工具包(LTK)。但是这个 API 是如何使用的呢?

编辑:

如果要在不使用 UI 的情况下以编程方式运行重构,可以使用重构描述符(请参阅文章)来填充参数并以编程方式执行重构。如果您创建一个依赖于并添加扩展的插件,您将能够从eclipse运行一个类似于普通Java应用程序中的类的类。调用 API 的示例可以在帖子中找到。org.eclipse.core.runtimeorg.eclipse.core.runtime.applicationsIApplicationmain(String[])

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论坛上提问。


答案 2

下面的答案很好,但我以更广阔的视角回答了那些需要更笨重和美味的蛋糕的松脆的人们:

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

在下面找到用于设置描述符的代码:

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

推荐