diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2018-12-27 11:21:47 -0800 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2018-12-31 09:44:58 -0800 |
| commit | b416f1398fa19b4f1fd9bc6418ea32e340d8379c (patch) | |
| tree | fcbcc6761799171dd0377c4e5c5b48289d3cf176 | |
| parent | 7edc434b72e6e1b46b625c3019e8227dc7a8e2e8 (diff) | |
| download | rust-b416f1398fa19b4f1fd9bc6418ea32e340d8379c.tar.gz rust-b416f1398fa19b4f1fd9bc6418ea32e340d8379c.zip | |
Use structured suggestion for braceless unicode escape squence
| -rw-r--r-- | src/libsyntax/parse/lexer/mod.rs | 36 | ||||
| -rw-r--r-- | src/libsyntax_ext/format.rs | 4 | ||||
| -rw-r--r-- | src/test/ui/fmt/format-string-error-2.stderr | 10 | ||||
| -rw-r--r-- | src/test/ui/parser/issue-23620-invalid-escapes.rs | 3 | ||||
| -rw-r--r-- | src/test/ui/parser/issue-23620-invalid-escapes.stderr | 10 |
5 files changed, 47 insertions, 16 deletions
diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index d13de002968..fb46f7a08b9 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -945,12 +945,36 @@ impl<'a> StringReader<'a> { self.scan_unicode_escape(delim) && !ascii_only } else { let span = self.mk_sp(start, self.pos); - self.sess.span_diagnostic - .struct_span_err(span, "incorrect unicode escape sequence") - .span_help(span, - "format of unicode escape sequences is \ - `\\u{…}`") - .emit(); + let mut suggestion = "\\u{".to_owned(); + let mut err = self.sess.span_diagnostic.struct_span_err( + span, + "incorrect unicode escape sequence", + ); + let mut i = 0; + while let (Some(ch), true) = (self.ch, i < 6) { + if ch.is_digit(16) { + suggestion.push(ch); + self.bump(); + i += 1; + } else { + break; + } + } + if i != 0 { + suggestion.push('}'); + err.span_suggestion_with_applicability( + self.mk_sp(start, self.pos), + "format of unicode escape sequences uses braces", + suggestion, + Applicability::MaybeIncorrect, + ); + } else { + err.span_help( + span, + "format of unicode escape sequences is `\\u{…}`", + ); + } + err.emit(); false }; if ascii_only { diff --git a/src/libsyntax_ext/format.rs b/src/libsyntax_ext/format.rs index 3a5f0ec07e7..c11f27f3ed5 100644 --- a/src/libsyntax_ext/format.rs +++ b/src/libsyntax_ext/format.rs @@ -845,8 +845,8 @@ pub fn expand_preparsed_format_args(ecx: &mut ExtCtxt, } } else if next_c.is_digit(16) { skips.push(next_pos); - // We suggest adding `{` and `}` when appropriate, accept it here as if it - // were correct + // We suggest adding `{` and `}` when appropriate, accept it here as if + // it were correct let mut i = 0; // consume up to 6 hexanumeric chars while let (Some((next_pos, c)), _) = (s.next(), i < 6) { if c.is_digit(16) { diff --git a/src/test/ui/fmt/format-string-error-2.stderr b/src/test/ui/fmt/format-string-error-2.stderr index ae62ed66338..baab8529940 100644 --- a/src/test/ui/fmt/format-string-error-2.stderr +++ b/src/test/ui/fmt/format-string-error-2.stderr @@ -2,13 +2,9 @@ error: incorrect unicode escape sequence --> $DIR/format-string-error-2.rs:77:20 | LL | println!("/x7B}/u8 {", 1); - | ^^ - | -help: format of unicode escape sequences is `/u{…}` - --> $DIR/format-string-error-2.rs:77:20 - | -LL | println!("/x7B}/u8 {", 1); - | ^^ + | ^^- + | | + | help: format of unicode escape sequences uses braces: `/u{8}` error: invalid format string: expected `'}'`, found `'a'` --> $DIR/format-string-error-2.rs:5:5 diff --git a/src/test/ui/parser/issue-23620-invalid-escapes.rs b/src/test/ui/parser/issue-23620-invalid-escapes.rs index 6895a926b4f..f8a2f1cc7e6 100644 --- a/src/test/ui/parser/issue-23620-invalid-escapes.rs +++ b/src/test/ui/parser/issue-23620-invalid-escapes.rs @@ -35,4 +35,7 @@ fn main() { //~^ ERROR invalid character in numeric character escape: //~^^ ERROR form of character escape may only be used with characters in the range [\x00-\x7f] //~^^^ ERROR incorrect unicode escape sequence + + let _ = "\u8f"; + //~^ ERROR incorrect unicode escape sequence } diff --git a/src/test/ui/parser/issue-23620-invalid-escapes.stderr b/src/test/ui/parser/issue-23620-invalid-escapes.stderr index b1a5764e891..025b392627d 100644 --- a/src/test/ui/parser/issue-23620-invalid-escapes.stderr +++ b/src/test/ui/parser/issue-23620-invalid-escapes.stderr @@ -118,5 +118,13 @@ help: format of unicode escape sequences is `/u{…}` LL | let _ = "/xf /u"; | ^^ -error: aborting due to 17 previous errors +error: incorrect unicode escape sequence + --> $DIR/issue-23620-invalid-escapes.rs:39:14 + | +LL | let _ = "/u8f"; + | ^^-- + | | + | help: format of unicode escape sequences uses braces: `/u{8f}` + +error: aborting due to 18 previous errors |
