Hi!
I had enough of always having small white-space issues in my patches lately, so I've hacked clang-format a bit to make it better handle Wine specific style(s), and make it more readily usable for contributing to Wine, and I'm now sharing it as it could be useful to others.
I also discovered the git clang-format helper, which formats source but only keeps the lines that a patch or a commit previously changed, making it easier to get correctly formatted patches without messing with the source code around.
Now it's still not completely a perfect fit and there's a few cases where the tool doesn't give very good results, but I find that git clang-format is very well done for hand-picking good style fixes.
For instance, you can just add all your changes before committing, then call `git clang-format`, which formats your changes without touching the staged changes. And you can then add the style fixes one by one with `git add -p`.
Or, if you already have a commit that you want to check or fixup, run `git clang-format HEAD^` and `git add -p` then `git commit --am`.
The patches for clang-format are attached (on llvm source, currently on 45344cf7ac5b848f77825ffa37b0cb3b69b9b07b HEAD), and a small explanation / usage for each one:
* PATCH 1/4 adds a new SpacesInFunctionParentheses configuration option to support some Wine-specific style for function calls, where spaces are used but only within parentheses of a function call. There was already some support for spaces around paren, but not specifically for function calls.
* PATCH 2/4 introduces a new way to lookup for .clang-format config files. There's already one that looks such files up a source file path, recursively, but as we don't include such files in Wine source, it was hard to maintain locally --I'm a heavy git clean -fdx user.
This instead introduces a new -style-dir command-line argument, and a corresponding clangFormat.styleDir git-clang-format configuration parameter, that will replace the current working dir when looking for such files.
For instance, I use clangFormat.styleDir = ~/Code/.wine-clang-format.d, which currently contains:
/home/rbernon/Code/.wine-clang-format.d/ ├── dlls │ ├── gdi32 │ │ └── .clang-format │ ├── user32 │ │ └── .clang-format │ └── windowscodecs │ └── .clang-format ├── server │ └── .clang-format └── tools └── widl └── .clang-format
And clang-format will use the .clang-format that best matches to the source file that is formatted in the wine source tree.
For reference and illustration, I have this user32 .clang-format, which works more or less correctly:
--- DisableFormat: false SortIncludes: false Language: Cpp StatementMacros: - todo_wine - todo_wine_if TypenameMacros: - MAKE_FUNCPTR - MAKELANGID - LOAD_FUNCPTR - ARRAY_SIZE - debugstr_a - debugstr_an - debugstr_w - debugstr_wn - debugstr_us - debugstr_faceid - debugstr_fontsignature IndentWidth: 4 ColumnLimit: 100 BreakBeforeBraces: Allman AlignAfterOpenBracket: Align AllowAllArgumentsOnNextLine: true AllowShortIfStatementsOnASingleLine: Always AllowShortLoopsOnASingleLine: true BinPackArguments: true BinPackParameters: true SpacesInFunctionParentheses: true PenaltyExcessCharacter: 1 ...
I currently abuse StatementMacros and TypenameMacros to tweak the resulting style, as it's still not perfect and the source is also not always consistent already.
Of course, this wouldn't be needed if these files could be added to Wine source tree.
* PATCH 3/4 and 4/4 are small style mix-ups fixes that occurred too may times already.