IntelliJ结构搜索能否引用变量计数?自定义检查咨询
嘿,我来帮你搞定这个IntelliJ结构搜索的问题!要实现你要的「匹配存在至少一个非原始类型参数且该参数无注解的方法(不管其他参数有没有注解)」,我们可以通过调整搜索模板+脚本过滤器来实现,还能满足你对变量计数引用的需求,具体步骤如下:
第一步:调整搜索模板
先把你原来的模板替换成更灵活的版本,让它能捕获方法的全部参数列表,而不是单个参数:
$MethodType$ $Method$($ParameterList$);
这个模板里的$ParameterList$会把方法的所有参数都纳入捕获范围,方便后续做批量检查。
第二步:配置核心过滤器(重点!)
接下来给每个变量设置过滤器,核心逻辑放在$ParameterList$的脚本过滤器里:
1. 基础参数数量限制
给$ParameterList$添加基础过滤器:count[1, ∞],确保我们只匹配有至少一个参数的方法。
2. 脚本过滤器实现精准匹配
给$ParameterList$再添加一个脚本过滤器,输入以下Groovy代码:
// 检查是否存在至少一个非原始类型且无注解的参数 parameters.any { param -> !param.type.isPrimitive() && param.annotations.isEmpty() }
这段脚本会遍历方法的所有参数,只要找到一个满足「非原始类型+没有任何注解」的参数,就判定该方法符合条件——完美覆盖你要的「部分参数有注解、部分无注解」的场景,当然也包含「所有参数都无注解」的情况。
3. 可选:限制方法范围(按需设置)
如果需要排除构造方法、静态方法或者特定返回类型的方法,可以给$Method$或$MethodType$添加额外过滤器,比如给$Method$设置kind[method]排除构造方法,或者给$MethodType$设置text[!void]限制返回类型。
关于你问的「变量计数引用」
完全可以在一个变量的过滤器中引用另一个变量的计数或属性!IntelliJ的结构搜索脚本过滤器支持Groovy语法,能直接访问变量的各种属性。比如如果你想做更复杂的逻辑(比如要求无注解的非原始参数数量≥2),可以修改脚本:
// 统计符合条件的参数数量 def targetParamCount = parameters.count { param -> !param.type.isPrimitive() && param.annotations.isEmpty() } // 要求至少2个符合条件的参数 targetParamCount >= 2
这里的parameters.size()就是参数列表的总数量,你可以直接拿来做对比,实现各种自定义逻辑。
为什么你之前的模板不生效?
你之前的模板是针对「单个参数」做匹配,加上$ParamAnnotation$: count[0,0]后,相当于只匹配「所有参数都没有注解」的方法——因为它把每个参数都固定为「要么带注解、要么不带注解」的单个实例,无法覆盖部分参数有注解的场景。而新模板通过捕获整个参数列表再做批量检查,就能解决这个问题。
内容的提问来源于stack exchange,提问作者cygnus

