【问题标题】:How to convert Java primitive to boxed type in IntelliJ Structural Replace如何在 IntelliJ Structural Replace 中将 Java 原语转换为盒装类型
【发布时间】:2020-02-03 09:56:38
【问题描述】:

我正在尝试使用 IntelliJ 结构搜索和替换来重载一组带有 Optional 变体的 setter 方法。这需要尊重目标值可能是原始的(例如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$;
}

我有点卡在生成 $vTypeMightBeBoxed 所需的 PSI Groovy 脚本上

附言。这主要是由于添加这些脚本时完全缺乏编辑器帮助造成的!不是 Jetbrains 所期望的!

【问题讨论】:

  • Optional&lt;Boolean&gt; 应该是什么,一个“是/否/也许”的东西?您是否有机会改用具有三个选项的更精确的枚举类型?
  • 这只是一个例子 :) boolean 可以是 int、int[]、String、List&lt;String&gt; 或 MyClass。这是关于使用 SSR 盲目地添加接受 Optionals 的替代 setter 方法,而不是讨厌的三态逻辑。

标签: java intellij-idea structural-search


【解决方案1】:

$VTypeMightBeBoxed$ 这样的脚本应该可以工作:

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

但请注意,当一个类中有多个具有相同名称的 set 方法时,您的替换将生成红色代码:这些方法将具有相同的擦除。

【讨论】:

  • 这或多或少是我所达到的,但要整洁得多。我确实找到了两个“红色方法”,其中有人手动添加了 setter。不过都很好 - 修复两个编译问题比添加 200 个方法要便宜得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2015-01-12
相关资源
最近更新 更多