0
4

2 回答 2

2

如果有人遇到类似问题,则基于 Bas Leijdekkers 的答案的解决方案。

将这些类定义用于示例:

static class FooClass{

    static BarClass bar(){
       return new BarClass();
    }
}

static class BarClass{

     Bar2Class bar2(){
        return new Bar2Class();
    }

    BarClass self(){return this;}
}

static class Bar2Class{

    FinalClass bar3(){
        return new FinalClass();
    }
    Bar2Class self(){return this;}
}

static class FinalClass{
    void doIt(){
        System.out.println("bar2");
    }
    FinalClass doSomethingElse(){
        return this;
    }
}

我最终得到了两三个表达式:

  1. 匹配静态方法FooClass.bar()。不需要倒置doIt条件

    FooClass.$MethodCall$($Parameter$);

  2. 匹配中间类 FooClass,BarClass。不需要倒置doIt条件

    $Instance$.$MethodCall$($Parameter$);

    实例的表达式类型是(FooClass|BarClass)

  3. 匹配类Bar2ClassFinalClass。不同之处在于可以通过添加doIt()到表达式来制作有效的表达式。这可能仅在只有一个最终调用时才有效。

    $Instance$.$MethodCall$($Parameter$);

    实例的表达式类型是(Bar2Class|FinalClass) Here using the reverse constraint on the method calldoIt

    替换模板是 $Instance$.$MethodCall$($Parameter$).doIt();

这些结构搜索模式也可以用作 IntelliJ 中的检查。

测试用例:

    FooClass.bar().bar2();

    FooClass.bar();

    FooClass.bar().self().self().bar2();

    FooClass.bar().bar2().bar3(); // do it can be added

    FooClass.bar().bar2();

    FooClass.bar().self().bar2();

    FooClass.bar().bar2().bar3().doSomethingElse(); // do it can be added


    FooClass.bar().bar2().self().bar3().doSomethingElse(); // do it can be added

    FooClass.bar().bar2().bar3().doSomethingElse().doIt(); // all but this are invalid and found by the inspections
于 2016-06-19T14:52:18.617 回答
2

假设所有流利的 api 方法都返回一个 的实例FooClass,以下应该可以工作。从现有的模板方法调用开始并添加分号以搜索语句:

$Instance$.$MethodCall$($Parameter$);

单击编辑变量:

  1. 实例Expression type_ _FooClass
  2. Text/Regexp一组MethodCalldoit启用Invert condition
于 2016-06-19T10:06:11.247 回答