Eclipse插件开发:获取指定错误的所有可用快速修复方案
你的思路没问题,我来帮你搞定实例获取的问题
你的方向是对的——实现QuickFixProcessor确实是在Eclipse插件里调用内置Quick Fix功能的标准路径,不过IInvocationContext和IProblemLocation[]这俩实例确实需要结合JDT的上下文来构建,我之前做类似插件的时候也踩过这个坑,给你拆解具体步骤:
1. 获取IInvocationContext实例
这个上下文需要关联当前的Java文件和对应的AST节点,通常从激活的Java编辑器入手:
// 获取当前激活的Java编辑器 IEditorPart activeEditor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); if (activeEditor instanceof JavaEditor) { // 从编辑器拿到对应的编译单元 IJavaElement javaElement = ((JavaEditor) activeEditor).getEditorInputJavaElement(); if (javaElement instanceof ICompilationUnit) { ICompilationUnit compilationUnit = (ICompilationUnit) javaElement; // 解析生成AST(注意JLS版本要匹配你的目标JDK) ASTParser parser = ASTParser.newParser(AST.JLS17); parser.setSource(compilationUnit); parser.setResolveBindings(true); CompilationUnit astRoot = (CompilationUnit) parser.createAST(null); // 用JDT内部的InvocationContext实现类创建实例 IInvocationContext context = new InvocationContext(compilationUnit, astRoot); } }
注意:
InvocationContext是org.eclipse.jdt.internal.corext.refactoring.code包下的内部类,需要确保你的插件依赖了org.eclipse.jdt.core.manipulation这个bundle。
2. 构建IProblemLocation[]实例
你需要先定位到目标错误,把IProblem包装成ProblemLocation(也是JDT内部实现类):
// 从AST根节点获取所有代码问题 IProblem[] allProblems = astRoot.getProblems(); List<IProblemLocation> targetProblemLocations = new ArrayList<>(); for (IProblem problem : allProblems) { // 筛选你要处理的特定错误,比如通过错误ID判断 // 举个例子:筛选未定义方法的错误,替换成你需要的错误ID if (problem.getID() == IProblem.UndefinedMethod) { // 用问题的起止位置和问题实例创建ProblemLocation targetProblemLocations.add(new ProblemLocation( problem.getSourceStart(), problem.getSourceEnd(), problem )); } } // 转成数组供方法调用 IProblemLocation[] problemLocations = targetProblemLocations.toArray(new IProblemLocation[0]);
3. 调用getCorrections获取修复方案
如果是调用Eclipse内置的Java快速修复,通过FixProcessorRegistry拿到对应的处理器即可:
// 获取内置的Java QuickFix处理器 QuickFixProcessor fixProcessor = FixProcessorRegistry.getDefault().getProcessor(IJavaFixProcessor.class); if (fixProcessor != null) { IJavaCompletionProposal[] fixProposals = fixProcessor.getCorrections(context, problemLocations); // 遍历处理修复方案,比如打印或者展示到UI上 for (IJavaCompletionProposal proposal : fixProposals) { System.out.println("可用修复:" + proposal.getDisplayString()); } }
额外注意事项
- 所有UI相关的操作要确保在UI线程执行,必要时用
Display.getDefault().asyncExec(Runnable)包裹代码。 - 如果是你自己实现的自定义
QuickFixProcessor,记得在plugin.xml中注册org.eclipse.jdt.ui.quickFixProcessors扩展点,这样处理器才能被正确识别。 - 依赖的bundle除了
org.eclipse.jdt.core.manipulation,还要确保包含org.eclipse.jdt.ui、org.eclipse.ui等基础UI和JDT相关bundle。
内容的提问来源于stack exchange,提问作者Srujan Barai




