簡體   English   中英

是否有可以通過編程方式調用的Eclipse重構API?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM