如何在IntelliJ插件中调用现有重构功能?
如何在IntelliJ插件中调用现有重构功能?
嘿,我来给你梳理下在IntelliJ插件里调用内置重构功能的实用思路~
首先,你提到的RefactoringFactory确实只封装了部分常用重构(比如重命名、安全删除),但其他像提取委托、提取方法这类重构,IntelliJ把它们的API分散在对应的子包和处理类里了,下面给你分情况说明:
1. 用RefactoringFactory实现基础重构(比如重命名)
如果是重命名这类已经被RefactoringFactory支持的功能,直接通过工厂实例创建对应的重构对象,配置参数后执行就行,举个简单例子:
Project project = ...; // 获取当前项目上下文 PsiElement elementToRename = ...; // 要重命名的Psi元素(比如类、方法) String newName = "NewClassName"; RenameRefactoring renameRefactoring = RefactoringFactory.getInstance(project).createRename(elementToRename, newName, false); // 如果不需要弹出确认对话框,可以设置跳过预览 renameRefactoring.setPreviewUsages(false); // 执行重构,注意要在Write Action中操作 WriteCommandAction.runWriteCommandAction(project, () -> { try { renameRefactoring.execute(); } catch (RefactoringException e) { // 处理重构异常 LOG.error("Rename failed", e); } });
2. 调用其他重构(比如提取委托、提取方法)
像提取委托(Extract Delegate)、提取方法(Extract Method)这类功能,需要找到对应的重构处理器或处理类,它们大多在com.intellij.refactoring的子包下:
示例:提取委托
提取委托可以用ExtractDelegateHandler或者直接实例化ExtractDelegateProcessor,需要先准备好要提取的目标元素、委托类的信息等:
Project project = ...; PsiClass targetClass = ...; // 要从中提取委托的类 PsiElement[] elementsToExtract = ...; // 要提取到委托类的元素(比如方法、字段) String delegateClassName = "MyDelegate"; // 创建提取委托的处理器 ExtractDelegateProcessor processor = new ExtractDelegateProcessor( project, targetClass, elementsToExtract, delegateClassName, // 这里可以配置是否生成getter、是否是内部类等参数 true, // generateGetter false // isInnerClass ); // 在Write Action中执行重构 WriteCommandAction.runWriteCommandAction(project, () -> { processor.run(); });
示例:提取方法
提取方法对应的类是ExtractMethodProcessor,需要指定要提取的代码范围、方法名等参数:
Project project = ...; PsiFile file = ...; TextRange selectedRange = ...; // 选中的要提取的代码范围 String methodName = "extractedMethod"; // 创建提取方法的处理器 ExtractMethodProcessor processor = new ExtractMethodProcessor( project, file, selectedRange.getStartOffset(), selectedRange.getEndOffset(), methodName, null, // 方法返回类型(自动推断可以传null) false // 是否是静态方法 ); // 执行重构 WriteCommandAction.runWriteCommandAction(project, processor::run);
3. 关键注意事项
- 上下文获取:所有重构都需要依赖
Project、PsiElement等上下文对象,你可以通过DataContext或者当前编辑器的状态来获取这些对象(比如从Editor中获取选中的文本范围,再转成Psi元素)。 - Write Action:修改Psi元素的操作必须放在
WriteCommandAction中执行,否则会抛出异常。 - 参数配置:很多重构处理器允许你配置是否弹出对话框、是否自动推断参数等,如果你希望插件自动执行重构而不需要用户交互,可以把这些参数设置为跳过对话框。
- 参考IDE源码:如果找不到某个重构的API,直接去看IntelliJ IDEA本身的重构实现源码,搜索对应的重构名称,就能找到对应的处理类和调用方式。
备注:内容来源于stack exchange,提问作者Simon Denisov
相关产品推荐
相关产品推荐

