mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-10 01:55:08 +00:00
b71edfaa4e
This is the first commit in a series that will reformat all the python files in the LLVM repository. Reformatting is done with `black`. See more information here: https://discourse.llvm.org/t/rfc-document-and-standardize-python-code-style Reviewed By: jhenderson, JDevlieghere, MatzeB Differential Revision: https://reviews.llvm.org/D150545
110 lines
3.2 KiB
Python
Executable File
110 lines
3.2 KiB
Python
Executable File
#!/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()
|