about summary refs log tree commit diff
path: root/src/tools/clippy/util/export.py
blob: 5d1bd60acf3d66ff0a6eb8202e16ad052c767a6d (plain)
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

# Build the gh-pages

from collections import OrderedDict
import re
import sys
import json

from lintlib import parse_all, log

lint_subheadline = re.compile(r'''^\*\*([\w\s]+?)[:?.!]?\*\*(.*)''')
rust_code_block = re.compile(r'''```rust.+?```''', flags=re.DOTALL)

CONF_TEMPLATE = """\
This lint has the following configuration variables:

* `%s: %s`: %s (defaults to `%s`)."""


def parse_code_block(match):
    lines = []

    for line in match.group(0).split('\n'):
        if not line.startswith('# '):
            lines.append(line)

    return '\n'.join(lines)


def parse_lint_def(lint):
    lint_dict = {}
    lint_dict['id'] = lint.name
    lint_dict['group'] = lint.group
    lint_dict['level'] = lint.level
    lint_dict['docs'] = OrderedDict()

    last_section = None

    for line in lint.doc:
        match = re.match(lint_subheadline, line)
        if match:
            last_section = match.groups()[0]
            text = match.groups()[1]
        else:
            text = line

        if not last_section:
            log.warning("Skipping comment line as it was not preceded by a heading")
            log.debug("in lint `%s`, line `%s`", lint.name, line)

        if last_section not in lint_dict['docs']:
            lint_dict['docs'][last_section] = ""

        lint_dict['docs'][last_section] += text + "\n"

    for section in lint_dict['docs']:
        lint_dict['docs'][section] = re.sub(rust_code_block, parse_code_block, lint_dict['docs'][section].strip())

    return lint_dict


def main():
    lintlist, configs = parse_all()
    lints = {}
    for lint in lintlist:
        lints[lint.name] = parse_lint_def(lint)
        if lint.name in configs:
            lints[lint.name]['docs']['Configuration'] = \
                CONF_TEMPLATE % configs[lint.name]

    outfile = sys.argv[1] if len(sys.argv) > 1 else "util/gh-pages/lints.json"
    with open(outfile, "w") as fp:
        lints = list(lints.values())
        lints.sort(key=lambda x: x['id'])
        json.dump(lints, fp, indent=2)
        log.info("wrote JSON for great justice")


if __name__ == "__main__":
    main()