Java IntelliJ/structural search:删除只调用超级方法的无用方法

Java IntelliJ/structural search:删除只调用超级方法的无用方法,java,android,android-studio,intellij-idea,structural-search,Java,Android,Android Studio,Intellij Idea,Structural Search,在我的一个Android项目中(但不一定与Android绑定),我有很多方法调用,它们实际上什么都不做,只是破坏了代码,可以自动删除。示例: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return super.onKeyDown(keyCode, event); } @Override public boolean onCreateOptionsMenu(Menu menu) { retu

在我的一个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();
}
我找不到任何有助于自动删除这些表达式的检查,所以我尝试了结构搜索。到目前为止,我的尝试是:复制了“带注释的方法”的模板,并做了2个小改动

  • $Annotation$更改为occurs=1,text=Override
  • 添加了一个$Statement$变量,其occurs=1
  • 模板代码:

    class $Class$ {
        @$Annotation$( )
        $MethodType$ $MethodName$($ParameterType$ $ParameterName$) {
            $Statement$;
        }
    }
    
    到目前为止,一切都很好——它只是找到了在主体中只有一行的方法。但是现在我想明确地搜索调用super方法的确切语句(有点像$MethodName$的反向引用),但它也返回super值(如果不是void)。有什么想法吗


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

    所以我最近发现IntelliJ的“空方法”检查实际上是在寻找这个。简单地说:

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

    大纲是“方法只调用其超级”,但检查实际上寻找的不仅仅是这个,例如:

    • 该方法及其所有派生项均为空
    • 此方法的所有实现都是空的
    • 方法为空
    • 空方法重写空方法

    根据您的情况,它可能会找到比您想要的更多的内容,而重构尝试删除比我实际想要的更多的内容。但是,通过快速手动检查,您应该可以很好地进行操作。:-)

    使用结构化搜索,您必须使用两个单独的搜索。一个用于查找具有void返回类型的方法:

    class $Class$ {
        $MethodType$ $MethodName$($ParameterType$ $ParameterName$) {
            super.$MethodName$($ParameterName$);
        }
    }
    
    第二个用于返回值的方法:

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

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

    不,这不起作用。这个模板发现了更多的方法——不仅仅是那些调用super的方法。虽然我不知道为什么。。。此外,它还忽略了必须传递给超级方法的参数。可能是个虫子。我将尝试解决这个问题。在IntelliJ IDEA 2016.3中,以这种方式搜索超级方法是正确的。