IDEA结构搜索实现特定方法的类,而不是其他方法

时间:2017-06-18 13:46:02

标签: java intellij-idea structural-search

在我们的代码库中,我正在寻找给定类的匿名子类,它们实现了一个特定的方法,并且没有其他方法或字段。这些可以转换为lambda表达式,并且不需要那个匿名子类。

我想出的搜索模板如下所示:

new SimpleListSubstitution<$Type$>() {
    @Modifier Iterable<$Type$> getItems() {
        return $EXPRESSION$;
    }
}

替换模板是:

SimpleListSubstitution.forItems(() -> $EXPRESSION$)

现在这个表达式找到了我想要重构的所有实例,但是它还找到了同样实现其他方法的子类(辅助方法或从超类中重写)。

作为一个例子,我希望它在这段代码中找到子类:

template.put("pathToRoot", new SimpleListSubstitution<Page>() {
    @Override
    protected Iterable<Page> getItems() {
        return listOfPagesToRoot;
    }
});

这将转换为以下内容:

template.put("pathToRoot", SimpleListSubstitution.forItems(() -> listOfPagesToRoot));

但由于额外的putAdditionalSubstitutions方法,我确实希望它找不到此代码中的子类:

template.put("children", new SimpleListSubstitution<Page>() {
    @Override
    protected Iterable<Page> getItems() {
        return getChildren(page, booleanFeatureName);
    }

    @Override
    protected void putAdditionalSubstitutions(Template template) {
        template.put("link", /*...*/);
    }
});

有没有办法在搜索/替换对话框中表达“没有其他方法”?

目前我只看到在查找视图中检查每个匹配并删除不需要的命中并替换其余命中的方法。由于我们需要多次应用此类和类似的重构(例如,处理同时写入的新代码),这变得相当费力。

1 个答案:

答案 0 :(得分:1)

您可以使用以下搜索模板:

new SimpleListSubstitution<$Type$>() {
    @Override
    protected Iterable<$Type$> getItems() {
        return $EXPRESSION$;
    }
    $ReturnType$ $Method$($ParameterType$ $Parameter$);
}

使用以下变量设置:
Method min:0,max:0
Parameter min:0,max:unlimited

请注意,此模式会尝试匹配其他方法,但由于Method设置为0次出现,因此如果找到方法,则匹配将失败。这样,只有未定义其他方法的类才会出现在搜索结果中。