如何在IntelliJ中结构上替换注释的一个参数的值

时间:2018-04-11 11:06:14

标签: java intellij-idea annotations ssr structural-search

我的课程注释了 @SequenceGenerator(name = "seq_gen",/*other_parameters*/) 我需要在每个班级中将"seq_gen"替换为"$Class$_seq_gen"

我试过了。

搜索

@SequenceGenerator(name = "seq_gen")
class $Class$ {}

替换

@SequenceGenerator(name = "$Class$_seq_gen")
class $Class$ {}

当我运行替换时,/*other_parameters*/部分被删除。

我也试过

搜索

@SequenceGenerator(name = "$VALUE$")
class $Class$ {}

替换

"$Class$_$VALUE$"

$VALUE$为目标,它现在不删除任何内容,但替换为_seq_gen,就像未定义$Class$一样。

我怎样才能做到这一点? SSR的文档非常混乱,而且不详细。

我通过搜索SO找到了这个问题,但它没有和实际答案,而且实际上是关于数组的问题。 Replace one of annotation parameters with IntelliJ IDEA's Structural replace

2 个答案:

答案 0 :(得分:0)

我找到了一个丑陋的工作,只为所有可能的N做这个:

搜索:

@SequenceGenerator(name = "$VALUE$", $param1$ = $value1$,/*...*/ $paramN$ = $valueN$)
class $Class$ {}

的更换:

@SequenceGenerator(name = "$Class$_$VALUE$", $param1$ = $value1$,/*...*/ $paramN$ = $valueN$)
class $Class$ {}

我真的不希望这是真正的答案,所以我不会在接下来的一周内接受它,希望有人提供更好的答案:)

答案 1 :(得分:0)

由于结构搜索中与注释参数相关的bug,这很难实现。但是,有一种使用替换变量和Groovy脚本的解决方法。使用以下搜索模板:

@SequenceGenerator(name = $value$)
class $Class$ {}
$ value $ constraints

text / regexp:"seq_gen"(包括引号)
此变量是搜索的目标:已启用

替换模板:

$replacement$
$ replacement $ script constraints

脚本文字:

import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.PsiClass

def x = PsiTreeUtil.getParentOfType(value, PsiClass.class);
"\"" + x.name + "_seq_gen\""