about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2018-12-27 11:21:47 -0800
committerEsteban Küber <esteban@kuber.com.ar>2018-12-31 09:44:58 -0800
commitb416f1398fa19b4f1fd9bc6418ea32e340d8379c (patch)
treefcbcc6761799171dd0377c4e5c5b48289d3cf176
parent7edc434b72e6e1b46b625c3019e8227dc7a8e2e8 (diff)
downloadrust-b416f1398fa19b4f1fd9bc6418ea32e340d8379c.tar.gz
rust-b416f1398fa19b4f1fd9bc6418ea32e340d8379c.zip
Use structured suggestion for braceless unicode escape squence
-rw-r--r--src/libsyntax/parse/lexer/mod.rs36
-rw-r--r--src/libsyntax_ext/format.rs4
-rw-r--r--src/test/ui/fmt/format-string-error-2.stderr10
-rw-r--r--src/test/ui/parser/issue-23620-invalid-escapes.rs3
-rw-r--r--src/test/ui/parser/issue-23620-invalid-escapes.stderr10
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