You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IntelliJ结构搜索无法匹配带@Internal注解类的方法调用问题

修复IntelliJ结构搜索脚本:匹配调用@Internal注解类方法的代码

问题排查

核心原因是脚本上下文判断错误:
模板中的$MethodCall$变量绑定的是方法调用的方法名字符串(PsiIdentifier),而非整个方法调用表达式(PsiMethodCallExpression)。原脚本中__context__ instanceof PsiMethodCallExpression的判断直接返回false,导致整个条件不满足,无法匹配目标代码。

另外,正则表达式com\\.interestingpackage\\.(?!notfrompackage).+逻辑冗余——如果不需要额外限制包名,可直接移除该条件;若需保留,当前正则逻辑在示例场景下是有效的,但并非无匹配结果的原因。

修复方案

提供两种可行修复方式,推荐第二种更简洁的实现:

方式一:调整脚本上下文获取

修改$MethodCall$的脚本,将当前上下文替换为其父节点(即完整的方法调用表达式):

import com.intellij.psi.* 
def methodCall = __context__.getParent()
methodCall instanceof PsiMethodCallExpression && 
methodCall.resolveMethod() != null &&
// 如需包名限制则保留此行,否则删除
java.util.regex.Pattern.matches("com\\.interestingpackage\\.(?!notfrompackage).+", methodCall.resolveMethod().getContainingClass().getQualifiedName()) &&
com.intellij.codeInsight.AnnotationUtil.isAnnotated(methodCall.resolveMethod().getContainingClass(), "com.common.Internal", true)

方式二:重新绑定变量到整个方法调用

  1. 修改搜索模板为:
$MethodCall$($Parameter$)
  1. 为$MethodCall$变量配置以下脚本:
import com.intellij.psi.* 
__context__ instanceof PsiMethodCallExpression && 
__context__.resolveMethod() != null &&
// 如需包名限制则保留此行,否则删除
java.util.regex.Pattern.matches("com\\.interestingpackage\\.(?!notfrompackage).+", __context__.resolveMethod().getContainingClass().getQualifiedName()) &&
com.intellij.codeInsight.AnnotationUtil.isAnnotated(__context__.resolveMethod().getContainingClass(), "com.common.Internal", true)

验证:使用任一修复方式后重新运行结构搜索,即可匹配到目标代码a.a();。

内容的提问来源于stack exchange,提问作者doleris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:13:28