Mercurial > hg > CbC > CbC_llvm
view llvm/utils/sort_includes.py @ 252:1f2b6ac9f198 llvm-original
LLVM16-1
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 18 Aug 2023 09:04:13 +0900 |
parents | 1d019706d866 |
children |
line wrap: on
line source
#!/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 def sort_includes(f): """Sort the #include lines of a specific file.""" # Skip files which are under INPUTS trees or test trees. if "INPUTS/" in f.name or "test/" in f.name: return ext = os.path.splitext(f.name)[1] if ext not in [".cpp", ".c", ".h", ".inc", ".def"]: return lines = f.readlines() look_for_api_header = ext in [".cpp", ".c"] found_headers = False headers_begin = 0 headers_end = 0 api_headers = [] local_headers = [] subproject_headers = [] llvm_headers = [] system_headers = [] for (i, l) in enumerate(lines): if l.strip() == "": continue if l.startswith("#include"): if not found_headers: headers_begin = i found_headers = True 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("<") or header.startswith('"gtest/') or header.startswith('"isl/') or header.startswith('"json/') ): system_headers.append(header) continue if ( header.startswith('"clang/') or header.startswith('"clang-c/') or header.startswith('"polly/') ): subproject_headers.append(header) continue if header.startswith('"llvm/') or header.startswith('"llvm-c/'): llvm_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 found_headers: break if l.startswith("//") or l.startswith("#define") or l.startswith("#ifndef"): continue break if not found_headers: return local_headers = sorted(set(local_headers)) subproject_headers = sorted(set(subproject_headers)) llvm_headers = sorted(set(llvm_headers)) system_headers = sorted(set(system_headers)) headers = ( api_headers + local_headers + subproject_headers + llvm_headers + system_headers ) header_lines = ["#include " + h for h in headers] lines = lines[:headers_begin] + header_lines + lines[headers_end + 1 :] 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()