@@ -38,6 +38,7 @@ pub enum Annotatable {
38
38
Item ( P < ast:: Item > ) ,
39
39
TraitItem ( P < ast:: TraitItem > ) ,
40
40
ImplItem ( P < ast:: ImplItem > ) ,
41
+ ForeignItem ( P < ast:: ForeignItem > ) ,
41
42
Stmt ( P < ast:: Stmt > ) ,
42
43
Expr ( P < ast:: Expr > ) ,
43
44
}
@@ -48,6 +49,7 @@ impl HasAttrs for Annotatable {
48
49
Annotatable :: Item ( ref item) => & item. attrs ,
49
50
Annotatable :: TraitItem ( ref trait_item) => & trait_item. attrs ,
50
51
Annotatable :: ImplItem ( ref impl_item) => & impl_item. attrs ,
52
+ Annotatable :: ForeignItem ( ref foreign_item) => & foreign_item. attrs ,
51
53
Annotatable :: Stmt ( ref stmt) => stmt. attrs ( ) ,
52
54
Annotatable :: Expr ( ref expr) => & expr. attrs ,
53
55
}
@@ -58,6 +60,8 @@ impl HasAttrs for Annotatable {
58
60
Annotatable :: Item ( item) => Annotatable :: Item ( item. map_attrs ( f) ) ,
59
61
Annotatable :: TraitItem ( trait_item) => Annotatable :: TraitItem ( trait_item. map_attrs ( f) ) ,
60
62
Annotatable :: ImplItem ( impl_item) => Annotatable :: ImplItem ( impl_item. map_attrs ( f) ) ,
63
+ Annotatable :: ForeignItem ( foreign_item) =>
64
+ Annotatable :: ForeignItem ( foreign_item. map_attrs ( f) ) ,
61
65
Annotatable :: Stmt ( stmt) => Annotatable :: Stmt ( stmt. map_attrs ( f) ) ,
62
66
Annotatable :: Expr ( expr) => Annotatable :: Expr ( expr. map_attrs ( f) ) ,
63
67
}
@@ -70,6 +74,7 @@ impl Annotatable {
70
74
Annotatable :: Item ( ref item) => item. span ,
71
75
Annotatable :: TraitItem ( ref trait_item) => trait_item. span ,
72
76
Annotatable :: ImplItem ( ref impl_item) => impl_item. span ,
77
+ Annotatable :: ForeignItem ( ref foreign_item) => foreign_item. span ,
73
78
Annotatable :: Stmt ( ref stmt) => stmt. span ,
74
79
Annotatable :: Expr ( ref expr) => expr. span ,
75
80
}
@@ -106,6 +111,13 @@ impl Annotatable {
106
111
}
107
112
}
108
113
114
+ pub fn expect_foreign_item ( self ) -> ast:: ForeignItem {
115
+ match self {
116
+ Annotatable :: ForeignItem ( i) => i. into_inner ( ) ,
117
+ _ => panic ! ( "expected foreign item" )
118
+ }
119
+ }
120
+
109
121
pub fn derive_allowed ( & self ) -> bool {
110
122
match * self {
111
123
Annotatable :: Item ( ref item) => match item. node {
@@ -317,6 +329,9 @@ pub trait MacResult {
317
329
None
318
330
}
319
331
332
+ /// Create zero or more items in an `extern {}` block
333
+ fn make_foreign_items ( self : Box < Self > ) -> Option < SmallVector < ast:: ForeignItem > > { None }
334
+
320
335
/// Create a pattern.
321
336
fn make_pat ( self : Box < Self > ) -> Option < P < ast:: Pat > > {
322
337
None
@@ -365,6 +380,7 @@ make_MacEager! {
365
380
items: SmallVector <P <ast:: Item >>,
366
381
impl_items: SmallVector <ast:: ImplItem >,
367
382
trait_items: SmallVector <ast:: TraitItem >,
383
+ foreign_items: SmallVector <ast:: ForeignItem >,
368
384
stmts: SmallVector <ast:: Stmt >,
369
385
ty: P <ast:: Ty >,
370
386
}
@@ -386,6 +402,10 @@ impl MacResult for MacEager {
386
402
self . trait_items
387
403
}
388
404
405
+ fn make_foreign_items ( self : Box < Self > ) -> Option < SmallVector < ast:: ForeignItem > > {
406
+ self . foreign_items
407
+ }
408
+
389
409
fn make_stmts ( self : Box < Self > ) -> Option < SmallVector < ast:: Stmt > > {
390
410
match self . stmts . as_ref ( ) . map_or ( 0 , |s| s. len ( ) ) {
391
411
0 => make_stmts_default ! ( self ) ,
@@ -502,6 +522,14 @@ impl MacResult for DummyResult {
502
522
}
503
523
}
504
524
525
+ fn make_foreign_items ( self : Box < Self > ) -> Option < SmallVector < ast:: ForeignItem > > {
526
+ if self . expr_only {
527
+ None
528
+ } else {
529
+ Some ( SmallVector :: new ( ) )
530
+ }
531
+ }
532
+
505
533
fn make_stmts ( self : Box < DummyResult > ) -> Option < SmallVector < ast:: Stmt > > {
506
534
Some ( SmallVector :: one ( ast:: Stmt {
507
535
id : ast:: DUMMY_NODE_ID ,
0 commit comments