编辑

Rename Refactoring

重命名重构的操作与Find Usages的操作非常相似.

它使用相同的规则来定位要重命名的元素,以及用于定位文件的相同索引,这些文件可能引用了要重命名的元素.

当执行重命名重构时,该方法

PsiNamedElement.setName()

调用重命名的元素,和

PsiReference.handleElementRename()

调用所有对重命名元素的引用.

这两种方法基本上执行相同的操作:将PSI元素的基础AST节点替换为包含用户输入的新文本的节点.

从头开始创建完全正确的AST节点非常困难.

因此,令人惊讶的是,获取替换节点的最简单方法是使用自定义语言创建一个虚拟文件,以便它在其解析树中包含必要的节点,构建解析树并从中提取必要的节点.

例:

的setName()

实施一个

属性语言插件

与重命名重构相关的另一个接口是

NamesValidator.

此接口允许插件根据自定义语言规则检查用户在“重命名”对话框中输入的名称是否是有效标识符(而不是关键字).

如果插件未提供此接口的实现,则使用用于验证标识符的Java规则.

实施

NamesValidator

com.intellij.lang.namesValidator扩展点中注册.

:

NamesValidator

对于

属性语言插件

可以在多个级别上进一步自定义重命名重构处理.

提供自定义的实现

RenameHandler

界面允许您完全替换重命名重构的UI和工作流,并且还支持重命名非重构的内容

PsiElement

一点都不

:

RenameHandler

用于重命名资源包

属性语言插件

如果你对标准UI很好,但需要扩展默认的重命名逻辑,你可以提供一个实现

RenamePsiElementProcessor

接口.

这允许您:

*重命名与调用操作的元素不同的元素(例如,超级方法)

*一次重命名多个元素(如果他们的名字根据您的语言逻辑链接)

*检查名称冲突(现有名称等)

*自定义搜索代码引用或文本引用的方式

*等

:

RenamePsiElementProcessor

用于重命名属性

属性插件语言

Last modified: 11 May 2019