diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index 26c1945db88..e4c7fbb1deb 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -114,6 +114,10 @@ pub trait MacResult { fn make_items(&self) -> Option> { None } + /// Create a pattern. + fn make_pat(&self) -> Option<@ast::Pat> { + None + } /// Create a statement. /// @@ -139,6 +143,20 @@ impl MacResult for MacExpr { Some(self.e) } } +/// A convenience type for macros that return a single pattern. +pub struct MacPat { + p: @ast::Pat +} +impl MacPat { + pub fn new(p: @ast::Pat) -> Box { + box MacPat { p: p } as Box + } +} +impl MacResult for MacPat { + fn make_pat(&self) -> Option<@ast::Pat> { + Some(self.p) + } +} /// A convenience type for macros that return a single item. pub struct MacItem { i: @ast::Item @@ -194,12 +212,24 @@ impl DummyResult { span: sp, } } + + /// A plain dummy pattern. + pub fn raw_pat(sp: Span) -> @ast::Pat { + @ast::Pat { + id: ast::DUMMY_NODE_ID, + node: ast::PatWild, + span: sp, + } + } } impl MacResult for DummyResult { fn make_expr(&self) -> Option<@ast::Expr> { Some(DummyResult::raw_expr(self.span)) } + fn make_pat(&self) -> Option<@ast::Pat> { + Some(DummyResult::raw_pat(self.span)) + } fn make_items(&self) -> Option> { if self.expr_only { None diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index 1bc0c7f7959..c69e5f9ba0f 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -63,6 +63,11 @@ impl<'a> MacResult for ParserAnyMacro<'a> { self.ensure_complete_parse(true); Some(ret) } + fn make_pat(&self) -> Option<@ast::Pat> { + let ret = self.parser.borrow_mut().parse_pat(); + self.ensure_complete_parse(false); + Some(ret) + } fn make_items(&self) -> Option> { let mut ret = SmallVector::zero(); loop {