diff options
| author | bors <bors@rust-lang.org> | 2013-03-19 21:57:49 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-03-19 21:57:49 -0700 |
| commit | f3c879fdd8aad67cf4f6edd3aacb0189c284c920 (patch) | |
| tree | 872abff783f535fce31af87b8bceeba0f10bf8dd /src/libsyntax/parse/parser.rs | |
| parent | 4cb9ca92962dbbe8ffd813c016e9d6f809dd285b (diff) | |
| parent | f8dab3a6c0adff63854d5e238961a771419d23b7 (diff) | |
| download | rust-f3c879fdd8aad67cf4f6edd3aacb0189c284c920.tar.gz rust-f3c879fdd8aad67cf4f6edd3aacb0189c284c920.zip | |
auto merge of #5442 : pcwalton/rust/extern-block-restriction, r=pcwalton
r? @graydon
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 114 |
1 files changed, 76 insertions, 38 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 6f4d9332df8..62e1d20e9b2 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -120,7 +120,7 @@ pub enum item_or_view_item { enum view_item_parse_mode { VIEW_ITEMS_AND_ITEMS_ALLOWED, - VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED, + FOREIGN_ITEMS_ALLOWED, IMPORTS_AND_ITEMS_ALLOWED } @@ -642,9 +642,9 @@ pub impl Parser { self.obsolete(*self.last_span, ObsoleteMutVector); } - // Parse the `* e` in `[ int * e ]` + // Parse the `, ..e` in `[ int, ..e ]` // where `e` is a const expression - let t = match self.maybe_parse_fixed_vstore_with_star() { + let t = match self.maybe_parse_fixed_vstore() { None => ty_vec(mt), Some(suffix) => ty_fixed_length_vec(mt, suffix) }; @@ -815,8 +815,14 @@ pub impl Parser { }) } - fn maybe_parse_fixed_vstore_with_star(&self) -> Option<@ast::expr> { + fn maybe_parse_fixed_vstore(&self) -> Option<@ast::expr> { if self.eat(&token::BINOP(token::STAR)) { + // XXX: Obsolete; remove after snapshot. + Some(self.parse_expr()) + } else if *self.token == token::COMMA && + self.look_ahead(1) == token::DOTDOT { + self.bump(); + self.bump(); Some(self.parse_expr()) } else { None @@ -3538,7 +3544,12 @@ pub impl Parser { fn parse_item_foreign_const(&self, vis: ast::visibility, +attrs: ~[attribute]) -> @foreign_item { let lo = self.span.lo; - self.expect_keyword(&~"const"); + + // XXX: Obsolete; remove after snap. + if !self.eat_keyword(&~"const") { + self.expect_keyword(&~"static"); + } + let ident = self.parse_ident(); self.expect(&token::COLON); let ty = self.parse_ty(false); @@ -3567,7 +3578,7 @@ pub impl Parser { fn parse_foreign_item(&self, +attrs: ~[attribute]) -> @foreign_item { let vis = self.parse_visibility(); - if self.is_keyword(&~"const") { + if self.is_keyword(&~"const") || self.is_keyword(&~"static") { self.parse_item_foreign_const(vis, attrs) } else { self.parse_item_foreign_fn(attrs) @@ -3585,7 +3596,7 @@ pub impl Parser { items: _, foreign_items: foreign_items } = self.parse_items_and_view_items(first_item_attrs, - VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED, + FOREIGN_ITEMS_ALLOWED, true); let mut items: ~[@foreign_item] = foreign_items; @@ -3925,17 +3936,24 @@ pub impl Parser { visibility = inherited; } - if items_allowed && self.eat_keyword(&~"const") { + if items_allowed && + (self.is_keyword(&~"const") || + (self.is_keyword(&~"static") && + !self.token_is_keyword(&~"fn", &self.look_ahead(1)))) { // CONST ITEM + self.bump(); let (ident, item_, extra_attrs) = self.parse_item_const(); return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_, visibility, maybe_append(attrs, extra_attrs))); - } else if foreign_items_allowed && self.is_keyword(&~"const") { + } + if foreign_items_allowed && + (self.is_keyword(&~"const") || self.is_keyword(&~"static")) { // FOREIGN CONST ITEM let item = self.parse_item_foreign_const(visibility, attrs); return iovi_foreign_item(item); - } else if items_allowed && + } + if items_allowed && // FUNCTION ITEM (not sure about lookahead condition...) self.is_keyword(&~"fn") && !self.fn_expr_lookahead(self.look_ahead(1u)) { @@ -3944,7 +3962,8 @@ pub impl Parser { return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_, visibility, maybe_append(attrs, extra_attrs))); - } else if items_allowed && self.eat_keyword(&~"pure") { + } + if items_allowed && self.eat_keyword(&~"pure") { // PURE FUNCTION ITEM // NB: We parse this as impure for bootstrapping purposes. self.expect_keyword(&~"fn"); @@ -3952,13 +3971,15 @@ pub impl Parser { return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_, visibility, maybe_append(attrs, extra_attrs))); - } else if foreign_items_allowed && + } + if foreign_items_allowed && (self.is_keyword(&~"fn") || self.is_keyword(&~"pure") || self.is_keyword(&~"unsafe")) { // FOREIGN FUNCTION ITEM (no items allowed) let item = self.parse_item_foreign_fn(attrs); return iovi_foreign_item(item); - } else if items_allowed && self.is_keyword(&~"unsafe") + } + if items_allowed && self.is_keyword(&~"unsafe") && self.look_ahead(1u) != token::LBRACE { // UNSAFE FUNCTION ITEM (where items are allowed) self.bump(); @@ -3967,7 +3988,8 @@ pub impl Parser { return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_, visibility, maybe_append(attrs, extra_attrs))); - } else if self.eat_keyword(&~"extern") { + } + if self.eat_keyword(&~"extern") { if items_allowed && self.eat_keyword(&~"fn") { // EXTERN FUNCTION ITEM let (ident, item_, extra_attrs) = @@ -3977,47 +3999,62 @@ pub impl Parser { maybe_append(attrs, extra_attrs))); } - // EXTERN MODULE ITEM - return self.parse_item_foreign_mod(lo, visibility, attrs, - items_allowed); - } else if items_allowed && self.eat_keyword(&~"mod") { + if !foreign_items_allowed { + // EXTERN MODULE ITEM + return self.parse_item_foreign_mod(lo, visibility, attrs, + items_allowed); + } + } + if items_allowed && !foreign_items_allowed && + self.eat_keyword(&~"mod") { // MODULE ITEM let (ident, item_, extra_attrs) = self.parse_item_mod(attrs); return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_, visibility, maybe_append(attrs, extra_attrs))); - } else if items_allowed && self.eat_keyword(&~"type") { + } + if items_allowed && !foreign_items_allowed && + self.eat_keyword(&~"type") { // TYPE ITEM let (ident, item_, extra_attrs) = self.parse_item_type(); return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_, visibility, maybe_append(attrs, extra_attrs))); - } else if items_allowed && self.eat_keyword(&~"enum") { + } + if items_allowed && !foreign_items_allowed && + self.eat_keyword(&~"enum") { // ENUM ITEM let (ident, item_, extra_attrs) = self.parse_item_enum(); return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_, visibility, maybe_append(attrs, extra_attrs))); - } else if items_allowed && self.eat_keyword(&~"trait") { + } + if items_allowed && !foreign_items_allowed && + self.eat_keyword(&~"trait") { // TRAIT ITEM let (ident, item_, extra_attrs) = self.parse_item_trait(); return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_, visibility, maybe_append(attrs, extra_attrs))); - } else if items_allowed && self.eat_keyword(&~"impl") { + } + if items_allowed && !foreign_items_allowed && + self.eat_keyword(&~"impl") { // IMPL ITEM let (ident, item_, extra_attrs) = self.parse_item_impl(visibility); return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_, visibility, maybe_append(attrs, extra_attrs))); - } else if items_allowed && self.eat_keyword(&~"struct") { + } + if items_allowed && !foreign_items_allowed && + self.eat_keyword(&~"struct") { // STRUCT ITEM let (ident, item_, extra_attrs) = self.parse_item_struct(); return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_, visibility, maybe_append(attrs, extra_attrs))); - } else if self.eat_keyword(&~"use") { + } + if !foreign_items_allowed && self.eat_keyword(&~"use") { // USE ITEM let view_item = self.parse_use(); self.expect(&token::SEMI); @@ -4027,7 +4064,8 @@ pub impl Parser { vis: visibility, span: mk_sp(lo, self.last_span.hi) }); - } else if macros_allowed && !self.is_any_keyword(© *self.token) + } + if macros_allowed && !self.is_any_keyword(© *self.token) && self.look_ahead(1) == token::NOT && (is_plain_ident(&self.look_ahead(2)) || self.look_ahead(2) == token::LPAREN @@ -4070,16 +4108,16 @@ pub impl Parser { let item_ = item_mac(m); return iovi_item(self.mk_item(lo, self.last_span.hi, id, item_, visibility, attrs)); - } else { - // FAILURE TO PARSE ITEM - if visibility != inherited { - let mut s = ~"unmatched visibility `"; - s += if visibility == public { ~"pub" } else { ~"priv" }; - s += ~"`"; - self.span_fatal(*self.last_span, s); - } - return iovi_none; - }; + } + + // FAILURE TO PARSE ITEM + if visibility != inherited { + let mut s = ~"unmatched visibility `"; + s += if visibility == public { ~"pub" } else { ~"priv" }; + s += ~"`"; + self.span_fatal(*self.last_span, s); + } + return iovi_none; } fn parse_item(&self, +attrs: ~[attribute]) -> Option<@ast::item> { @@ -4246,17 +4284,17 @@ pub impl Parser { let items_allowed = match mode { VIEW_ITEMS_AND_ITEMS_ALLOWED | IMPORTS_AND_ITEMS_ALLOWED => true, - VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED => false + FOREIGN_ITEMS_ALLOWED => false }; let restricted_to_imports = match mode { IMPORTS_AND_ITEMS_ALLOWED => true, VIEW_ITEMS_AND_ITEMS_ALLOWED | - VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED => false + FOREIGN_ITEMS_ALLOWED => false }; let foreign_items_allowed = match mode { - VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED => true, + FOREIGN_ITEMS_ALLOWED => true, VIEW_ITEMS_AND_ITEMS_ALLOWED | IMPORTS_AND_ITEMS_ALLOWED => false }; |
