Есть ли API-интерфейс для рефакторинга Eclipse, который я могу назвать программным?
Мне нужно реорганизовать код в широком смысле. Я знаю, что изнутри Eclipse IDE я могу реорганизовать свои классы. Но есть ли какой-либо API, который я могу использовать в проекте java, чтобы я мог реорганизовывать проекты динамически через код?
Мне нужна идея о том, как добиться следующего: программа, которая вызывает все рефакторинги Eclipse для переименования и перемещения в цикле для реорганизации всего проекта за один снимок!
Я не хочу вводить новые типы рефакторинга, расширяя классы рефакторинга. Я просто хочу назвать их программным способом.
Ответы
Ответ 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
:
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);
Ответ 2
Что-то вроде this?
Любой, кто поддерживает язык программирования в среде IDE на основе Eclipse будет предложено рано или поздно предложить автоматические рефакторинги - аналогично тому, что предоставляется инструментами разработки Java (JDT). поскольку выпуск Eclipse 3.1, по крайней мере, часть этой задачи (которой нет означает простой) поддерживается с помощью нейтрального интерфейса API: Язык Инструментарий (ЛТК). Но как этот API используется?
EDIT:
Если вы хотите программно запускать рефакторинг без использования пользовательского интерфейса, RefactoringDescriptors (см. article) можно использовать для заполнения параметров и выполнять программный рефакторинг. Если вы создадите плагин, который зависит от org.eclipse.core.runtime
и добавьте расширение org.eclipse.core.runtime.applications
, вы сможете запустить класс IApplication
из eclipse, аналогичный классу main(String[])
, в простых Java-приложениях. Пример вызова API можно найти на post.
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, Refactoring и т.д.), я предлагаю вам обратиться к JDT Forum.