diff options
| author | Keegan McAllister <kmcallister@mozilla.com> | 2014-05-19 13:32:51 -0700 |
|---|---|---|
| committer | Keegan McAllister <kmcallister@mozilla.com> | 2014-05-28 12:42:21 -0700 |
| commit | 00704ea33b98dc880d9ac1e4ae7f61b45e8e4330 (patch) | |
| tree | 0049887c8ffe7cd42dade72209ac48cb5c25fb63 /src/libsyntax | |
| parent | 5fdd0e4b05979a0a01ca6c14e0510880d320250c (diff) | |
| download | rust-00704ea33b98dc880d9ac1e4ae7f61b45e8e4330.tar.gz rust-00704ea33b98dc880d9ac1e4ae7f61b45e8e4330.zip | |
Add patterns to MacResult
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/base.rs | 30 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/macro_rules.rs | 5 |
2 files changed, 35 insertions, 0 deletions
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<SmallVector<@ast::Item>> { 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<MacResult> { + box MacPat { p: p } as Box<MacResult> + } +} +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<SmallVector<@ast::Item>> { 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<SmallVector<@ast::Item>> { let mut ret = SmallVector::zero(); loop { |
