From 6120b2244b68930b414c27d06438ee3b0ddc246a Mon Sep 17 00:00:00 2001 From: Hossein Dindar Date: Tue, 3 Nov 2020 17:38:54 +0000 Subject: [PATCH 1/7] Give a better diagnostic for keywords with incorrect capitalization --- .../rustc_parse/src/parser/diagnostics.rs | 26 ++++++++++++++++--- src/test/ui/parser/mistyped_reserved_token.rs | 5 ++++ 2 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 src/test/ui/parser/mistyped_reserved_token.rs diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index 1ea01d95a134e..bc008d71a3a1e 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -235,6 +235,10 @@ impl<'a> Parser<'a> { }) } + let prev_token_to_string = pprust::token_kind_to_string(&self.prev_token.kind); + let prev_token_seems_reserved_token = + Ident::from_str(&prev_token_to_string.to_lowercase()).is_reserved(); + let mut expected = edible .iter() .map(|x| TokenType::Token(x.clone())) @@ -245,7 +249,15 @@ impl<'a> Parser<'a> { expected.dedup(); let expect = tokens_to_string(&expected[..]); let actual = super::token_descr(&self.token); - let (msg_exp, (label_sp, label_exp)) = if expected.len() > 1 { + let (msg_exp, (label_sp, label_exp)) = if prev_token_seems_reserved_token { + ( + format!("`{:?}` is not a keyword", prev_token_to_string), + ( + self.prev_token.span, + format!("help: try {:?} instead", prev_token_to_string.to_lowercase()), + ), + ) + } else if expected.len() > 1 { let short_expect = if expected.len() > 6 { format!("{} possible tokens", expected.len()) } else { @@ -267,7 +279,11 @@ impl<'a> Parser<'a> { ) }; self.last_unexpected_token_span = Some(self.token.span); - let mut err = self.struct_span_err(self.token.span, &msg_exp); + let mut err = if prev_token_seems_reserved_token { + self.struct_span_err(self.prev_token.span, &msg_exp) + } else { + self.struct_span_err(self.token.span, &msg_exp) + }; let sp = if self.token == token::Eof { // This is EOF; don't want to point at the following char, but rather the last token. self.prev_token.span @@ -315,7 +331,11 @@ impl<'a> Parser<'a> { err.span_label(self.token.span, label_exp); } else { err.span_label(sp, label_exp); - err.span_label(self.token.span, "unexpected token"); + if prev_token_seems_reserved_token { + err.span_label(self.prev_token.span, "unexpected token"); + } else { + err.span_label(self.token.span, "unexpected token"); + } } self.maybe_annotate_with_ascription(&mut err, false); Err(err) diff --git a/src/test/ui/parser/mistyped_reserved_token.rs b/src/test/ui/parser/mistyped_reserved_token.rs new file mode 100644 index 0000000000000..36951efff5d5a --- /dev/null +++ b/src/test/ui/parser/mistyped_reserved_token.rs @@ -0,0 +1,5 @@ +fn main() { + let a = While true { + break; + }; +} \ No newline at end of file From a899fda35cd542437a5bf3047a4f68ca0731bac5 Mon Sep 17 00:00:00 2001 From: Hossein Dindar Date: Thu, 19 Nov 2020 15:40:58 +0000 Subject: [PATCH 2/7] a little change --- compiler/rustc_parse/src/parser/diagnostics.rs | 5 ++--- src/test/ui/parser/mistyped_reserved_token.stderr | 8 ++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 src/test/ui/parser/mistyped_reserved_token.stderr diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index bc008d71a3a1e..140a7fa290018 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -236,8 +236,7 @@ impl<'a> Parser<'a> { } let prev_token_to_string = pprust::token_kind_to_string(&self.prev_token.kind); - let prev_token_seems_reserved_token = - Ident::from_str(&prev_token_to_string.to_lowercase()).is_reserved(); + let prev_token_seems_reserved_token = self.prev_token.is_ident() && Ident::from_str(&prev_token_to_string.to_lowercase()).is_reserved() && prev_token_to_string != prev_token_to_string.to_lowercase(); let mut expected = edible .iter() @@ -1794,4 +1793,4 @@ impl<'a> Parser<'a> { } } } -} +} \ No newline at end of file diff --git a/src/test/ui/parser/mistyped_reserved_token.stderr b/src/test/ui/parser/mistyped_reserved_token.stderr new file mode 100644 index 0000000000000..b809db9301755 --- /dev/null +++ b/src/test/ui/parser/mistyped_reserved_token.stderr @@ -0,0 +1,8 @@ +error: `"While"` is not a keyword + --> $DIR/mistyped_reserved_token.rs:2:13 + | +LL | let a = While true { + | ^^^^^ ---- help: try "while" instead + +error: aborting due to previous error + From 958e18365710549a323191a3d8f5fd486fbb7641 Mon Sep 17 00:00:00 2001 From: Hossein Dindar Date: Sat, 28 Nov 2020 13:37:05 +0000 Subject: [PATCH 3/7] a little change --- .../rustc_parse/src/parser/diagnostics.rs | 60 ++++++++++--------- src/test/ui/parser/mistyped_reserved_token.rs | 2 +- .../ui/parser/mistyped_reserved_token.stderr | 4 +- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index 140a7fa290018..670bc425d75ef 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -236,7 +236,10 @@ impl<'a> Parser<'a> { } let prev_token_to_string = pprust::token_kind_to_string(&self.prev_token.kind); - let prev_token_seems_reserved_token = self.prev_token.is_ident() && Ident::from_str(&prev_token_to_string.to_lowercase()).is_reserved() && prev_token_to_string != prev_token_to_string.to_lowercase(); + let prev_token_seems_reserved_token = !self.prev_token.is_path_segment_keyword() + && self.prev_token.is_ident() + && Ident::from_str(&prev_token_to_string.to_lowercase()).is_reserved() + && prev_token_to_string != prev_token_to_string.to_lowercase(); let mut expected = edible .iter() @@ -248,24 +251,29 @@ impl<'a> Parser<'a> { expected.dedup(); let expect = tokens_to_string(&expected[..]); let actual = super::token_descr(&self.token); - let (msg_exp, (label_sp, label_exp)) = if prev_token_seems_reserved_token { - ( - format!("`{:?}` is not a keyword", prev_token_to_string), + let (msg_exp, (label_sp, label_exp)) = if expected.len() > 1 { + if prev_token_seems_reserved_token { ( - self.prev_token.span, - format!("help: try {:?} instead", prev_token_to_string.to_lowercase()), - ), - ) - } else if expected.len() > 1 { - let short_expect = if expected.len() > 6 { - format!("{} possible tokens", expected.len()) + format!("`{:?}` is not a keyword", prev_token_to_string), + ( + self.prev_token.span, + format!("help: try `{:?}` instead", prev_token_to_string.to_lowercase()), + ), + ) } else { - expect.clone() - }; - ( - format!("expected one of {}, found {}", expect, actual), - (self.prev_token.span.shrink_to_hi(), format!("expected one of {}", short_expect)), - ) + let short_expect = if expected.len() > 6 { + format!("{} possible tokens", expected.len()) + } else { + expect.clone() + }; + ( + format!("expected one of {}, found {}", expect, actual), + ( + self.prev_token.span.shrink_to_hi(), + format!("expected one of {}", short_expect), + ), + ) + } } else if expected.is_empty() { ( format!("unexpected token: {}", actual), @@ -278,11 +286,7 @@ impl<'a> Parser<'a> { ) }; self.last_unexpected_token_span = Some(self.token.span); - let mut err = if prev_token_seems_reserved_token { - self.struct_span_err(self.prev_token.span, &msg_exp) - } else { - self.struct_span_err(self.token.span, &msg_exp) - }; + let mut err = self.struct_span_err(self.token.span, &msg_exp); let sp = if self.token == token::Eof { // This is EOF; don't want to point at the following char, but rather the last token. self.prev_token.span @@ -330,11 +334,7 @@ impl<'a> Parser<'a> { err.span_label(self.token.span, label_exp); } else { err.span_label(sp, label_exp); - if prev_token_seems_reserved_token { - err.span_label(self.prev_token.span, "unexpected token"); - } else { - err.span_label(self.token.span, "unexpected token"); - } + err.span_label(self.token.span, "unexpected token"); } self.maybe_annotate_with_ascription(&mut err, false); Err(err) @@ -664,6 +664,10 @@ impl<'a> Parser<'a> { ) -> PResult<'a, ()> { if let ExprKind::Binary(binop, _, _) = &expr.kind { if let ast::BinOpKind::Lt = binop.node { + debug!( + "check_mistyped_turbofish_with_multiple_type_params = {:?} {:?}", + e, self.token + ); if self.eat(&token::Comma) { let x = self.parse_seq_to_before_end( &token::Gt, @@ -1793,4 +1797,4 @@ impl<'a> Parser<'a> { } } } -} \ No newline at end of file +} diff --git a/src/test/ui/parser/mistyped_reserved_token.rs b/src/test/ui/parser/mistyped_reserved_token.rs index 36951efff5d5a..900572f04ad3c 100644 --- a/src/test/ui/parser/mistyped_reserved_token.rs +++ b/src/test/ui/parser/mistyped_reserved_token.rs @@ -2,4 +2,4 @@ fn main() { let a = While true { break; }; -} \ No newline at end of file +} diff --git a/src/test/ui/parser/mistyped_reserved_token.stderr b/src/test/ui/parser/mistyped_reserved_token.stderr index b809db9301755..8f8b4cce12cf4 100644 --- a/src/test/ui/parser/mistyped_reserved_token.stderr +++ b/src/test/ui/parser/mistyped_reserved_token.stderr @@ -1,8 +1,8 @@ error: `"While"` is not a keyword - --> $DIR/mistyped_reserved_token.rs:2:13 + --> $DIR/mistyped_reserved_token.rs:2:19 | LL | let a = While true { - | ^^^^^ ---- help: try "while" instead + | ^^^^ help: try `"while"` instead error: aborting due to previous error From 0478387e306339dc5bfe3e06b0b105fc89ac8aab Mon Sep 17 00:00:00 2001 From: Hossein Dindar Date: Sat, 5 Dec 2020 16:49:37 +0000 Subject: [PATCH 4/7] a little change --- src/test/ui/parser/mistyped_reserved_token.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/ui/parser/mistyped_reserved_token.rs b/src/test/ui/parser/mistyped_reserved_token.rs index 900572f04ad3c..9d463fa26ca14 100644 --- a/src/test/ui/parser/mistyped_reserved_token.rs +++ b/src/test/ui/parser/mistyped_reserved_token.rs @@ -1,5 +1,5 @@ fn main() { - let a = While true { + let a = While true { //~ ERROR break; }; } From 80d34ed331df8ab422f37c53e433e0b4390642d6 Mon Sep 17 00:00:00 2001 From: Hossein Dindar Date: Sat, 5 Dec 2020 18:36:37 +0000 Subject: [PATCH 5/7] add span suggestion --- compiler/rustc_parse/src/parser/diagnostics.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index 670bc425d75ef..fc1f931393e65 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -257,7 +257,7 @@ impl<'a> Parser<'a> { format!("`{:?}` is not a keyword", prev_token_to_string), ( self.prev_token.span, - format!("help: try `{:?}` instead", prev_token_to_string.to_lowercase()), + format!("try `{:?}` instead", prev_token_to_string.to_lowercase()), ), ) } else { @@ -287,12 +287,18 @@ impl<'a> Parser<'a> { }; self.last_unexpected_token_span = Some(self.token.span); let mut err = self.struct_span_err(self.token.span, &msg_exp); + + if prev_token_seems_reserved_token { + err = self.struct_span_err(self.prev_token.span, &msg_exp); + } + let sp = if self.token == token::Eof { // This is EOF; don't want to point at the following char, but rather the last token. self.prev_token.span } else { label_sp }; + match self.recover_closing_delimiter( &expected .iter() @@ -314,7 +320,10 @@ impl<'a> Parser<'a> { } let sm = self.sess.source_map(); - if self.prev_token.span == DUMMY_SP { + if prev_token_seems_reserved_token { + err.span_suggestion(sp, &msg_exp, label_exp.clone(), Applicability::MaybeIncorrect); + err.span_label(self.prev_token.span, label_exp); + } else if self.prev_token.span == DUMMY_SP { // Account for macro context where the previous span might not be // available to avoid incorrect output (#54841). err.span_label(self.token.span, label_exp); @@ -664,10 +673,6 @@ impl<'a> Parser<'a> { ) -> PResult<'a, ()> { if let ExprKind::Binary(binop, _, _) = &expr.kind { if let ast::BinOpKind::Lt = binop.node { - debug!( - "check_mistyped_turbofish_with_multiple_type_params = {:?} {:?}", - e, self.token - ); if self.eat(&token::Comma) { let x = self.parse_seq_to_before_end( &token::Gt, From 34e257ce9e11cb75c6f169e3f3b322babeae2bab Mon Sep 17 00:00:00 2001 From: Hossein Dindar Date: Sat, 5 Dec 2020 19:14:00 +0000 Subject: [PATCH 6/7] add span suggestion --- compiler/rustc_parse/src/parser/diagnostics.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index fc1f931393e65..6ebb00a1c4bc3 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -286,7 +286,11 @@ impl<'a> Parser<'a> { ) }; self.last_unexpected_token_span = Some(self.token.span); - let mut err = self.struct_span_err(self.token.span, &msg_exp); + let mut err = if !prev_token_seems_reserved_token { + self.struct_span_err(self.token.span, &msg_exp) + } else { + self.struct_span_err(self.token.span, &msg_exp) + }; if prev_token_seems_reserved_token { err = self.struct_span_err(self.prev_token.span, &msg_exp); @@ -322,7 +326,6 @@ impl<'a> Parser<'a> { let sm = self.sess.source_map(); if prev_token_seems_reserved_token { err.span_suggestion(sp, &msg_exp, label_exp.clone(), Applicability::MaybeIncorrect); - err.span_label(self.prev_token.span, label_exp); } else if self.prev_token.span == DUMMY_SP { // Account for macro context where the previous span might not be // available to avoid incorrect output (#54841). From c55dd122cc30e783b6020f617649bc8c164c6cdd Mon Sep 17 00:00:00 2001 From: Hossein Dindar Date: Sat, 5 Dec 2020 19:43:06 +0000 Subject: [PATCH 7/7] fix issues --- compiler/rustc_parse/src/parser/diagnostics.rs | 8 ++------ src/test/ui/parser/mistyped_reserved_token.stderr | 4 ++-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index 6ebb00a1c4bc3..6bdd6ece1fd37 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -289,13 +289,9 @@ impl<'a> Parser<'a> { let mut err = if !prev_token_seems_reserved_token { self.struct_span_err(self.token.span, &msg_exp) } else { - self.struct_span_err(self.token.span, &msg_exp) + self.struct_span_err(self.prev_token.span, &msg_exp) }; - if prev_token_seems_reserved_token { - err = self.struct_span_err(self.prev_token.span, &msg_exp); - } - let sp = if self.token == token::Eof { // This is EOF; don't want to point at the following char, but rather the last token. self.prev_token.span @@ -325,7 +321,7 @@ impl<'a> Parser<'a> { let sm = self.sess.source_map(); if prev_token_seems_reserved_token { - err.span_suggestion(sp, &msg_exp, label_exp.clone(), Applicability::MaybeIncorrect); + err.span_label(self.prev_token.span, label_exp); } else if self.prev_token.span == DUMMY_SP { // Account for macro context where the previous span might not be // available to avoid incorrect output (#54841). diff --git a/src/test/ui/parser/mistyped_reserved_token.stderr b/src/test/ui/parser/mistyped_reserved_token.stderr index 8f8b4cce12cf4..d6f76f98b5038 100644 --- a/src/test/ui/parser/mistyped_reserved_token.stderr +++ b/src/test/ui/parser/mistyped_reserved_token.stderr @@ -1,8 +1,8 @@ error: `"While"` is not a keyword - --> $DIR/mistyped_reserved_token.rs:2:19 + --> $DIR/mistyped_reserved_token.rs:2:13 | LL | let a = While true { - | ^^^^ help: try `"while"` instead + | ^^^^^ try `"while"` instead error: aborting due to previous error