簡體   English   中英

如何從IJavaCompletionProposal獲取CompilationUnit

[英]How to get CompilationUnit from IJavaCompletionProposal

我正在編寫一個讀取Java項目的插件,並且在程序中出現編譯器錯誤的情況下,它使用Eclipse JDT Quick fix提取可能的解決方案來修復編譯器錯誤。 用於查找輸入編譯單元的錯誤和日食解決方案的代碼如下:

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.IProblemIJavaCompletionProposal直接提取class1的comilationUnit

您可以使用getCompilationUnit()CUCorrectionProposal規定提取的Class1的CompilationUnit。 需要注意的是LinkedCorrectionProposal延伸CUCorrectionProposal。 但是,我不確定所有的Eclipse 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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