IntelliJ Structural Search не заменяет все вызовы методов в цепочечном / свободном интерфейсе
Рассмотрим следующий полный пример класса стиля Builder.
package com.derp;
class MyBuilder {
public MyBuilder set(String key, Object val) {
return this;
}
public MyBuilder setFoo(Object val) {
return this;
}
public MyBuilder setBar(Object val) {
return this;
}
public MyBuilder setBaz(Object val) {
return this;
}
}
public class Main {
public static void main(String[] args) {
// ** Example 1
MyBuilder a = new MyBuilder();
a.set("foo", 1);
a.set("bar", 2);
a.set("baz", 3);
// ** Example 2
MyBuilder b = new MyBuilder()
.set("foo", 1)
.set("bar", 2)
.set("baz", 3);
}
}
Используя IntelliJ Structural Search, я бы хотел рефакторинг вызовов методов в форме set("foo", value)
в setFoo(value)
везде он вызывается в определенном классе / интерфейсе для всех строковых литералов (а не только для "foo").
Это только в некоторой степени работает с цепочкой вызовов методов (AKA "свободный" интерфейс), в которой set()
возвращаемый метод this
,
В приведенном выше основном методе то, что я пометил как Пример 1, корректно реорганизовано, но Пример 2 заканчивается так, что бесполезно:
MyBuilder b = new MyBuilder()
.set("foo", 1)
.set("bar", 2).setBaz(3);
я нуждаюсь set("foo", 1)
а также set("bar", 2)
чтобы быть обновленным здесь
Может ли IntelliJ справиться с этим вариантом использования?
Ниже приведены подробности опций, которые я передал в Структурный поиск и замена. Я попытался настроить параметры "количества случаев", но, к сожалению, не нашел ни одного варианта, который работал. Вот детали шаблона.
Шаблон поиска:$Builder$.set($Key$, $Val$)
Шаблон замены:$Builder$.set$Name$($Val$)
Переменные:
$Builder$
Тип выражения (регулярное выражение): com\.derp\.MyBuilder
$Key$
Тип выражения (регулярное выражение): java\.lang\.String
$Name$
Текст сценария: Key.getText().replace("\"", "").capitalize()
1 ответ
Это ограничение структурного поиска и замены, и в настоящий момент это невозможно. Что вы можете сделать, это вызвать заменить несколько раз. Каждый раз будет найден один экземпляр цепочки. Вы должны будете продолжать делать это, пока больше не будет найдено никаких экземпляров.
Или чуть более удобно, вы можете создать инспекцию поиска по структуре из ваших шаблонов. Это найдет все экземпляры. Но вам придется вызывать быстрое исправление для каждого экземпляра цепочки отдельно, иначе оно не будет работать.