From ba9eda72363ddb5fdc1ee143ee57827eb9a330c7 Mon Sep 17 00:00:00 2001 From: Pascal Hertleif Date: Tue, 12 Jul 2016 14:11:18 +0200 Subject: [PATCH 1/5] Add First Draft of Lint Listing Page --- .gitignore | 3 + .travis.yml | 8 +++ util/export.py | 127 +++++++++++++++++++++++++++++++++++++++ util/gh-pages/index.html | 114 +++++++++++++++++++++++++++++++++++ 4 files changed, 252 insertions(+) create mode 100644 util/export.py create mode 100644 util/gh-pages/index.html diff --git a/.gitignore b/.gitignore index 2db1ec514..e5a2f2aa7 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,6 @@ Cargo.lock # Generated by dogfood /target_recur/ + +# gh pages docs +util/gh-pages/lints.json diff --git a/.travis.yml b/.travis.yml index 34e50956c..96d7915a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,3 +46,11 @@ after_success: else echo "Ignored" fi +- | + if [ "$TRAVIS_PULL_REQUEST" == "false" ] && + [ "$TRAVIS_REPO_SLUG" == "Manishearth/rust-clippy" ] && + [ "$TRAVIS_BRANCH" == "master" ] ; then + + python util/export.py + + fi diff --git a/util/export.py b/util/export.py new file mode 100644 index 000000000..ce5b22401 --- /dev/null +++ b/util/export.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python + +import os +import re +import json + +level_re = re.compile(r'''(Forbid|Deny|Warn|Allow)''') +conf_re = re.compile(r'''define_Conf! {\n([^}]*)\n}''', re.MULTILINE) +confvar_re = re.compile(r'''/// Lint: (\w+). (.*).*\n *\("([^"]*)", (?:[^,]*), (.*) => (.*)\),''') +lint_subheadline = re.compile(r'''^\*\*([\w\s]+)[:?.!]\*\*(.*)''') + +# TODO: actual logging +def warn(*args): print(args) +def debug(*args): print(args) +def info(*args): print(args) + +def parse_path(p="clippy_lints/src"): + d = [] + for f in os.listdir(p): + if f.endswith(".rs"): + parse_file(d, os.path.join(p, f)) + return (d, parse_conf(p)) + + +def parse_conf(p): + c = {} + with open(p + '/utils/conf.rs') as f: + f = f.read() + + m = re.search(conf_re, f) + m = m.groups()[0] + + m = re.findall(confvar_re, m) + + for (lint, doc, name, default, ty) in m: + c[lint.lower()] = (name, ty, doc, default) + + return c + +def parseLintDef(level, comment, name): + lint = {} + lint['id'] = name + lint['level'] = level + lint['docs'] = {} + + last_section = None + + for line in comment: + if len(line.strip()) == 0: + continue + + match = re.match(lint_subheadline, line) + if match: + last_section = match.groups()[0] + text = match and match.groups()[1] or line + + if not last_section: + warn("Skipping comment line as it was not preceded by a heading") + debug("in lint `%s`, line `%s`" % name, line) + + lint['docs'][last_section] = (lint['docs'].get(last_section, "") + "\n" + text).strip() + + return lint + +def parse_file(d, f): + last_comment = [] + comment = True + + with open(f) as rs: + for line in rs: + if comment: + if line.startswith("///"): + if line.startswith("/// "): + last_comment.append(line[4:]) + else: + last_comment.append(line[3:]) + elif line.startswith("declare_lint!"): + comment = False + deprecated = False + restriction = False + elif line.startswith("declare_restriction_lint!"): + comment = False + deprecated = False + restriction = True + elif line.startswith("declare_deprecated_lint!"): + comment = False + deprecated = True + else: + last_comment = [] + if not comment: + l = line.strip() + m = re.search(r"pub\s+([A-Z_][A-Z_0-9]*)", l) + + if m: + name = m.group(1).lower() + + # Intentionally either a never looping or infinite loop + while not deprecated and not restriction: + m = re.search(level_re, line) + if m: + level = m.group(0) + break + + line = next(rs) + + if deprecated: + level = "Deprecated" + elif restriction: + level = "Allow" + + info("found %s with level %s in %s" % (name, level, f)) + d.append(parseLintDef(level, last_comment, name=name)) + last_comment = [] + comment = True + if "}" in l: + warn("Warning: Missing Lint-Name in", f) + comment = True + +def main(): + (lints, config) = parse_path() + info("got %s lints" % len(lints)) + with open("util/gh-pages/lints.json", "w") as file: + json.dump(lints, file, indent=2) + info("wrote JSON for great justice") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/util/gh-pages/index.html b/util/gh-pages/index.html new file mode 100644 index 000000000..7b44c4114 --- /dev/null +++ b/util/gh-pages/index.html @@ -0,0 +1,114 @@ + + + + + Clippy + + + + + +
+ + + + + +
+
+
+
+ + +
+
+
+
+ Filter: + + + + +
+
+
+
+ +
+
+ + +

+ {{lint.id}} + Allow + Warn + Deny +

+
+ +
    +
  • +

    + {{title}} +

    +
    +
  • +
+
+
+ + + + + + + + + + \ No newline at end of file From bbbd0a5475095962e8eaeef57d9ad62f5ba018fd Mon Sep 17 00:00:00 2001 From: Pascal Hertleif Date: Thu, 14 Jul 2016 21:00:20 +0200 Subject: [PATCH 2/5] Adjust HTML Docs - Section IDs, with handy anchor links - Multiple filters for levels - Table rendering, block quote size - Nicer loading (hide un-rendered content) - Code highlighting (only for Rust, of course!) - Fix parsing of descriptions that have a newline after the section title (lead to duplicating the title, e.g., "Examples", in the content) --- util/export.py | 13 ++-- util/gh-pages/index.html | 164 ++++++++++++++++++++++++--------------- 2 files changed, 111 insertions(+), 66 deletions(-) mode change 100644 => 100755 util/export.py diff --git a/util/export.py b/util/export.py old mode 100644 new mode 100755 index ce5b22401..152e9de14 --- a/util/export.py +++ b/util/export.py @@ -52,14 +52,17 @@ def parseLintDef(level, comment, name): match = re.match(lint_subheadline, line) if match: last_section = match.groups()[0] - text = match and match.groups()[1] or line - + if match: + text = match.groups()[1] + else: + text = line + if not last_section: warn("Skipping comment line as it was not preceded by a heading") debug("in lint `%s`, line `%s`" % name, line) - lint['docs'][last_section] = (lint['docs'].get(last_section, "") + "\n" + text).strip() - + lint['docs'][last_section] = (lint['docs'].get(last_section, "") + "\n" + text).strip() + return lint def parse_file(d, f): @@ -124,4 +127,4 @@ def main(): info("wrote JSON for great justice") if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/util/gh-pages/index.html b/util/gh-pages/index.html index 7b44c4114..dd72ee234 100644 --- a/util/gh-pages/index.html +++ b/util/gh-pages/index.html @@ -1,11 +1,19 @@ - + + + Clippy - - + + +
@@ -13,87 +21,121 @@

ALL the Clippy Lints

- - + -
-
-
-
- - +
+ + + + +
+
+
+
+
+ +
+
-
-
-
- Filter: - - - - +
+
+ Filter: + + + + +
+ +
+
+ + +

+ {{lint.id}} + + Allow + Warn + Deny + + +

+
+ +
    +
  • +

    + {{title}} +

    +
    +
  • +
+
- -
-
- - -

- {{lint.id}} - Allow - Warn - Deny -

-
- -
    -
  • -

    - {{title}} -

    -
    -
  • -
-
- + + +