1

我正在尝试使用以下搜索和替换模板查找大括号在新行中写入的所有 if 语句:

搜索模板:

if ($Expr$)
{
    $ThenStatements$;
}
else
{
    $ElseStatements$;
}

替换模板:

if ($Expr$) {
    $ThenStatements$;
}
else {
    $ElseStatements$;
}

如果模板引擎不区分两个模板,我将面临的问题。它让我可以用正确的模板替换搜索模板,但它也会将“正确”的模板检测为错误模板。

有没有办法使用某种正则表达式来解决这个问题?

编辑:在 Android Studio 上工作。我正在尝试为我的公司代码样式约定生成一组 lint 规则,这些规则将显示为警告或错误

4

2 回答 2

6

我相信适合这项工作的工具是代码格式化程序。

我假设这是我们正在谈论的Java。

调整格式化程序设置:

  • 转到设置 -> 编辑器 -> 代码样式 -> Java -> (选项卡)包装和大括号
  • 将项目大括号放置/其他设置为:行尾
  • 检查预览是否是您想要的设置
  • 点击确定

格式化(全部)代码:

  • 选择根包
  • 点击 Alt+L(菜单:代码 -> 重新格式化代码)
  • 出现重新格式化代码对话框,单击确定

所有代码都应根据规则重新格式化。

于 2015-12-07T09:05:15.873 回答
1

结构搜索和替换旨在搜索代码,无论其格式如何。因此,您的用例并不真正受支持。但是,通过一些技巧,可以从中获得您想要的东西。

从您的搜索模板开始,并将以下 Groovy 脚本约束添加到$Expr$变量中:

import com.intellij.psi.*
import com.intellij.openapi.editor.Document

PsiDocumentManager dm = PsiDocumentManager.getInstance(__context__.project)
Document d = dm.getDocument(__context__.containingFile)
PsiIfStatement is = __context__.parent
if (is.thenBranch != null && is.thenBranch.text.startsWith("{")) {
  if (d.getLineNumber(is.thenBranch.textOffset) > d.getLineNumber(is.RParenth.textOffset))
    return true
}
if (is.elseBranch != null && is.elseBranch.text.startsWith("{")) {
  if (d.getLineNumber(is.elseBranch.textOffset) > d.getLineNumber(is.elseElement.textOffset))
    return true;
}
return false 

该脚本检查 then 分支{是否在大于)if 语句的行上,或者 else 分支{是否在大于else关键字的行上,否则返回false

于 2015-12-07T14:18:29.543 回答