IDEA 结构搜索 类 实现了一个特定的方法,没有其他

IDEA structural search for classes implementing a specific method and no other

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

的需要

我想出的搜索模板是这样的:

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

替换模板是这样的:

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

现在这个表达式找到了我想要重构的所有实例,而且它还找到了还实现其他方法(辅助方法或从 superclass 覆盖)的子classes。

例如,我希望它在这段代码中找到子class:

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

这将转换为以下内容:

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

但由于附加的 putAdditionalSubstitutions 方法,我不希望它在此代码中找不到子 class:

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

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

有没有办法在search/replace对话框中表达"no other methods"?

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

您可以使用这样的搜索模板:

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

具有以下变量设置:
Method 最小值:0,最大值:0
Parameter 最小值:0,最大值:无限制

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