我们正在尝试识别任何地方,仅使用特定类型的对象从中获取特定属性,然后将该属性传递给方法。
我认为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
所困扰,因为除了调用getId()之外,它们还对mc对象做一些事情。
答案 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$
变量上即可。
然后,我们需要提取所需类型的参数的名称,并查看它是否在方法的主体中被调用。以下脚本将起作用。
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$
变量过滤器中,并验证结果。