diff options
Diffstat (limited to 'src/libsyntax/ext/base.rs')
| -rw-r--r-- | src/libsyntax/ext/base.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index d3157af984e..5a735be55c0 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -38,6 +38,7 @@ pub enum Annotatable { Item(P<ast::Item>), TraitItem(P<ast::TraitItem>), ImplItem(P<ast::ImplItem>), + ForeignItem(P<ast::ForeignItem>), Stmt(P<ast::Stmt>), Expr(P<ast::Expr>), } @@ -48,6 +49,7 @@ impl HasAttrs for Annotatable { Annotatable::Item(ref item) => &item.attrs, Annotatable::TraitItem(ref trait_item) => &trait_item.attrs, Annotatable::ImplItem(ref impl_item) => &impl_item.attrs, + Annotatable::ForeignItem(ref foreign_item) => &foreign_item.attrs, Annotatable::Stmt(ref stmt) => stmt.attrs(), Annotatable::Expr(ref expr) => &expr.attrs, } @@ -58,6 +60,8 @@ impl HasAttrs for Annotatable { Annotatable::Item(item) => Annotatable::Item(item.map_attrs(f)), Annotatable::TraitItem(trait_item) => Annotatable::TraitItem(trait_item.map_attrs(f)), Annotatable::ImplItem(impl_item) => Annotatable::ImplItem(impl_item.map_attrs(f)), + Annotatable::ForeignItem(foreign_item) => + Annotatable::ForeignItem(foreign_item.map_attrs(f)), Annotatable::Stmt(stmt) => Annotatable::Stmt(stmt.map_attrs(f)), Annotatable::Expr(expr) => Annotatable::Expr(expr.map_attrs(f)), } @@ -70,6 +74,7 @@ impl Annotatable { Annotatable::Item(ref item) => item.span, Annotatable::TraitItem(ref trait_item) => trait_item.span, Annotatable::ImplItem(ref impl_item) => impl_item.span, + Annotatable::ForeignItem(ref foreign_item) => foreign_item.span, Annotatable::Stmt(ref stmt) => stmt.span, Annotatable::Expr(ref expr) => expr.span, } @@ -106,6 +111,13 @@ impl Annotatable { } } + pub fn expect_foreign_item(self) -> ast::ForeignItem { + match self { + Annotatable::ForeignItem(i) => i.into_inner(), + _ => panic!("expected foreign item") + } + } + pub fn derive_allowed(&self) -> bool { match *self { Annotatable::Item(ref item) => match item.node { @@ -317,6 +329,9 @@ pub trait MacResult { None } + /// Create zero or more items in an `extern {}` block + fn make_foreign_items(self: Box<Self>) -> Option<SmallVector<ast::ForeignItem>> { None } + /// Create a pattern. fn make_pat(self: Box<Self>) -> Option<P<ast::Pat>> { None @@ -365,6 +380,7 @@ make_MacEager! { items: SmallVector<P<ast::Item>>, impl_items: SmallVector<ast::ImplItem>, trait_items: SmallVector<ast::TraitItem>, + foreign_items: SmallVector<ast::ForeignItem>, stmts: SmallVector<ast::Stmt>, ty: P<ast::Ty>, } @@ -386,6 +402,10 @@ impl MacResult for MacEager { self.trait_items } + fn make_foreign_items(self: Box<Self>) -> Option<SmallVector<ast::ForeignItem>> { + self.foreign_items + } + fn make_stmts(self: Box<Self>) -> Option<SmallVector<ast::Stmt>> { match self.stmts.as_ref().map_or(0, |s| s.len()) { 0 => make_stmts_default!(self), @@ -502,6 +522,14 @@ impl MacResult for DummyResult { } } + fn make_foreign_items(self: Box<Self>) -> Option<SmallVector<ast::ForeignItem>> { + if self.expr_only { + None + } else { + Some(SmallVector::new()) + } + } + fn make_stmts(self: Box<DummyResult>) -> Option<SmallVector<ast::Stmt>> { Some(SmallVector::one(ast::Stmt { id: ast::DUMMY_NODE_ID, |
