【问题标题】:IntelliJ Structural Search doesn't replace all method calls in a chain/fluent interfaceIntelliJ 结构搜索不会替换链/流式接口中的所有方法调用
【发布时间】: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


【解决方案1】:

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

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

您可能需要为此问题提交bug report

【讨论】:

  • 感谢您的快速回复。您是否有任何关于我如何以“无头”方式运行结构搜索的指示或文档,即来自命令行的可编写脚本的版本?在 GUI 停止更改之前,我无法使用 GUI 手动运行 100 次。从那以后,我即兴创作了一个工具来帮助我基于不同的 AST 表示进行重构,但这绝对不会是我最后一次需要进行大型重构。将来,我会考虑克隆 IntelliJ 源代码并为我的 IDE 打补丁,所以欢迎您提供任何文档 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多