我正在编写一个读取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()来提取发生错误的文件。但是,我面临的问题是我不知道如何提取需要更改以修复错误的类的comilationUnit。
作为一个简单的例子,当我们从另一个类(class2)引用私有字段(在class1中定义)时,我们遇到编译器错误。在这种情况下,我需要为 class1 提取compilationUnit。请注意, getOriginatingFileName 会返回class2。
请告诉我如何使用 org.eclipse.jdt.core.compiler.IProblem 和 IJavaCompletionProposal 直接提取class1的comilationUnit。
答案 0 :(得分:1)
您可以使用 CUCorrectionProposal 中定义的 getCompilationUnit()来提取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);