【发布时间】:2017-08-25 18:57:59
【问题描述】:
考虑以下 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。
在上面的 main 方法中,我标记为 Example 1 的内容被正确重构,但 Example 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()
【问题讨论】:
标签: java intellij-idea structural-search