From 258a205b852e15145dde035363cf980f5ef25eb1 Mon Sep 17 00:00:00 2001 From: Stefan Arentz Date: Mon, 24 Oct 2022 20:53:55 -0400 Subject: [PATCH 1/3] Fixes #9677 - Lint against mod lib; --- CHANGELOG.md | 1 + clippy_lints/src/lib.register_lints.rs | 1 + clippy_lints/src/lib.register_pedantic.rs | 1 + clippy_lints/src/lib.rs | 2 + clippy_lints/src/mod_lib.rs | 52 +++++++++++++++++++++++ src/docs.rs | 1 + src/docs/mod_lib.txt | 12 ++++++ tests/ui/mod_lib/lib.rs | 3 ++ tests/ui/mod_lib/lib.stderr | 9 ++++ tests/ui/mod_lib/main.rs | 8 ++++ tests/ui/mod_lib/main.stderr | 21 +++++++++ 11 files changed, 111 insertions(+) create mode 100644 clippy_lints/src/mod_lib.rs create mode 100644 src/docs/mod_lib.txt create mode 100644 tests/ui/mod_lib/lib.rs create mode 100644 tests/ui/mod_lib/lib.stderr create mode 100644 tests/ui/mod_lib/main.rs create mode 100644 tests/ui/mod_lib/main.stderr diff --git a/CHANGELOG.md b/CHANGELOG.md index cb5a4d4a5778..b5bc14948966 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4054,6 +4054,7 @@ Released 2018-09-13 [`mistyped_literal_suffixes`]: https://rust-lang.github.io/rust-clippy/master/index.html#mistyped_literal_suffixes [`mixed_case_hex_literals`]: https://rust-lang.github.io/rust-clippy/master/index.html#mixed_case_hex_literals [`mixed_read_write_in_expression`]: https://rust-lang.github.io/rust-clippy/master/index.html#mixed_read_write_in_expression +[`mod_lib`]: https://rust-lang.github.io/rust-clippy/master/index.html#mod_lib [`mod_module_files`]: https://rust-lang.github.io/rust-clippy/master/index.html#mod_module_files [`module_inception`]: https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [`module_name_repetitions`]: https://rust-lang.github.io/rust-clippy/master/index.html#module_name_repetitions diff --git a/clippy_lints/src/lib.register_lints.rs b/clippy_lints/src/lib.register_lints.rs index 6eaf17709a88..c7f5d2af04f4 100644 --- a/clippy_lints/src/lib.register_lints.rs +++ b/clippy_lints/src/lib.register_lints.rs @@ -410,6 +410,7 @@ store.register_lints(&[ missing_trait_methods::MISSING_TRAIT_METHODS, mixed_read_write_in_expression::DIVERGING_SUB_EXPRESSION, mixed_read_write_in_expression::MIXED_READ_WRITE_IN_EXPRESSION, + mod_lib::MOD_LIB, module_style::MOD_MODULE_FILES, module_style::SELF_NAMED_MODULE_FILES, multi_assignments::MULTI_ASSIGNMENTS, diff --git a/clippy_lints/src/lib.register_pedantic.rs b/clippy_lints/src/lib.register_pedantic.rs index 768b3347c2aa..857e76051a12 100644 --- a/clippy_lints/src/lib.register_pedantic.rs +++ b/clippy_lints/src/lib.register_pedantic.rs @@ -67,6 +67,7 @@ store.register_group(true, "clippy::pedantic", Some("clippy_pedantic"), vec![ LintId::of(methods::UNNECESSARY_JOIN), LintId::of(misc::USED_UNDERSCORE_BINDING), LintId::of(mismatching_type_param_order::MISMATCHING_TYPE_PARAM_ORDER), + LintId::of(mod_lib::MOD_LIB), LintId::of(mut_mut::MUT_MUT), LintId::of(needless_continue::NEEDLESS_CONTINUE), LintId::of(needless_for_each::NEEDLESS_FOR_EACH), diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index 28248d01b643..eb6f832814a8 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -292,6 +292,7 @@ mod missing_enforced_import_rename; mod missing_inline; mod missing_trait_methods; mod mixed_read_write_in_expression; +mod mod_lib; mod module_style; mod multi_assignments; mod mut_key; @@ -920,6 +921,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: store.register_early_pass(|| Box::new(partial_pub_fields::PartialPubFields)); store.register_late_pass(|_| Box::new(missing_trait_methods::MissingTraitMethods)); store.register_late_pass(|_| Box::new(from_raw_with_void_ptr::FromRawWithVoidPtr)); + store.register_early_pass(|| Box::new(mod_lib::ModLib)); // add lints here, do not remove this comment, it's used in `new_lint` } diff --git a/clippy_lints/src/mod_lib.rs b/clippy_lints/src/mod_lib.rs new file mode 100644 index 000000000000..5aa4a91d7280 --- /dev/null +++ b/clippy_lints/src/mod_lib.rs @@ -0,0 +1,52 @@ +use clippy_utils::diagnostics::span_lint_and_help; +use rustc_ast::{ptr::P, Crate, Item, ItemKind, ModKind}; +use rustc_lint::{EarlyContext, EarlyLintPass}; +use rustc_session::{declare_lint_pass, declare_tool_lint}; +use rustc_span::sym; + +declare_clippy_lint! { + /// ### What it does + /// + /// ### Why is this bad? + /// + /// ### Example + /// ```rust + /// // example code where clippy issues a warning + /// ``` + /// Use instead: + /// ```rust + /// // example code which does not raise clippy warning + /// ``` + #[clippy::version = "1.66.0"] + pub MOD_LIB, + pedantic, + "default lint description" +} +declare_lint_pass!(ModLib => [MOD_LIB]); + +impl EarlyLintPass for ModLib { + fn check_crate(&mut self, cx: &EarlyContext<'_>, krate: &Crate) { + // println!("MOO Checking crate {:#?}", krate); + check_mod(cx, &krate.items); + } +} + +fn check_mod(cx: &EarlyContext<'_>, items: &[P]) { + for item in items { + if let ItemKind::Mod(_, ModKind::Loaded(..)) = item.kind { + // println!("MOO Got a Mod: {:#?}", items); + // println!("MOO Got a Mod: {:#?}", item.ident.name); + + if item.ident.name == sym::lib { + span_lint_and_help( + cx, + MOD_LIB, + item.span, + "uncommon use of mod::lib", + None, + "you probably meant use::package instead", + ); + } + } + } +} diff --git a/src/docs.rs b/src/docs.rs index d9c34a6c0498..47cc669853c5 100644 --- a/src/docs.rs +++ b/src/docs.rs @@ -320,6 +320,7 @@ docs! { "mistyped_literal_suffixes", "mixed_case_hex_literals", "mixed_read_write_in_expression", + "mod_lib", "mod_module_files", "module_inception", "module_name_repetitions", diff --git a/src/docs/mod_lib.txt b/src/docs/mod_lib.txt new file mode 100644 index 000000000000..92a0504a7dde --- /dev/null +++ b/src/docs/mod_lib.txt @@ -0,0 +1,12 @@ +### What it does + +### Why is this bad? + +### Example +``` +// example code where clippy issues a warning +``` +Use instead: +``` +// example code which does not raise clippy warning +``` \ No newline at end of file diff --git a/tests/ui/mod_lib/lib.rs b/tests/ui/mod_lib/lib.rs new file mode 100644 index 000000000000..00d01a6bfd3f --- /dev/null +++ b/tests/ui/mod_lib/lib.rs @@ -0,0 +1,3 @@ +pub fn something() -> i32 { + 42 +} diff --git a/tests/ui/mod_lib/lib.stderr b/tests/ui/mod_lib/lib.stderr new file mode 100644 index 000000000000..5aa85d70bc27 --- /dev/null +++ b/tests/ui/mod_lib/lib.stderr @@ -0,0 +1,9 @@ +error[E0601]: `main` function not found in crate `lib` + --> $DIR/lib.rs:3:2 + | +LL | } + | ^ consider adding a `main` function to `$DIR/lib.rs` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0601`. diff --git a/tests/ui/mod_lib/main.rs b/tests/ui/mod_lib/main.rs new file mode 100644 index 000000000000..7e97a1e2c7d2 --- /dev/null +++ b/tests/ui/mod_lib/main.rs @@ -0,0 +1,8 @@ +#![allow(unused)] +#![warn(clippy::mod_lib)] + +mod lib; + +fn main() { + println!("{}", lib::something()); +} diff --git a/tests/ui/mod_lib/main.stderr b/tests/ui/mod_lib/main.stderr new file mode 100644 index 000000000000..77333a89df41 --- /dev/null +++ b/tests/ui/mod_lib/main.stderr @@ -0,0 +1,21 @@ +error: found module declaration for lib.rs + --> $DIR/main.rs:4:1 + | +LL | mod lib; + | ^^^^^^^^ + | + = note: lib.rs is the root of this crate's library target + = help: to refer to it from other targets, use the library's name as the path + = note: `-D special-module-name` implied by `-D warnings` + +error: uncommon use of mod::lib + --> $DIR/main.rs:4:1 + | +LL | mod lib; + | ^^^^^^^^ + | + = help: you probably meant use::package instead + = note: `-D clippy::mod-lib` implied by `-D warnings` + +error: aborting due to 2 previous errors + From 003b9747e1b2eb167b2c71ad95cbccbc63755f85 Mon Sep 17 00:00:00 2001 From: Stefan Arentz Date: Tue, 25 Oct 2022 19:35:21 -0400 Subject: [PATCH 2/3] Fixes #9677 - Lint against mod lib; --- clippy_lints/src/lib.rs | 2 +- clippy_lints/src/mod_lib.rs | 25 ++++++++++--------------- tests/ui/mod_lib/main.stderr | 17 ++++++++--------- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index ac30d5b56d44..6e65500fccff 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -913,7 +913,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: store.register_early_pass(|| Box::new(partial_pub_fields::PartialPubFields)); store.register_late_pass(|_| Box::new(missing_trait_methods::MissingTraitMethods)); store.register_late_pass(|_| Box::new(from_raw_with_void_ptr::FromRawWithVoidPtr)); - store.register_early_pass(|| Box::new(mod_lib::ModLib)); + store.register_late_pass(|_| Box::new(mod_lib::ModLib)); // add lints here, do not remove this comment, it's used in `new_lint` } diff --git a/clippy_lints/src/mod_lib.rs b/clippy_lints/src/mod_lib.rs index 5aa4a91d7280..489511b8e284 100644 --- a/clippy_lints/src/mod_lib.rs +++ b/clippy_lints/src/mod_lib.rs @@ -1,7 +1,7 @@ use clippy_utils::diagnostics::span_lint_and_help; -use rustc_ast::{ptr::P, Crate, Item, ItemKind, ModKind}; -use rustc_lint::{EarlyContext, EarlyLintPass}; -use rustc_session::{declare_lint_pass, declare_tool_lint}; +use rustc_hir::{Item, ItemKind}; +use rustc_lint::{LateContext, LateLintPass}; +use rustc_session::{declare_tool_lint, impl_lint_pass}; use rustc_span::sym; declare_clippy_lint! { @@ -22,21 +22,16 @@ declare_clippy_lint! { pedantic, "default lint description" } -declare_lint_pass!(ModLib => [MOD_LIB]); -impl EarlyLintPass for ModLib { - fn check_crate(&mut self, cx: &EarlyContext<'_>, krate: &Crate) { - // println!("MOO Checking crate {:#?}", krate); - check_mod(cx, &krate.items); - } -} +#[derive(Default)] +pub struct ModLib; -fn check_mod(cx: &EarlyContext<'_>, items: &[P]) { - for item in items { - if let ItemKind::Mod(_, ModKind::Loaded(..)) = item.kind { - // println!("MOO Got a Mod: {:#?}", items); - // println!("MOO Got a Mod: {:#?}", item.ident.name); +impl_lint_pass!(ModLib => [MOD_LIB]); +impl<'tcx> LateLintPass<'tcx> for ModLib { + fn check_item(&mut self, cx: &LateContext<'_>, item: &Item<'_>) { + if let ItemKind::Mod(_) = item.kind { + // println!("MOO Found a Mod: {:#?}", item.ident); if item.ident.name == sym::lib { span_lint_and_help( cx, diff --git a/tests/ui/mod_lib/main.stderr b/tests/ui/mod_lib/main.stderr index 77333a89df41..0b9aac11f7bf 100644 --- a/tests/ui/mod_lib/main.stderr +++ b/tests/ui/mod_lib/main.stderr @@ -1,3 +1,11 @@ +error: unknown lint: `clippy::mod_lib` + --> $DIR/main.rs:2:9 + | +LL | #![warn(clippy::mod_lib)] + | ^^^^^^^^^^^^^^^ help: did you mean: `clippy::min_max` + | + = note: `-D unknown-lints` implied by `-D warnings` + error: found module declaration for lib.rs --> $DIR/main.rs:4:1 | @@ -8,14 +16,5 @@ LL | mod lib; = help: to refer to it from other targets, use the library's name as the path = note: `-D special-module-name` implied by `-D warnings` -error: uncommon use of mod::lib - --> $DIR/main.rs:4:1 - | -LL | mod lib; - | ^^^^^^^^ - | - = help: you probably meant use::package instead - = note: `-D clippy::mod-lib` implied by `-D warnings` - error: aborting due to 2 previous errors From 4604e61f0e627eadb755fcd947ed415deeaecba1 Mon Sep 17 00:00:00 2001 From: Stefan Arentz Date: Tue, 25 Oct 2022 19:36:29 -0400 Subject: [PATCH 3/3] Fixes #9677 - Lint against mod lib; --- clippy_lints/src/mod_lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/clippy_lints/src/mod_lib.rs b/clippy_lints/src/mod_lib.rs index 489511b8e284..ec536d2a1ec8 100644 --- a/clippy_lints/src/mod_lib.rs +++ b/clippy_lints/src/mod_lib.rs @@ -31,7 +31,6 @@ impl_lint_pass!(ModLib => [MOD_LIB]); impl<'tcx> LateLintPass<'tcx> for ModLib { fn check_item(&mut self, cx: &LateContext<'_>, item: &Item<'_>) { if let ItemKind::Mod(_) = item.kind { - // println!("MOO Found a Mod: {:#?}", item.ident); if item.ident.name == sym::lib { span_lint_and_help( cx,