From 0b40ae178a4e3dfa8ec5312562cf473adea3989e Mon Sep 17 00:00:00 2001 From: Andre Bogus Date: Sat, 30 Apr 2016 23:54:10 +0200 Subject: [PATCH] fixed tests, added clippy_restrictions lint group --- src/arithmetic.rs | 26 ++++++++++----------- src/lib.rs | 11 ++++++++- tests/compile-fail/arithmetic.rs | 1 - util/update_lints.py | 39 +++++++++++++++++++++++++------- 4 files changed, 53 insertions(+), 24 deletions(-) diff --git a/src/arithmetic.rs b/src/arithmetic.rs index 6f34fdc2427..be732740442 100644 --- a/src/arithmetic.rs +++ b/src/arithmetic.rs @@ -15,9 +15,8 @@ use utils::span_lint; /// ``` /// a + 1 /// ``` -declare_lint! { +declare_restriction_lint! { pub INTEGER_ARITHMETIC, - Allow, "Any integer arithmetic statement" } @@ -32,9 +31,8 @@ declare_lint! { /// ``` /// a + 1.0 /// ``` -declare_lint! { +declare_restriction_lint! { pub FLOAT_ARITHMETIC, - Allow, "Any floating-point arithmetic statement" } @@ -55,32 +53,32 @@ impl LateLintPass for Arithmetic { match expr.node { hir::ExprBinary(ref op, ref l, ref r) => { match op.node { - hir::BiAnd | hir::BiOr | hir::BiBitAnd | - hir::BiBitOr | hir::BiBitXor | hir::BiShl | hir::BiShr | - hir::BiEq | hir::BiLt | hir::BiLe | hir::BiNe | hir::BiGe | + hir::BiAnd | hir::BiOr | hir::BiBitAnd | + hir::BiBitOr | hir::BiBitXor | hir::BiShl | hir::BiShr | + hir::BiEq | hir::BiLt | hir::BiLe | hir::BiNe | hir::BiGe | hir::BiGt => return, _ => () } let (l_ty, r_ty) = (cx.tcx.expr_ty(l), cx.tcx.expr_ty(r)); if l_ty.is_integral() && r_ty.is_integral() { - span_lint(cx, - INTEGER_ARITHMETIC, + span_lint(cx, + INTEGER_ARITHMETIC, expr.span, "integer arithmetic detected"); - self.span = Some(expr.span); + self.span = Some(expr.span); } else if l_ty.is_floating_point() && r_ty.is_floating_point() { span_lint(cx, FLOAT_ARITHMETIC, expr.span, "floating-point arithmetic detected"); - self.span = Some(expr.span); + self.span = Some(expr.span); } }, hir::ExprUnary(hir::UnOp::UnNeg, ref arg) => { let ty = cx.tcx.expr_ty(arg); if ty.is_integral() { - span_lint(cx, - INTEGER_ARITHMETIC, + span_lint(cx, + INTEGER_ARITHMETIC, expr.span, "integer arithmetic detected"); self.span = Some(expr.span); @@ -95,7 +93,7 @@ impl LateLintPass for Arithmetic { _ => () } } - + fn check_expr_post(&mut self, _: &LateContext, expr: &hir::Expr) { if Some(expr.span) == self.span { self.span = None; diff --git a/src/lib.rs b/src/lib.rs index 584ae7f77eb..e22d85a43e1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -44,6 +44,12 @@ extern crate rustc_const_eval; extern crate rustc_const_math; use rustc_plugin::Registry; +macro_rules! declare_restriction_lint { + { pub $name:tt, $description:tt } => { + declare_lint! { pub $name, Allow, $description } + }; +} + pub mod consts; #[macro_use] pub mod utils; @@ -242,9 +248,12 @@ pub fn plugin_registrar(reg: &mut Registry) { reg.register_late_lint_pass(box mem_forget::MemForget); reg.register_late_lint_pass(box arithmetic::Arithmetic::default()); - reg.register_lint_group("clippy_pedantic", vec![ + reg.register_lint_group("clippy_restrictions", vec![ arithmetic::FLOAT_ARITHMETIC, arithmetic::INTEGER_ARITHMETIC, + ]); + + reg.register_lint_group("clippy_pedantic", vec![ array_indexing::INDEXING_SLICING, booleans::NONMINIMAL_BOOL, enum_glob_use::ENUM_GLOB_USE, diff --git a/tests/compile-fail/arithmetic.rs b/tests/compile-fail/arithmetic.rs index 3b9e1b8b85a..54ac65970ae 100644 --- a/tests/compile-fail/arithmetic.rs +++ b/tests/compile-fail/arithmetic.rs @@ -15,7 +15,6 @@ fn main() { i & 1; // no wrapping i | 1; i ^ 1; - i % 7; i >> 1; i << 1; diff --git a/util/update_lints.py b/util/update_lints.py index bf9728d4f58..bfed0430abb 100755 --- a/util/update_lints.py +++ b/util/update_lints.py @@ -21,12 +21,18 @@ declare_deprecated_lint_re = re.compile(r''' " (?P(?:[^"\\]+|\\.)*) " \s* [})] ''', re.VERBOSE | re.DOTALL) +declare_restriction_lint_re = re.compile(r''' + declare_restriction_lint! \s* [{(] \s* + pub \s+ (?P[A-Z_][A-Z_0-9]*) \s*,\s* + " (?P(?:[^"\\]+|\\.)*) " \s* [})] +''', re.VERBOSE | re.DOTALL) + nl_escape_re = re.compile(r'\\\n\s*') wiki_link = 'https://github.com/Manishearth/rust-clippy/wiki' -def collect(lints, deprecated_lints, fn): +def collect(lints, deprecated_lints, restriction_lints, fn): """Collect all lints from a file. Adds entries to the lints list as `(module, name, level, desc)`. @@ -48,6 +54,14 @@ def collect(lints, deprecated_lints, fn): match.group('name').lower(), desc.replace('\\"', '"'))) + for match in declare_restriction_lint_re.finditer(code): + # remove \-newline escapes from description string + desc = nl_escape_re.sub('', match.group('desc')) + restriction_lints.append((os.path.splitext(os.path.basename(fn))[0], + match.group('name').lower(), + "allow", + desc.replace('\\"', '"'))) + def gen_table(lints, link=None): """Write lint table in Markdown format.""" @@ -86,7 +100,6 @@ def gen_deprecated(lints): for lint in lints: yield ' store.register_removed("%s", "%s");\n' % (lint[1], lint[2]) - def replace_region(fn, region_start, region_end, callback, replace_start=True, write_back=True): """Replace a region in a file delimited by two lines matching regexes. @@ -128,6 +141,7 @@ def replace_region(fn, region_start, region_end, callback, def main(print_only=False, check=False): lints = [] deprecated_lints = [] + restriction_lints = [] # check directory if not os.path.isfile('src/lib.rs'): @@ -138,22 +152,24 @@ def main(print_only=False, check=False): for root, _, files in os.walk('src'): for fn in files: if fn.endswith('.rs'): - collect(lints, deprecated_lints, os.path.join(root, fn)) + collect(lints, deprecated_lints, restriction_lints, + os.path.join(root, fn)) if print_only: - sys.stdout.writelines(gen_table(lints)) + sys.stdout.writelines(gen_table(lints + restriction_lints)) return # replace table in README.md changed = replace_region( 'README.md', r'^name +\|', '^$', - lambda: gen_table(lints, link=wiki_link), + lambda: gen_table(lints + restriction_lints, link=wiki_link), write_back=not check) changed |= replace_region( 'README.md', r'^There are \d+ lints included in this crate:', "", - lambda: ['There are %d lints included in this crate:\n' % len(lints)], + lambda: ['There are %d lints included in this crate:\n' % (len(lints) + + len(restriction_lints))], write_back=not check) # update the links in the CHANGELOG @@ -162,13 +178,14 @@ def main(print_only=False, check=False): "", "", lambda: ["[`{0}`]: {1}#{0}\n".format(l[1], wiki_link) for l in - sorted(lints + deprecated_lints, key=lambda l: l[1])], + sorted(lints + restriction_lints + deprecated_lints, + key=lambda l: l[1])], replace_start=False, write_back=not check) # update the `pub mod` list changed |= replace_region( 'src/lib.rs', r'begin lints modules', r'end lints modules', - lambda: gen_mods(lints), + lambda: gen_mods(lints + restriction_lints), replace_start=False, write_back=not check) # same for "clippy" lint collection @@ -190,6 +207,12 @@ def main(print_only=False, check=False): lambda: gen_group(lints, levels=('allow',)), replace_start=False, write_back=not check) + # same for "clippy_restrictions" lint collection + changed |= replace_region( + 'src/lib.rs', r'reg.register_lint_group\("clippy_restrictions"', + r'\]\);', lambda: gen_group(restriction_lints), + replace_start=False, write_back=not check) + if check and changed: print('Please run util/update_lints.py to regenerate lints lists.') return 1