Forbid item macros from occuring where statement macros might occur, and allow item macros to look like statement/expr macros.

This commit is contained in:
Paul Stansifer 2012-11-21 14:49:19 -05:00 committed by Graydon Hoare
parent 0f707f42c8
commit 45bcb10204

View File

@ -2253,7 +2253,8 @@ impl Parser {
let item_attrs = vec::append(first_item_attrs, item_attrs); let item_attrs = vec::append(first_item_attrs, item_attrs);
match self.parse_item_or_view_item(item_attrs, true, false) { match self.parse_item_or_view_item(item_attrs,
true, false, false) {
iovi_item(i) => { iovi_item(i) => {
let mut hi = i.span.hi; let mut hi = i.span.hi;
let decl = @spanned(lo, hi, decl_item(i)); let decl = @spanned(lo, hi, decl_item(i));
@ -2333,7 +2334,7 @@ impl Parser {
let {attrs_remaining, view_items, items: items, _} = let {attrs_remaining, view_items, items: items, _} =
self.parse_items_and_view_items(first_item_attrs, self.parse_items_and_view_items(first_item_attrs,
IMPORTS_AND_ITEMS_ALLOWED); IMPORTS_AND_ITEMS_ALLOWED, false);
for items.each |item| { for items.each |item| {
let decl = @spanned(item.span.lo, item.span.hi, decl_item(*item)); let decl = @spanned(item.span.lo, item.span.hi, decl_item(*item));
@ -2968,7 +2969,8 @@ impl Parser {
// Shouldn't be any view items since we've already parsed an item attr // Shouldn't be any view items since we've already parsed an item attr
let {attrs_remaining, view_items, items: starting_items, _} = let {attrs_remaining, view_items, items: starting_items, _} =
self.parse_items_and_view_items(first_item_attrs, self.parse_items_and_view_items(first_item_attrs,
VIEW_ITEMS_AND_ITEMS_ALLOWED); VIEW_ITEMS_AND_ITEMS_ALLOWED,
true);
let mut items: ~[@item] = move starting_items; let mut items: ~[@item] = move starting_items;
let mut first = true; let mut first = true;
@ -2980,7 +2982,7 @@ impl Parser {
} }
debug!("parse_mod_items: parse_item_or_view_item(attrs=%?)", debug!("parse_mod_items: parse_item_or_view_item(attrs=%?)",
attrs); attrs);
match self.parse_item_or_view_item(attrs, true, false) { match self.parse_item_or_view_item(attrs, true, false, true) {
iovi_item(item) => items.push(item), iovi_item(item) => items.push(item),
iovi_view_item(view_item) => { iovi_view_item(view_item) => {
self.span_fatal(view_item.span, ~"view items must be \ self.span_fatal(view_item.span, ~"view items must be \
@ -3168,7 +3170,8 @@ impl Parser {
// Shouldn't be any view items since we've already parsed an item attr // Shouldn't be any view items since we've already parsed an item attr
let {attrs_remaining, view_items, items: _, foreign_items} = let {attrs_remaining, view_items, items: _, foreign_items} =
self.parse_items_and_view_items(first_item_attrs, self.parse_items_and_view_items(first_item_attrs,
VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED); VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED,
true);
let mut items: ~[@foreign_item] = move foreign_items; let mut items: ~[@foreign_item] = move foreign_items;
let mut initial_attrs = attrs_remaining; let mut initial_attrs = attrs_remaining;
@ -3472,7 +3475,8 @@ impl Parser {
} }
fn parse_item_or_view_item(+attrs: ~[attribute], items_allowed: bool, fn parse_item_or_view_item(+attrs: ~[attribute], items_allowed: bool,
foreign_items_allowed: bool) foreign_items_allowed: bool,
macros_allowed: bool)
-> item_or_view_item { -> item_or_view_item {
assert items_allowed != foreign_items_allowed; assert items_allowed != foreign_items_allowed;
@ -3581,9 +3585,11 @@ impl Parser {
vis: visibility, vis: visibility,
span: mk_sp(lo, self.last_span.hi) span: mk_sp(lo, self.last_span.hi)
}); });
} else if items_allowed && (!self.is_any_keyword(copy self.token) } else if macros_allowed && !self.is_any_keyword(copy self.token)
&& self.look_ahead(1) == token::NOT && self.look_ahead(1) == token::NOT
&& is_plain_ident(self.look_ahead(2))) { && (is_plain_ident(self.look_ahead(2))
|| self.look_ahead(2) == token::LPAREN
|| self.look_ahead(2) == token::LBRACE) {
// item macro. // item macro.
let pth = self.parse_path_without_tps(); let pth = self.parse_path_without_tps();
self.expect(token::NOT); self.expect(token::NOT);
@ -3591,10 +3597,10 @@ impl Parser {
// a 'special' identifier (like what `macro_rules!` uses) // a 'special' identifier (like what `macro_rules!` uses)
// is optional. We should eventually unify invoc syntax // is optional. We should eventually unify invoc syntax
// and remove this. // and remove this.
let id = if self.token == token::LPAREN { let id = if is_plain_ident(self.token) {
token::special_idents::invalid // no special identifier
} else {
self.parse_ident() self.parse_ident()
} else {
token::special_idents::invalid // no special identifier
}; };
let tts = match self.token { let tts = match self.token {
token::LPAREN | token::LBRACE => { token::LPAREN | token::LBRACE => {
@ -3624,7 +3630,7 @@ impl Parser {
} }
fn parse_item(+attrs: ~[attribute]) -> Option<@ast::item> { fn parse_item(+attrs: ~[attribute]) -> Option<@ast::item> {
match self.parse_item_or_view_item(attrs, true, false) { match self.parse_item_or_view_item(attrs, true, false, true) {
iovi_none => iovi_none =>
None, None,
iovi_view_item(_) => iovi_view_item(_) =>
@ -3762,7 +3768,8 @@ impl Parser {
} }
fn parse_items_and_view_items(+first_item_attrs: ~[attribute], fn parse_items_and_view_items(+first_item_attrs: ~[attribute],
mode: view_item_parse_mode) mode: view_item_parse_mode,
macros_allowed: bool)
-> {attrs_remaining: ~[attribute], -> {attrs_remaining: ~[attribute],
view_items: ~[@view_item], view_items: ~[@view_item],
items: ~[@item], items: ~[@item],
@ -3789,7 +3796,8 @@ impl Parser {
let (view_items, items, foreign_items) = (DVec(), DVec(), DVec()); let (view_items, items, foreign_items) = (DVec(), DVec(), DVec());
loop { loop {
match self.parse_item_or_view_item(attrs, items_allowed, match self.parse_item_or_view_item(attrs, items_allowed,
foreign_items_allowed) { foreign_items_allowed,
macros_allowed) {
iovi_none => iovi_none =>
break, break,
iovi_view_item(view_item) => { iovi_view_item(view_item) => {