如果基础 class 符合条件,则 IntelliJ 结构搜索会找到派生的 classes

IntelliJ structural search find derived classes if base class matches criteria

假设我有一个带有字段 refCount 的基 class。我不小心创建了一个派生的 class,它还声明了一个具有相同名称的字段。 (其实名字并不重要,重要的是类型,就是ReferenceCount;不过名字还是比较一致的。)这太浪费内存了,要是能自动找到这样的东西就好了。这可以通过结构搜索(或其他一些方式)来完成吗?

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

如果你想用结构搜索来做到这一点,你可以这样做。 搜索模板:

class $X$ {
  RefCount $f$;
}

并在 "complete match" 上添加以下 "script" 过滤器:

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;

看起来新版本的 IntelliJ (2018.3) 让这件事变得相当简单,尽管有点笨拙。如果我知道这即将到来,我会很想使用预览版。

诀窍是首先创建(并保存!)一个搜索模板 class;例如像这样:

class $Class$ {RefCount $count$;}

然后做这样的事情:

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

然后为 $Base$ 添加一个 "reference" 过滤器,它引用您保存的模板。

如果 Child 扩展了 Parent,而 Parent 又扩展了 GrandParent,此技巧将不起作用,其中该字段在 Child 和 GrandParent 中声明,但不在 Parent 中声明。我认为这可以解决这个问题,不会有太多麻烦,但我实际上不知道该怎么做。