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;
}
}
我最终得到了两三个表达式:
匹配静态方法
FooClass.bar()
。不需要倒置doIt
条件FooClass.$MethodCall$($Parameter$);
匹配中间类 FooClass,BarClass。不需要倒置
doIt
条件$Instance$.$MethodCall$($Parameter$);
实例的表达式类型是
(FooClass|BarClass)
匹配类
Bar2Class
,FinalClass
。不同之处在于可以通过添加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
假设所有流利的 api 方法都返回一个 的实例FooClass
,以下应该可以工作。从现有的模板方法调用开始并添加分号以搜索语句:
$Instance$.$MethodCall$($Parameter$);
单击编辑变量:
- 实例集
Expression type
_ _FooClass
Text/Regexp
一组MethodCall并doit
启用Invert condition