仅使用特定参数类型的一个特定属性来查找所有Java方法

时间:2019-06-20 17:30:15

标签: java intellij-idea refactoring

我们正在尝试识别任何地方,仅使用特定类型的对象从中获取特定属性,然后将该属性传递给方法。

我认为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,但不要被shoudNotBeMatchedalsoShouldNotBeMatched所困扰,因为除了调用getId()之外,它们还对mc对象做一些事情。

1 个答案:

答案 0 :(得分:0)

  

我认为IntelliJ IDEA的“结构搜索”可能是一个很好的工具

的确如此。文档可能会很困难。

让我们检查Search templates, filters, and script constraints页。如下。

  

比方说,您有一个与方法匹配的变量,即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