aboutsummaryrefslogtreecommitdiff
path: root/utils/sort_includes.py
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2012-12-03 14:23:44 +0000
committerChandler Carruth <chandlerc@gmail.com>2012-12-03 14:23:44 +0000
commit0cd94c71db19c0a53d1d97f353116e271884a336 (patch)
treeded792bbeb4c80858cfaff89471996d688ae861d /utils/sort_includes.py
parente74a4a791535b9756fa7312e5cd6f746ecc1c989 (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-xutils/sort_includes.py79
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()