11use clippy_utils:: diagnostics:: { span_lint_and_help, span_lint_and_sugg} ;
22use clippy_utils:: in_macro;
3- use rustc_ast:: { ptr:: P , Crate , Item , ItemKind , ModKind , UseTreeKind } ;
3+ use rustc_ast:: { ptr:: P , Crate , Item , ItemKind , MacroDef , ModKind , UseTreeKind , VisibilityKind } ;
44use rustc_errors:: Applicability ;
55use rustc_lint:: { EarlyContext , EarlyLintPass } ;
66use rustc_session:: { declare_lint_pass, declare_tool_lint} ;
@@ -60,8 +60,21 @@ fn check_mod(cx: &EarlyContext<'_>, items: &[P<Item>]) {
6060 // ```
6161 let mut single_use_usages = Vec :: new ( ) ;
6262
63+ // keep track of macros defined in the module as we don't want it to trigger on this (#7106)
64+ // ```rust,ignore
65+ // macro_rules! foo { () => {} };
66+ // pub(crate) use foo;
67+ // ```
68+ let mut macros = Vec :: new ( ) ;
69+
6370 for item in items {
64- track_uses ( cx, & item, & mut imports_reused_with_self, & mut single_use_usages) ;
71+ track_uses (
72+ cx,
73+ & item,
74+ & mut imports_reused_with_self,
75+ & mut single_use_usages,
76+ & mut macros,
77+ ) ;
6578 }
6679
6780 for single_use in & single_use_usages {
@@ -96,6 +109,7 @@ fn track_uses(
96109 item : & Item ,
97110 imports_reused_with_self : & mut Vec < Symbol > ,
98111 single_use_usages : & mut Vec < ( Symbol , Span , bool ) > ,
112+ macros : & mut Vec < Symbol > ,
99113) {
100114 if in_macro ( item. span ) || item. vis . kind . is_pub ( ) {
101115 return ;
@@ -105,14 +119,22 @@ fn track_uses(
105119 ItemKind :: Mod ( _, ModKind :: Loaded ( ref items, ..) ) => {
106120 check_mod ( cx, & items) ;
107121 } ,
122+ ItemKind :: MacroDef ( MacroDef { macro_rules : true , .. } ) => {
123+ macros. push ( item. ident . name ) ;
124+ } ,
108125 ItemKind :: Use ( use_tree) => {
109126 let segments = & use_tree. prefix . segments ;
110127
128+ let should_report =
129+ |name : & Symbol | !macros. contains ( name) || matches ! ( item. vis. kind, VisibilityKind :: Inherited ) ;
130+
111131 // keep track of `use some_module;` usages
112132 if segments. len ( ) == 1 {
113133 if let UseTreeKind :: Simple ( None , _, _) = use_tree. kind {
114- let ident = & segments[ 0 ] . ident ;
115- single_use_usages. push ( ( ident. name , item. span , true ) ) ;
134+ let name = segments[ 0 ] . ident . name ;
135+ if should_report ( & name) {
136+ single_use_usages. push ( ( name, item. span , true ) ) ;
137+ }
116138 }
117139 return ;
118140 }
@@ -124,8 +146,10 @@ fn track_uses(
124146 let segments = & tree. 0 . prefix . segments ;
125147 if segments. len ( ) == 1 {
126148 if let UseTreeKind :: Simple ( None , _, _) = tree. 0 . kind {
127- let ident = & segments[ 0 ] . ident ;
128- single_use_usages. push ( ( ident. name , tree. 0 . span , false ) ) ;
149+ let name = segments[ 0 ] . ident . name ;
150+ if should_report ( & name) {
151+ single_use_usages. push ( ( name, tree. 0 . span , false ) ) ;
152+ }
129153 }
130154 }
131155 }
0 commit comments