Project

General

Profile

Task #3895

Updated by Davide Pesavento over 1 year ago

Clang-format is a tool that reformats C++ code (among other languages) according to a configuration file. The program is expressive and useful, and it would be a good extension to the toolchain. 

 Currently, the system has some limitations. According to Davide Pesavento: 

 * ~~"break-after-return-type" doesn't work on overloaded operators, they are not considered functions, thus the rule isn't applied.~~ *Fixed *FIXED in clang-format 10* clang-format-10* 
 * `constexpr`/`explicit`/`virtual` are not considered return types (and rightly so), but this means that constexpr/explicit constructors and virtual destructors are reformatted all on one line. This is minor and I think we can adapt our code style. 
 * In lambda expressions, clang-format always removes the space between capture list and param list. This is very minor and we can adapt our style. 
 * clang-format gets *very* confused by macros such as `PUBLIC_WITH_TESTS_ELSE_PRIVATE` (I guess it doesn't expand them) and it makes a terrible mess with the lines that follow, until it encounters another access specifier or the end of the class declaration. With clang-format 10, clang-format-10, this behavior can be improved by adding these macros to `StatementMacros`. Even then, it's It's still less than ideal not perfect because `AccessModifierOffset` is not applied, applied to them, but maybe we can live with it. 
 * The alignment of "`<<`" after a line break within a logging macro is not what you would expect. One potential workaround is to list all logging macros in `WhitespaceSensitiveMacros`, but that disables formatting completely inside those macros. 
 * ~~Enums Enums containing few short enumerators that could fit in one line are reformatted to be all on the same line.~~ *This was made configurable via `AllowShortEnumsOnASingleLine` in clang-format 11* line (but there is a [workaround](https://stackoverflow.com/a/24009906)) 
 * It would be nice if we could enable set `AlignConsecutiveAssignments` to true for enums *only*. *only*, and false for everything else. 

 We should also take a look at [uncrustify](https://github.com/uncrustify/uncrustify).

Back