]> git.lizzy.rs Git - rust.git/commitdiff
update script: also generate lint list in lib.rs
authorGeorg Brandl <georg@python.org>
Thu, 13 Aug 2015 09:31:09 +0000 (11:31 +0200)
committerGeorg Brandl <georg@python.org>
Thu, 13 Aug 2015 09:34:51 +0000 (11:34 +0200)
src/lib.rs
util/update_lints.py [new file with mode: 0644]
util/update_readme.py [deleted file]

index eb2704cd4bd54e8eb60511f8c4dfb4d2a2bd96af..9fc5def88c4f671f714d92dadc30daf9a27bcd2a 100755 (executable)
@@ -64,39 +64,40 @@ pub fn plugin_registrar(reg: &mut Registry) {
     reg.register_lint_pass(box loops::LoopsPass as LintPassObject);
     reg.register_lint_pass(box lifetimes::LifetimePass as LintPassObject);
 
-    reg.register_lint_group("clippy", vec![types::BOX_VEC,
-                                           types::LINKEDLIST,
-                                           types::LET_UNIT_VALUE,
-                                           misc::SINGLE_MATCH,
-                                           misc::TOPLEVEL_REF_ARG,
-                                           misc::CMP_NAN,
-                                           misc::FLOAT_CMP,
-                                           misc::PRECEDENCE,
-                                           misc::CMP_OWNED,
-                                           eq_op::EQ_OP,
-                                           bit_mask::BAD_BIT_MASK,
-                                           bit_mask::INEFFECTIVE_BIT_MASK,
-                                           ptr_arg::PTR_ARG,
-                                           needless_bool::NEEDLESS_BOOL,
-                                           approx_const::APPROX_CONSTANT,
-                                           eta_reduction::REDUNDANT_CLOSURE,
-                                           identity_op::IDENTITY_OP,
-                                           mut_mut::MUT_MUT,
-                                           len_zero::LEN_ZERO,
-                                           len_zero::LEN_WITHOUT_IS_EMPTY,
-                                           attrs::INLINE_ALWAYS,
-                                           collapsible_if::COLLAPSIBLE_IF,
-                                           unicode::ZERO_WIDTH_SPACE,
-                                           unicode::NON_ASCII_LITERAL,
-                                           strings::STRING_ADD_ASSIGN,
-                                           returns::NEEDLESS_RETURN,
-                                           returns::LET_AND_RETURN,
-                                           misc::MODULO_ONE,
-                                           methods::OPTION_UNWRAP_USED,
-                                           methods::RESULT_UNWRAP_USED,
-                                           methods::STR_TO_STRING,
-                                           methods::STRING_TO_STRING,
-                                           lifetimes::NEEDLESS_LIFETIMES,
-                                           loops::NEEDLESS_RANGE_LOOP,
-                                           ]);
+    reg.register_lint_group("clippy", vec![
+        approx_const::APPROX_CONSTANT,
+        attrs::INLINE_ALWAYS,
+        bit_mask::BAD_BIT_MASK,
+        bit_mask::INEFFECTIVE_BIT_MASK,
+        collapsible_if::COLLAPSIBLE_IF,
+        eq_op::EQ_OP,
+        eta_reduction::REDUNDANT_CLOSURE,
+        identity_op::IDENTITY_OP,
+        len_zero::LEN_WITHOUT_IS_EMPTY,
+        len_zero::LEN_ZERO,
+        lifetimes::NEEDLESS_LIFETIMES,
+        loops::NEEDLESS_RANGE_LOOP,
+        methods::OPTION_UNWRAP_USED,
+        methods::RESULT_UNWRAP_USED,
+        methods::STR_TO_STRING,
+        methods::STRING_TO_STRING,
+        misc::CMP_NAN,
+        misc::CMP_OWNED,
+        misc::FLOAT_CMP,
+        misc::MODULO_ONE,
+        misc::PRECEDENCE,
+        misc::SINGLE_MATCH,
+        misc::TOPLEVEL_REF_ARG,
+        mut_mut::MUT_MUT,
+        needless_bool::NEEDLESS_BOOL,
+        ptr_arg::PTR_ARG,
+        returns::LET_AND_RETURN,
+        returns::NEEDLESS_RETURN,
+        strings::STRING_ADD_ASSIGN,
+        types::BOX_VEC,
+        types::LET_UNIT_VALUE,
+        types::LINKEDLIST,
+        unicode::NON_ASCII_LITERAL,
+        unicode::ZERO_WIDTH_SPACE,
+    ]);
 }
