如果基类符合条件,则IntelliJ结构搜索会找到派生类

时间:2018-11-13 18:56:04

标签: java intellij-idea ide editor structural-search

假设我有一个带有字段refCount的基类。我不小心创建了一个派生类,该类也声明了一个具有相同名称的字段。 (实际上,名称并不重要:重要的是类型,即ReferenceCount;但是名称相当一致。)这是浪费内存,因此能够自动查找此类内容会很不错。可以使用结构搜索(或其他方法)来完成此操作吗?

2 个答案:

答案 0 :(得分:2)

看来Java | Visibility | Field name hides field in superclass检查所做的事情与您需要的类似。

如果要通过“结构化搜索”执行此操作,则可以执行以下操作。 搜索模板:

class $X$ {
  RefCount $f$;
}

并在“完全匹配”上添加以下“脚本”过滤器:

import com.intellij.psi.*;
for (PsiClass aClass : X.getSupers()) { // X refers to the template var $X$
  for (PsiField field : aClass.getAllFields()) {
    // compares the type of the super field with the type of field $a$
    if (field.getType().equals(a.getType())) {
      return true;
    }
  }
}
return false;

答案 1 :(得分:1)

看起来新版本的IntelliJ(2018.3)使得此操作相当容易,尽管有点尴尬。如果我知道这即将到来,我会很想使用预览版。

诀窍是首先为基类创建(并保存!)搜索模板;例如这样的

class $Class$ {RefCount $count$;}

然后执行以下操作:

class $Child$ extends $Base$ {RefCount $count$;}

然后为$Base$添加一个“引用”过滤器,该过滤器引用您保存的模板。

如果Child扩展了Parent,这又扩展了GrandParent,则此技巧不起作用。在父级中,该字段在Child和GrandParent中声明,但在Parent中声明。我认为可以解决该问题,而不会带来太多麻烦,但是我实际上不知道如何做到这一点。