[llvm-commits] [llvm] r169125 - /llvm/trunk/utils/sort_includes.py

Chandler Carruth chandlerc at gmail.com
Mon Dec 3 06:23:44 PST 2012


Author: chandlerc
Date: Mon Dec  3 08:23:44 2012
New Revision: 169125

URL: http://llvm.org/viewvc/llvm-project?rev=169125&view=rev
Log:
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.

Added:
    llvm/trunk/utils/sort_includes.py   (with props)

Added: llvm/trunk/utils/sort_includes.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/sort_includes.py?rev=169125&view=auto
==============================================================================
--- llvm/trunk/utils/sort_includes.py (added)
+++ llvm/trunk/utils/sort_includes.py Mon Dec  3 08:23:44 2012
@@ -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()

Propchange: llvm/trunk/utils/sort_includes.py
------------------------------------------------------------------------------
    svn:executable = *





More information about the llvm-commits mailing list