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)
方式二:重新绑定变量到整个方法调用
- 修改搜索模板为:
$MethodCall$($Parameter$)
- 为
$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
相关产品推荐
相关产品推荐

