Есть ли какой-либо 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.