IntelliJ/ структурный поиск: удаление ненужных методов, которые вызывают только супер метод
В одном из моих проектов 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 $ изменен на встречающийся =1, текст = переопределить
- Добавлена переменная $Statement$ с происходит = 1
Код шаблона:
class $Class$ {
@$Annotation$( )
$MethodType$ $MethodName$($ParameterType$ $ParameterName$) {
$Statement$;
}
}
Пока все хорошо - это только поиск методов с одной строкой в теле. Но теперь я хочу явно искать точные операторы, вызывающие метод super (вроде как обратная ссылка на $MethodName$), но которые также возвращают значение super (если не void). Есть идеи?
Я считаю, что это будет действительно полезная проверка, которая также может быть интегрирована в основную кодовую базу IntelliJ.:-)
2 ответа
Поэтому недавно я обнаружил, что проверка IntelliJ "Пустой метод" на самом деле ищет это. Просто:
Двойная смена -> Выполнить проверку по имени -> Пустой метод
Вкратце: "Метод вызывает только супер", но проверка на самом деле ищет больше, чем просто это, например:
- Метод и все его производные являются пустыми
- Все реализации этого метода пусты
- Метод пуст
- Пустой метод переопределяет пустой метод
В зависимости от вашей ситуации он может найти больше, чем вы хотите - и рефакторинг попытался удалить больше, чем я на самом деле хотел. Но с быстрым ручным обзором вы должны быть готовы.:-)
При использовании структурного поиска вам придется использовать два отдельных поиска. Один для поиска методов с возвращаемым типом void:
class $Class$ {
$MethodType$ $MethodName$($ParameterType$ $ParameterName$) {
super.$MethodName$($ParameterName$);
}
}
и второй для методов, которые возвращают значение:
class $Class$ {
$MethodType$ $MethodName$($ParameterType$ $ParameterName$) {
return super.$MethodName$($ParameterName$);
}
}
Указание @Override
аннотации в этом случае не нужны.