File: generate_iwyu_mapping.py

package info (click to toggle)
llvm-toolchain-16 1%3A16.0.6-15~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,634,792 kB
  • sloc: cpp: 6,179,261; ansic: 1,216,205; asm: 741,319; python: 196,614; objc: 75,325; f90: 49,640; lisp: 32,396; pascal: 12,286; sh: 9,394; perl: 7,442; ml: 5,494; awk: 3,523; makefile: 2,723; javascript: 1,206; xml: 886; fortran: 581; cs: 573
file content (81 lines) | stat: -rw-r--r-- 2,752 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env python

import os, pathlib, sys

def generate(private, public):
    return f'{{ include: [ "{private}", "private", "<{public}>", "public" ] }}'


def panic(file):
    print(f'========== {__file__} error ==========', file=sys.stderr)
    print(f'\tFile \'{file}\' is a top-level detail header without a mapping', file=sys.stderr)
    sys.exit(1)


def generate_map(include):
    detail_files = []
    detail_directories = []
    c_headers = []

    for i in include.iterdir():
        if i.is_dir() and i.name.startswith('__'):
            detail_directories.append(f'{i.name}')
            continue

        if i.name.startswith('__'):
            detail_files.append(i.name)
            continue

        if i.name.endswith('.h'):
            c_headers.append(i.name)

    result = []
    temporary_mappings = {'__tuple_dir': 'tuple'}
    for i in detail_directories:
        public_header = temporary_mappings.get(i, i.lstrip('_'))
        result.append(f'{generate(f"@<{i}/.*>", public_header)},')

    for i in detail_files:
        public = []
        if   i == '__assert': continue
        elif i == '__availability': continue
        elif i == '__bit_reference': continue
        elif i == '__bits': public = ['bits']
        elif i == '__bsd_locale_defaults.h': continue
        elif i == '__bsd_locale_fallbacks.h': continue
        elif i == '__config_site.in': continue
        elif i == '__config': continue
        elif i == '__debug': continue
        elif i == '__errc': continue
        elif i == '__hash_table': public = ['unordered_map', 'unordered_set']
        elif i == '__locale': public = ['locale']
        elif i == '__mbstate_t.h': continue
        elif i == '__mutex_base': continue
        elif i == '__node_handle': public = ['map', 'set', 'unordered_map', 'unordered_set']
        elif i == '__split_buffer': public = ['deque', 'vector']
        elif i == '__std_stream': public = ['iostream']
        elif i == '__threading_support': public = ['atomic', 'mutex', 'semaphore', 'thread']
        elif i == '__tree': public = ['map', 'set']
        elif i == '__undef_macros': continue
        elif i == '__verbose_abort': continue
        else: panic()

        for p in public:
            result.append(f'{generate(f"<{i}>", p)},')

    result.sort()
    return result

def main():
    monorepo_root = pathlib.Path(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
    assert(monorepo_root.exists())
    include = pathlib.Path(os.path.join(monorepo_root, 'libcxx', 'include'))

    mapping = generate_map(include)
    data = '[\n  ' + '\n  '.join(mapping) + '\n]\n'
    with open(f'{include}/libcxx.imp', 'w') as f:
        f.write(data)


if __name__ == '__main__':
    main()