diff options
| author | bors <bors@rust-lang.org> | 2023-11-19 01:39:06 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-11-19 01:39:06 +0000 |
| commit | 9263f806d8e47a577d8e55bd48ad8a8df4952087 (patch) | |
| tree | e402a846d9c4d75174dfdd402511122f0795838d | |
| parent | 6eb935a578f7b2fcd87377bd571c4ff1dec48982 (diff) | |
| parent | d8c0e6460b6e08c503acb34179957d387684f90c (diff) | |
| download | rust-9263f806d8e47a577d8e55bd48ad8a8df4952087.tar.gz rust-9263f806d8e47a577d8e55bd48ad8a8df4952087.zip | |
Auto merge of #11782 - Alexendoo:macro-use-imports-ordering, r=Centri3
Make `macro_use_imports` lint ordering more stable changelog: none Fixes [the `macro_use_imports` ordering dependence](https://github.com/rust-lang/rust/pull/117649#issuecomment-1797716088) on the hash of `Span`s
| -rw-r--r-- | clippy_lints/src/macro_use.rs | 25 | ||||
| -rw-r--r-- | tests/ui/macro_use_imports.stderr | 12 |
2 files changed, 17 insertions, 20 deletions
diff --git a/clippy_lints/src/macro_use.rs b/clippy_lints/src/macro_use.rs index 6f1c5461dc0..2744b0ca416 100644 --- a/clippy_lints/src/macro_use.rs +++ b/clippy_lints/src/macro_use.rs @@ -2,13 +2,14 @@ use clippy_utils::diagnostics::span_lint_hir_and_then; use clippy_utils::source::snippet; use hir::def::{DefKind, Res}; use rustc_ast::ast; -use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_data_structures::fx::FxHashSet; use rustc_errors::Applicability; use rustc_hir as hir; use rustc_lint::{LateContext, LateLintPass, LintContext}; use rustc_session::{declare_tool_lint, impl_lint_pass}; use rustc_span::edition::Edition; use rustc_span::{sym, Span}; +use std::collections::BTreeMap; declare_clippy_lint! { /// ### What it does @@ -137,7 +138,7 @@ impl<'tcx> LateLintPass<'tcx> for MacroUseImports { } } fn check_crate_post(&mut self, cx: &LateContext<'_>) { - let mut used = FxHashMap::default(); + let mut used = BTreeMap::new(); let mut check_dup = vec![]; for (import, span, hir_id) in &self.imports { let found_idx = self.mac_refs.iter().position(|mac| import.ends_with(&mac.name)); @@ -186,20 +187,16 @@ impl<'tcx> LateLintPass<'tcx> for MacroUseImports { } } - let mut suggestions = vec![]; - for ((root, span, hir_id), path) in used { - if path.len() == 1 { - suggestions.push((span, format!("{root}::{}", path[0]), hir_id)); - } else { - suggestions.push((span, format!("{root}::{{{}}}", path.join(", ")), hir_id)); - } - } - // If mac_refs is not empty we have encountered an import we could not handle // such as `std::prelude::v1::foo` or some other macro that expands to an import. if self.mac_refs.is_empty() { - for (span, import, hir_id) in suggestions { - let help = format!("use {import};"); + for ((root, span, hir_id), path) in used { + let import = if let [single] = &path[..] { + format!("{root}::{single}") + } else { + format!("{root}::{{{}}}", path.join(", ")) + }; + span_lint_hir_and_then( cx, MACRO_USE_IMPORTS, @@ -210,7 +207,7 @@ impl<'tcx> LateLintPass<'tcx> for MacroUseImports { diag.span_suggestion( *span, "remove the attribute and import the macro directly, try", - help, + format!("use {import};"), Applicability::MaybeIncorrect, ); }, diff --git a/tests/ui/macro_use_imports.stderr b/tests/ui/macro_use_imports.stderr index 6de869699ec..5524e7e5642 100644 --- a/tests/ui/macro_use_imports.stderr +++ b/tests/ui/macro_use_imports.stderr @@ -1,8 +1,8 @@ error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:25:5 + --> $DIR/macro_use_imports.rs:19:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner::nested::string_add;` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{pub_macro, inner_mod_macro, function_macro, ty_macro, pub_in_private_macro};` | = note: `-D clippy::macro-use-imports` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::macro_use_imports)]` @@ -14,16 +14,16 @@ LL | #[macro_use] | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{inner::mut_mut, inner::try_err};` error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:21:5 + --> $DIR/macro_use_imports.rs:25:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mini_mac::ClippyMiniMacroTest;` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner::nested::string_add;` error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:19:5 + --> $DIR/macro_use_imports.rs:21:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{pub_macro, inner_mod_macro, function_macro, ty_macro, pub_in_private_macro};` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mini_mac::ClippyMiniMacroTest;` error: aborting due to 4 previous errors |
