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 небольших изменения.

  1. $ Annotation $ изменен на встречающийся =1, текст = переопределить
  2. Добавлена ​​переменная $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 аннотации в этом случае не нужны.

Другие вопросы по тегам