【问题标题】:How to eliminate 'braces on new line' using Intellij search and replace pattern?如何使用 Intellij 搜索和替换模式消除“新行大括号”?
【发布时间】:2015-12-07 08:37:11
【问题描述】:

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

搜索模板:

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

替换模板:

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

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

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

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

【问题讨论】:

    标签: android-studio intellij-idea code-inspection inspection structural-search


    【解决方案1】:

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

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

    调整格式化程序设置:

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

    格式化(全部)代码:

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

    所有代码都应该按照规则重新格式化。

    【讨论】:

    • 格式化工具很棒。但我不确定这是我要找的。我正在尝试生成一组 lint 规则,这些规则将在 IDE 排水沟中显示为警告/错误标记。
    • 您的问题似乎是格式问题,而不是静态代码分析问题(主要使用 lint)。不想改代码改进格式,只想报告问题?
    • 我想过用 lint 来执行我们的代码约定。格式化一次可以解决问题,但仍然允许提交“错误”代码。
    • 您应该查看Checkstyle - 它可以满足您的需求,并且可以安装在 IDE 和 CI 服务器中。
    • 是的,谢谢马尔科。事实上,我确实最终集成了 Checkstyle。我发现这个项目很有帮助github.com/vincentbrison/vb-android-app-quality
    【解决方案2】:

    结构搜索和替换专为搜索代码而设计,无论其格式如何。因此,您的用例并不真正受支持。但是,通过一些 hack 就可以得到你想要的东西。

    从您的搜索模板开始,将以下 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 否则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      相关资源
      最近更新 更多