Есть ли какой-либо API рефакторинга Eclipse, который я могу вызвать программно?

Мне нужно рефакторинг кода в широком смысле. Я знаю, что внутри Eclipse IDE я могу реорганизовать свои классы. Но есть ли API, который я могу использовать в Java-проекте, чтобы я мог динамически рефакторинг проектов с помощью кода?


Мне нужна некоторая идея о том, как добиться следующего: программа, которая вызывает все рефакторинги Eclipse для переименования и перемещения по циклу, чтобы рефакторинг всего проекта за один раз!


Я не хочу вводить новые типы рефакторинга, расширяя классы рефакторинга. Я просто хочу назвать их программно.

2 ответа

Решение

Ответ ниже велик, но я ответил с более широкой точки зрения для людей, которым нужен более громоздкий и вкусный хруст этого замечательного 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 :

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

Как то так?

Любому, кто поддерживает язык программирования в IDE на основе Eclipse, рано или поздно будет предложено предложить автоматический рефакторинг - аналогично тому, как это предусмотрено инструментами разработки Java (JDT). Начиная с выпуска Eclipse 3.1, по крайней мере часть этой задачи (которая ни в коем случае не проста) поддерживается независимым от языка API: Language Toolkit (LTK). Но как этот API используется?

РЕДАКТИРОВАТЬ:

Если вы хотите программно выполнить рефакторинг без использования пользовательского интерфейса, RefactoringDescriptors (см. Статью) можно использовать для заполнения параметров и программного рефакторинга. Если вы создаете плагин, который зависит от org.eclipse.core.runtime и добавить org.eclipse.core.runtime.applications расширение, вы сможете запустить IApplication класс из затмения похож на main(String[]) класс в простых Java-приложениях. Пример вызова 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();
}

Если у вас есть более подробные вопросы об использовании API JDT (AST, Refactoring и т. Д.), Я бы посоветовал задать их на форуме JDT.

Другие вопросы по тегам