[英]Is there any Eclipse refactoring API that I can call programmatically?
我需要在很長一段時間內重構代碼。 我知道從Eclipse IDE里面我可以重構我的類。 但是我可以在java項目中使用任何API,以便我可以通過代碼動態地重構項目嗎?
我需要了解如何實現以下內容:一個程序調用所有Eclipse重構進行重命名並在循環中移動以一次重構整個項目!
我不想通過擴展重構類來引入新的重構類型。 我只是想以編程方式調用它們。
像這樣的東西?
任何在基於Eclipse的IDE中支持編程語言的人遲早都會被要求提供自動重構 - 類似於Java開發工具(JDT)提供的內容。 自Eclipse 3.1發布以來,語言中性API(語言工具包(LTK))至少支持此任務的一部分(這絕不是簡單的)。 但是這個API是如何使用的呢?
編輯:
如果要在不使用UI的情況下以編程方式運行重構,可以使用RefactoringDescriptors(請參閱文章 )填寫參數並以編程方式執行重構。 如果您創建一個依賴於org.eclipse.core.runtime
的插件並添加org.eclipse.core.runtime.applications
擴展,您將能夠從eclipse運行一個類似於main(String[])
類的IApplication
類在純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();
}
如果您有關於使用JDT API(AST,Refactoring等)的更詳細的問題,我建議您在JDT論壇上提問。
下面的答案很棒,但我對那些需要更美味和美味的美味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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.