IntelliJ 的搜索模板语言是不是有办法识别没有被 if 语句包装的函数调用

Posted

技术标签:

【中文标题】IntelliJ 的搜索模板语言是不是有办法识别没有被 if 语句包装的函数调用【英文标题】:Does IntelliJ's search template language have a way to identify function calls not wrapped by an if statementIntelliJ 的搜索模板语言是否有办法识别没有被 if 语句包装的函数调用 【发布时间】:2020-09-29 22:20:36 【问题描述】:

我正在查看 phpStorm 中的一些遗留代码,代码库中有一些实例,其中特定函数调用被 if 语句中的另一个函数调用包装,例如

if (thisIsTrue($param1, $param2)) 
    // possibly some function calls above
    callThisFunction($paramA, $paramB);
    // possibly some function calls below

我只使用基本的 Linux find/grep 命令来突出显示感兴趣的文件已经取得了一些成功,但我希望能够创建一个结构搜索检查,可以找到未被包裹的 callThisFunction 实例特定的 if 语句。

有谁知道这是否可以通过 vanilla IntelliJ 搜索模板功能实现?

【问题讨论】:

代码库有多大?主要是,该函数多久被调用一次?您可以将插入符号放在函数名称上并调用Edit | Find Usages | Find Usages,然后手动浏览找到的位置。 jetbrains.com/help/phpstorm/find-highlight-usages.html 虽然对于 s-s-r(结构搜索和替换)......我很难想象它是如何工作的“如果”部分。我能想到的最好的:检查前一行的内容以及它是否与某些 RegEx 不匹配...并没有真正使用匹配的内容,因此无法在这里为您提供任何真正有用的可靠示例。无论如何:jetbrains.com/help/phpstorm/structural-search-and-replace.html 【参考方案1】:

简短的回答是(仍然)不。

如果您复制现有模板“Logging without if”(在 Operators 类别中)或导入此 XML,则可以定义“不在 if 语句内”模板约束:

<searchConfiguration name="Logging without if" text="LOG.debug($Argument$);" recursive="false" caseInsensitive="true" type="JAVA" pattern_context="default">
  <constraint name="__context__" negateWithin="true" within="statement in if" contains="" />
  <constraint name="Argument" minCount="0" maxCount="2147483647" within="" contains="" />
</searchConfiguration>

但是,当 if 主体有多个语句时它不匹配,并且当我将文本修改为 $Statement1$; log.tracef($Argument$); $Statement2$; 时,我的 IntelliJ 挂起,语句的计数限制与参数相同。

您可以改为运行 2 次搜索:一次仅使用 callThisFunction($paramA, $paramB);,另一次使用整个模板,然后比较结果。

如果您将结构搜索转换为检查,然后从命令行运行这些检查 (https://www.jetbrains.com/help/idea/command-line-code-inspector.html),比较结果应该会更容易

有关“内部”约束的更多信息,请参阅 https://ijnspector.wordpress.com/2020/06/11/contained-in-constraints/

【讨论】:

以上是关于IntelliJ 的搜索模板语言是不是有办法识别没有被 if 语句包装的函数调用的主要内容,如果未能解决你的问题,请参考以下文章

Intellij IDEA使用总结

IntelliJ IDEA 2017 创建 Maven Java Web 程序

让IntelliJ IDEA支持.vue文件

使用片段时 Intellij 无法正确识别 Thymeleaf 模型变量

Vue:.vue 模板中无法识别 pug 语言

IntelliJ IDEA - Project 左侧项目栏文件名搜索