#!/usr/bin/env python from __future__ import print_function import glob import io import re import sys import itertools def do_exist(file_name, lines, imported): if not any(not re.match(fr'using \w+::{imported};', line) and re.search(fr'\b{imported}\b', line) for line in lines): print(f'File "{file_name}" does not use "{imported}"') return False return True def is_valid(file_name): with io.open(file_name, encoding='utf-8') as source_file: lines = [line.strip() for line in source_file] usings, importeds, line_numbers, valid = [], [], [], True for idx, line in enumerate(lines, 1): matches = re.search(r'^using (\w+::(\w+));$', line) if matches: line_numbers.append(idx) usings.append(matches.group(1)) importeds.append(matches.group(2)) valid = all(do_exist(file_name, lines, imported) for imported in importeds) sorted_usings = sorted(usings, key=lambda x: x.lower()) if sorted_usings != usings: print(f"using statements aren't sorted in '{file_name}'.") for num, actual, expected in zip(line_numbers, usings, sorted_usings): if actual != expected: print(f'\tLine {num}: Actual: {actual}, Expected: {expected}') return False return valid if __name__ == '__main__': if len(sys.argv) > 1: files = [] for pattern in sys.argv[1:]: files = itertools.chain(files, glob.iglob(pattern)) else: files = glob.iglob('src/*.cc') sys.exit(0 if all(list(map(is_valid, files))) else 1)