Intellij 根据目标结构替换不需要的行为

问题描述 投票:0回答:1

我试图通过使用检查来建议替换该方法以使其成为静态,来查找并替换

@JsonCreator
在非静态方法上的所有用法。我有以下模板:

// Search template

@$Annotation$
$MethodType$ $Method$($ParameterType$ $Parameter$)

/** Modifiers
* Annotation{count=[1, inf], text=JsonCreator}
* Method{Script=!__context__.hasModifierProperty("static")}
* Parameter{count=[0, inf]}
*/ 

// Replace template

@$Annotation$
static $MethodType$ $Method$($ParameterType$ $Parameter$)

/** Modifiers
* Annotation{count=[1, inf], text=JsonCreator}
* Method{Script=!__context__.hasModifierProperty("static")}
* Parameter{count=[0, inf]}
*/ 

当搜索目标是

Complete Match
Method
时,这将按预期工作,执行以下操作:

// Before
@JsonCreator
BasicEnum fromString(String value) 
{
  // ...
}

// After
@JsonCreator
static BasicEnum fromString(String value) 
{
  // ...
}

但是,当目标为

Annotation
时,它会失败,而是执行以下操作。

// Before
@JsonCreator
BasicEnum fromString(String value) 
{
  // ...
}

//After
BasicEnum fromString(String value) 
{
  // ...
}

它删除了注释并且不添加 static 修饰符。

我希望目标是

Annotation
,因为在整个方法中显示警告波浪线感觉很笨拙。为什么定位
Annotation
时替换失败?有没有办法解决这个问题,使波浪线只出现在注释上?

要注意的是,我知道

@JsonCreator
也可以用于构造函数方法,但管理这些不是我现在关心的事情。我只是想找到
@JsonCreator
用于非静态方法的情况,并提供检查来替换。

java intellij-idea annotations static-analysis structural-search
1个回答
0
投票

为什么不使用“Method”作为目标呢?替换修改的是方法,而不是注释。然后仅突出显示方法名称。

当前的行为似乎是某种错误。可以使用如下模板来解决它:

<replaceConfiguration name="Squigly" text="class $A$ {&#10;@$Annotation$&#10;$MethodType$ $Method$($ParameterType$ $Parameter$);&#10;}" recursive="false" type="JAVA" pattern_context="default" search_injected="false" reformatAccordingToStyle="true" shortenFQN="true" replacement="@$Annotation$ static">
  <constraint name="__context__" within="" contains="" />
  <constraint name="Annotation" regexp="JsonCreator" target="true" within="" contains="" />
  <constraint name="MethodType" within="" contains="" />
  <constraint name="Method" script="&quot;!__context__.hasModifierProperty(&quot;static&quot;)&quot;" within="" contains="" />
  <constraint name="ParameterType" within="" contains="" />
  <constraint name="Parameter" minCount="0" maxCount="2147483647" within="" contains="" />
  <constraint name="A" within="" contains="" />
</replaceConfiguration>

(使用现有模板面板上方对话框左上方工具栏中的“从剪贴板导入模板”按钮)

不幸的是,最终结果的格式不太好:

//After
@JsonCreator
static
BasicEnum fromString(String value) 
{
  // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.