about summary refs log tree commit diff
path: root/src/tools/clippy/util/export.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/clippy/util/export.py')
-rwxr-xr-xsrc/tools/clippy/util/export.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/tools/clippy/util/export.py b/src/tools/clippy/util/export.py
new file mode 100755
index 00000000000..5d1bd60acf3
--- /dev/null
+++ b/src/tools/clippy/util/export.py
@@ -0,0 +1,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()