Найти все методы Java, используя только одно конкретное свойство определенного типа параметра - PullRequest
4 голосов
/ 20 июня 2019

Мы пытаемся везде идентифицировать, что конкретный тип объекта используется только для получения от него определенного свойства, и вместо этого передать это свойство в метод.

Я думаю,«Структурный поиск» IntelliJ IDEA может быть хорошим инструментом для этого, но я не уверен, как сформулировать шаблон поиска.

Конкретный пример:

public class MyClass {
   public Long getId() {...}
   public void setSomethingElse(int se) {...}
}

public class SomeOtherClasses {
   public void shouldBeMatched(MyClass mc) {
     doSomething();
     mc.getId();
     doSomethingElse();
   }

   public void shouldNotBeMatched(MyClass mc) {
      doSomething();
      mc.getId();
      mc.setSomethingElse(14);
      doSomethingElse();
   }

   public void alsoShouldNotBeMatched(MyClass mc) {
      shouldBeMatched(mc);
   }
}

В приведенном выше примере, если я ищу методы, которые используют только getId, то я должен найти shouldBeMatched, но не беспокоиться о shoudNotBeMatched и alsoShouldNotBeMatched, потому что они делают что-то с объектом mc, отличным от вызова getId ().

1 Ответ

0 голосов
/ 22 июня 2019

Я думаю, что IntelliJ IDEA "Структурный поиск" может быть хорошим инструментом для этого

И это действительно так. Документация может быть жесткой, хотя.

Давайте проверим Поиск шаблонов, фильтров и ограничений скрипта страница. Это происходит следующим образом.

Допустим, у вас есть переменная, которая соответствует методу, toString () метод. Тогда эта переменная на самом деле является узлом PsiMethod. Получение variable.parent создаст узел PsiClass и т. д. Затем variable.text выдаст вам весь текст метода. если ты просто нужно имя метода, вы можете использовать variable.name.

Похоже, что задачу можно выполнить, выбрав подходящий шаблон и написав соответствующий скрипт Groovy.

Шаблон называется methods of the class и находится под Existing templates. Они предоставляют переменную __context__ для использования со скриптом.

Мы должны быть уверены, что у совпадающих методов есть параметры. Это достаточно просто, просто установите счетный фильтр для переменной $Parameter$.

Count filter

Затем нам нужно извлечь имя параметра нужного типа и посмотреть, вызывается ли он в теле метода. Следующий скрипт сделает.

def parameters = __context__.getParameterList().getParameters();
def parameter = parameters.find { p -> p.getType().getName().equals('MyClass') };
if (parameter == null) return false;
String parameterName = parameter.getName();
String methodText = __context__.getText();
String occurrence = "${parameterName}.";
String methodCall = "${parameterName}.getId()";
return methodText.count(occurrence) > 0 && methodText.count(occurrence) == methodText.count(methodCall);

Поместите его в переменный фильтр $Method$ и проверьте результаты.

Verify results by pressing Find

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...