1
1
use rustc_ast:: ptr:: P ;
2
2
use rustc_ast:: token:: { Delimiter , TokenKind } ;
3
3
use 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
+ } ;
5
7
use rustc_ast_pretty:: pprust:: path_to_string;
6
8
use rustc_expand:: base:: { Annotatable , ExtCtxt } ;
7
9
use rustc_span:: { Ident , Span , kw, sym} ;
@@ -53,7 +55,13 @@ fn eii_(
53
55
) -> Vec < Annotatable > {
54
56
let span = ecx. with_def_site_ctxt ( span) ;
55
57
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 {
57
65
ecx. dcx ( )
58
66
. emit_err ( EIIMacroExpectedFunction { span, name : path_to_string ( & meta_item. path ) } ) ;
59
67
return vec ! [ item] ;
@@ -106,7 +114,7 @@ fn eii_(
106
114
is_default : true , // important!
107
115
} ) ;
108
116
109
- return_items. push ( Annotatable :: Item ( P ( ast:: Item {
117
+ return_items. push ( P ( ast:: Item {
110
118
attrs : ThinVec :: new ( ) ,
111
119
id : ast:: DUMMY_NODE_ID ,
112
120
span,
@@ -128,7 +136,7 @@ fn eii_(
128
136
stmts : thin_vec ! [ ast:: Stmt {
129
137
id: DUMMY_NODE_ID ,
130
138
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
132
140
id: DUMMY_NODE_ID ,
133
141
span: item_span,
134
142
vis: ast:: Visibility {
@@ -155,7 +163,7 @@ fn eii_(
155
163
define_opaque : None ,
156
164
} ) ) ,
157
165
tokens : None ,
158
- } ) ) )
166
+ } ) )
159
167
}
160
168
161
169
let decl_span = span. to ( func. sig . span ) ;
@@ -199,7 +207,7 @@ fn eii_(
199
207
style : ast:: AttrStyle :: Outer ,
200
208
span,
201
209
} ) ;
202
- let extern_block = Annotatable :: Item ( P ( ast:: Item {
210
+ let extern_block = P ( ast:: Item {
203
211
attrs : ast:: AttrVec :: default ( ) ,
204
212
id : ast:: DUMMY_NODE_ID ,
205
213
span,
@@ -218,7 +226,7 @@ fn eii_(
218
226
} ) ] ) ,
219
227
} ) ,
220
228
tokens : None ,
221
- } ) ) ;
229
+ } ) ;
222
230
223
231
let mut macro_attrs = attrs. clone ( ) ;
224
232
macro_attrs. push (
@@ -246,7 +254,7 @@ fn eii_(
246
254
} ,
247
255
) ;
248
256
249
- let macro_def = Annotatable :: Item ( P ( ast:: Item {
257
+ let macro_def = P ( ast:: Item {
250
258
attrs : macro_attrs,
251
259
id : ast:: DUMMY_NODE_ID ,
252
260
span,
@@ -286,12 +294,21 @@ fn eii_(
286
294
} ,
287
295
) ,
288
296
tokens : None ,
289
- } ) ) ;
297
+ } ) ;
290
298
291
299
return_items. push ( extern_block) ;
292
300
return_items. push ( macro_def) ;
293
301
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
+ }
295
312
}
296
313
297
314
use crate :: errors:: {
@@ -305,10 +322,17 @@ pub(crate) fn eii_macro_for(
305
322
meta_item : & ast:: MetaItem ,
306
323
mut item : Annotatable ,
307
324
) -> 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 {
309
332
ecx. dcx ( ) . emit_err ( EIIMacroForExpectedMacro { span } ) ;
310
333
return vec ! [ item] ;
311
334
} ;
335
+
312
336
let ItemKind :: MacroDef ( _, d) = & mut i. kind else {
313
337
ecx. dcx ( ) . emit_err ( EIIMacroForExpectedMacro { span } ) ;
314
338
return vec ! [ item] ;
@@ -353,7 +377,13 @@ pub(crate) fn eii_macro(
353
377
meta_item : & ast:: MetaItem ,
354
378
mut item : Annotatable ,
355
379
) -> 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 {
357
387
ecx. dcx ( )
358
388
. emit_err ( EIIMacroExpectedFunction { span, name : path_to_string ( & meta_item. path ) } ) ;
359
389
return vec ! [ item] ;
0 commit comments