diff --git a/util/update_lints.py b/util/update_lints.py
new file mode 100644 (file)
index 0000000..c2a9e08
--- /dev/null
@@ -0,0 +1,110 @@
+# Generate a Markdown table of all lints, and put it in README.md.
+# With -n option, only print the new table to stdout.
+
+import os
+import re
+import sys
+
+declare_lint_re = re.compile(r'''
+    declare_lint! \s* [{(] \s*
+    pub \s+ (?P<name>[A-Z_]+) \s*,\s*
+    (?P<level>Forbid|Deny|Warn|Allow) \s*,\s*
+    " (?P<desc>(?:[^"\\]+|\\.)*) " \s* [})]
+''', re.X | re.S)
+
+nl_escape_re = re.compile(r'\\\n\s*')
+
+
+def collect(lints, fn):
+    """Collect all lints from a file.
+
+    Adds entries to the lints list as `(module, name, level, desc)`.
+    """
+    with open(fn) as fp:
+        code = fp.read()
+    for match in declare_lint_re.finditer(code):
+        # remove \-newline escapes from description string
+        desc = nl_escape_re.sub('', match.group('desc'))
+        lints.append((os.path.splitext(os.path.basename(fn))[0],
+                      match.group('name').lower(),
+                      match.group('level').lower(),
+                      desc.replace('\\"', '"')))
+
+
+def write_tbl(lints, fp):
+    """Write lint table in Markdown format."""
+    # first and third column widths
+    w_name = max(len(l[1]) for l in lints)
+    w_desc = max(len(l[3]) for l in lints)
+    # header and underline
+    fp.write('%-*s | default | meaning\n' % (w_name, 'name'))
+    fp.write('%s-|-%s-|-%s\n' % ('-' * w_name, '-' * 7, '-' * w_desc))
+    # one table row per lint
+    for (_, name, default, meaning) in sorted(lints, key=lambda l: l[1]):
+        fp.write('%-*s | %-7s | %s\n' % (w_name, name, default, meaning))
+
+
+def write_group(lints, fp):
+    """Write lint group (list of all lints in the form module::NAME)."""
+    for (module, name, _, _) in sorted(lints):
+        fp.write('        %s::%s,\n' % (module, name.upper()))
+
+
+def replace_region(fn, region_start, region_end, callback,
+                   replace_start=True):
+    """Replace a region in a file delimited by two lines matching regexes.
+
+    A callback is called to write the new region.  If `replace_start` is true,
+    the start delimiter line is replaced as well.  The end delimiter line is
+    never replaced.
+    """
+    # read current content
+    with open(fn) as fp:
+        lines = list(fp)
+
+    # replace old region with new region
+    with open(fn, 'w') as fp:
+        in_old_region = False
+        for line in lines:
+            if in_old_region:
+                if re.search(region_end, line):
+                    in_old_region = False
+                    fp.write(line)
+            elif re.search(region_start, line):
+                if not replace_start:
+                    fp.write(line)
+                # old region starts here
+                in_old_region = True
+                callback(fp)
+            else:
+                fp.write(line)
+
+
+def main(print_only=False):
+    lints = []
+
+    # check directory
+    if not os.path.isfile('src/lib.rs'):
+        print('Error: call this script from clippy checkout directory!')
+        return
+
+    # collect all lints from source files
+    for root, dirs, files in os.walk('src'):
+        for fn in files:
+            if fn.endswith('.rs'):
+                collect(lints, os.path.join(root, fn))
+
+    if print_only:
+        write_tbl(lints, sys.stdout)
+        return
+
+    # replace table in README.md
+    replace_region('README.md', r'^name +\|', '^$', lambda fp: write_tbl(lints, fp))
+
+    # same for "clippy" lint collection
+    replace_region('src/lib.rs', r'reg.register_lint_group\("clippy"', r'\]\);',
+                   lambda fp: write_group(lints, fp), replace_start=False)
+
+
+if __name__ == '__main__':
+    main(print_only='-n' in sys.argv)
diff --git a/util/update_readme.py b/util/update_readme.py
deleted file mode 100644 (file)
index 0b54afa..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-# Generate a Markdown table of all lints, and put it in README.md.
-# With -n option, only print the new table to stdout.
-
-import os
-import re
-import sys
-
-declare_lint_re = re.compile(r'''
-    declare_lint! \s* [{(] \s*
-    pub \s+ (?P<name>[A-Z_]+) \s*,\s*
-    (?P<level>Forbid|Deny|Warn|Allow) \s*,\s*
-    " (?P<desc>(?:[^"\\]+|\\.)*) " \s* [})]
-''', re.X | re.S)
-
-nl_escape_re = re.compile(r'\\\n\s*')
-
-
-def collect(lints, fp):
-    code = fp.read()
-    for match in declare_lint_re.finditer(code):
-        # remove \-newline escapes from description string
-        desc = nl_escape_re.sub('', match.group('desc'))
-        lints.append((match.group('name').lower(),
-                      match.group('level').lower(),
-                      desc.replace('\\"', '"')))
-
-
-def write_tbl(lints, fp):
-    # first and third column widths
-    w_name = max(len(l[0]) for l in lints)
-    w_desc = max(len(l[2]) for l in lints)
-    # header and underline
-    fp.write('%-*s | default | meaning\n' % (w_name, 'name'))
-    fp.write('%s-|-%s-|-%s\n' % ('-' * w_name, '-' * 7, '-' * w_desc))
-    # one table row per lint
-    for (name, default, meaning) in sorted(lints):
-        fp.write('%-*s | %-7s | %s\n' % (w_name, name, default, meaning))
-
-
-def main(print_only=False):
-    lints = []
-
-    # check directory
-    if not os.path.isfile('src/lib.rs'):
-        print('Error: call this script from clippy checkout directory!')
-        return
-
-    # collect all lints from source files
-    for root, dirs, files in os.walk('src'):
-        for fn in files:
-            if fn.endswith('.rs'):
-                with open(os.path.join(root, fn)) as fp:
-                    collect(lints, fp)
-
-    if print_only:
-        write_tbl(lints, sys.stdout)
-        return
-
-    # read current README.md content
-    with open('README.md') as fp:
-        lines = list(fp)
-
-    # replace old table with new table
-    with open('README.md', 'w') as fp:
-        in_old_tbl = False
-        for line in lines:
-            if line.replace(' ', '').strip() == 'name|default|meaning':
-                # old table starts here
-                write_tbl(lints, fp)
-                in_old_tbl = True
-            if in_old_tbl:
-                # the old table is finished by an empty line
-                if line.strip():
-                    continue
-                in_old_tbl = False
-            fp.write(line)
-
-
-if __name__ == '__main__':
-    main(print_only='-n' in sys.argv)