diff options
| author | John Clements <clements@racket-lang.org> | 2014-07-10 17:46:09 -0700 |
|---|---|---|
| committer | John Clements <clements@racket-lang.org> | 2014-07-13 10:10:38 -0700 |
| commit | 2c4b6d6f7d6001bf9241f90f1465f4a98490a0d9 (patch) | |
| tree | 6d8f02407a344a97aaca64ef48e9c799d5524061 /src/libsyntax/ext | |
| parent | 6c8bb5a68a82afc0a94769b115988f4012e5991b (diff) | |
| download | rust-2c4b6d6f7d6001bf9241f90f1465f4a98490a0d9.tar.gz rust-2c4b6d6f7d6001bf9241f90f1465f4a98490a0d9.zip | |
add make_method method to MacResult trait
this allows macro results to be parsed as methods
Diffstat (limited to 'src/libsyntax/ext')
| -rw-r--r-- | src/libsyntax/ext/base.rs | 18 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/macro_rules.rs | 19 |
2 files changed, 36 insertions, 1 deletions
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index dcb69ae8f7e..56484c4ba59 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -104,6 +104,9 @@ pub type IdentMacroExpanderFn = /// just into the compiler's internal macro table, for `make_def`). pub trait MacResult { /// Define a new macro. + // this should go away; the idea that a macro might expand into + // either a macro definition or an expression, depending on what + // the context wants, is kind of silly. fn make_def(&self) -> Option<MacroDef> { None } @@ -115,6 +118,12 @@ pub trait MacResult { fn make_items(&self) -> Option<SmallVector<Gc<ast::Item>>> { None } + + /// Create zero or more methods. + fn make_methods(&self) -> Option<SmallVector<Gc<ast::Method>>> { + None + } + /// Create a pattern. fn make_pat(&self) -> Option<Gc<ast::Pat>> { None @@ -222,6 +231,7 @@ impl DummyResult { span: sp, } } + } impl MacResult for DummyResult { @@ -232,6 +242,14 @@ impl MacResult for DummyResult { Some(DummyResult::raw_pat(self.span)) } fn make_items(&self) -> Option<SmallVector<Gc<ast::Item>>> { + // this code needs a comment... why not always just return the Some() ? + if self.expr_only { + None + } else { + Some(SmallVector::zero()) + } + } + fn make_methods(&self) -> Option<SmallVector<Gc<ast::Method>>> { if self.expr_only { None } else { diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index 923b3e78731..1eb37abb781 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -38,7 +38,7 @@ struct ParserAnyMacro<'a> { impl<'a> ParserAnyMacro<'a> { /// Make sure we don't have any tokens left to parse, so we don't /// silently drop anything. `allow_semi` is so that "optional" - /// semilons at the end of normal expressions aren't complained + /// semicolons at the end of normal expressions aren't complained /// about e.g. the semicolon in `macro_rules! kapow( () => { /// fail!(); } )` doesn't get picked up by .parse_expr(), but it's /// allowed to be there. @@ -73,6 +73,9 @@ impl<'a> MacResult for ParserAnyMacro<'a> { let mut ret = SmallVector::zero(); loop { let mut parser = self.parser.borrow_mut(); + // so... do outer attributes attached to the macro invocation + // just disappear? This question applies to make_methods, as + // well. match parser.parse_item_with_outer_attributes() { Some(item) => ret.push(item), None => break @@ -81,6 +84,20 @@ impl<'a> MacResult for ParserAnyMacro<'a> { self.ensure_complete_parse(false); Some(ret) } + + fn make_methods(&self) -> Option<SmallVector<Gc<ast::Method>>> { + let mut ret = SmallVector::zero(); + loop { + let mut parser = self.parser.borrow_mut(); + match parser.token { + EOF => break, + _ => ret.push(parser.parse_method(None)) + } + } + self.ensure_complete_parse(false); + Some(ret) + } + fn make_stmt(&self) -> Option<Gc<ast::Stmt>> { let attrs = self.parser.borrow_mut().parse_outer_attributes(); let ret = self.parser.borrow_mut().parse_stmt(attrs); |
