Skip to content

Commit

Permalink
Make macro_use_imports lint ordering more stable
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexendoo committed Nov 9, 2023
1 parent 34b7d15 commit d8c0e64
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 20 deletions.
25 changes: 11 additions & 14 deletions clippy_lints/src/macro_use.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ use clippy_utils::source::snippet;
use hir::def::{DefKind, Res};
use if_chain::if_chain;
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
Expand Down Expand Up @@ -142,7 +143,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));
Expand Down Expand Up @@ -191,20 +192,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,
Expand All @@ -215,7 +212,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,
);
},
Expand Down
12 changes: 6 additions & 6 deletions tests/ui/macro_use_imports.stderr
Original file line number Diff line number Diff line change
@@ -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)]`
Expand All @@ -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

0 comments on commit d8c0e64

Please sign in to comment.