@@ -2,13 +2,14 @@ use clippy_utils::diagnostics::span_lint_hir_and_then;
22use clippy_utils:: source:: snippet;
33use hir:: def:: { DefKind , Res } ;
44use rustc_ast:: ast;
5- use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
5+ use rustc_data_structures:: fx:: FxHashSet ;
66use rustc_errors:: Applicability ;
77use rustc_hir as hir;
88use rustc_lint:: { LateContext , LateLintPass , LintContext } ;
99use rustc_session:: { declare_tool_lint, impl_lint_pass} ;
1010use rustc_span:: edition:: Edition ;
1111use rustc_span:: { sym, Span } ;
12+ use std:: collections:: BTreeMap ;
1213
1314declare_clippy_lint ! {
1415 /// ### What it does
@@ -137,7 +138,7 @@ impl<'tcx> LateLintPass<'tcx> for MacroUseImports {
137138 }
138139 }
139140 fn check_crate_post ( & mut self , cx : & LateContext < ' _ > ) {
140- let mut used = FxHashMap :: default ( ) ;
141+ let mut used = BTreeMap :: new ( ) ;
141142 let mut check_dup = vec ! [ ] ;
142143 for ( import, span, hir_id) in & self . imports {
143144 let found_idx = self . mac_refs . iter ( ) . position ( |mac| import. ends_with ( & mac. name ) ) ;
@@ -186,20 +187,16 @@ impl<'tcx> LateLintPass<'tcx> for MacroUseImports {
186187 }
187188 }
188189
189- let mut suggestions = vec ! [ ] ;
190- for ( ( root, span, hir_id) , path) in used {
191- if path. len ( ) == 1 {
192- suggestions. push ( ( span, format ! ( "{root}::{}" , path[ 0 ] ) , hir_id) ) ;
193- } else {
194- suggestions. push ( ( span, format ! ( "{root}::{{{}}}" , path. join( ", " ) ) , hir_id) ) ;
195- }
196- }
197-
198190 // If mac_refs is not empty we have encountered an import we could not handle
199191 // such as `std::prelude::v1::foo` or some other macro that expands to an import.
200192 if self . mac_refs . is_empty ( ) {
201- for ( span, import, hir_id) in suggestions {
202- let help = format ! ( "use {import};" ) ;
193+ for ( ( root, span, hir_id) , path) in used {
194+ let import = if let [ single] = & path[ ..] {
195+ format ! ( "{root}::{single}" )
196+ } else {
197+ format ! ( "{root}::{{{}}}" , path. join( ", " ) )
198+ } ;
199+
203200 span_lint_hir_and_then (
204201 cx,
205202 MACRO_USE_IMPORTS ,
@@ -210,7 +207,7 @@ impl<'tcx> LateLintPass<'tcx> for MacroUseImports {
210207 diag. span_suggestion (
211208 * span,
212209 "remove the attribute and import the macro directly, try" ,
213- help ,
210+ format ! ( "use {import};" ) ,
214211 Applicability :: MaybeIncorrect ,
215212 ) ;
216213 } ,
0 commit comments