11use rustc_ast:: ptr:: P ;
22use rustc_ast:: token:: { Delimiter , TokenKind } ;
33use rustc_ast:: tokenstream:: { DelimSpacing , DelimSpan , Spacing , TokenStream , TokenTree } ;
4- use rustc_ast:: { DUMMY_NODE_ID , EIIImpl , EIIMacroFor , ItemKind , ast, token, tokenstream} ;
4+ use rustc_ast:: {
5+ DUMMY_NODE_ID , EIIImpl , EIIMacroFor , ItemKind , Stmt , StmtKind , ast, token, tokenstream,
6+ } ;
57use rustc_ast_pretty:: pprust:: path_to_string;
68use rustc_expand:: base:: { Annotatable , ExtCtxt } ;
79use rustc_span:: { Ident , Span , kw, sym} ;
@@ -53,7 +55,13 @@ fn eii_(
5355) -> Vec < Annotatable > {
5456 let span = ecx. with_def_site_ctxt ( span) ;
5557
56- let Annotatable :: Item ( item) = item else {
58+ let ( item, stmt) = if let Annotatable :: Item ( item) = item {
59+ ( item, false )
60+ } else if let Annotatable :: Stmt ( ref stmt) = item
61+ && let StmtKind :: Item ( ref item) = stmt. kind
62+ {
63+ ( item. clone ( ) , true )
64+ } else {
5765 ecx. dcx ( )
5866 . emit_err ( EIIMacroExpectedFunction { span, name : path_to_string ( & meta_item. path ) } ) ;
5967 return vec ! [ item] ;
@@ -106,7 +114,7 @@ fn eii_(
106114 is_default : true , // important!
107115 } ) ;
108116
109- return_items. push ( Annotatable :: Item ( P ( ast:: Item {
117+ return_items. push ( P ( ast:: Item {
110118 attrs : ThinVec :: new ( ) ,
111119 id : ast:: DUMMY_NODE_ID ,
112120 span,
@@ -128,7 +136,7 @@ fn eii_(
128136 stmts : thin_vec ! [ ast:: Stmt {
129137 id: DUMMY_NODE_ID ,
130138 kind: ast:: StmtKind :: Item ( P ( ast:: Item {
131- attrs: thin_vec![ ] , // TODO : re-add some original attrs
139+ attrs: thin_vec![ ] , // FIXME : re-add some original attrs
132140 id: DUMMY_NODE_ID ,
133141 span: item_span,
134142 vis: ast:: Visibility {
@@ -155,7 +163,7 @@ fn eii_(
155163 define_opaque : None ,
156164 } ) ) ,
157165 tokens : None ,
158- } ) ) )
166+ } ) )
159167 }
160168
161169 let decl_span = span. to ( func. sig . span ) ;
@@ -199,7 +207,7 @@ fn eii_(
199207 style : ast:: AttrStyle :: Outer ,
200208 span,
201209 } ) ;
202- let extern_block = Annotatable :: Item ( P ( ast:: Item {
210+ let extern_block = P ( ast:: Item {
203211 attrs : ast:: AttrVec :: default ( ) ,
204212 id : ast:: DUMMY_NODE_ID ,
205213 span,
@@ -218,7 +226,7 @@ fn eii_(
218226 } ) ] ) ,
219227 } ) ,
220228 tokens : None ,
221- } ) ) ;
229+ } ) ;
222230
223231 let mut macro_attrs = attrs. clone ( ) ;
224232 macro_attrs. push (
@@ -246,7 +254,7 @@ fn eii_(
246254 } ,
247255 ) ;
248256
249- let macro_def = Annotatable :: Item ( P ( ast:: Item {
257+ let macro_def = P ( ast:: Item {
250258 attrs : macro_attrs,
251259 id : ast:: DUMMY_NODE_ID ,
252260 span,
@@ -286,12 +294,21 @@ fn eii_(
286294 } ,
287295 ) ,
288296 tokens : None ,
289- } ) ) ;
297+ } ) ;
290298
291299 return_items. push ( extern_block) ;
292300 return_items. push ( macro_def) ;
293301
294- return_items
302+ if stmt {
303+ return_items
304+ . into_iter ( )
305+ . map ( |i| {
306+ Annotatable :: Stmt ( P ( Stmt { id : DUMMY_NODE_ID , kind : StmtKind :: Item ( i) , span } ) )
307+ } )
308+ . collect ( )
309+ } else {
310+ return_items. into_iter ( ) . map ( |i| Annotatable :: Item ( i) ) . collect ( )
311+ }
295312}
296313
297314use crate :: errors:: {
@@ -305,10 +322,17 @@ pub(crate) fn eii_macro_for(
305322 meta_item : & ast:: MetaItem ,
306323 mut item : Annotatable ,
307324) -> Vec < Annotatable > {
308- let Annotatable :: Item ( i) = & mut item else {
325+ let i = if let Annotatable :: Item ( ref mut item) = item {
326+ item
327+ } else if let Annotatable :: Stmt ( ref mut stmt) = item
328+ && let StmtKind :: Item ( ref mut item) = stmt. kind
329+ {
330+ item
331+ } else {
309332 ecx. dcx ( ) . emit_err ( EIIMacroForExpectedMacro { span } ) ;
310333 return vec ! [ item] ;
311334 } ;
335+
312336 let ItemKind :: MacroDef ( _, d) = & mut i. kind else {
313337 ecx. dcx ( ) . emit_err ( EIIMacroForExpectedMacro { span } ) ;
314338 return vec ! [ item] ;
@@ -353,7 +377,13 @@ pub(crate) fn eii_macro(
353377 meta_item : & ast:: MetaItem ,
354378 mut item : Annotatable ,
355379) -> Vec < Annotatable > {
356- let Annotatable :: Item ( i) = & mut item else {
380+ let i = if let Annotatable :: Item ( ref mut item) = item {
381+ item
382+ } else if let Annotatable :: Stmt ( ref mut stmt) = item
383+ && let StmtKind :: Item ( ref mut item) = stmt. kind
384+ {
385+ item
386+ } else {
357387 ecx. dcx ( )
358388 . emit_err ( EIIMacroExpectedFunction { span, name : path_to_string ( & meta_item. path ) } ) ;
359389 return vec ! [ item] ;
0 commit comments