diff options
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/mod.rs | 14 | ||||
| -rw-r--r-- | src/libsyntax/parse/obsolete.rs | 6 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 72 | ||||
| -rw-r--r-- | src/libsyntax/parse/token.rs | 7 |
4 files changed, 56 insertions, 43 deletions
diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index 6ff5c77f507..5f4cf9af5ee 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -560,7 +560,7 @@ fn filtered_float_lit(data: token::InternedString, suffix: Option<&str>, } pub fn float_lit(s: &str, suffix: Option<&str>, sd: &SpanHandler, sp: Span) -> ast::Lit_ { debug!("float_lit: {:?}, {:?}", s, suffix); - // FIXME #2252: bounds checking float literals is defered until trans + // FIXME #2252: bounds checking float literals is deferred until trans let s = s.chars().filter(|&c| c != '_').collect::<String>(); let data = token::intern_and_get_ident(&*s); filtered_float_lit(data, suffix, sd, sp) @@ -1201,19 +1201,19 @@ mod test { let source = "/// doc comment\r\nfn foo() {}".to_string(); let item = parse_item_from_source_str(name.clone(), source, Vec::new(), &sess).unwrap(); let doc = first_attr_value_str_by_name(&item.attrs, "doc").unwrap(); - assert_eq!(doc.get(), "/// doc comment"); + assert_eq!(&doc[], "/// doc comment"); let source = "/// doc comment\r\n/// line 2\r\nfn foo() {}".to_string(); let item = parse_item_from_source_str(name.clone(), source, Vec::new(), &sess).unwrap(); - let docs = item.attrs.iter().filter(|a| a.name().get() == "doc") - .map(|a| a.value_str().unwrap().get().to_string()).collect::<Vec<_>>(); + let docs = item.attrs.iter().filter(|a| &a.name()[] == "doc") + .map(|a| a.value_str().unwrap().to_string()).collect::<Vec<_>>(); let b: &[_] = &["/// doc comment".to_string(), "/// line 2".to_string()]; assert_eq!(&docs[], b); let source = "/** doc comment\r\n * with CRLF */\r\nfn foo() {}".to_string(); let item = parse_item_from_source_str(name, source, Vec::new(), &sess).unwrap(); let doc = first_attr_value_str_by_name(&item.attrs, "doc").unwrap(); - assert_eq!(doc.get(), "/** doc comment\n * with CRLF */"); + assert_eq!(&doc[], "/** doc comment\n * with CRLF */"); } #[test] @@ -1233,8 +1233,8 @@ mod test { let span = tts.iter().rev().next().unwrap().get_span(); match sess.span_diagnostic.cm.span_to_snippet(span) { - Some(s) => assert_eq!(&s[], "{ body }"), - None => panic!("could not get snippet"), + Ok(s) => assert_eq!(&s[], "{ body }"), + Err(_) => panic!("could not get snippet"), } } } diff --git a/src/libsyntax/parse/obsolete.rs b/src/libsyntax/parse/obsolete.rs index 60de6c909b7..1df2e762ee7 100644 --- a/src/libsyntax/parse/obsolete.rs +++ b/src/libsyntax/parse/obsolete.rs @@ -63,15 +63,15 @@ impl<'a> ParserObsoleteMethods for parser::Parser<'a> { "use a `move ||` expression instead", ), ObsoleteSyntax::ClosureType => ( - "`|usize| -> bool` closure type syntax", + "`|usize| -> bool` closure type", "use unboxed closures instead, no type annotation needed" ), ObsoleteSyntax::ClosureKind => ( - "`:`, `&mut:`, or `&:` syntax", + "`:`, `&mut:`, or `&:`", "rely on inference instead" ), ObsoleteSyntax::Sized => ( - "`Sized? T` syntax for removing the `Sized` bound", + "`Sized? T` for removing the `Sized` bound", "write `T: ?Sized` instead" ), }; diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 22174494458..fd2f0685cab 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1036,6 +1036,8 @@ impl<'a> Parser<'a> { */ // parse <'lt> + let lo = self.span.lo; + let lifetime_defs = self.parse_late_bound_lifetime_defs(); // examine next token to decide to do @@ -1047,9 +1049,11 @@ impl<'a> Parser<'a> { self.token.is_ident() || self.token.is_path() { + let hi = self.span.hi; let trait_ref = self.parse_trait_ref(); let poly_trait_ref = ast::PolyTraitRef { bound_lifetimes: lifetime_defs, - trait_ref: trait_ref }; + trait_ref: trait_ref, + span: mk_sp(lo, hi)}; let other_bounds = if self.eat(&token::BinOp(token::Plus)) { self.parse_ty_param_bounds(BoundParsingMode::Bare) } else { @@ -2527,16 +2531,7 @@ impl<'a> Parser<'a> { let bracket_pos = self.span.lo; self.bump(); - let mut found_dotdot = false; - if self.token == token::DotDot && - self.look_ahead(1, |t| t == &token::CloseDelim(token::Bracket)) { - // Using expr[..], which is a mistake, should be expr[] - self.bump(); - self.bump(); - found_dotdot = true; - } - - if found_dotdot || self.eat(&token::CloseDelim(token::Bracket)) { + if self.eat(&token::CloseDelim(token::Bracket)) { // No expression, expand to a RangeFull // FIXME(#20516) It would be better to use a lang item or // something for RangeFull. @@ -2560,7 +2555,11 @@ impl<'a> Parser<'a> { let range = ExprStruct(path, vec![], None); let ix = self.mk_expr(bracket_pos, hi, range); let index = self.mk_index(e, ix); - e = self.mk_expr(lo, hi, index) + e = self.mk_expr(lo, hi, index); + // Enable after snapshot. + // self.span_warn(e.span, "deprecated slicing syntax: `[]`"); + // self.span_note(e.span, + // "use `&expr[..]` to construct a slice of the whole of expr"); } else { let ix = self.parse_expr(); hi = self.span.hi; @@ -2569,11 +2568,6 @@ impl<'a> Parser<'a> { e = self.mk_expr(lo, hi, index) } - if found_dotdot { - self.span_err(e.span, "incorrect slicing expression: `[..]`"); - self.span_note(e.span, - "use `&expr[]` to construct a slice of the whole of expr"); - } } _ => return e } @@ -2934,9 +2928,14 @@ impl<'a> Parser<'a> { // with the postfix-form 'expr..' let lo = self.span.lo; self.bump(); - let rhs = self.parse_binops(); - let hi = rhs.span.hi; - let ex = self.mk_range(None, Some(rhs)); + let opt_end = if self.is_at_start_of_range_notation_rhs() { + let end = self.parse_binops(); + Some(end) + } else { + None + }; + let hi = self.span.hi; + let ex = self.mk_range(None, opt_end); self.mk_expr(lo, hi, ex) } _ => { @@ -4075,7 +4074,8 @@ impl<'a> Parser<'a> { if let Some(unbound) = unbound { let mut bounds_as_vec = bounds.into_vec(); bounds_as_vec.push(TraitTyParamBound(PolyTraitRef { bound_lifetimes: vec![], - trait_ref: unbound }, + trait_ref: unbound, + span: span }, TraitBoundModifier::Maybe)); bounds = OwnedSlice::from_vec(bounds_as_vec); }; @@ -4228,6 +4228,16 @@ impl<'a> Parser<'a> { } _ => { + let bound_lifetimes = if self.eat_keyword(keywords::For) { + // Higher ranked constraint. + self.expect(&token::Lt); + let lifetime_defs = self.parse_lifetime_defs(); + self.expect_gt(); + lifetime_defs + } else { + vec![] + }; + let bounded_ty = self.parse_ty(); if self.eat(&token::Colon) { @@ -4238,12 +4248,13 @@ impl<'a> Parser<'a> { if bounds.len() == 0 { self.span_err(span, "each predicate in a `where` clause must have \ - at least one bound in it"); + at least one bound in it"); } generics.where_clause.predicates.push(ast::WherePredicate::BoundPredicate( ast::WhereBoundPredicate { span: span, + bound_lifetimes: bound_lifetimes, bounded_ty: bounded_ty, bounds: bounds, })); @@ -4679,8 +4690,12 @@ impl<'a> Parser<'a> { /// Parse trait Foo { ... } fn parse_item_trait(&mut self, unsafety: Unsafety) -> ItemInfo { + let ident = self.parse_ident(); let mut tps = self.parse_generics(); + // This is not very accurate, but since unbound only exists to catch + // obsolete syntax, the span is unlikely to ever be used. + let unbound_span = self.span; let unbound = self.parse_for_sized(); // Parse supertrait bounds. @@ -4689,7 +4704,8 @@ impl<'a> Parser<'a> { if let Some(unbound) = unbound { let mut bounds_as_vec = bounds.into_vec(); bounds_as_vec.push(TraitTyParamBound(PolyTraitRef { bound_lifetimes: vec![], - trait_ref: unbound }, + trait_ref: unbound, + span: unbound_span }, TraitBoundModifier::Maybe)); bounds = OwnedSlice::from_vec(bounds_as_vec); }; @@ -4808,11 +4824,13 @@ impl<'a> Parser<'a> { /// Parse for<'l> a::B<String,i32> fn parse_poly_trait_ref(&mut self) -> PolyTraitRef { + let lo = self.span.lo; let lifetime_defs = self.parse_late_bound_lifetime_defs(); ast::PolyTraitRef { bound_lifetimes: lifetime_defs, - trait_ref: self.parse_trait_ref() + trait_ref: self.parse_trait_ref(), + span: mk_sp(lo, self.last_span.hi), } } @@ -5138,7 +5156,7 @@ impl<'a> Parser<'a> { outer_attrs, "path") { Some(d) => (dir_path.join(d), true), None => { - let mod_name = mod_string.get().to_string(); + let mod_name = mod_string.to_string(); let default_path_str = format!("{}.rs", mod_name); let secondary_path_str = format!("{}/mod.rs", mod_name); let default_path = dir_path.join(&default_path_str[]); @@ -5150,7 +5168,7 @@ impl<'a> Parser<'a> { self.span_err(id_sp, "cannot declare a new module at this location"); let this_module = match self.mod_path_stack.last() { - Some(name) => name.get().to_string(), + Some(name) => name.to_string(), None => self.root_module_name.as_ref().unwrap().clone(), }; self.span_note(id_sp, @@ -5196,7 +5214,7 @@ impl<'a> Parser<'a> { }; self.eval_src_mod_from_path(file_path, owns_directory, - mod_string.get().to_string(), id_sp) + mod_string.to_string(), id_sp) } fn eval_src_mod_from_path(&mut self, diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 129c1d20bc0..45f4f044ea4 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -625,11 +625,6 @@ impl InternedString { string: string, } } - - #[inline] - pub fn get<'a>(&'a self) -> &'a str { - &self.string[] - } } impl Deref for InternedString { @@ -644,7 +639,7 @@ impl BytesContainer for InternedString { // of `BytesContainer`, which is itself a workaround for the lack of // DST. unsafe { - let this = self.get(); + let this = &self[]; mem::transmute::<&[u8],&[u8]>(this.container_as_bytes()) } } |
