【问题标题】:How to get CompilationUnit from IJavaCompletionProposal如何从 IJavaCompletionProposal 获取 CompilationUnit
【发布时间】:2014-09-26 11:36:14
【问题描述】:

我正在编写一个读取 java 项目的插件,如果程序中存在任何编译器错误,它会使用 Eclipse JDT 快速修复来提取可能的解决方案来修复编译器错误。用于查找输入编译单元的错误和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);
}

我同时使用 iProblemproposals 来获取有关错误和解决方案的更多详细信息。例如,我使用 iProblem.getOriginatingFileName() 来提取发生错误的文件。但是,我面临的问题是我不知道如何提取需要更改以修复错误的类的 comilationUnit。

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

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

【问题讨论】:

    标签: java eclipse compiler-errors eclipse-jdt


    【解决方案1】:

    您可以使用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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      相关资源
      最近更新 更多