diff options
author | Tobias Markmann <tm@ayena.de> | 2015-03-20 14:40:26 (GMT) |
---|---|---|
committer | Kevin Smith <kevin.smith@isode.com> | 2015-04-04 09:36:27 (GMT) |
commit | fbe7af04050bdf2f57c63300e8b6d74d648d9f09 (patch) | |
tree | 2063cfbd1d940d559333f4361a5ae818a392af75 /BuildTools | |
parent | 33fabd0c800dd7eeadfb6b98e4d0d76551380094 (diff) | |
download | swift-fbe7af04050bdf2f57c63300e8b6d74d648d9f09.zip swift-fbe7af04050bdf2f57c63300e8b6d74d648d9f09.tar.bz2 |
Improve FixIncludes.py script to support in-place modification
In-place modification can be enabled by passing -i as second parameter.
Added detection of other preprocessor directives not supported by this
tool. It will report a warning in this case.
Test-Information:
Ran the tool over all .h/.cpp files in Swiften. Still build on OS X with
clang.
Change-Id: Ic6e15142379ab9fc8a2bc5a6f9c1c2a906dec692
Diffstat (limited to 'BuildTools')
-rwxr-xr-x[-rw-r--r--] | BuildTools/FixIncludes.py | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/BuildTools/FixIncludes.py b/BuildTools/FixIncludes.py index def2dd5..0854e68 100644..100755 --- a/BuildTools/FixIncludes.py +++ b/BuildTools/FixIncludes.py @@ -4,12 +4,16 @@ import sys; import os; import re; from sets import Set filename = sys.argv[1] +inPlace = False +if "-i" in sys.argv: + inPlace = True + filename_base = os.path.basename(filename) (filename_name, filename_ext) = os.path.splitext(filename_base) c_stdlib_headers = Set(["assert.h", "limits.h", "signal.h", "stdlib.h", "ctype.h", "locale.h", "stdarg.h", "string.h", "errno.h", "math.h", "stddef.h", "time.h", "float.h", "setjmp.h", "stdio.h", "iso646.h", "wchar.h", "wctype.h", "complex.h", "inttypes.h", "stdint.h", "tgmath.h", "fenv.h", "stdbool.h"]) cpp_stdlib_headers = Set(["algorithm", "fstream", "list", "regex", "typeindex", "array", "functional", "locale", "set", "typeinfo", "atomic", "future", "map", "sstream", "type_traits", "bitset", "initializer_list", "memory", "stack", "unordered_map", "chrono", "iomanip", "mutex", "stdexcept", "unordered_set", "codecvt", "ios", "new", "streambuf", "utility", "complex", "iosfwd", "numeric", "string", "valarray", "condition_variable", "iostream", "ostream", "strstream", "vector", "deque", "istream", "queue", "system_error", "exception", "iterator", "random", "thread", "forward_list", "limits", "ratio", "tuple", "cassert", "ciso646", "csetjmp", "cstdio", "ctime", "cctype", "climits", "csignal", "cstdlib", "cwchar", "cerrno", "clocale", "cstdarg", "cstring", "cwctype", "cfloat", "cmath", "cstddef"]) @@ -17,19 +21,22 @@ cpp_stdlib_headers = Set(["algorithm", "fstream", "list", "regex", "typeindex", class HeaderType: PRAGMA_ONCE, CORRESPONDING_HEADER, C_STDLIB, CPP_STDLIB, BOOST, QT, OTHER, SWIFTEN, SWIFT_CONTROLLERS, SWIFTOOLS, SWIFT = range(11) def findHeaderBlock(lines): start = False end = False + lastLine = None for idx, line in enumerate(lines): if not start and line.startswith("#"): start = idx elif start and (not end) and (not line.startswith("#")) and line.strip(): end = idx-1 break + if not end: + end = len(lines) return (start, end) def lineToFileName(line): match = re.match( r'#include "(.*)"', line) if match: return match.group(1) @@ -69,63 +76,75 @@ def fileNameToHeaderType(name): return HeaderType.OTHER def serializeHeaderGroups(groups): headerList = [] for group in range(0, HeaderType.SWIFT + 1): if group in groups: - headers = sorted(groups[group]) + # sorted and without duplicates + headers = sorted(list(set(groups[group]))) headerList.extend(headers) headerList.extend(["\n"]) headerList.pop() return headerList +def overwriteFile(filename, content): + with open(filename, 'w') as f: + for line in content: + f.write(line) + def cleanHeaderFile(content, headerStart, headerEnd, headerGroups): del content[headerStart:headerEnd] newHeaders = serializeHeaderGroups(headerGroups) content[headerStart:1] = newHeaders - for line in content: - print line, + if inPlace : + overwriteFile(filename, content) + else : + for line in content: + print line, def cleanImplementationFile(content, headerStart, headerEnd, headerGroups): del content[headerStart:headerEnd] newHeaders = serializeHeaderGroups(headerGroups) content[headerStart:1] = newHeaders - for line in content: - print line, + if inPlace : + overwriteFile(filename, content) + else : + for line in content: + print line, -containsIf = False +containsComplexPreprocessorDirectives = False with open(filename) as f: content = f.readlines() (headerStart, headerEnd) = findHeaderBlock(content) headerGroups = {} for line in content[headerStart:headerEnd]: if line.strip(): - if line.strip().startswith("#if "): - containsIf = True - break - if line.strip().startswith("#pragma once"): headerType = HeaderType.PRAGMA_ONCE + elif line.strip().startswith("#if") or line.strip().startswith("#def") or line.strip().startswith("#undef") or line.strip().startswith("#pragma "): + containsComplexPreprocessorDirectives = True + break else: + #print line headerType = fileNameToHeaderType(lineToFileName(line)) - filename = lineToFileName(line) + #filename = lineToFileName(line) if headerType in headerGroups: headerGroups[headerType].append(line) else: headerGroups[headerType] = [line] -if containsIf: - print "Cannot format headers containing preprocessor if statements" +if containsComplexPreprocessorDirectives: + print "Cannot format headers containing preprocessor #if, #pragma, #define or #undef statements!" exit(1) if filename_base.endswith(".h"): if not HeaderType.PRAGMA_ONCE in headerGroups: print "Missing #pragma once!" exit(2) |