【问题标题】:Intellij structural replace change method signatureIntellij 结构替换更改方法签名
【发布时间】:2015-02-18 10:45:58
【问题描述】:

我想更改一个带有特定签名的方法:

public OldReturnType get.*(Params) {
  //lots of code
}

到这里:

public NewReturnTyp get.*(Params) {
  //lots of code
}

-> 我想替换返回类型。我用 SSR 试过这个:

  • 复制现有的模板“类的方法”。这产生了模板:

    类 $Class$ { $ReturnType$ $MethodName$($ParameterType$ $Parameter$); }

我首先尝试分别替换 $ReturnType$ OldType 和 NewType:

搜索模板:

class $Class$ { 
  OldType $MethodName$($ParameterType$ $Parameter$);
}

替换模板:

class $Class$ { 
  NewType $MethodName$($ParameterType$ $Parameter$);
}

这给了我所有的方法,但如果我替换它,方法就会被删除。

然后我尝试通过以下方式更改模式:

搜索模板:

class $Class$ { 
  $OldType$ $MethodName$($ParameterType$ $Parameter$);
}

并指定 $OldType$ 应该是搜索的目标。我还为这个变量指定了一个 RegEx 模式:OldType。

替换模板:

class $Class$ { 
  NewType $MethodName$($ParameterType$ $Parameter$);
}

这也会找到所有方法,但如果我替换它们会被删除。我尝试了非常不同的方法,但结果始终相同:如果我替换匹配项,则该方法将被删除。我如何必须指定搜索/替换模板才能在签名中将 OldType 替换为 NewType。

【问题讨论】:

    标签: intellij-idea structural-search


    【解决方案1】:

    您在结构搜索和替换中遇到了错误。大概是这个:https://youtrack.jetbrains.com/issue/IDEA-127835

    但是有一个解决方法。使用以下搜索模板:

    class $Class$ { 
      OldType $MethodName$($ParameterType$ $Parameter$) {
        $statement$;
      }
    
      $other$;
    }
    

    确保未设置 $MethodName$ 的“此变量是搜索的目标”,否则它将不起作用。

    $statement$
    最小计数:0
    最大数量:无限制

    $其他$
    最小计数:0
    最大数量:无限制

    其余的与现有模板中的类方法一样。

    Replacement Template 和 Search Template 一样,只是用 NewType 替换了 OldType。

    让我知道它是否有效,或者如果您还有其他问题。

    【讨论】:

    • 种类:现在的问题是,一些参数失去了它们的最终修饰符,所以我在匿名内部类中遇到了一些编译器错误。但是我现在是手工完成的,我认为你提到的错误是我发誓的原因(-;。我会接受你的回答,因为我认为对于下一个想要这样做的人来说这是一个好的开始,但对我来说,问题解决了。
    • 我认为您的方法签名中需要类似这样的内容: $accessModifier$ $static$ OldType $MethodName$($ParameterType$ $Parameter$){ 并设置 min/max分别计为 0 和 1。
    • @mish 在 SSR 中不能使用变量作为修饰符。模板始终需要是有效的可编译 Java 代码(片段)。
    • 啊,好的,感谢您的澄清——不过这绝对是一个弱点。
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2012-03-30
    • 2011-03-19
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多