考虑以下 Builder 样式类的完整示例。
package com.derp;
class MyBuilder {
public MyBuilder set(String key, Object val) {
return this;
}
public MyBuilder setFoo(Object val) {
return this;
}
public MyBuilder setBar(Object val) {
return this;
}
public MyBuilder setBaz(Object val) {
return this;
}
}
public class Main {
public static void main(String[] args) {
// ** Example 1
MyBuilder a = new MyBuilder();
a.set("foo", 1);
a.set("bar", 2);
a.set("baz", 3);
// ** Example 2
MyBuilder b = new MyBuilder()
.set("foo", 1)
.set("bar", 2)
.set("baz", 3);
}
}
使用 IntelliJ 的结构搜索,我想将表单的方法调用重构set("foo", value)
到setFoo(value)
在某个类/接口上调用它的任何地方,对于所有字符串文字(不仅仅是“foo”)。
这仅在一定程度上适用于方法调用链(也称为“流利的”接口),其中相关set()
方法返回this
.
在上面的主要方法中,我标记为示例 1的内容得到了正确重构,但示例 2以这样的方式结束,这没有帮助:
MyBuilder b = new MyBuilder()
.set("foo", 1)
.set("bar", 2).setBaz(3);
我需要set("foo", 1)
并且set("bar", 2)
在这里也需要更新。
IntelliJ 可以处理这个用例吗?
以下是我传递给结构搜索和替换的选项的详细信息。我尝试过围绕“出现次数”调整选项,但遗憾的是没有提出任何可行的选项。这是模板的详细信息。
搜索模板:
$Builder$.set($Key$, $Val$)
替换模板:
$Builder$.set$Name$($Val$)
变量:
$Builder$
表达式类型(正则表达式):com\.derp\.MyBuilder
$Key$
表达式类型(正则表达式):java\.lang\.String
$Name$
脚本文本:Key.getText().replace("\"", "").capitalize()