使用结构化搜索和替换
结构化搜索和替换是一种强大的工具,可以搜索特定的代码模式并添加修饰符以缩小搜索范围。
在本教程中,我们将搜索字段声明,添加修饰符,并基于修改后的模板创建代码检查。 如果您愿意,您可以在我们深入探讨之前观看相关视频。 视频可能会略有不同,因为这是为较早版本的 IntelliJ IDEA 制作的。
让我们打开 结构化搜索 对话框,并使用一个现有模板进行搜索。
使用现有模板(字段声明)
在主菜单中,前往 。
在 Structural Search 对话框中,在 节点下,选择 类的所有字段 ,这将查找所有字段声明并点击 查找。

因此,在 查找 工具窗口中,IntelliJ IDEA 会显示我们 Java 代码中声明的所有字段。

现在,让我们回到结构搜索对话框来稍微修改一下预定义模板。 顺便说一句,您可以使用 随处搜索 窗口来访问搜索对话框。
更改预定义模板
请按 Shift 两次以打开 随处搜索 窗口。
开始输入搜索查询,点击搜索结果列表中的 结构化搜索 以打开我们的结构化搜索对话框。

在 Structural Search 对话框中,我们通过在
final变量之前添加$Field$来更新模板,只搜索最终字段。 请注意,对话框中支持代码补全。
我们将递归地搜索我们的代码,匹配大小写,并且只在 Java 类型文件中搜索。

当我们更改范围时,IntelliJ IDEA 可以立即通知您在指定范围内是否可以找到代码模式。

请在 查找 工具窗口中检查结果。

通过结构搜索,我们可以进行一些有趣的搜索。 让我们选择另一个现有模板(方法调用 )作为我们的例子。
使用现有的模板(方法调用)
在 Structural Search 对话框中,点击
并选择 现有模板。
打开现有模板列表,然后在 方法调用 节点下选择 表达式 模板。

如果我们现在运行搜索,我们的代码中的所有方法调用都会出现在结果中。 因此,我们应当稍微修改我们的模板并使用修饰符,以便更具体地说明我们在寻找什么。 让我们添加一个修饰符
文本并定义一个名为print的方法。 我们会查找调用一个名为print的方法。我们可以添加一个正则表达式,例如,查找所有包含
print的方法调用。 为此,让我们切换print到print.*。现在搜索结果不仅会包括 print,还会包括
println和printf。让我们更改搜索模式,以便结果只显示仅接受单个参数的方法。 点击
$Parameter$变量并添加计数修饰符min=1max=1。
在这种情况下,我们的搜索结果会更少。
假设我们正在进行此搜索,以用日志调用替换所有这些方法调用,而不是 System.out。 这些日志方法只接受字符串类型,不接受其他类型。
首先,让我们找出传递字符串的方法。
在 Structural Search 对话框中,为
$Parameter$变量添加修饰符 类型。
点击 搜索。 因此,我们看到了一系列只接受文字字符串或类型为
String的变量的 print 方法。
现在让我们进行替换。
替换代码
请使用 随处搜索 窗口访问 结构化替换。
在 结构化替换 对话框中,在 替换模板 中添加您想要用来替换搜索结果的代码。 在我们的情形中是
java.util.logging.Logger.getLogger(this.getClass().getName()).fine($Parameter$)
点击 查找。
请在 查找 工具窗口中检查结果,并使用替换选项替换所有结果或仅替换选定的结果。

正如您所见,代码已被更改。

我们可以保存此模板以备日后需要时参考。
保存已修改的模板
在 结构化替换 对话框中,点击
。
在打开的列表中,选择 保存模板。
让我们添加模板的名称 (打印 String 调用) 并点击 OK。
模板保存在 用户定义 节点下的 现有模板 对话框中。

在 结构化替换 对话框中,我们可以点击
来查看您最近搜索的历史记录,并快速重新运行其中的任何一条。

我们还可以将模板用作检查,因此当我们遇到相同代码时,会看到一个警告,并可以快速替换代码。
创建自定义检查
在 查找 工具窗口中,当您获得替换模式的结果时,点击 从模板创建检查。
在打开的对话框中,添加模板的名称
打印 String 调用。
如果您愿意,您可以添加工具提示并点击 OK。
在 设置 对话框(Ctrl+Alt+S )中,转到 。
在 检查 页面上,打开 结构化搜索 节点以定位创建的检查。

现在,您可以在编辑器中快速修复代码,或者使用 问题 视图,在那里我们可以检查带有使用新代码替换的建议的警告。

我们可以直接从检查设置中添加自定义结构搜索检查。
从检查 设置中创建自定义检查
在 设置 对话框(Ctrl+Alt+S )中,转到 。
在 检查 页面,选择 结构化搜索 节点并点击
。 我们可以基于搜索模板或替换模板进行检查。 让我们选择 添加替换模板。
在 结构化替换 对话框中,让我们稍微更改一下搜索模式。 让我们将
类型修饰符更改为int以便我们的$Parameter$变量。在替换模式中,让我们调整代码。
java.util.logging.Logger.getLogger(this.getClass().getName()).fine(String.valueOf($Parameter$)),
在打开的对话框中,让我们添加检查的名称
print int calls并点击 OK。
新的检查项被添加到 结构化搜索 下,您可以运行它来搜索打印整数的实例。 当找到这样的代码时,我们可以用记录器调用来替换它,并将找到的参数转换成字符串。
我们可以使用其名称单独运行我们的检查。
运行结构搜索检查
按 Ctrl+Alt+Shift+I 或转到主菜单中的 。
在打开的对话框中,我们输入检查的名称
打印 String 调用。
在 运行 'print String calls' 对话框中,让我们保留默认选项并点击 OK。

我们可以在 检查结果 工具窗口中查看我们的结果。
