From 1169066a0b501ae508461181b76c37d7e3b8ae6a Mon Sep 17 00:00:00 2001 From: Araam Borhanian Date: Sun, 13 Jan 2019 10:19:02 -0500 Subject: [PATCH 01/22] Adding lint for too many lines. --- clippy_lints/src/assign_ops.rs | 1 + clippy_lints/src/bit_mask.rs | 1 + clippy_lints/src/eq_op.rs | 2 +- clippy_lints/src/functions.rs | 77 +++++++++++- clippy_lints/src/lib.rs | 4 +- clippy_lints/src/loops.rs | 2 + clippy_lints/src/methods/mod.rs | 2 + clippy_lints/src/needless_pass_by_value.rs | 1 + clippy_lints/src/non_expressive_names.rs | 1 + clippy_lints/src/ptr.rs | 1 + clippy_lints/src/redundant_clone.rs | 1 + clippy_lints/src/transmute.rs | 2 +- clippy_lints/src/types.rs | 7 +- clippy_lints/src/utils/author.rs | 2 + clippy_lints/src/utils/conf.rs | 2 + clippy_lints/src/utils/hir_utils.rs | 2 +- src/driver.rs | 1 + .../toml_unknown_key/conf_unknown_key.stderr | 2 +- tests/ui/functions_maxlines.rs | 112 ++++++++++++++++++ tests/ui/functions_maxlines.stderr | 16 +++ tests/ui/matches.rs | 2 +- 21 files changed, 228 insertions(+), 13 deletions(-) create mode 100644 tests/ui/functions_maxlines.rs create mode 100644 tests/ui/functions_maxlines.stderr diff --git a/clippy_lints/src/assign_ops.rs b/clippy_lints/src/assign_ops.rs index cc44b514ea77..2ef2a1847461 100644 --- a/clippy_lints/src/assign_ops.rs +++ b/clippy_lints/src/assign_ops.rs @@ -64,6 +64,7 @@ impl LintPass for AssignOps { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for AssignOps { + #[allow(clippy::too_many_lines)] fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr) { match &expr.node { hir::ExprKind::AssignOp(op, lhs, rhs) => { diff --git a/clippy_lints/src/bit_mask.rs b/clippy_lints/src/bit_mask.rs index d4e303761990..f052ad6e5ac6 100644 --- a/clippy_lints/src/bit_mask.rs +++ b/clippy_lints/src/bit_mask.rs @@ -177,6 +177,7 @@ fn check_compare(cx: &LateContext<'_, '_>, bit_op: &Expr, cmp_op: BinOpKind, cmp } } +#[allow(clippy::too_many_lines)] fn check_bit_mask( cx: &LateContext<'_, '_>, bit_op: BinOpKind, diff --git a/clippy_lints/src/eq_op.rs b/clippy_lints/src/eq_op.rs index 57291dd24eee..2602ad45986b 100644 --- a/clippy_lints/src/eq_op.rs +++ b/clippy_lints/src/eq_op.rs @@ -59,7 +59,7 @@ impl LintPass for EqOp { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for EqOp { - #[allow(clippy::similar_names)] + #[allow(clippy::similar_names, clippy::too_many_lines)] fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) { if let ExprKind::Binary(op, ref left, ref right) = e.node { if in_macro(e.span) { diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index cb69e96c8e48..9710eba21ade 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -1,4 +1,4 @@ -use crate::utils::{iter_input_pats, span_lint, type_is_unsafe_function}; +use crate::utils::{iter_input_pats, snippet, span_lint, type_is_unsafe_function}; use matches::matches; use rustc::hir; use rustc::hir::def::Def; @@ -31,6 +31,22 @@ declare_clippy_lint! { "functions with too many arguments" } +/// **What it does:** Checks for functions with a large amount of lines. +/// +/// **Why is this bad?** Functions with a lot of lines are harder to understand +/// due to having to look at a larger amount of code to understand what the +/// function is doing. Consider splitting the body of the function into +/// multiple functions. +/// +/// **Known problems:** None. +/// +/// ``` +declare_clippy_lint! { + pub TOO_MANY_LINES, + pedantic, + "functions with too many lines" +} + /// **What it does:** Checks for public functions that dereferences raw pointer /// arguments but are not marked unsafe. /// @@ -62,17 +78,21 @@ declare_clippy_lint! { #[derive(Copy, Clone)] pub struct Functions { threshold: u64, + max_lines: u64 } impl Functions { - pub fn new(threshold: u64) -> Self { - Self { threshold } + pub fn new(threshold: u64, max_lines: u64) -> Self { + Self { + threshold, + max_lines + } } } impl LintPass for Functions { fn get_lints(&self) -> LintArray { - lint_array!(TOO_MANY_ARGUMENTS, NOT_UNSAFE_PTR_ARG_DEREF) + lint_array!(TOO_MANY_ARGUMENTS, TOO_MANY_LINES, NOT_UNSAFE_PTR_ARG_DEREF) } fn name(&self) -> &'static str { @@ -123,6 +143,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Functions { } self.check_raw_ptr(cx, unsafety, decl, body, nodeid); + self.check_line_number(cx, span); } fn check_trait_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx hir::TraitItem) { @@ -153,6 +174,54 @@ impl<'a, 'tcx> Functions { } } + fn check_line_number(self, cx: &LateContext, span: Span) { + let code_snippet = snippet(cx, span, ".."); + let mut line_count = 0; + let mut in_comment = false; + for mut line in code_snippet.lines() { + if in_comment { + let end_comment_loc = match line.find("*/") { + Some(i) => i, + None => continue + }; + in_comment = false; + line = &line[end_comment_loc..]; + } + line = line.trim_left(); + if line.is_empty() || line.starts_with("//") { continue; } + if line.contains("/*") { + let mut count_line: bool = !line.starts_with("/*"); + let close_counts = line.match_indices("*/").count(); + let open_counts = line.match_indices("/*").count(); + + if close_counts > 1 || open_counts > 1 { + line_count += 1; + } else if close_counts == 1 { + match line.find("*/") { + Some(i) => { + line = line[i..].trim_left(); + if !line.is_empty() && !line.starts_with("//") { + count_line = true; + } + }, + None => continue + } + } else { + in_comment = true; + } + if count_line { line_count += 1; } + } else { + // No multipart comment, no single comment, non-empty string. + line_count += 1; + } + } + + if line_count > self.max_lines { + span_lint(cx, TOO_MANY_LINES, span, + "This function has a large number of lines.") + } + } + fn check_raw_ptr( self, cx: &LateContext<'a, 'tcx>, diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index 52cc2a88da4a..8e8657c9d028 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -290,6 +290,7 @@ pub fn read_conf(reg: &rustc_plugin::Registry<'_>) -> Conf { } } +#[allow(clippy::too_many_lines)] #[rustfmt::skip] pub fn register_plugins(reg: &mut rustc_plugin::Registry<'_>, conf: &Conf) { let mut store = reg.sess.lint_store.borrow_mut(); @@ -427,7 +428,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry<'_>, conf: &Conf) { reg.register_late_lint_pass(box blacklisted_name::BlackListedName::new( conf.blacklisted_names.iter().cloned().collect() )); - reg.register_late_lint_pass(box functions::Functions::new(conf.too_many_arguments_threshold)); + reg.register_late_lint_pass(box functions::Functions::new(conf.too_many_arguments_threshold, conf.too_many_lines_threshold)); reg.register_early_lint_pass(box doc::Doc::new(conf.doc_valid_idents.iter().cloned().collect())); reg.register_late_lint_pass(box neg_multiply::NegMultiply); reg.register_early_lint_pass(box unsafe_removed_from_name::UnsafeNameRemoval); @@ -527,6 +528,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry<'_>, conf: &Conf) { enum_glob_use::ENUM_GLOB_USE, enum_variants::MODULE_NAME_REPETITIONS, enum_variants::PUB_ENUM_VARIANT_NAMES, + functions::TOO_MANY_LINES, if_not_else::IF_NOT_ELSE, infinite_iter::MAYBE_INFINITE_ITER, items_after_statements::ITEMS_AFTER_STATEMENTS, diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs index 4d6cc75135ec..06266257d1e5 100644 --- a/clippy_lints/src/loops.rs +++ b/clippy_lints/src/loops.rs @@ -472,6 +472,7 @@ impl LintPass for Pass { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass { + #[allow(clippy::too_many_lines)] fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) { // we don't want to check expanded macros if in_macro(expr.span) { @@ -1066,6 +1067,7 @@ fn detect_manual_memcpy<'a, 'tcx>( /// Check for looping over a range and then indexing a sequence with it. /// The iteratee must be a range literal. +#[allow(clippy::too_many_lines)] fn check_for_loop_range<'a, 'tcx>( cx: &LateContext<'a, 'tcx>, pat: &'tcx Pat, diff --git a/clippy_lints/src/methods/mod.rs b/clippy_lints/src/methods/mod.rs index 20ffc1fd4068..4ce2ae03b9fb 100644 --- a/clippy_lints/src/methods/mod.rs +++ b/clippy_lints/src/methods/mod.rs @@ -1005,6 +1005,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass { } /// Checks for the `OR_FUN_CALL` lint. +#[allow(clippy::too_many_lines)] fn lint_or_fun_call(cx: &LateContext<'_, '_>, expr: &hir::Expr, method_span: Span, name: &str, args: &[hir::Expr]) { /// Check for `unwrap_or(T::new())` or `unwrap_or(T::default())`. fn check_unwrap_or_default( @@ -1151,6 +1152,7 @@ fn lint_or_fun_call(cx: &LateContext<'_, '_>, expr: &hir::Expr, method_span: Spa } /// Checks for the `EXPECT_FUN_CALL` lint. +#[allow(clippy::too_many_lines)] fn lint_expect_fun_call(cx: &LateContext<'_, '_>, expr: &hir::Expr, method_span: Span, name: &str, args: &[hir::Expr]) { // Strip `&`, `as_ref()` and `as_str()` off `arg` until we're left with either a `String` or // `&str` diff --git a/clippy_lints/src/needless_pass_by_value.rs b/clippy_lints/src/needless_pass_by_value.rs index 73c0ed72d3b4..a8cc5eeec9f2 100644 --- a/clippy_lints/src/needless_pass_by_value.rs +++ b/clippy_lints/src/needless_pass_by_value.rs @@ -73,6 +73,7 @@ macro_rules! need { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessPassByValue { + #[allow(clippy::too_many_lines)] fn check_fn( &mut self, cx: &LateContext<'a, 'tcx>, diff --git a/clippy_lints/src/non_expressive_names.rs b/clippy_lints/src/non_expressive_names.rs index 3bdf2c38d237..fbf60db28ee4 100644 --- a/clippy_lints/src/non_expressive_names.rs +++ b/clippy_lints/src/non_expressive_names.rs @@ -158,6 +158,7 @@ impl<'a, 'tcx, 'b> SimilarNamesNameVisitor<'a, 'tcx, 'b> { ); } } + #[allow(clippy::too_many_lines)] fn check_name(&mut self, span: Span, name: Name) { let interned_name = name.as_str(); if interned_name.chars().any(char::is_uppercase) { diff --git a/clippy_lints/src/ptr.rs b/clippy_lints/src/ptr.rs index b990b7ab2bd3..5a54971f49e0 100644 --- a/clippy_lints/src/ptr.rs +++ b/clippy_lints/src/ptr.rs @@ -151,6 +151,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for PointerPass { } } +#[allow(clippy::too_many_lines)] fn check_fn(cx: &LateContext<'_, '_>, decl: &FnDecl, fn_id: NodeId, opt_body_id: Option) { let fn_def_id = cx.tcx.hir().local_def_id(fn_id); let sig = cx.tcx.fn_sig(fn_def_id); diff --git a/clippy_lints/src/redundant_clone.rs b/clippy_lints/src/redundant_clone.rs index 7ac147c8ac17..5c994d8a2bc9 100644 --- a/clippy_lints/src/redundant_clone.rs +++ b/clippy_lints/src/redundant_clone.rs @@ -80,6 +80,7 @@ impl LintPass for RedundantClone { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for RedundantClone { + #[allow(clippy::too_many_lines)] fn check_fn( &mut self, cx: &LateContext<'a, 'tcx>, diff --git a/clippy_lints/src/transmute.rs b/clippy_lints/src/transmute.rs index 90cfcd56c3b0..56e1aa4a4e1f 100644 --- a/clippy_lints/src/transmute.rs +++ b/clippy_lints/src/transmute.rs @@ -226,7 +226,7 @@ impl LintPass for Transmute { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { - #[allow(clippy::similar_names)] + #[allow(clippy::similar_names, clippy::too_many_lines)] fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) { if let ExprKind::Call(ref path_expr, ref args) = e.node { if let ExprKind::Path(ref qpath) = path_expr.node { diff --git a/clippy_lints/src/types.rs b/clippy_lints/src/types.rs index 939dd27c4415..e81df4af383b 100644 --- a/clippy_lints/src/types.rs +++ b/clippy_lints/src/types.rs @@ -240,8 +240,9 @@ fn match_type_parameter(cx: &LateContext<'_, '_>, qpath: &QPath, path: &[&str]) /// /// The parameter `is_local` distinguishes the context of the type; types from /// local bindings should only be checked for the `BORROWED_BOX` lint. -fn check_ty(cx: &LateContext<'_, '_>, hir_ty: &hir::Ty, is_local: bool) { - if in_macro(hir_ty.span) { +#[allow(clippy::too_many_lines)] +fn check_ty(cx: &LateContext<'_, '_>, ast_ty: &hir::Ty, is_local: bool) { + if in_macro(ast_ty.span) { return; } match hir_ty.node { @@ -1968,7 +1969,7 @@ impl LintPass for ImplicitHasher { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImplicitHasher { - #[allow(clippy::cast_possible_truncation)] + #[allow(clippy::cast_possible_truncation, clippy::too_many_lines)] fn check_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx Item) { use syntax_pos::BytePos; diff --git a/clippy_lints/src/utils/author.rs b/clippy_lints/src/utils/author.rs index 19c3f3ad2302..5a76b965d269 100644 --- a/clippy_lints/src/utils/author.rs +++ b/clippy_lints/src/utils/author.rs @@ -194,6 +194,7 @@ struct PrintVisitor { } impl<'tcx> Visitor<'tcx> for PrintVisitor { + #[allow(clippy::too_many_lines)] fn visit_expr(&mut self, expr: &Expr) { print!(" if let ExprKind::"); let current = format!("{}.node", self.current); @@ -506,6 +507,7 @@ impl<'tcx> Visitor<'tcx> for PrintVisitor { } } + #[allow(clippy::too_many_lines)] fn visit_pat(&mut self, pat: &Pat) { print!(" if let PatKind::"); let current = format!("{}.node", self.current); diff --git a/clippy_lints/src/utils/conf.rs b/clippy_lints/src/utils/conf.rs index 55256a254278..4ab274e598fa 100644 --- a/clippy_lints/src/utils/conf.rs +++ b/clippy_lints/src/utils/conf.rs @@ -148,6 +148,8 @@ define_Conf! { (literal_representation_threshold, "literal_representation_threshold", 16384 => u64), /// Lint: TRIVIALLY_COPY_PASS_BY_REF. The maximum size (in bytes) to consider a `Copy` type for passing by value instead of by reference. (trivial_copy_size_limit, "trivial_copy_size_limit", None => Option), + /// Lint: TOO_MANY_LINES. The maximum number of lines a function or method can have + (too_many_lines_threshold, "too_many_lines_threshold", 101 => u64), } impl Default for Conf { diff --git a/clippy_lints/src/utils/hir_utils.rs b/clippy_lints/src/utils/hir_utils.rs index a176830be26b..2b0b0e7121fa 100644 --- a/clippy_lints/src/utils/hir_utils.rs +++ b/clippy_lints/src/utils/hir_utils.rs @@ -389,7 +389,7 @@ impl<'a, 'tcx: 'a> SpanlessHash<'a, 'tcx> { .hash(&mut self.s); } - #[allow(clippy::many_single_char_names)] + #[allow(clippy::many_single_char_names, clippy::too_many_lines)] pub fn hash_expr(&mut self, e: &Expr) { if let Some(e) = constant_simple(self.cx, self.tables, e) { return e.hash(&mut self.s); diff --git a/src/driver.rs b/src/driver.rs index 1ce6f6b7c496..b41895f3c2bd 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -20,6 +20,7 @@ fn show_version() { println!(env!("CARGO_PKG_VERSION")); } +#[allow(clippy::too_many_lines)] pub fn main() { rustc_driver::init_rustc_env_logger(); exit( diff --git a/tests/ui-toml/toml_unknown_key/conf_unknown_key.stderr b/tests/ui-toml/toml_unknown_key/conf_unknown_key.stderr index 05a04fb377ad..ec2ac20684b8 100644 --- a/tests/ui-toml/toml_unknown_key/conf_unknown_key.stderr +++ b/tests/ui-toml/toml_unknown_key/conf_unknown_key.stderr @@ -1,4 +1,4 @@ -error: error reading Clippy's configuration file `$DIR/clippy.toml`: unknown field `foobar`, expected one of `blacklisted-names`, `cyclomatic-complexity-threshold`, `doc-valid-idents`, `too-many-arguments-threshold`, `type-complexity-threshold`, `single-char-binding-names-threshold`, `too-large-for-stack`, `enum-variant-name-threshold`, `enum-variant-size-threshold`, `verbose-bit-mask-threshold`, `literal-representation-threshold`, `trivial-copy-size-limit`, `third-party` +error: error reading Clippy's configuration file `$DIR/clippy.toml`: unknown field `foobar`, expected one of `blacklisted-names`, `cyclomatic-complexity-threshold`, `doc-valid-idents`, `too-many-arguments-threshold`, `type-complexity-threshold`, `single-char-binding-names-threshold`, `too-large-for-stack`, `enum-variant-name-threshold`, `enum-variant-size-threshold`, `verbose-bit-mask-threshold`, `literal-representation-threshold`, `trivial-copy-size-limit`, `too-many-lines-threshold`, `third-party` error: aborting due to previous error diff --git a/tests/ui/functions_maxlines.rs b/tests/ui/functions_maxlines.rs new file mode 100644 index 000000000000..5d8baf438df3 --- /dev/null +++ b/tests/ui/functions_maxlines.rs @@ -0,0 +1,112 @@ +#![warn(clippy::all, clippy::pedantic)] + +// TOO_MANY_LINES +fn good_lines() { + /* println!("This is good."); */ + // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); */ + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); +} + +fn bad_lines() { + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); +} + +fn main() {} diff --git a/tests/ui/functions_maxlines.stderr b/tests/ui/functions_maxlines.stderr new file mode 100644 index 000000000000..9e1b2fe568a4 --- /dev/null +++ b/tests/ui/functions_maxlines.stderr @@ -0,0 +1,16 @@ +error: This function has a large number of lines. + --> $DIR/functions_maxlines.rs:59:1 + | +LL | / fn bad_lines() { +LL | | println!("This is bad."); +LL | | println!("This is bad."); +LL | | println!("This is bad."); +... | +LL | | println!("This is bad."); +LL | | } + | |_^ + | + = note: `-D clippy::too-many-lines` implied by `-D warnings` + +error: aborting due to previous error + diff --git a/tests/ui/matches.rs b/tests/ui/matches.rs index 013f12a1a0e8..a40b80378efc 100644 --- a/tests/ui/matches.rs +++ b/tests/ui/matches.rs @@ -1,6 +1,6 @@ #![feature(exclusive_range_pattern)] #![warn(clippy::all)] -#![allow(unused, clippy::redundant_pattern_matching)] +#![allow(unused, clippy::redundant_pattern_matching, clippy::too_many_lines)] #![warn(clippy::match_same_arms)] fn dummy() {} From 6b86c3b1e7cce84787c6903d48392e4c5f24f6b3 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 13 Jan 2019 11:07:14 -0500 Subject: [PATCH 02/22] Updating number of lines for the failing test to be > 100. Due to updating the configuration to be 101 instead of 51 --- tests/ui/functions_maxlines.rs | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/ui/functions_maxlines.rs b/tests/ui/functions_maxlines.rs index 5d8baf438df3..5f93f8153400 100644 --- a/tests/ui/functions_maxlines.rs +++ b/tests/ui/functions_maxlines.rs @@ -107,6 +107,56 @@ fn bad_lines() { println!("This is bad."); println!("This is bad."); println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); } fn main() {} From 93bf74a15885c100dc830958d457c1704640de43 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 13 Jan 2019 11:42:09 -0500 Subject: [PATCH 03/22] Running util/dev to update README/CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71066aadfcbd..192e0132619e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -981,6 +981,7 @@ All notable changes to this project will be documented in this file. [`temporary_assignment`]: https://rust-lang.github.io/rust-clippy/master/index.html#temporary_assignment [`temporary_cstring_as_ptr`]: https://rust-lang.github.io/rust-clippy/master/index.html#temporary_cstring_as_ptr [`too_many_arguments`]: https://rust-lang.github.io/rust-clippy/master/index.html#too_many_arguments +[`too_many_lines`]: https://rust-lang.github.io/rust-clippy/master/index.html#too_many_lines [`toplevel_ref_arg`]: https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [`transmute_bytes_to_str`]: https://rust-lang.github.io/rust-clippy/master/index.html#transmute_bytes_to_str [`transmute_int_to_bool`]: https://rust-lang.github.io/rust-clippy/master/index.html#transmute_int_to_bool From 7fbd55c3291175229fb86ffd8a31c1e5fb544e27 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 13 Jan 2019 16:26:03 -0500 Subject: [PATCH 04/22] Reworking function logic, and adding doc example. This should fix line count logic issues that the previous code had, with assumptions it would make. --- clippy_lints/src/functions.rs | 78 +++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index 9710eba21ade..a5dbbeb3e515 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -40,6 +40,13 @@ declare_clippy_lint! { /// /// **Known problems:** None. /// +/// **Example:** +/// ``` rust +/// fn im_too_long() { +/// println!(""); +/// // ... 100 more LoC +/// println!(""); +/// } /// ``` declare_clippy_lint! { pub TOO_MANY_LINES, @@ -174,46 +181,57 @@ impl<'a, 'tcx> Functions { } } - fn check_line_number(self, cx: &LateContext, span: Span) { + fn check_line_number(self, cx: &LateContext<'_, '_>, span: Span) { let code_snippet = snippet(cx, span, ".."); - let mut line_count = 0; + let mut line_count: u64 = 0; let mut in_comment = false; - for mut line in code_snippet.lines() { - if in_comment { - let end_comment_loc = match line.find("*/") { - Some(i) => i, - None => continue - }; - in_comment = false; - line = &line[end_comment_loc..]; - } - line = line.trim_left(); - if line.is_empty() || line.starts_with("//") { continue; } - if line.contains("/*") { - let mut count_line: bool = !line.starts_with("/*"); - let close_counts = line.match_indices("*/").count(); - let open_counts = line.match_indices("/*").count(); + let mut code_in_line; - if close_counts > 1 || open_counts > 1 { - line_count += 1; - } else if close_counts == 1 { + // Skip the surrounding function decl. + let start_brace_idx = match code_snippet.find("{") { + Some(i) => i + 1, + None => 0 + }; + let end_brace_idx = match code_snippet.find("}") { + Some(i) => i, + None => code_snippet.len() + }; + let function_lines = code_snippet[start_brace_idx..end_brace_idx].lines(); + + for mut line in function_lines { + code_in_line = false; + loop { + line = line.trim_start(); + if line.is_empty() { break; } + if in_comment { match line.find("*/") { Some(i) => { - line = line[i..].trim_left(); - if !line.is_empty() && !line.starts_with("//") { - count_line = true; - } + line = &line[i + 2..]; + in_comment = false; + continue; }, - None => continue + None => break } } else { - in_comment = true; + let multi_idx = match line.find("/*") { + Some(i) => i, + None => line.len() + }; + let single_idx = match line.find("//") { + Some(i) => i, + None => line.len() + }; + code_in_line |= multi_idx > 0 && single_idx > 0; + // Implies multi_idx is below line.len() + if multi_idx < single_idx { + line = &line[multi_idx + 2..]; + in_comment = true; + continue; + } + break; } - if count_line { line_count += 1; } - } else { - // No multipart comment, no single comment, non-empty string. - line_count += 1; } + if code_in_line { line_count += 1; } } if line_count > self.max_lines { From 3a97b5fa2048211b16d362be34293912fe996113 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 13 Jan 2019 16:26:20 -0500 Subject: [PATCH 05/22] Moving tests to ui-toml to make use of clippy.toml --- tests/ui-toml/functions_maxlines/clippy.toml | 1 + tests/ui-toml/functions_maxlines/test.rs | 44 +++++ tests/ui-toml/functions_maxlines/test.stderr | 23 +++ tests/ui/functions_maxlines.rs | 162 ------------------- tests/ui/functions_maxlines.stderr | 16 -- 5 files changed, 68 insertions(+), 178 deletions(-) create mode 100644 tests/ui-toml/functions_maxlines/clippy.toml create mode 100644 tests/ui-toml/functions_maxlines/test.rs create mode 100644 tests/ui-toml/functions_maxlines/test.stderr delete mode 100644 tests/ui/functions_maxlines.rs delete mode 100644 tests/ui/functions_maxlines.stderr diff --git a/tests/ui-toml/functions_maxlines/clippy.toml b/tests/ui-toml/functions_maxlines/clippy.toml new file mode 100644 index 000000000000..951dbb523d95 --- /dev/null +++ b/tests/ui-toml/functions_maxlines/clippy.toml @@ -0,0 +1 @@ +too-many-lines-threshold = 1 diff --git a/tests/ui-toml/functions_maxlines/test.rs b/tests/ui-toml/functions_maxlines/test.rs new file mode 100644 index 000000000000..6ee75e4dbc17 --- /dev/null +++ b/tests/ui-toml/functions_maxlines/test.rs @@ -0,0 +1,44 @@ +#![warn(clippy::too_many_lines)] + + +// This function should be considered one line. +fn many_comments_but_one_line_of_code() { + /* println!("This is good."); */ + // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* println!("This is good."); + println!("This is good."); + println!("This is good."); */ + println!("This is good."); +} + +// This should be considered two and a fail. +fn too_many_lines() { + println!("This is bad."); + println!("This is bad."); +} + +// This should be considered one line. +fn comment_starts_after_code() { + let _ = 5; /* closing comment. */ /* + this line shouldn't be counted theoretically. + */ +} + +// This should be considered one line. +fn comment_after_code() { + let _ = 5; /* this line should get counted once. */ +} + +// This should fail since it is technically two lines. +fn comment_before_code() { + let _ = "test"; + /* This comment extends to the front of + teh code but this line should still count. */ let _ = 5; +} + +// This should be considered one line. +fn main() {} diff --git a/tests/ui-toml/functions_maxlines/test.stderr b/tests/ui-toml/functions_maxlines/test.stderr new file mode 100644 index 000000000000..f36c59787841 --- /dev/null +++ b/tests/ui-toml/functions_maxlines/test.stderr @@ -0,0 +1,23 @@ +error: This function has a large number of lines. + --> $DIR/test.rs:19:1 + | +LL | / fn too_many_lines() { +LL | | println!("This is bad."); +LL | | println!("This is bad."); +LL | | } + | |_^ + | + = note: `-D clippy::too-many-lines` implied by `-D warnings` + +error: This function has a large number of lines. + --> $DIR/test.rs:37:1 + | +LL | / fn comment_before_code() { +LL | | let _ = "test"; +LL | | /* This comment extends to the front of +LL | | teh code but this line should still count. */ let _ = 5; +LL | | } + | |_^ + +error: aborting due to 2 previous errors + diff --git a/tests/ui/functions_maxlines.rs b/tests/ui/functions_maxlines.rs deleted file mode 100644 index 5f93f8153400..000000000000 --- a/tests/ui/functions_maxlines.rs +++ /dev/null @@ -1,162 +0,0 @@ -#![warn(clippy::all, clippy::pedantic)] - -// TOO_MANY_LINES -fn good_lines() { - /* println!("This is good."); */ - // println!("This is good."); - /* */ // println!("This is good."); - /* */ // println!("This is good."); - /* */ // println!("This is good."); - /* */ // println!("This is good."); - /* println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); */ - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); -} - -fn bad_lines() { - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); -} - -fn main() {} diff --git a/tests/ui/functions_maxlines.stderr b/tests/ui/functions_maxlines.stderr deleted file mode 100644 index 9e1b2fe568a4..000000000000 --- a/tests/ui/functions_maxlines.stderr +++ /dev/null @@ -1,16 +0,0 @@ -error: This function has a large number of lines. - --> $DIR/functions_maxlines.rs:59:1 - | -LL | / fn bad_lines() { -LL | | println!("This is bad."); -LL | | println!("This is bad."); -LL | | println!("This is bad."); -... | -LL | | println!("This is bad."); -LL | | } - | |_^ - | - = note: `-D clippy::too-many-lines` implied by `-D warnings` - -error: aborting due to previous error - From e583f35b3a7f2c55bc0ef786a3c671a843b38a46 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 13 Jan 2019 16:53:26 -0500 Subject: [PATCH 06/22] rustfmt --- clippy_lints/src/functions.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index a5dbbeb3e515..e95bf6639fc8 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -85,15 +85,12 @@ declare_clippy_lint! { #[derive(Copy, Clone)] pub struct Functions { threshold: u64, - max_lines: u64 + max_lines: u64, } impl Functions { pub fn new(threshold: u64, max_lines: u64) -> Self { - Self { - threshold, - max_lines - } + Self { threshold, max_lines } } } @@ -190,11 +187,11 @@ impl<'a, 'tcx> Functions { // Skip the surrounding function decl. let start_brace_idx = match code_snippet.find("{") { Some(i) => i + 1, - None => 0 + None => 0, }; let end_brace_idx = match code_snippet.find("}") { Some(i) => i, - None => code_snippet.len() + None => code_snippet.len(), }; let function_lines = code_snippet[start_brace_idx..end_brace_idx].lines(); @@ -202,7 +199,9 @@ impl<'a, 'tcx> Functions { code_in_line = false; loop { line = line.trim_start(); - if line.is_empty() { break; } + if line.is_empty() { + break; + } if in_comment { match line.find("*/") { Some(i) => { @@ -210,16 +209,16 @@ impl<'a, 'tcx> Functions { in_comment = false; continue; }, - None => break + None => break, } } else { let multi_idx = match line.find("/*") { Some(i) => i, - None => line.len() + None => line.len(), }; let single_idx = match line.find("//") { Some(i) => i, - None => line.len() + None => line.len(), }; code_in_line |= multi_idx > 0 && single_idx > 0; // Implies multi_idx is below line.len() @@ -231,12 +230,13 @@ impl<'a, 'tcx> Functions { break; } } - if code_in_line { line_count += 1; } + if code_in_line { + line_count += 1; + } } if line_count > self.max_lines { - span_lint(cx, TOO_MANY_LINES, span, - "This function has a large number of lines.") + span_lint(cx, TOO_MANY_LINES, span, "This function has a large number of lines.") } } From c1f4e18453e18d6cae92aeaeca465f004d1463a7 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 13 Jan 2019 17:53:56 -0500 Subject: [PATCH 07/22] Adding back tests, but also reducing threshold by 1 --- clippy_lints/src/utils/conf.rs | 2 +- tests/ui/functions_maxlines.rs | 163 +++++++++++++++++++++++++++++ tests/ui/functions_maxlines.stderr | 16 +++ 3 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 tests/ui/functions_maxlines.rs create mode 100644 tests/ui/functions_maxlines.stderr diff --git a/clippy_lints/src/utils/conf.rs b/clippy_lints/src/utils/conf.rs index 4ab274e598fa..09d204a562c9 100644 --- a/clippy_lints/src/utils/conf.rs +++ b/clippy_lints/src/utils/conf.rs @@ -149,7 +149,7 @@ define_Conf! { /// Lint: TRIVIALLY_COPY_PASS_BY_REF. The maximum size (in bytes) to consider a `Copy` type for passing by value instead of by reference. (trivial_copy_size_limit, "trivial_copy_size_limit", None => Option), /// Lint: TOO_MANY_LINES. The maximum number of lines a function or method can have - (too_many_lines_threshold, "too_many_lines_threshold", 101 => u64), + (too_many_lines_threshold, "too_many_lines_threshold", 100 => u64), } impl Default for Conf { diff --git a/tests/ui/functions_maxlines.rs b/tests/ui/functions_maxlines.rs new file mode 100644 index 000000000000..762525401b83 --- /dev/null +++ b/tests/ui/functions_maxlines.rs @@ -0,0 +1,163 @@ +#![warn(clippy::all, clippy::pedantic)] + +// TOO_MANY_LINES +fn good_lines() { + /* println!("This is good."); */ + // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); */ + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); +} + +fn bad_lines() { + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); +} + +fn main() {} diff --git a/tests/ui/functions_maxlines.stderr b/tests/ui/functions_maxlines.stderr new file mode 100644 index 000000000000..9e1b2fe568a4 --- /dev/null +++ b/tests/ui/functions_maxlines.stderr @@ -0,0 +1,16 @@ +error: This function has a large number of lines. + --> $DIR/functions_maxlines.rs:59:1 + | +LL | / fn bad_lines() { +LL | | println!("This is bad."); +LL | | println!("This is bad."); +LL | | println!("This is bad."); +... | +LL | | println!("This is bad."); +LL | | } + | |_^ + | + = note: `-D clippy::too-many-lines` implied by `-D warnings` + +error: aborting due to previous error + From 50c82e02707fc013f584b92beae760db34222430 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 14 Jan 2019 21:38:15 -0500 Subject: [PATCH 08/22] Updating to just warn for one test. --- tests/ui/functions_maxlines.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/ui/functions_maxlines.rs b/tests/ui/functions_maxlines.rs index 762525401b83..ada35abde99c 100644 --- a/tests/ui/functions_maxlines.rs +++ b/tests/ui/functions_maxlines.rs @@ -1,6 +1,5 @@ -#![warn(clippy::all, clippy::pedantic)] +#![warn(clippy::too_many_lines)] -// TOO_MANY_LINES fn good_lines() { /* println!("This is good."); */ // println!("This is good."); From 02456208b413c5bc2854a2b54bb5691eacd82813 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 14 Jan 2019 22:32:12 -0500 Subject: [PATCH 09/22] Fix test broken by removing comment. --- tests/ui/functions_maxlines.stderr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ui/functions_maxlines.stderr b/tests/ui/functions_maxlines.stderr index 9e1b2fe568a4..dfa6a1cf3c5f 100644 --- a/tests/ui/functions_maxlines.stderr +++ b/tests/ui/functions_maxlines.stderr @@ -1,5 +1,5 @@ error: This function has a large number of lines. - --> $DIR/functions_maxlines.rs:59:1 + --> $DIR/functions_maxlines.rs:58:1 | LL | / fn bad_lines() { LL | | println!("This is bad."); From 44c835feead3bbc0c993a7ee20a51cb9ce1e07d9 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 19 Jan 2019 17:35:32 -0500 Subject: [PATCH 10/22] Skipping check if in external macro. --- clippy_lints/src/functions.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index e95bf6639fc8..0da7e26a1be4 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -3,7 +3,7 @@ use matches::matches; use rustc::hir; use rustc::hir::def::Def; use rustc::hir::intravisit; -use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass}; +use rustc::lint::{in_external_macro, LateContext, LateLintPass, LintArray, LintContext, LintPass}; use rustc::ty; use rustc::{declare_tool_lint, lint_array}; use rustc_data_structures::fx::FxHashSet; @@ -179,6 +179,10 @@ impl<'a, 'tcx> Functions { } fn check_line_number(self, cx: &LateContext<'_, '_>, span: Span) { + if in_external_macro(cx.sess(), span) { + return; + } + let code_snippet = snippet(cx, span, ".."); let mut line_count: u64 = 0; let mut in_comment = false; From 5e10809ac31526d3e91088eaeb1ee8567e90ba2a Mon Sep 17 00:00:00 2001 From: Araam Borhanian Date: Sun, 13 Jan 2019 10:19:02 -0500 Subject: [PATCH 11/22] Adding lint for too many lines. --- clippy_lints/src/functions.rs | 5 ++++- tests/ui/functions_maxlines.rs | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index 0da7e26a1be4..5b4f6f2ad17b 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -90,7 +90,10 @@ pub struct Functions { impl Functions { pub fn new(threshold: u64, max_lines: u64) -> Self { - Self { threshold, max_lines } + Self { + threshold, + max_lines + } } } diff --git a/tests/ui/functions_maxlines.rs b/tests/ui/functions_maxlines.rs index ada35abde99c..56fcd4866d61 100644 --- a/tests/ui/functions_maxlines.rs +++ b/tests/ui/functions_maxlines.rs @@ -1,5 +1,6 @@ #![warn(clippy::too_many_lines)] + fn good_lines() { /* println!("This is good."); */ // println!("This is good."); @@ -106,6 +107,7 @@ fn bad_lines() { println!("This is bad."); println!("This is bad."); println!("This is bad."); +<<<<<<< HEAD println!("This is bad."); println!("This is bad."); println!("This is bad."); From be514a4336ee664c46b40acd2250942299f3e15c Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 13 Jan 2019 11:07:14 -0500 Subject: [PATCH 12/22] Updating number of lines for the failing test to be > 100. Due to updating the configuration to be 101 instead of 51 --- tests/ui/functions_maxlines.rs | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/ui/functions_maxlines.rs b/tests/ui/functions_maxlines.rs index 56fcd4866d61..33a47675ff1f 100644 --- a/tests/ui/functions_maxlines.rs +++ b/tests/ui/functions_maxlines.rs @@ -159,6 +159,56 @@ fn bad_lines() { println!("This is bad."); println!("This is bad."); println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); } fn main() {} From 65f62d04976c387c30a876e37fa6f446d99a3767 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 13 Jan 2019 16:26:20 -0500 Subject: [PATCH 13/22] Moving tests to ui-toml to make use of clippy.toml --- tests/ui/functions_maxlines.rs | 214 ----------------------------- tests/ui/functions_maxlines.stderr | 16 --- 2 files changed, 230 deletions(-) delete mode 100644 tests/ui/functions_maxlines.rs delete mode 100644 tests/ui/functions_maxlines.stderr diff --git a/tests/ui/functions_maxlines.rs b/tests/ui/functions_maxlines.rs deleted file mode 100644 index 33a47675ff1f..000000000000 --- a/tests/ui/functions_maxlines.rs +++ /dev/null @@ -1,214 +0,0 @@ -#![warn(clippy::too_many_lines)] - - -fn good_lines() { - /* println!("This is good."); */ - // println!("This is good."); - /* */ // println!("This is good."); - /* */ // println!("This is good."); - /* */ // println!("This is good."); - /* */ // println!("This is good."); - /* println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); */ - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); - println!("This is good."); -} - -fn bad_lines() { - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); -<<<<<<< HEAD - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); - println!("This is bad."); -} - -fn main() {} diff --git a/tests/ui/functions_maxlines.stderr b/tests/ui/functions_maxlines.stderr deleted file mode 100644 index dfa6a1cf3c5f..000000000000 --- a/tests/ui/functions_maxlines.stderr +++ /dev/null @@ -1,16 +0,0 @@ -error: This function has a large number of lines. - --> $DIR/functions_maxlines.rs:58:1 - | -LL | / fn bad_lines() { -LL | | println!("This is bad."); -LL | | println!("This is bad."); -LL | | println!("This is bad."); -... | -LL | | println!("This is bad."); -LL | | } - | |_^ - | - = note: `-D clippy::too-many-lines` implied by `-D warnings` - -error: aborting due to previous error - From 6931b0f5a16c02e314fda6d3cccc5c08c51ceb68 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 13 Jan 2019 16:53:26 -0500 Subject: [PATCH 14/22] rustfmt --- clippy_lints/src/functions.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index 5b4f6f2ad17b..0da7e26a1be4 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -90,10 +90,7 @@ pub struct Functions { impl Functions { pub fn new(threshold: u64, max_lines: u64) -> Self { - Self { - threshold, - max_lines - } + Self { threshold, max_lines } } } From 057037a6b91de82e8a75bcb36bd596e944ab3328 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 13 Jan 2019 17:53:56 -0500 Subject: [PATCH 15/22] Adding back tests, but also reducing threshold by 1 --- tests/ui/functions_maxlines.rs | 163 +++++++++++++++++++++++++++++ tests/ui/functions_maxlines.stderr | 16 +++ 2 files changed, 179 insertions(+) create mode 100644 tests/ui/functions_maxlines.rs create mode 100644 tests/ui/functions_maxlines.stderr diff --git a/tests/ui/functions_maxlines.rs b/tests/ui/functions_maxlines.rs new file mode 100644 index 000000000000..762525401b83 --- /dev/null +++ b/tests/ui/functions_maxlines.rs @@ -0,0 +1,163 @@ +#![warn(clippy::all, clippy::pedantic)] + +// TOO_MANY_LINES +fn good_lines() { + /* println!("This is good."); */ + // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* */ // println!("This is good."); + /* println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); */ + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); + println!("This is good."); +} + +fn bad_lines() { + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); + println!("This is bad."); +} + +fn main() {} diff --git a/tests/ui/functions_maxlines.stderr b/tests/ui/functions_maxlines.stderr new file mode 100644 index 000000000000..9e1b2fe568a4 --- /dev/null +++ b/tests/ui/functions_maxlines.stderr @@ -0,0 +1,16 @@ +error: This function has a large number of lines. + --> $DIR/functions_maxlines.rs:59:1 + | +LL | / fn bad_lines() { +LL | | println!("This is bad."); +LL | | println!("This is bad."); +LL | | println!("This is bad."); +... | +LL | | println!("This is bad."); +LL | | } + | |_^ + | + = note: `-D clippy::too-many-lines` implied by `-D warnings` + +error: aborting due to previous error + From ae3bcb770e94dcb5668194a99260b170edb4fcf3 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 14 Jan 2019 21:38:15 -0500 Subject: [PATCH 16/22] Updating to just warn for one test. --- tests/ui/functions_maxlines.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/ui/functions_maxlines.rs b/tests/ui/functions_maxlines.rs index 762525401b83..ada35abde99c 100644 --- a/tests/ui/functions_maxlines.rs +++ b/tests/ui/functions_maxlines.rs @@ -1,6 +1,5 @@ -#![warn(clippy::all, clippy::pedantic)] +#![warn(clippy::too_many_lines)] -// TOO_MANY_LINES fn good_lines() { /* println!("This is good."); */ // println!("This is good."); From 21e2b13125f50695cc4de10529019ffd1566237f Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 14 Jan 2019 22:32:12 -0500 Subject: [PATCH 17/22] Fix test broken by removing comment. --- tests/ui/functions_maxlines.stderr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ui/functions_maxlines.stderr b/tests/ui/functions_maxlines.stderr index 9e1b2fe568a4..dfa6a1cf3c5f 100644 --- a/tests/ui/functions_maxlines.stderr +++ b/tests/ui/functions_maxlines.stderr @@ -1,5 +1,5 @@ error: This function has a large number of lines. - --> $DIR/functions_maxlines.rs:59:1 + --> $DIR/functions_maxlines.rs:58:1 | LL | / fn bad_lines() { LL | | println!("This is bad."); From 93a856e9d505db2ca3fe3be22ec28a1d97bce84e Mon Sep 17 00:00:00 2001 From: Unknown Date: Thu, 31 Jan 2019 23:50:55 -0500 Subject: [PATCH 18/22] Changing single character string to a character match. --- clippy_lints/src/functions.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index 0da7e26a1be4..7c23503507ae 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -189,11 +189,11 @@ impl<'a, 'tcx> Functions { let mut code_in_line; // Skip the surrounding function decl. - let start_brace_idx = match code_snippet.find("{") { + let start_brace_idx = match code_snippet.find('{') { Some(i) => i + 1, None => 0, }; - let end_brace_idx = match code_snippet.find("}") { + let end_brace_idx = match code_snippet.find('}') { Some(i) => i, None => code_snippet.len(), }; From a35083f2e61315f66eedc2e46a0eaafd92f7be73 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 1 Feb 2019 00:16:08 -0500 Subject: [PATCH 19/22] Updated readme. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c1f457a956eb..8519fe55a9f4 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A collection of lints to catch common mistakes and improve your [Rust](https://github.com/rust-lang/rust) code. -[There are 294 lints included in this crate!](https://rust-lang.github.io/rust-clippy/master/index.html) +[There are 295 lints included in this crate!](https://rust-lang.github.io/rust-clippy/master/index.html) We have a bunch of lint categories to allow you to choose how much Clippy is supposed to ~~annoy~~ help you: From 6e35b33bc3d128d18883c9a69f906a605f71bd61 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 1 Feb 2019 13:19:55 -0500 Subject: [PATCH 20/22] Updating code to ignore rustfmt issue. --- tests/ui-toml/functions_maxlines/test.rs | 3 ++- tests/ui-toml/functions_maxlines/test.stderr | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/ui-toml/functions_maxlines/test.rs b/tests/ui-toml/functions_maxlines/test.rs index 6ee75e4dbc17..cd0e00825861 100644 --- a/tests/ui-toml/functions_maxlines/test.rs +++ b/tests/ui-toml/functions_maxlines/test.rs @@ -1,6 +1,5 @@ #![warn(clippy::too_many_lines)] - // This function should be considered one line. fn many_comments_but_one_line_of_code() { /* println!("This is good."); */ @@ -22,6 +21,7 @@ fn too_many_lines() { } // This should be considered one line. +#[rustfmt::skip] fn comment_starts_after_code() { let _ = 5; /* closing comment. */ /* this line shouldn't be counted theoretically. @@ -34,6 +34,7 @@ fn comment_after_code() { } // This should fail since it is technically two lines. +#[rustfmt::skip] fn comment_before_code() { let _ = "test"; /* This comment extends to the front of diff --git a/tests/ui-toml/functions_maxlines/test.stderr b/tests/ui-toml/functions_maxlines/test.stderr index f36c59787841..0669e99370b2 100644 --- a/tests/ui-toml/functions_maxlines/test.stderr +++ b/tests/ui-toml/functions_maxlines/test.stderr @@ -1,5 +1,5 @@ error: This function has a large number of lines. - --> $DIR/test.rs:19:1 + --> $DIR/test.rs:18:1 | LL | / fn too_many_lines() { LL | | println!("This is bad."); @@ -10,7 +10,7 @@ LL | | } = note: `-D clippy::too-many-lines` implied by `-D warnings` error: This function has a large number of lines. - --> $DIR/test.rs:37:1 + --> $DIR/test.rs:38:1 | LL | / fn comment_before_code() { LL | | let _ = "test"; From a022d47a6bb005e928462820c31b84ba6c99e875 Mon Sep 17 00:00:00 2001 From: Philipp Hansch Date: Fri, 1 Feb 2019 14:52:56 -0500 Subject: [PATCH 21/22] Update clippy_lints/src/types.rs Co-Authored-By: avborhanian --- clippy_lints/src/types.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clippy_lints/src/types.rs b/clippy_lints/src/types.rs index e81df4af383b..3574217306b1 100644 --- a/clippy_lints/src/types.rs +++ b/clippy_lints/src/types.rs @@ -241,7 +241,7 @@ fn match_type_parameter(cx: &LateContext<'_, '_>, qpath: &QPath, path: &[&str]) /// The parameter `is_local` distinguishes the context of the type; types from /// local bindings should only be checked for the `BORROWED_BOX` lint. #[allow(clippy::too_many_lines)] -fn check_ty(cx: &LateContext<'_, '_>, ast_ty: &hir::Ty, is_local: bool) { +fn check_ty(cx: &LateContext<'_, '_>, hir_ty: &hir::Ty, is_local: bool) { if in_macro(ast_ty.span) { return; } From ac9472d16e5eee8b5cdf3adaf83b8ba5fdd354cd Mon Sep 17 00:00:00 2001 From: Philipp Hansch Date: Fri, 1 Feb 2019 14:53:15 -0500 Subject: [PATCH 22/22] Update clippy_lints/src/types.rs Co-Authored-By: avborhanian --- clippy_lints/src/types.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clippy_lints/src/types.rs b/clippy_lints/src/types.rs index 3574217306b1..1a48009655e0 100644 --- a/clippy_lints/src/types.rs +++ b/clippy_lints/src/types.rs @@ -242,7 +242,7 @@ fn match_type_parameter(cx: &LateContext<'_, '_>, qpath: &QPath, path: &[&str]) /// local bindings should only be checked for the `BORROWED_BOX` lint. #[allow(clippy::too_many_lines)] fn check_ty(cx: &LateContext<'_, '_>, hir_ty: &hir::Ty, is_local: bool) { - if in_macro(ast_ty.span) { + if in_macro(hir_ty.span) { return; } match hir_ty.node {