@@ -38,6 +38,7 @@ pub enum Annotatable {
3838 Item ( P < ast:: Item > ) ,
3939 TraitItem ( P < ast:: TraitItem > ) ,
4040 ImplItem ( P < ast:: ImplItem > ) ,
41+ ForeignItem ( P < ast:: ForeignItem > ) ,
4142 Stmt ( P < ast:: Stmt > ) ,
4243 Expr ( P < ast:: Expr > ) ,
4344}
@@ -48,6 +49,7 @@ impl HasAttrs for Annotatable {
4849 Annotatable :: Item ( ref item) => & item. attrs ,
4950 Annotatable :: TraitItem ( ref trait_item) => & trait_item. attrs ,
5051 Annotatable :: ImplItem ( ref impl_item) => & impl_item. attrs ,
52+ Annotatable :: ForeignItem ( ref foreign_item) => & foreign_item. attrs ,
5153 Annotatable :: Stmt ( ref stmt) => stmt. attrs ( ) ,
5254 Annotatable :: Expr ( ref expr) => & expr. attrs ,
5355 }
@@ -58,6 +60,8 @@ impl HasAttrs for Annotatable {
5860 Annotatable :: Item ( item) => Annotatable :: Item ( item. map_attrs ( f) ) ,
5961 Annotatable :: TraitItem ( trait_item) => Annotatable :: TraitItem ( trait_item. map_attrs ( f) ) ,
6062 Annotatable :: ImplItem ( impl_item) => Annotatable :: ImplItem ( impl_item. map_attrs ( f) ) ,
63+ Annotatable :: ForeignItem ( foreign_item) =>
64+ Annotatable :: ForeignItem ( foreign_item. map_attrs ( f) ) ,
6165 Annotatable :: Stmt ( stmt) => Annotatable :: Stmt ( stmt. map_attrs ( f) ) ,
6266 Annotatable :: Expr ( expr) => Annotatable :: Expr ( expr. map_attrs ( f) ) ,
6367 }
@@ -70,6 +74,7 @@ impl Annotatable {
7074 Annotatable :: Item ( ref item) => item. span ,
7175 Annotatable :: TraitItem ( ref trait_item) => trait_item. span ,
7276 Annotatable :: ImplItem ( ref impl_item) => impl_item. span ,
77+ Annotatable :: ForeignItem ( ref foreign_item) => foreign_item. span ,
7378 Annotatable :: Stmt ( ref stmt) => stmt. span ,
7479 Annotatable :: Expr ( ref expr) => expr. span ,
7580 }
@@ -106,6 +111,13 @@ impl Annotatable {
106111 }
107112 }
108113
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+
109121 pub fn derive_allowed ( & self ) -> bool {
110122 match * self {
111123 Annotatable :: Item ( ref item) => match item. node {
@@ -317,6 +329,9 @@ pub trait MacResult {
317329 None
318330 }
319331
332+ /// Create zero or more items in an `extern {}` block
333+ fn make_foreign_items ( self : Box < Self > ) -> Option < SmallVector < ast:: ForeignItem > > { None }
334+
320335 /// Create a pattern.
321336 fn make_pat ( self : Box < Self > ) -> Option < P < ast:: Pat > > {
322337 None
@@ -365,6 +380,7 @@ make_MacEager! {
365380 items: SmallVector <P <ast:: Item >>,
366381 impl_items: SmallVector <ast:: ImplItem >,
367382 trait_items: SmallVector <ast:: TraitItem >,
383+ foreign_items: SmallVector <ast:: ForeignItem >,
368384 stmts: SmallVector <ast:: Stmt >,
369385 ty: P <ast:: Ty >,
370386}
@@ -386,6 +402,10 @@ impl MacResult for MacEager {
386402 self . trait_items
387403 }
388404
405+ fn make_foreign_items ( self : Box < Self > ) -> Option < SmallVector < ast:: ForeignItem > > {
406+ self . foreign_items
407+ }
408+
389409 fn make_stmts ( self : Box < Self > ) -> Option < SmallVector < ast:: Stmt > > {
390410 match self . stmts . as_ref ( ) . map_or ( 0 , |s| s. len ( ) ) {
391411 0 => make_stmts_default ! ( self ) ,
@@ -502,6 +522,14 @@ impl MacResult for DummyResult {
502522 }
503523 }
504524
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+
505533 fn make_stmts ( self : Box < DummyResult > ) -> Option < SmallVector < ast:: Stmt > > {
506534 Some ( SmallVector :: one ( ast:: Stmt {
507535 id : ast:: DUMMY_NODE_ID ,
0 commit comments