2012-02-03 22 views
14

我需要在廣義上重構代碼。我知道從Eclipse IDE內部我可以重構我的類。但是有什麼API可以在java項目中使用,以便我可以通過代碼動態重構項目?是否有任何我可以通過編程調用的Eclipse重構API?


我需要關於如何實現以下一些想法:調用所有重命名Eclipse的重構和環型移動到一次性重構整個項目的程序!


我不想通過擴展重構類引進新的重構類型。我只是想以編程方式調用它們。

回答

6

下面的答案是偉大的,但我回答誰需要這個美好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); 
15

喜歡的東西this

任何人誰支持的編程語言在基於Eclipse的IDE 將遲早要求提供自動化的重構 - 類似於由Java開發工具(JDT)提供。語言 工具包(LTK):由於 的Eclipse 3.1的發佈,這個任務(這絕不意味着 簡單)的至少一部分通過語言無關的API支持。但是,這個API是如何使用的?

編輯:

如果你想以編程方式運行的重構,而無需使用UI,RefactoringDescriptors(見article)可用於填寫參數和程序執行的重構。如果您創建依賴於org.eclipse.core.runtime插件,並添加org.eclipse.core.runtime.applications擴展,你將能夠從Eclipse運行類似的IApplication類純Java應用程序一個main(String[])類。調用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,重構等等)更詳細的問題,我建議你在JDT Forum問。

+2

我認爲它在eclipse目錄中是一個文件:Core和UI org.eclipse.ltk.core.refactoring.Refactoring的子類必須始終創建。檢查覈心和用戶界面上的文字和「操作!」 – 2012-02-03 14:08:35

+5

LTK API允許使用對象而不是UI來配置其重構。雖然它需要是一個eclipse插件,但您可以編寫一個無頭應用程序,它可以從命令行填入重構配置,並在您的工作區執行它。 – 2012-02-06 15:36:21

+3

http://www.eclipse.org/articles/article.php?file=Article-Unleashing-the-Power-of-Refactoring/index.html是重構API的討論。 'RefactoringDescriptors'可用於編程設置更改並在操作中執行它,而不涉及GUI或嚮導。 – 2012-02-06 19:05:50

相關問題