diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2012-12-03 14:23:44 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2012-12-03 14:23:44 +0000 |
commit | 0cd94c71db19c0a53d1d97f353116e271884a336 (patch) | |
tree | ded792bbeb4c80858cfaff89471996d688ae861d /utils/sort_includes.py | |
parent | e74a4a791535b9756fa7312e5cd6f746ecc1c989 (diff) |
Add a completely hack-ish tool to sort includes according to the coding
standards.
I am a terrible Python programmer. Patches more the welcome. Please tell
me how this should look if it should look differently. It's just a tiny
little script so it didn't make sense to go through pre-commit review,
especially as someone who actually knows python may want to just rip it
apart and do it The Right Way.
I will be preparing a commit shortly that uses this script to
canonicalize *all* of the #include lines in LLVM. Really, all of them.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169125 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/sort_includes.py')
-rwxr-xr-x | utils/sort_includes.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/utils/sort_includes.py b/utils/sort_includes.py new file mode 100755 index 0000000000..6f20cb76e4 --- /dev/null +++ b/utils/sort_includes.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python + +"""Script to sort the top-most block of #include lines. + +Assumes the LLVM coding conventions. + +Currently, this script only bothers sorting the llvm/... headers. Patches +welcome for more functionality, and sorting other header groups. +""" + +import argparse +import os +import re +import sys +import tempfile + +def sort_includes(f): + lines = f.readlines() + look_for_api_header = f.name[-4:] == '.cpp' + headers_begin = 0 + headers_end = 0 + api_headers = [] + local_headers = [] + project_headers = [] + system_headers = [] + for (i, l) in enumerate(lines): + if l.strip() == '': + continue + if l.startswith('#include'): + if headers_begin == 0: + headers_begin = i + headers_end = i + header = l[len('#include'):].lstrip() + if look_for_api_header and header.startswith('"'): + api_headers.append(header) + look_for_api_header = False + continue + if header.startswith('<'): + system_headers.append(header) + continue + if header.startswith('"llvm/') or header.startswith('"clang/'): + project_headers.append(header) + continue + local_headers.append(header) + continue + + # Only allow comments and #defines prior to any includes. If either are + # mixed with includes, the order might be sensitive. + if headers_begin != 0: + break + if l.startswith('//') or l.startswith('#define'): + continue + break + if headers_begin == 0: + return + + local_headers.sort() + project_headers.sort() + system_headers.sort() + headers = api_headers + local_headers + project_headers + system_headers + header_lines = ['#include ' + h for h in headers] + lines = lines[:headers_begin] + header_lines + lines[headers_end + 1:] + + #for l in lines[headers_begin:headers_end]: + # print l.rstrip() + f.seek(0) + f.truncate() + f.writelines(lines) + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('files', nargs='+', type=argparse.FileType('r+'), + help='the source files to sort includes within') + args = parser.parse_args() + for f in args.files: + sort_includes(f) + +if __name__ == '__main__': + main() |