【问题标题】:clang-format makes changes to an already formatted fileclang-format 对已格式化的文件进行更改
【发布时间】:2020-08-28 10:20:32
【问题描述】:

使用 clang-format 命令行工具两次格式化同一文件时,两次都会进行更改。

我的理解是,一旦格式化,尝试重新格式化同一个文件不会产生任何变化。

这是我运行的测试:

输入文件

$ cat test.c 
//********************************************** AAAAAAA BBBB***************************************************//
  1. 第一种格式 - 按预期进行的更改
$ clang-format -i test.c 
$ cat test.c 
//********************************************** AAAAAAA
//BBBB***************************************************//
  1. 第二种格式 - 第二行出现意外变化(BBBB 之前添加了额外的空格)**
$ clang-format -i test.c 
$ cat test.c 
//********************************************** AAAAAAA
// BBBB***************************************************//
  1. 第三种格式 - 最终产生相同的结果。

我正在使用的版本是:Ubuntu 18.04.2 上的10.0.0-++20200323042644+d32170dbd5b-1~exp1~20200323154014.129(请注意,我也设法在clang-format-9 中重现了这种行为)

这是我遇到的错误,还是我最初的假设不正确?

编辑:也可在10.0.1-++20200507062652+bab8d1790a3-1~exp1~20200507163249.158 中重现

【问题讨论】:

  • 第一种格式不应做出违反格式规则的更改。您可以将此作为错误提交,但这看起来影响很小(即是否有更具体的生产代码受此影响?)
  • @RossJacobs 问题是我想将 clang-format 集成到我们公司的 CI 流程中(例如检查代码格式是否正确的工作)基本上不管影响有多小,它都是足以破坏构建此外,这只是众多示例中的一个。我们正在尝试重新格式化一个非常大的代码库,它需要 4 次 clang 格式传递,直到它达到稳定状态

标签: c llvm code-formatting clang-format idempotent


【解决方案1】:

我可以重现这种缺乏幂等性的情况。您可以在这里做三件事:使用不同的样式、使用更少的规则或将其作为错误提交。

1。使用不同的风格

clang-format10.0.0 自带的样式在--help中列出:

 --style=<string>           - Coding style, currently supports:
                                 LLVM, Google, Chromium, Mozilla, WebKit.

其中 LLVM 是默认值。要指定样式,请使用clang-format --style=&lt;style&gt; ...。除了 Webkit 之外的所有样式都会重现此错误(但 webkit 样式不会更改初始文件):

$ clang-format --style=webkit test.c > test2.c
$ clang-format --style=webkit test2.c > test3.c
$ diff test2.c test3.c
$ 

正如您所说,这是您遇到的众多幂等性问题之一。

2。使用规则子集

每种样式都包含您可以修改以满足您的需要的规则。您可以使用clang-format --dump-config 转储当前配置(默认llvm)。

$ clang-format --dump-config | tee .clang-format
---
Language:        Cpp
# BasedOnStyle:  LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false

<output truncated> 

您可以手动选择these rules 的较小子集来使用,或消除规则直到实现幂等性。

如果您将此.clang-format 文件与您的修改一起放在项目的根目录中,然后您可以告诉clang-format 使用--style=file 查找它。请注意,如果您希望在该目录中应用不同的格式规则,您可以将 .clang-format 文件放在子目录中。

3。提交错误

您问题的一个关键组成部分是 clang-format 是否将缺少 idempotency 视为错误。情况就是这样,根据评论认为此问题已被视为错误01

我可以在 Macos 上的 10.0.0 上复制它。根据bug report docs 中的介绍,您拥有将其归档为错误所需的所有信息。显然,此选项要求您等到有可用的修复程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2020-07-27
    相关资源
    最近更新 更多