From 8794e41728756e2a284ebcb9c666c6efcda62f8b Mon Sep 17 00:00:00 2001 From: Lzu Tao Date: Thu, 6 Feb 2020 21:39:15 +0700 Subject: [PATCH] dev: Use bytecount for faster line count --- clippy_dev/Cargo.toml | 1 + clippy_dev/src/stderr_length_check.rs | 55 ++++++++++++--------------- clippy_lints/src/missing_doc.rs | 2 +- 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/clippy_dev/Cargo.toml b/clippy_dev/Cargo.toml index b30ba61d2991..c8aa1e79f34c 100644 --- a/clippy_dev/Cargo.toml +++ b/clippy_dev/Cargo.toml @@ -5,6 +5,7 @@ authors = ["Philipp Hansch "] edition = "2018" [dependencies] +bytecount = "0.6" clap = "2.33" itertools = "0.8" regex = "1" diff --git a/clippy_dev/src/stderr_length_check.rs b/clippy_dev/src/stderr_length_check.rs index e36feb3a2713..041ee6911377 100644 --- a/clippy_dev/src/stderr_length_check.rs +++ b/clippy_dev/src/stderr_length_check.rs @@ -1,54 +1,49 @@ use std::ffi::OsStr; -use walkdir::WalkDir; +use std::fs; +use std::path::{Path, PathBuf}; -use std::fs::File; -use std::io::prelude::*; +use walkdir::WalkDir; // The maximum length allowed for stderr files. // // We limit this because small files are easier to deal with than bigger files. -const LIMIT: usize = 200; +const LENGTH_LIMIT: usize = 200; pub fn check() { - let stderr_files = stderr_files(); - let exceeding_files = exceeding_stderr_files(stderr_files).collect::>(); + let exceeding_files: Vec<_> = exceeding_stderr_files(); if !exceeding_files.is_empty() { - eprintln!("Error: stderr files exceeding limit of {} lines:", LIMIT); + eprintln!("Error: stderr files exceeding limit of {} lines:", LENGTH_LIMIT); for path in exceeding_files { - println!("{}", path); + println!("{}", path.display()); } std::process::exit(1); } } -fn exceeding_stderr_files(files: impl Iterator) -> impl Iterator { - files.filter_map(|file| { - let path = file.path().to_str().expect("Could not convert path to str").to_string(); - let linecount = count_linenumbers(&path); - if linecount > LIMIT { - Some(path) - } else { - None - } - }) -} - -fn stderr_files() -> impl Iterator { +fn exceeding_stderr_files() -> Vec { // We use `WalkDir` instead of `fs::read_dir` here in order to recurse into subdirectories. WalkDir::new("../tests/ui") .into_iter() - .filter_map(std::result::Result::ok) - .filter(|f| f.path().extension() == Some(OsStr::new("stderr"))) + .filter_map(Result::ok) + .filter_map(|e| { + let p = e.into_path(); + if p.extension() == Some(OsStr::new("stderr")) && count_linenumbers(&p) > LENGTH_LIMIT { + Some(p) + } else { + None + } + }) + .collect() } #[must_use] -fn count_linenumbers(filepath: &str) -> usize { - if let Ok(mut file) = File::open(filepath) { - let mut content = String::new(); - file.read_to_string(&mut content).expect("Failed to read file?"); - content.lines().count() - } else { - 0 +fn count_linenumbers(filepath: &Path) -> usize { + match fs::read(filepath) { + Ok(content) => bytecount::count(&content, b'\n'), + Err(e) => { + eprintln!("Failed to read file: {}", e); + 0 + }, } } diff --git a/clippy_lints/src/missing_doc.rs b/clippy_lints/src/missing_doc.rs index 5ebc8a4d6479..e502db59e66b 100644 --- a/clippy_lints/src/missing_doc.rs +++ b/clippy_lints/src/missing_doc.rs @@ -36,7 +36,7 @@ pub struct MissingDoc { doc_hidden_stack: Vec, } -impl ::std::default::Default for MissingDoc { +impl Default for MissingDoc { #[must_use] fn default() -> Self { Self::new()