From 2c4b6d6f7d6001bf9241f90f1465f4a98490a0d9 Mon Sep 17 00:00:00 2001 From: John Clements Date: Thu, 10 Jul 2014 17:46:09 -0700 Subject: [PATCH] add make_method method to MacResult trait this allows macro results to be parsed as methods --- src/libsyntax/ext/base.rs | 18 ++++++++++++++++++ src/libsyntax/ext/tt/macro_rules.rs | 19 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index dcb69ae8f7e64..56484c4ba59df 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 { None } @@ -115,6 +118,12 @@ pub trait MacResult { fn make_items(&self) -> Option>> { None } + + /// Create zero or more methods. + fn make_methods(&self) -> Option>> { + None + } + /// Create a pattern. fn make_pat(&self) -> Option> { 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>> { + // 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>> { 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 923b3e78731a0..1eb37abb781a3 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>> { + 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> { let attrs = self.parser.borrow_mut().parse_outer_attributes(); let ret = self.parser.borrow_mut().parse_stmt(attrs);