Skip to content
Snippets Groups Projects
Forked from card10 / firmware
1700 commits behind the upstream repository.
fix-multi-decl.py 1.33 KiB
#!/usr/bin/env python3
#
# I prefer to have the closing brace of a multi-line declaration or function call on its
# own line.  This is unfortunately not yet supported by clang-format.  This script is
# a hack to manually introduce my style.
#
# Tracking for this style in clang-format: https://reviews.llvm.org/D33029
#
# Example
# =======
# This is the style I want:
#
#     printf(
#         "Hello %s %d\n",
#         "World",
#         123
#     );
import re
import sys

EXPR = r"""                         # Indentation is saved to <ws>
^(?P<ws>[ \t]*)(?P<decl>.*\(\n      # Opening line, ending with (\n
    (?:.*,\n)*                      # Lines with arguments, all ending with ,\n
    .*)\)(?P<final>[); \t]*)\n      # Last line with closing brace & optional following characters
(?![ \t]*\).*)                      # Don't match an already expanded decl
"""


def main():
    with open(sys.argv[1], "r") as f:
        source = f.read()

    fixed = re.sub(
        EXPR,
        r"\g<ws>\g<decl>\n\g<ws>)\g<final>\n",
        source,
        flags=re.MULTILINE | re.VERBOSE,
    )

    # Fix function definitions that can now be pulled into one line
    fixed = re.sub(
        r"^\)\n{$",
        r") {",
        fixed,
        flags=re.MULTILINE,
    )

    with open(sys.argv[1], "w") as f:
        f.write(fixed)


if __name__ == "__main__":
    main()