IntelliJ/structural 搜索:删除只调用超级方法的无用方法

IntelliJ/structural search: Remove useless methods that only call super method

在我的一个 Android 项目中(但不一定绑定到 Android),我有很多方法调用实际上什么都不做,只是破坏代码并且可以自动删除。示例:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    return super.onKeyDown(keyCode, event);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    return super.onCreateOptionsMenu(menu);
}

@Override
public void onDestroy() {
    super.onDestroy();
}

我找不到任何帮助我自动删除这些表达式的检查,所以我尝试了结构搜索。到目前为止我的尝试:我复制了 'annotated methods' 的模板并做了 2 处小改动。

  1. $Annotation$ 更改为 occurs=1, text=Override
  2. 添加了 occurs=1 的 $Statement$ 变量

模板代码:

class $Class$ {
    @$Annotation$( )
    $MethodType$ $MethodName$($ParameterType$ $ParameterName$) {
        $Statement$;
    }
}

到目前为止,一切顺利 - 它只在正文中找到只有一行的方法。但是现在我想明确地搜索调用 super 方法的确切语句(有点像对 $MethodName$ 的反向引用),但它也是 return super 值(当不为空时)。有什么想法吗?

我相信这将是一个非常有用的检查,也可以集成到主要的 IntelliJ 代码库中。 :-)

所以我最近发现 IntelliJ 的 'Empty method' 检查实际上是在寻找这个。只需:

双班次 -> 运行 按名称检查 -> 空方法

大纲是'Method only calls its super',但是检查其实找的不止这个,例如:

  • 该方法及其所有导数都是空的
  • 这个方法的所有实现都是空的
  • 方法为空
  • 空方法覆盖空方法

根据你的情况,它可能会找到比你想要的更多的东西——重构试图删除比我实际想要的更多的东西。但是通过快速的人工审查,你应该可以开始了。 :-)

使用结构搜索,您将不得不使用两个单独的搜索。一种用于查找 void return 类型的方法:

class $Class$ {
    $MethodType$ $MethodName$($ParameterType$ $ParameterName$) {
        super.$MethodName$($ParameterName$);
    }
}

第二个用于 return 值的方法:

class $Class$ {
    $MethodType$ $MethodName$($ParameterType$ $ParameterName$) {
        return super.$MethodName$($ParameterName$);
    }
}

在这种情况下不需要指定 @Override 注释。