diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2017-01-18 19:01:04 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2017-01-24 22:56:02 +0300 |
| commit | 375cb2eec70f239b477c6b88852c8258765b5420 (patch) | |
| tree | 66f238cc9c9ba00e7f7e146e80731a2588deb4ba | |
| parent | a8f5047430aa78c2d1ff30b5960cdbde24daab84 (diff) | |
| download | rust-375cb2eec70f239b477c6b88852c8258765b5420.tar.gz rust-375cb2eec70f239b477c6b88852c8258765b5420.zip | |
Improve some expected/found error messages from parser
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 61 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-20616-3.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-20616-4.rs | 3 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-20616-5.rs | 3 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-20616-6.rs | 3 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-20616-7.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-20616-8.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-20616-9.rs | 2 | ||||
| -rw-r--r-- | src/test/parse-fail/bounds-lifetime-3.rs | 2 | ||||
| -rw-r--r-- | src/test/parse-fail/bounds-lifetime-where-2.rs | 2 |
10 files changed, 61 insertions, 21 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index c589f1a7aaa..939f126640d 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -192,14 +192,22 @@ pub enum TokenType { Token(token::Token), Keyword(keywords::Keyword), Operator, + Lifetime, + Ident, + Path, + Type, } impl TokenType { fn to_string(&self) -> String { match *self { TokenType::Token(ref t) => format!("`{}`", Parser::token_to_string(t)), - TokenType::Operator => "an operator".to_string(), TokenType::Keyword(kw) => format!("`{}`", kw.name()), + TokenType::Operator => "an operator".to_string(), + TokenType::Lifetime => "lifetime".to_string(), + TokenType::Ident => "identifier".to_string(), + TokenType::Path => "path".to_string(), + TokenType::Type => "type".to_string(), } } } @@ -552,6 +560,33 @@ impl<'a> Parser<'a> { } } + fn check_ident(&mut self) -> bool { + if self.token.is_ident() { + true + } else { + self.expected_tokens.push(TokenType::Ident); + false + } + } + + fn check_path(&mut self) -> bool { + if self.token.is_path_start() { + true + } else { + self.expected_tokens.push(TokenType::Path); + false + } + } + + fn check_type(&mut self) -> bool { + if self.token.can_begin_type() { + true + } else { + self.expected_tokens.push(TokenType::Type); + false + } + } + /// Expect and consume an `&`. If `&&` is seen, replace it with a single /// `&` and continue. If an `&` is not seen, signal an error. fn expect_and(&mut self) -> PResult<'a, ()> { @@ -1802,7 +1837,10 @@ impl<'a> Parser<'a> { name: ident.name }) } - _ => None + _ => { + self.expected_tokens.push(TokenType::Lifetime); + None + } } } @@ -3953,7 +3991,7 @@ impl<'a> Parser<'a> { "`?` may only modify trait bounds, not lifetime bounds"); } bounds.push(RegionTyParamBound(lifetime)); - } else if self.token.is_keyword(keywords::For) || self.token.is_path_start() { + } else {if self.check_keyword(keywords::For) || self.check_path() { let poly_trait_ref = self.parse_poly_trait_ref()?; let modifier = if question.is_some() { TraitBoundModifier::Maybe @@ -3963,7 +4001,7 @@ impl<'a> Parser<'a> { bounds.push(TraitTyParamBound(poly_trait_ref, modifier)); } else { break - } + }} // Trailing plus is not allowed for now and we have to detect it. let is_bound_start = |token: &token::Token| { @@ -4047,7 +4085,7 @@ impl<'a> Parser<'a> { self.span_err(self.prev_span, "lifetime parameters must be declared prior to type parameters"); } - } else if self.token.is_ident() { + } else {if self.check_ident() { // Parse type parameter. ty_params.push(self.parse_ty_param(attrs)?); seen_ty_param = true; @@ -4059,7 +4097,7 @@ impl<'a> Parser<'a> { &format!("trailing attribute after {} parameters", param_kind)); } break - } + }} if !self.eat(&token::Comma) { break @@ -4105,7 +4143,6 @@ impl<'a> Parser<'a> { let mut seen_type = false; let mut seen_binding = false; loop { - let eq_is_next = self.look_ahead(1, |t| t == &token::Eq); // borrowck workaround if let Some(lifetime) = self.eat_lifetime() { // Parse lifetime argument. lifetimes.push(lifetime); @@ -4113,7 +4150,7 @@ impl<'a> Parser<'a> { self.span_err(self.prev_span, "lifetime parameters must be declared prior to type parameters"); } - } else if self.token.is_ident() && eq_is_next { + } else {if self.check_ident() && self.look_ahead(1, |t| t == &token::Eq) { // Parse associated type binding. let lo = self.span.lo; let ident = self.parse_ident()?; @@ -4126,7 +4163,7 @@ impl<'a> Parser<'a> { span: mk_sp(lo, self.prev_span.hi), }); seen_binding = true; - } else if self.token.can_begin_type() { + } else if self.check_type() { // Parse type argument. types.push(self.parse_ty()?); if seen_binding { @@ -4136,7 +4173,7 @@ impl<'a> Parser<'a> { seen_type = true; } else { break - } + }} if !self.eat(&token::Comma) { break @@ -4192,7 +4229,7 @@ impl<'a> Parser<'a> { bounds: bounds, } )); - } else if self.token.can_begin_type() { + } else {if self.check_type() { // Parse optional `for<'a, 'b>`. // This `for` is parsed greedily and applies to the whole predicate, // the bounded type can have its own `for` applying only to it. @@ -4230,7 +4267,7 @@ impl<'a> Parser<'a> { } } else { break - } + }} if !self.eat(&token::Comma) { break diff --git a/src/test/compile-fail/issue-20616-3.rs b/src/test/compile-fail/issue-20616-3.rs index 9a5972a7a16..e5ed46d2cb3 100644 --- a/src/test/compile-fail/issue-20616-3.rs +++ b/src/test/compile-fail/issue-20616-3.rs @@ -22,7 +22,7 @@ type Type_1_<'a, T> = &'a T; //type Type_2 = Type_1_<'static ()>; // error: expected `,` or `>` after lifetime name, found `(` -type Type_3<T> = Box<T,,>; //~ error: expected `>`, found `,` +type Type_3<T> = Box<T,,>; //~ error: expected one of `>`, identifier, lifetime, or type, found `,` //type Type_4<T> = Type_1_<'static,, T>; // error: expected type, found `,` diff --git a/src/test/compile-fail/issue-20616-4.rs b/src/test/compile-fail/issue-20616-4.rs index 1567698e476..9b731289e13 100644 --- a/src/test/compile-fail/issue-20616-4.rs +++ b/src/test/compile-fail/issue-20616-4.rs @@ -25,7 +25,8 @@ type Type_1_<'a, T> = &'a T; //type Type_3<T> = Box<T,,>; // error: expected type, found `,` -type Type_4<T> = Type_1_<'static,, T>; //~ error: expected `>`, found `,` +type Type_4<T> = Type_1_<'static,, T>; +//~^ error: expected one of `>`, identifier, lifetime, or type, found `,` type Type_5_<'a> = Type_1_<'a, ()>; diff --git a/src/test/compile-fail/issue-20616-5.rs b/src/test/compile-fail/issue-20616-5.rs index c5a0624574d..5e3b024da9a 100644 --- a/src/test/compile-fail/issue-20616-5.rs +++ b/src/test/compile-fail/issue-20616-5.rs @@ -31,7 +31,8 @@ type Type_1_<'a, T> = &'a T; type Type_5_<'a> = Type_1_<'a, ()>; -type Type_5<'a> = Type_1_<'a, (),,>; //~ error: expected `>`, found `,` +type Type_5<'a> = Type_1_<'a, (),,>; +//~^ error: expected one of `>`, identifier, lifetime, or type, found `,` //type Type_6 = Type_5_<'a,,>; // error: expected type, found `,` diff --git a/src/test/compile-fail/issue-20616-6.rs b/src/test/compile-fail/issue-20616-6.rs index 56578409546..b6ee26f9f62 100644 --- a/src/test/compile-fail/issue-20616-6.rs +++ b/src/test/compile-fail/issue-20616-6.rs @@ -34,7 +34,8 @@ type Type_5_<'a> = Type_1_<'a, ()>; //type Type_5<'a> = Type_1_<'a, (),,>; // error: expected type, found `,` -type Type_6 = Type_5_<'a,,>; //~ error: expected `>`, found `,` +type Type_6 = Type_5_<'a,,>; +//~^ error: expected one of `>`, identifier, lifetime, or type, found `,` //type Type_7 = Box<(),,>; // error: expected type, found `,` diff --git a/src/test/compile-fail/issue-20616-7.rs b/src/test/compile-fail/issue-20616-7.rs index ecd0a467cf6..fef3dd4e31d 100644 --- a/src/test/compile-fail/issue-20616-7.rs +++ b/src/test/compile-fail/issue-20616-7.rs @@ -37,7 +37,7 @@ type Type_5_<'a> = Type_1_<'a, ()>; //type Type_6 = Type_5_<'a,,>; // error: expected type, found `,` -type Type_7 = Box<(),,>; //~ error: expected `>`, found `,` +type Type_7 = Box<(),,>; //~ error: expected one of `>`, identifier, lifetime, or type, found `,` //type Type_8<'a,,> = &'a (); // error: expected ident, found `,` diff --git a/src/test/compile-fail/issue-20616-8.rs b/src/test/compile-fail/issue-20616-8.rs index 535672c65e4..b7bef47c4f4 100644 --- a/src/test/compile-fail/issue-20616-8.rs +++ b/src/test/compile-fail/issue-20616-8.rs @@ -40,7 +40,7 @@ type Type_5_<'a> = Type_1_<'a, ()>; //type Type_7 = Box<(),,>; // error: expected type, found `,` -type Type_8<'a,,> = &'a (); //~ error: expected `>`, found `,` +type Type_8<'a,,> = &'a (); //~ error: expected one of `>`, identifier, or lifetime, found `,` //type Type_9<T,,> = Box<T>; // error: expected identifier, found `,` diff --git a/src/test/compile-fail/issue-20616-9.rs b/src/test/compile-fail/issue-20616-9.rs index b666a8b67aa..5c16d24cef8 100644 --- a/src/test/compile-fail/issue-20616-9.rs +++ b/src/test/compile-fail/issue-20616-9.rs @@ -43,4 +43,4 @@ type Type_5_<'a> = Type_1_<'a, ()>; //type Type_8<'a,,> = &'a (); // error: expected identifier, found `,` -type Type_9<T,,> = Box<T>; //~ error: expected `>`, found `,` +type Type_9<T,,> = Box<T>; //~ error: expected one of `>`, identifier, or lifetime, found `,` diff --git a/src/test/parse-fail/bounds-lifetime-3.rs b/src/test/parse-fail/bounds-lifetime-3.rs index be7c197245e..e0443159815 100644 --- a/src/test/parse-fail/bounds-lifetime-3.rs +++ b/src/test/parse-fail/bounds-lifetime-3.rs @@ -10,6 +10,6 @@ // compile-flags: -Z parse-only -type A = for<,> fn(); //~ ERROR expected `>`, found `,` +type A = for<,> fn(); //~ ERROR expected one of `>`, identifier, or lifetime, found `,` fn main() {} diff --git a/src/test/parse-fail/bounds-lifetime-where-2.rs b/src/test/parse-fail/bounds-lifetime-where-2.rs index 97dcd5cc5f8..ffcacdf357d 100644 --- a/src/test/parse-fail/bounds-lifetime-where-2.rs +++ b/src/test/parse-fail/bounds-lifetime-where-2.rs @@ -10,6 +10,6 @@ // compile-flags: -Z parse-only -type A where , = u8; //~ ERROR expected `=`, found `,` +type A where , = u8; //~ ERROR expected one of `=`, lifetime, or type, found `,` fn main() {} |
