如何从IJavaCompletionProposal中获取CompilationUnit



我正在编写一个插件,用于读取java项目,如果程序中存在任何编译器错误,它将使用Eclipse JDT Quick fix提取可能的解决方案来修复编译器错误。用于为输入编译单元查找错误和eclipse解决方案的代码如下:

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()提取发生错误的文件。然而,我面临的问题是,我不知道如何提取需要更改的类的comlationUnit来修复错误。

举个简单的例子,当我们引用另一个类(类2)的私有文件(在类1中定义)时,我们会出现编译器错误。在这种情况下,我需要提取class1的compilationUnit。请注意getOriginatingFileName返回class2。

请告诉我如何使用org.eclipse.jdt.core.coompiler.IProblemIJavaCompletionProposal直接提取类1的comilationUnit。

您可以使用CUCorrectionProposal中定义的getCompilationUnit()来提取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);

最新更新