2014-09-26 106 views
1

我正在編寫一個讀取java項目的插件,並且在程序中存在任何編譯器錯誤的情況下,它使用Eclipse JDT Quick fix來提取可能的解決方案來修復編譯器錯誤。用來發現錯誤和Eclipse解決方案的輸入編譯單元的代碼如下:如何從IJavaCompletionProposal獲取CompilationUnit

private void collectCorrections(final ICompilationUnit cu, final CompilationUnit astRoot) { 

    ArrayList<IProblem> problems = new ArrayList<IProblem>(); 
    for (IProblem iProblem : astRoot.getProblems()) 
     if (iProblem.isError()) problems.add(iProblem); 

    Map<IProblem, ArrayList<IJavaCompletionProposal>> ErrorproposalsMap = new HashMap<IProblem, ArrayList<IJavaCompletionProposal>>(); 

    for (IProblem iProblem : problems) { 

     int offset = iProblem.getSourceStart(); 
     int length = iProblem.getSourceEnd() + 1 - offset; 
     context = new AssistContext(cu, offset, length); 
    } 

    ProblemLocation problem = new ProblemLocation(iProblem); 

    ArrayList<IJavaCompletionProposal> proposals = new ArrayList<IJavaCompletionProposal>(); 

    JavaCorrectionProcessor.collectCorrections(context, new IProblemLocation[] { problem }, proposals); 

    ErrorproposalsMap.put(iProblem, proposals); 
} 

我同時使用iProblem建議獲取有關錯誤和解決方案的更多詳細信息。作爲示例,我使用iProblem.getOriginatingFileName()來提取發生錯誤的文件。但是,我面臨的問題是我不知道如何提取需要修改以修復錯誤的類的comilationUnit。

作爲一個簡單的例子,當我們從另一個類(class2)引用私有文件(在class1中定義)時,我們有一個編譯器錯誤。在這種情況下,我需要爲class1提取compilationUnit。請注意,getOriginatingFileName返回class2。

請讓我知道我可以提取使用org.eclipse.jdt.core.compiler.IProblem,並IJavaCompletionProposal class1的直接comilationUnit。

回答

1

您可以使用getCompilationUnit()CUCorrectionProposal規定提取的Class1的CompilationUnit。請注意,LinkedCorrectionProposal延伸CUCorrectionProposal。但是,我不確定所有的月蝕CorrectionProposal延長LinkedCorrectionProposal。覈實。

解決方案可以是這樣的。

CUCorrectionProposal cUCorrectionProposal = (CUCorrectionProposal) eclipseProposal; 
    ICompilationUnit iCompilationUnit = cUCorrectionProposal.getCompilationUnit(); 

    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT); 
    parser.setSource(iCompilationUnit); 

    CompilationUnit compilationUnit = (CompilationUnit) parser.createAST(null);