Как преобразовать примитив Java в коробочный тип в IntelliJ Structural Replace

Я пытаюсь использовать IntelliJ Structural Search and Replace для перегрузки набора методов установки Optional вариантами. При этом необходимо учитывать, что целевое значение может быть примитивным (например, от boolean до Optional<Boolean>). Вот основная часть преобразования:

Поиск:

public static void set($BType$ $BName$, $VType$ $VName$) {
    $body$; // 0 - infinity
}

Замена:

public static void set($BType$ $BName$, java.util.Optional<$VTypeMightBeBoxed$> $VName$) {
    $VName$.ifPresent(v -> set($BName$, v));
}
public static void set($BType$ $BName$, $VType$ $VName$) {
    $body$;
}

Я немного застрял в скрипте PSI Groovy, необходимом для генерации $vTypeMightBeBoxed

PS. Это в основном вызвано полным отсутствием помощи редактора при добавлении этих скриптов! Не то, что ожидается от Jetbrains!


person drekbour    schedule 03.02.2020    source источник
comment
Что такое Optional<Boolean>, должно быть, да / нет / может быть? Есть ли у вас шанс использовать вместо этого более точный enum-type с тремя вариантами?   -  person Amadán    schedule 03.02.2020
comment
Это должно быть примером :) boolean может быть int, int[], String, List<String> или MyClass. Речь идет об использовании SSR для слепого добавления альтернативных методов установки, которые принимают Optionals, а не для неприятной логики с тремя состояниями.   -  person drekbour    schedule 03.02.2020


Ответы (1)


Такой скрипт для $VTypeMightBeBoxed$ должен работать:

import com.intellij.psi.*
def x = VType.getType()
if (x instanceof PsiPrimitiveType) {
  return x.getBoxedTypeName();
} else {
  return VType.getText();
} 

Но будьте осторожны, ваша замена сгенерирует красный код, если в классе есть несколько из этих методов набора с одинаковым именем: методы будут иметь одинаковое стирание.

person Bas Leijdekkers    schedule 03.02.2020
comment
Это было более или менее то, к чему я подошел, хотя и намного аккуратнее. Я нашел два «красных метода», когда кто-то вручную добавлял сеттер. Впрочем, все хорошо - исправить две проблемы с компиляцией намного дешевле, чем добавить 200 методов. - person drekbour; 03.02.2020