1

考虑以下 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()

4

1 回答 1

1

这是结构搜索和替换的限制,目前是不可能的。您可以做的是多次调用 Replace。每次都会找到一个链的实例。您将不得不继续这样做,直到找不到更多实例。

或者稍微方便一点,您可以从模板创建结构搜索检查。这将找到所有实例。但是您必须分别对链的每个实例调用快速修复,否则它将不起作用。

您可能需要为此问题提交错误报告

于 2017-08-27T07:18:10.447 回答