使用IntelliJ结构搜索将字段及其表达式替换为新字段

时间:2016-01-28 14:25:37

标签: java android-studio intellij-idea structural-search

我想在Android上使用ButterKnife。我需要根据代码中其他地方的一些表达式来注释一些字段。我有这样的代码

private String myField;
...
public myClassConstructor() {
    ...
    myField = res.getString(R.string.my_string_id);
    ...
}

我想要这个

@BindString(R.string.my_string_id);
String myField;
...
public myClassConstructor() {
    ...
    ...
}

在结果中,表达式消失了,并且该字段基于旧表达式进行注释。

是否有可能在IntelliJ的结构替换中进行此类搜索和替换?当感兴趣的线不相邻并且在结构上处于不同的位置时,似乎它没有优雅地处理该情况。我尝试将它基于类模板,并使用$ Statement $(0-unbounded occurrence),但它对我不起作用。

我意识到它实际上与正则表达式相比很简单,当然比使用IntelliJ结构搜索来玩球更简单,但是 我喜欢学习我的工具,所以我仍然想知道这是否可行。

2 个答案:

答案 0 :(得分:2)

虽然Search structurally在某种程度上有效并且可以进行搜索查询,但replace structuraly是一种由外星人和#34;制作的工具。对于"捕食者"。我希望intelliJ团队能够重新审视这个功能,并使其更加实用/可理解。

我自己尝试进行Replace structurally查询,但我只能制作Search structurally条款。

我以Mockito lib为例。

Structural search dialog

此处的一个关键点是$SomeStatement1$$SomeStatement2$分钟和最大点数为{0,无限制}

enter image description here

从这一点开始,我尝试使用替换子句,但它完全弄乱了方法/字段声明/类的范围。

希望这有帮助。

答案 1 :(得分:0)

这样的事情应该有效 搜索模板:

class $Class$ { 
    $FieldType$ $FieldName$;

    $Class$() {
        $st1$;
        $FieldName$ = res.getString($expr$);
        $st2$;
    }
}

变量:
st1分钟:0最大:无限制 st2 min:0 max:unlimited

替换模板:

class $Class$ { 
    @BindString($expr$)
    $FieldType$ $FieldName$;

    $Class$() {
        $st1$;
        $st2$;
    }
}