From 41f58a7cf69d14151070996de50eb7f8587f6b1d Mon Sep 17 00:00:00 2001 From: keatinge Date: Sat, 6 Jan 2018 07:41:36 -0500 Subject: [PATCH 1/7] Add help message for incorrect pattern syntax --- src/libsyntax/parse/parser.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 812e3c4967a9d..f347f7af06d3e 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3432,7 +3432,16 @@ impl<'a> Parser<'a> { loop { pats.push(self.parse_pat()?); if self.check(&token::BinOp(token::Or)) { self.bump();} - else { return Ok(pats); } + else { + // Accidental use of || instead of | inbetween patterns + if self.token == token::OrOr { + return Err(self.span_fatal_help( + self.span, "Unexpected token `||` after pattern", + "Did you mean to use `|` to specify multiple patterns instead?")); + } + + return Ok(pats); + } }; } From 13576dfcd424570f12e2a225c53f3ba83712d048 Mon Sep 17 00:00:00 2001 From: keatinge Date: Sat, 6 Jan 2018 08:37:01 -0500 Subject: [PATCH 2/7] fix capitalization --- src/libsyntax/parse/parser.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index f347f7af06d3e..e7c46bfd7bc51 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3436,8 +3436,8 @@ impl<'a> Parser<'a> { // Accidental use of || instead of | inbetween patterns if self.token == token::OrOr { return Err(self.span_fatal_help( - self.span, "Unexpected token `||` after pattern", - "Did you mean to use `|` to specify multiple patterns instead?")); + self.span, "unexpected token `||` after pattern", + "did you mean to use `|` to specify multiple patterns instead?")); } return Ok(pats); From dcb53d754bed44ad72edf19889daf06e54a70a5b Mon Sep 17 00:00:00 2001 From: keatinge Date: Sat, 6 Jan 2018 10:01:54 -0500 Subject: [PATCH 3/7] Emit non-fatal error instead --- src/libsyntax/parse/parser.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index e7c46bfd7bc51..3fd73418df55f 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3431,15 +3431,17 @@ impl<'a> Parser<'a> { let mut pats = Vec::new(); loop { pats.push(self.parse_pat()?); - if self.check(&token::BinOp(token::Or)) { self.bump();} - else { - // Accidental use of || instead of | inbetween patterns - if self.token == token::OrOr { - return Err(self.span_fatal_help( - self.span, "unexpected token `||` after pattern", - "did you mean to use `|` to specify multiple patterns instead?")); - } + if self.token == token::OrOr { + self.span_err_help(self.span, + "unexpected token `||` after pattern", + "did you mean to use `|` to specify multiple patterns?"); + self.bump(); + } + else if self.check(&token::BinOp(token::Or)) { + self.bump(); + } + else { return Ok(pats); } }; From 4436bca5af397da88854900508ae9726ee117e26 Mon Sep 17 00:00:00 2001 From: keatinge Date: Sat, 6 Jan 2018 10:05:02 -0500 Subject: [PATCH 4/7] fix style --- src/libsyntax/parse/parser.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 3fd73418df55f..897f199f25eb4 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3437,11 +3437,9 @@ impl<'a> Parser<'a> { "unexpected token `||` after pattern", "did you mean to use `|` to specify multiple patterns?"); self.bump(); - } - else if self.check(&token::BinOp(token::Or)) { + } else if self.check(&token::BinOp(token::Or)) { self.bump(); - } - else { + } else { return Ok(pats); } }; From 8260209bb231cb92b1c9636ceded73f09edbc1c6 Mon Sep 17 00:00:00 2001 From: keatinge Date: Sat, 6 Jan 2018 12:34:19 -0500 Subject: [PATCH 5/7] Add tests for error message for pattern matching typo --- .../ui/did_you_mean/multiple-pattern-typo.rs | 17 +++++++++++++++++ .../did_you_mean/multiple-pattern-typo.stderr | 10 ++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/test/ui/did_you_mean/multiple-pattern-typo.rs create mode 100644 src/test/ui/did_you_mean/multiple-pattern-typo.stderr diff --git a/src/test/ui/did_you_mean/multiple-pattern-typo.rs b/src/test/ui/did_you_mean/multiple-pattern-typo.rs new file mode 100644 index 0000000000000..a8994fd6c96aa --- /dev/null +++ b/src/test/ui/did_you_mean/multiple-pattern-typo.rs @@ -0,0 +1,17 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let x = 3; + match x { + 1 | 2 || 3 => (), //~ ERROR unexpected token `||` after pattern + _ => (), + } +} diff --git a/src/test/ui/did_you_mean/multiple-pattern-typo.stderr b/src/test/ui/did_you_mean/multiple-pattern-typo.stderr new file mode 100644 index 0000000000000..940ff6828b150 --- /dev/null +++ b/src/test/ui/did_you_mean/multiple-pattern-typo.stderr @@ -0,0 +1,10 @@ +error: unexpected token `||` after pattern + --> $DIR/multiple-pattern-typo.rs:14:15 + | +14 | 1 | 2 || 3 => (), //~ ERROR unexpected token `||` after pattern + | ^^ + | + = help: did you mean to use `|` to specify multiple patterns? + +error: aborting due to previous error + From a9b746bb2371a39d77bcea431415fa0a6ddca548 Mon Sep 17 00:00:00 2001 From: keatinge Date: Sat, 6 Jan 2018 15:22:29 -0500 Subject: [PATCH 6/7] Use span_suggestion instead of span_err_help --- src/libsyntax/parse/parser.rs | 6 +++--- src/test/ui/did_you_mean/multiple-pattern-typo.stderr | 4 +--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 897f199f25eb4..adaa5670e8092 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3433,9 +3433,9 @@ impl<'a> Parser<'a> { pats.push(self.parse_pat()?); if self.token == token::OrOr { - self.span_err_help(self.span, - "unexpected token `||` after pattern", - "did you mean to use `|` to specify multiple patterns?"); + let mut err = self.struct_span_err(self.span, "unexpected token `||` after pattern"); + err.span_suggestion(self.span, "use a single `|` to specify multiple patterns", "|".to_owned()); + err.emit(); self.bump(); } else if self.check(&token::BinOp(token::Or)) { self.bump(); diff --git a/src/test/ui/did_you_mean/multiple-pattern-typo.stderr b/src/test/ui/did_you_mean/multiple-pattern-typo.stderr index 940ff6828b150..a35aa6f3d1c97 100644 --- a/src/test/ui/did_you_mean/multiple-pattern-typo.stderr +++ b/src/test/ui/did_you_mean/multiple-pattern-typo.stderr @@ -2,9 +2,7 @@ error: unexpected token `||` after pattern --> $DIR/multiple-pattern-typo.rs:14:15 | 14 | 1 | 2 || 3 => (), //~ ERROR unexpected token `||` after pattern - | ^^ - | - = help: did you mean to use `|` to specify multiple patterns? + | ^^ help: use a single `|` to specify multiple patterns: `|` error: aborting due to previous error From 6aafdc3781c7adca6270b8e712152bed160b6071 Mon Sep 17 00:00:00 2001 From: keatinge Date: Sat, 6 Jan 2018 15:29:08 -0500 Subject: [PATCH 7/7] Fix tidy error --- src/libsyntax/parse/parser.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index adaa5670e8092..3bc8a3021cb3d 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3433,8 +3433,11 @@ impl<'a> Parser<'a> { pats.push(self.parse_pat()?); if self.token == token::OrOr { - let mut err = self.struct_span_err(self.span, "unexpected token `||` after pattern"); - err.span_suggestion(self.span, "use a single `|` to specify multiple patterns", "|".to_owned()); + let mut err = self.struct_span_err(self.span, + "unexpected token `||` after pattern"); + err.span_suggestion(self.span, + "use a single `|` to specify multiple patterns", + "|".to_owned()); err.emit(); self.bump(); } else if self.check(&token::BinOp(token::Or)) {