结构搜索以匹配具有通用参数的方法调用
Structural Search to match method call with generic parameter
假设我有一个 class class Foo : Base
并且我想执行带有签名
的特定方法调用
public void someStuf(Iterable<? extends Base> param)
对于搜索模板,我只是以预先存在的一个
作为起点
$Instance$.$MethodCall$($Parameter$)
是否可以匹配特定 Base
subclass 的任何 种类 Iterable
的参数(Foo
在这个例子中)??
List<Foo> fooList = new ArrayList<>();
fooList.add(new Foo("A"));
List<Bar> barList = new ArrayList<>();
barList.add(new Bar(1));
someStuff(fooList); // find this!
someStuff(barList); // don't find this one
someStuff(Collections.singletonList(new Foo("B"))); // also match this one
我已经尝试了几种组合,但都没有成功,是否可行?
目前不借助黑客手段是不可能的。诀窍是使用脚本约束:
搜索模板
$Instance$.$MethodCall$($Parameter$)
变量
$Instance$
min/max 计数:0,1
$MethodCall
text/regexp: someStuff
$Parameter$
脚本文本:__context__.type.parameters[0].presentableText.contains("Foo")
,表达式类型:List
我已经提交了a bug report。
假设我有一个 class class Foo : Base
并且我想执行带有签名
public void someStuf(Iterable<? extends Base> param)
对于搜索模板,我只是以预先存在的一个
作为起点$Instance$.$MethodCall$($Parameter$)
是否可以匹配特定 Base
subclass 的任何 种类 Iterable
的参数(Foo
在这个例子中)??
List<Foo> fooList = new ArrayList<>();
fooList.add(new Foo("A"));
List<Bar> barList = new ArrayList<>();
barList.add(new Bar(1));
someStuff(fooList); // find this!
someStuff(barList); // don't find this one
someStuff(Collections.singletonList(new Foo("B"))); // also match this one
我已经尝试了几种组合,但都没有成功,是否可行?
目前不借助黑客手段是不可能的。诀窍是使用脚本约束:
搜索模板
$Instance$.$MethodCall$($Parameter$)
变量
$Instance$
min/max 计数:0,1
$MethodCall
text/regexp: someStuff
$Parameter$
脚本文本:__context__.type.parameters[0].presentableText.contains("Foo")
,表达式类型:List
我已经提交了a bug report。