diff options
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 77 | 
1 files changed, 40 insertions, 37 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 59e79200568..b5d29a0d6db 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -50,7 +50,7 @@ use errors::{self, DiagnosticBuilder}; use ext::tt::macro_parser; use parse; use parse::classify; -use parse::common::{SeqSep, seq_sep_none, seq_sep_trailing_allowed}; +use parse::common::SeqSep; use parse::lexer::{Reader, TokenAndSpan}; use parse::obsolete::{ParserObsoleteMethods, ObsoleteSyntax}; use parse::token::{self, intern, MatchNt, SubstNt, SpecialVarNt, InternedString}; @@ -72,6 +72,7 @@ bitflags! { flags Restrictions: u8 { const RESTRICTION_STMT_EXPR = 1 << 0, const RESTRICTION_NO_STRUCT_LITERAL = 1 << 1, + const NO_NONINLINE_MOD = 1 << 2, } } @@ -850,7 +851,7 @@ impl<'a> Parser<'a> { /// passes through any errors encountered. Used for error recovery. pub fn eat_to_tokens(&mut self, kets: &[&token::Token]) { self.parse_seq_to_before_tokens(kets, - seq_sep_none(), + SeqSep::none(), |p| p.parse_token_tree(), |mut e| e.cancel()); } @@ -1234,7 +1235,7 @@ impl<'a> Parser<'a> { self.parse_unspanned_seq( &token::OpenDelim(token::Brace), &token::CloseDelim(token::Brace), - seq_sep_none(), + SeqSep::none(), |p| -> PResult<'a, TraitItem> { maybe_whole!(no_clone_from_p p, NtTraitItem); let mut attrs = try!(p.parse_outer_attributes()); @@ -1459,7 +1460,7 @@ impl<'a> Parser<'a> { self.bump(); let delim = try!(self.expect_open_delim()); let tts = try!(self.parse_seq_to_end(&token::CloseDelim(delim), - seq_sep_none(), + SeqSep::none(), |p| p.parse_token_tree())); let hi = self.span.hi; TyKind::Mac(spanned(lo, hi, Mac_ { path: path, tts: tts, ctxt: EMPTY_CTXT })) @@ -1799,7 +1800,7 @@ impl<'a> Parser<'a> { let inputs = try!(self.parse_seq_to_end( &token::CloseDelim(token::Paren), - seq_sep_trailing_allowed(token::Comma), + SeqSep::trailing_allowed(token::Comma), |p| p.parse_ty_sum())); let output_ty = if self.eat(&token::RArrow) { @@ -2205,7 +2206,7 @@ impl<'a> Parser<'a> { self.bump(); let remaining_exprs = try!(self.parse_seq_to_end( &token::CloseDelim(token::Bracket), - seq_sep_trailing_allowed(token::Comma), + SeqSep::trailing_allowed(token::Comma), |p| Ok(try!(p.parse_expr())) )); let mut exprs = vec!(first_expr); @@ -2324,7 +2325,7 @@ impl<'a> Parser<'a> { let delim = try!(self.expect_open_delim()); let tts = try!(self.parse_seq_to_end( &token::CloseDelim(delim), - seq_sep_none(), + SeqSep::none(), |p| p.parse_token_tree())); let hi = self.last_span.hi; @@ -2497,7 +2498,7 @@ impl<'a> Parser<'a> { let mut es = try!(self.parse_unspanned_seq( &token::OpenDelim(token::Paren), &token::CloseDelim(token::Paren), - seq_sep_trailing_allowed(token::Comma), + SeqSep::trailing_allowed(token::Comma), |p| Ok(try!(p.parse_expr())) )); let hi = self.last_span.hi; @@ -2599,7 +2600,7 @@ impl<'a> Parser<'a> { let es = try!(self.parse_unspanned_seq( &token::OpenDelim(token::Paren), &token::CloseDelim(token::Paren), - seq_sep_trailing_allowed(token::Comma), + SeqSep::trailing_allowed(token::Comma), |p| Ok(try!(p.parse_expr())) )); hi = self.last_span.hi; @@ -2635,7 +2636,7 @@ impl<'a> Parser<'a> { let Spanned { node: seq, span: seq_span } = try!(self.parse_seq( &token::OpenDelim(token::Paren), &token::CloseDelim(token::Paren), - seq_sep_none(), + SeqSep::none(), |p| p.parse_token_tree() )); let (sep, repeat) = try!(self.parse_sep_and_kleene_op()); @@ -2748,7 +2749,7 @@ impl<'a> Parser<'a> { // Parse the token trees within the delimiters let tts = self.parse_seq_to_before_end(&token::CloseDelim(delim), - seq_sep_none(), + SeqSep::none(), |p| p.parse_token_tree()); // Parse the close delimiter. @@ -3301,8 +3302,8 @@ impl<'a> Parser<'a> { /// Evaluate the closure with restrictions in place. /// /// After the closure is evaluated, restrictions are reset. - pub fn with_res<F>(&mut self, r: Restrictions, f: F) -> PResult<'a, P<Expr>> - where F: FnOnce(&mut Self) -> PResult<'a, P<Expr>> + pub fn with_res<F, T>(&mut self, r: Restrictions, f: F) -> T + where F: FnOnce(&mut Self) -> T { let old = self.restrictions; self.restrictions = r; @@ -3578,7 +3579,7 @@ impl<'a> Parser<'a> { self.bump(); let delim = try!(self.expect_open_delim()); let tts = try!(self.parse_seq_to_end(&token::CloseDelim(delim), - seq_sep_none(), |p| p.parse_token_tree())); + SeqSep::none(), |p| p.parse_token_tree())); let mac = Mac_ { path: path, tts: tts, ctxt: EMPTY_CTXT }; pat = PatKind::Mac(codemap::Spanned {node: mac, span: mk_sp(lo, self.last_span.hi)}); @@ -3637,7 +3638,7 @@ impl<'a> Parser<'a> { let args = try!(self.parse_enum_variant_seq( &token::OpenDelim(token::Paren), &token::CloseDelim(token::Paren), - seq_sep_trailing_allowed(token::Comma), + SeqSep::trailing_allowed(token::Comma), |p| p.parse_pat())); pat = PatKind::TupleStruct(path, Some(args)); } @@ -3887,7 +3888,7 @@ impl<'a> Parser<'a> { let tts = try!(self.parse_unspanned_seq( &token::OpenDelim(delim), &token::CloseDelim(delim), - seq_sep_none(), + SeqSep::none(), |p| p.parse_token_tree() )); let hi = self.last_span.hi; @@ -3926,7 +3927,9 @@ impl<'a> Parser<'a> { } } else { // FIXME: Bad copy of attrs - match try!(self.parse_item_(attrs.clone(), false, true)) { + let restrictions = self.restrictions | Restrictions::NO_NONINLINE_MOD; + match try!(self.with_res(restrictions, + |this| this.parse_item_(attrs.clone(), false, true))) { Some(i) => { let hi = i.span.hi; let decl = P(spanned(lo, hi, DeclKind::Item(i))); @@ -4469,7 +4472,7 @@ impl<'a> Parser<'a> { try!(self.parse_unspanned_seq( &token::OpenDelim(token::Paren), &token::CloseDelim(token::Paren), - seq_sep_trailing_allowed(token::Comma), + SeqSep::trailing_allowed(token::Comma), |p| { if p.token == token::DotDotDot { p.bump(); @@ -4681,7 +4684,7 @@ impl<'a> Parser<'a> { match self.token { token::Comma => { self.bump(); - let sep = seq_sep_trailing_allowed(token::Comma); + let sep = SeqSep::trailing_allowed(token::Comma); let mut fn_inputs = self.parse_seq_to_before_end( &token::CloseDelim(token::Paren), sep, @@ -4704,7 +4707,7 @@ impl<'a> Parser<'a> { let fn_inputs = match explicit_self { SelfKind::Static => { - let sep = seq_sep_trailing_allowed(token::Comma); + let sep = SeqSep::trailing_allowed(token::Comma); self.parse_seq_to_before_end(&token::CloseDelim(token::Paren), sep, parse_arg_fn) } SelfKind::Value(id) => parse_remaining_arguments!(id), @@ -4738,7 +4741,7 @@ impl<'a> Parser<'a> { try!(self.parse_obsolete_closure_kind()); let args = self.parse_seq_to_before_end( &token::BinOp(token::Or), - seq_sep_trailing_allowed(token::Comma), + SeqSep::trailing_allowed(token::Comma), |p| p.parse_fn_block_arg() ); self.bump(); @@ -4902,7 +4905,7 @@ impl<'a> Parser<'a> { // eat a matched-delimiter token tree: let delim = try!(self.expect_open_delim()); let tts = try!(self.parse_seq_to_end(&token::CloseDelim(delim), - seq_sep_none(), + SeqSep::none(), |p| p.parse_token_tree())); let m_ = Mac_ { path: pth, tts: tts, ctxt: EMPTY_CTXT }; let m: ast::Mac = codemap::Spanned { node: m_, @@ -5139,7 +5142,7 @@ impl<'a> Parser<'a> { let fields = try!(self.parse_unspanned_seq( &token::OpenDelim(token::Paren), &token::CloseDelim(token::Paren), - seq_sep_trailing_allowed(token::Comma), + SeqSep::trailing_allowed(token::Comma), |p| { let attrs = try!(p.parse_outer_attributes()); let lo = p.span.lo; @@ -5257,11 +5260,8 @@ impl<'a> Parser<'a> { self.push_mod_path(id, outer_attrs); try!(self.expect(&token::OpenDelim(token::Brace))); let mod_inner_lo = self.span.lo; - let old_owns_directory = self.owns_directory; - self.owns_directory = true; let attrs = try!(self.parse_inner_attributes()); let m = try!(self.parse_mod_items(&token::CloseDelim(token::Brace), mod_inner_lo)); - self.owns_directory = old_owns_directory; self.pop_mod_path(); Ok((id, ItemKind::Mod(m), Some(attrs))) } @@ -5338,7 +5338,17 @@ impl<'a> Parser<'a> { let paths = Parser::default_submod_path(id, &dir_path, self.sess.codemap()); - if !self.owns_directory { + if self.restrictions.contains(Restrictions::NO_NONINLINE_MOD) { + let msg = + "Cannot declare a non-inline module inside a block unless it has a path attribute"; + let mut err = self.diagnostic().struct_span_err(id_sp, msg); + if paths.path_exists { + let msg = format!("Maybe `use` the module `{}` instead of redeclaring it", + paths.name); + err.span_note(id_sp, &msg); + } + return Err(err); + } else if !self.owns_directory { let mut err = self.diagnostic().struct_span_err(id_sp, "cannot declare a new module at this location"); let this_module = match self.mod_path_stack.last() { @@ -5477,13 +5487,6 @@ impl<'a> Parser<'a> { try!(self.expect(&token::Semi)); let last_span = self.last_span; - - if visibility == ast::Visibility::Public { - self.span_warn(mk_sp(lo, last_span.hi), - "`pub extern crate` does not work as expected and should not be used. \ - Likely to become an error. Prefer `extern crate` and `pub use`."); - } - Ok(self.mk_item(lo, last_span.hi, ident, @@ -5962,7 +5965,7 @@ impl<'a> Parser<'a> { // eat a matched-delimiter token tree: let delim = try!(self.expect_open_delim()); let tts = try!(self.parse_seq_to_end(&token::CloseDelim(delim), - seq_sep_none(), + SeqSep::none(), |p| p.parse_token_tree())); // single-variant-enum... : let m = Mac_ { path: pth, tts: tts, ctxt: EMPTY_CTXT }; @@ -6029,7 +6032,7 @@ impl<'a> Parser<'a> { let idents = try!(self.parse_unspanned_seq( &token::OpenDelim(token::Brace), &token::CloseDelim(token::Brace), - seq_sep_trailing_allowed(token::Comma), + SeqSep::trailing_allowed(token::Comma), |p| p.parse_path_list_item())); let path = ast::Path { span: mk_sp(lo, self.span.hi), @@ -6057,7 +6060,7 @@ impl<'a> Parser<'a> { let idents = try!(self.parse_unspanned_seq( &token::OpenDelim(token::Brace), &token::CloseDelim(token::Brace), - seq_sep_trailing_allowed(token::Comma), + SeqSep::trailing_allowed(token::Comma), |p| p.parse_path_list_item() )); let path = ast::Path {  | 
