2012-02-03 42 views
14

Tôi cần mã refactor trong một thời gian dài. Tôi biết rằng từ bên trong IDE Eclipse, tôi có thể cấu trúc lại các lớp của mình. Nhưng có API nào mà tôi có thể sử dụng trong một dự án java để tôi có thể tái cấu trúc các dự án động thông qua mã không?Có API cấu trúc lại Eclipse nào mà tôi có thể gọi theo chương trình không?


Tôi cần một số ý tưởng về cách đạt được các điều sau: chương trình gọi tất cả các cấu trúc lại của Eclipse để đổi tên và di chuyển trong vòng lặp để tái cấu trúc toàn bộ dự án trong một lần chụp!


Tôi không muốn giới thiệu các loại tái cấu trúc mới bằng cách mở rộng các lớp tái cấu trúc. Tôi chỉ muốn gọi chúng theo chương trình.

Trả lời

6

Câu trả lời dưới đây là rất tốt, nhưng tôi đã trả lời với một viễn cảnh rộng lớn hơn đối với những người cần một cuộc khủng hoảng cồng kềnh hơn và ngon của tuyệt vời cake này:

RefactoringStatus status = new RefactoringStatus(); 
    IWorkspace workspace = ResourcesPlugin.getWorkspace(); 
    IWorkspaceRoot root = workspace.getRoot(); 
    IProject[] projects = root.getProjects(); 

thì:

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; 
    } 
} 

Sau đó:

IProgressMonitor monitor = new NullProgressMonitor(); 
status = new RefactoringStatus(); 
Refactoring refactoring = performMethodsRefactoring(status, methodToRename, newName); 

thì:

Change change = refactoring.createChange(monitor); 
change.perform(monitor); 

tìm thấy bên dưới đoạn code để thiết lập các 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

Giống như this?

Bất cứ ai hỗ trợ một ngôn ngữ lập trình trong một IDE Eclipse dựa trên sẽ được yêu cầu sớm hay muộn để cung cấp phép tái cấu trúc tự động - tương tự như những gì được cung cấp bởi các công cụ phát triển Java (JDT). Kể từ khi phát hành Eclipse 3.1, ít nhất một phần của nhiệm vụ này (không phải là có nghĩa là đơn giản) được hỗ trợ bởi một API trung gian ngôn ngữ: Ngôn ngữ Bộ công cụ (LTK). Nhưng API này được sử dụng như thế nào?

EDIT:

Nếu bạn muốn lập trình chạy refactorings mà không sử dụng giao diện người dùng, RefactoringDescriptors (xem article) có thể được sử dụng để điền vào các thông số và thực hiện sắp xếp theo chương trình. Nếu bạn tạo plugin phụ thuộc vào số org.eclipse.core.runtime và thêm tiện ích mở rộng org.eclipse.core.runtime.applications, bạn sẽ có thể chạy một lớp học IApplication từ nhật thực tương tự như lớp main(String[]) trong các ứng dụng java đơn giản. Một ví dụ về việc gọi API có thể được tìm thấy trên 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(); 
} 

Nếu bạn có câu hỏi chi tiết hơn về cách sử dụng API JDT (AST, Refactoring, v.v), tôi khuyên bạn nên hỏi JDT Forum.

+2

Tôi nghĩ rằng một tập tin trong thư mục eclipse của bạn: Core và UI Một lớp con của org.eclipse.ltk.core.refactoring.Refactoring phải luôn luôn được tạo ra. Kiểm tra văn bản tại Core và UI và "Action!" –

+5

Các API LTK cho phép cấu trúc lại của nó được cấu hình với một đối tượng trái ngược với giao diện người dùng. Trong khi nó cần phải là một plugin eclipse, bạn có thể viết một IApplication không đầu mà có thể điền vào cấu hình tái cấu trúc từ dòng lệnh và thực hiện nó chống lại không gian làm việc của bạn. –

+3

http://www.eclipse.org/articles/article.php?file=Article-Unleashing-the-Power-of-Refactoring/index.html là cuộc thảo luận về API tái cấu trúc. Các 'RefactoringDescriptors' có thể được sử dụng để lập trình thiết lập một sự thay đổi và thực hiện nó trong một hoạt động mà không cần liên quan đến GUI hoặc trình thủ thuật. –

Các vấn đề liên quan