Skip to content

Commit d6afb4f

Browse files
committed
Auto merge of #15746 - pvalletbo:string-literals-diagnose, r=Veykril
String literals diagnose Continues the work from #15744 to add diagnosis errors to Str, ByteStr, and CStr literal kinds. Also replaces `unescape_char` for `unescape_byte` to use the correct method for Byte literals.
2 parents 2910dbf + 6845c80 commit d6afb4f

9 files changed

+177
-21
lines changed

crates/parser/src/lexed_str.rs

+40-1
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ impl<'a> Converter<'a> {
274274
let text = &self.res.text[self.offset + 2..][..len - 2];
275275
let i = text.rfind('\'').unwrap();
276276
let text = &text[..i];
277-
if let Err(e) = rustc_lexer::unescape::unescape_char(text) {
277+
if let Err(e) = rustc_lexer::unescape::unescape_byte(text) {
278278
err = error_to_diagnostic_message(e, Mode::Byte);
279279
}
280280
}
@@ -284,18 +284,33 @@ impl<'a> Converter<'a> {
284284
rustc_lexer::LiteralKind::Str { terminated } => {
285285
if !terminated {
286286
err = "Missing trailing `\"` symbol to terminate the string literal";
287+
} else {
288+
let text = &self.res.text[self.offset + 1..][..len - 1];
289+
let i = text.rfind('"').unwrap();
290+
let text = &text[..i];
291+
err = unescape_string_error_message(text, Mode::Str);
287292
}
288293
STRING
289294
}
290295
rustc_lexer::LiteralKind::ByteStr { terminated } => {
291296
if !terminated {
292297
err = "Missing trailing `\"` symbol to terminate the byte string literal";
298+
} else {
299+
let text = &self.res.text[self.offset + 2..][..len - 2];
300+
let i = text.rfind('"').unwrap();
301+
let text = &text[..i];
302+
err = unescape_string_error_message(text, Mode::ByteStr);
293303
}
294304
BYTE_STRING
295305
}
296306
rustc_lexer::LiteralKind::CStr { terminated } => {
297307
if !terminated {
298308
err = "Missing trailing `\"` symbol to terminate the string literal";
309+
} else {
310+
let text = &self.res.text[self.offset + 2..][..len - 2];
311+
let i = text.rfind('"').unwrap();
312+
let text = &text[..i];
313+
err = unescape_string_error_message(text, Mode::CStr);
299314
}
300315
C_STRING
301316
}
@@ -360,3 +375,27 @@ fn error_to_diagnostic_message(error: EscapeError, mode: Mode) -> &'static str {
360375
EscapeError::MultipleSkippedLinesWarning => "",
361376
}
362377
}
378+
379+
fn unescape_string_error_message(text: &str, mode: Mode) -> &'static str {
380+
let mut error_message = "";
381+
match mode {
382+
Mode::CStr => {
383+
rustc_lexer::unescape::unescape_c_string(text, mode, &mut |_, res| {
384+
if let Err(e) = res {
385+
error_message = error_to_diagnostic_message(e, mode);
386+
}
387+
});
388+
}
389+
Mode::ByteStr | Mode::Str => {
390+
rustc_lexer::unescape::unescape_literal(text, mode, &mut |_, res| {
391+
if let Err(e) = res {
392+
error_message = error_to_diagnostic_message(e, mode);
393+
}
394+
});
395+
}
396+
_ => {
397+
// Other Modes are not supported yet or do not apply
398+
}
399+
}
400+
error_message
401+
}

crates/parser/test_data/lexer/err/byte_char_literals.rast

+11-17
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ BYTE "b'\\'a'" error: character literal may only contain one codepoint
2222
WHITESPACE "\n"
2323
BYTE "b'\\0a'" error: character literal may only contain one codepoint
2424
WHITESPACE "\n"
25-
BYTE "b'\\u{0}x'" error: character literal may only contain one codepoint
25+
BYTE "b'\\u{0}x'" error: unicode escape in byte string
2626
WHITESPACE "\n"
27-
BYTE "b'\\u{1F63b}}'" error: character literal may only contain one codepoint
27+
BYTE "b'\\u{1F63b}}'" error: unicode escape in byte string
2828
WHITESPACE "\n"
2929
BYTE "b'\\v'" error: unknown byte escape
3030
WHITESPACE "\n"
@@ -50,12 +50,6 @@ BYTE "b'\\x🦀'" error: invalid character in numeric character escape
5050
WHITESPACE "\n"
5151
BYTE "b'\\xtt'" error: invalid character in numeric character escape
5252
WHITESPACE "\n"
53-
BYTE "b'\\xff'" error: out of range hex escape
54-
WHITESPACE "\n"
55-
BYTE "b'\\xFF'" error: out of range hex escape
56-
WHITESPACE "\n"
57-
BYTE "b'\\x80'" error: out of range hex escape
58-
WHITESPACE "\n"
5953
BYTE "b'\\u'" error: incorrect unicode escape sequence
6054
WHITESPACE "\n"
6155
BYTE "b'\\u[0123]'" error: incorrect unicode escape sequence
@@ -72,21 +66,21 @@ BYTE "b'\\u{_0000}'" error: invalid start of unicode escape
7266
WHITESPACE "\n"
7367
BYTE "b'\\u{0000000}'" error: overlong unicode escape
7468
WHITESPACE "\n"
75-
BYTE "b'\\u{FFFFFF}'" error: invalid unicode character escape
69+
BYTE "b'\\u{FFFFFF}'" error: unicode escape in byte string
7670
WHITESPACE "\n"
77-
BYTE "b'\\u{ffffff}'" error: invalid unicode character escape
71+
BYTE "b'\\u{ffffff}'" error: unicode escape in byte string
7872
WHITESPACE "\n"
79-
BYTE "b'\\u{ffffff}'" error: invalid unicode character escape
73+
BYTE "b'\\u{ffffff}'" error: unicode escape in byte string
8074
WHITESPACE "\n"
81-
BYTE "b'\\u{DC00}'" error: invalid unicode character escape
75+
BYTE "b'\\u{DC00}'" error: unicode escape in byte string
8276
WHITESPACE "\n"
83-
BYTE "b'\\u{DDDD}'" error: invalid unicode character escape
77+
BYTE "b'\\u{DDDD}'" error: unicode escape in byte string
8478
WHITESPACE "\n"
85-
BYTE "b'\\u{DFFF}'" error: invalid unicode character escape
79+
BYTE "b'\\u{DFFF}'" error: unicode escape in byte string
8680
WHITESPACE "\n"
87-
BYTE "b'\\u{D800}'" error: invalid unicode character escape
81+
BYTE "b'\\u{D800}'" error: unicode escape in byte string
8882
WHITESPACE "\n"
89-
BYTE "b'\\u{DAAA}'" error: invalid unicode character escape
83+
BYTE "b'\\u{DAAA}'" error: unicode escape in byte string
9084
WHITESPACE "\n"
91-
BYTE "b'\\u{DBFF}'" error: invalid unicode character escape
85+
BYTE "b'\\u{DBFF}'" error: unicode escape in byte string
9286
WHITESPACE "\n"

crates/parser/test_data/lexer/err/byte_char_literals.rs

-3
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ b'\xx'
2525
b'\xы'
2626
b'\x🦀'
2727
b'\xtt'
28-
b'\xff'
29-
b'\xFF'
30-
b'\x80'
3128
b'\u'
3229
b'\u[0123]'
3330
b'\u{0x}'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
BYTE_STRING "b\"\\💩\"" error: unknown byte escape
2+
WHITESPACE "\n"
3+
BYTE_STRING "b\"\\●\"" error: unknown byte escape
4+
WHITESPACE "\n"
5+
BYTE_STRING "b\"\\u{_0000}\"" error: invalid start of unicode escape
6+
WHITESPACE "\n"
7+
BYTE_STRING "b\"\\u{0000000}\"" error: overlong unicode escape
8+
WHITESPACE "\n"
9+
BYTE_STRING "b\"\\u{FFFFFF}\"" error: unicode escape in byte string
10+
WHITESPACE "\n"
11+
BYTE_STRING "b\"\\u{ffffff}\"" error: unicode escape in byte string
12+
WHITESPACE "\n"
13+
BYTE_STRING "b\"\\u{ffffff}\"" error: unicode escape in byte string
14+
WHITESPACE "\n"
15+
BYTE_STRING "b\"\\u{DC00}\"" error: unicode escape in byte string
16+
WHITESPACE "\n"
17+
BYTE_STRING "b\"\\u{DDDD}\"" error: unicode escape in byte string
18+
WHITESPACE "\n"
19+
BYTE_STRING "b\"\\u{DFFF}\"" error: unicode escape in byte string
20+
WHITESPACE "\n"
21+
BYTE_STRING "b\"\\u{D800}\"" error: unicode escape in byte string
22+
WHITESPACE "\n"
23+
BYTE_STRING "b\"\\u{DAAA}\"" error: unicode escape in byte string
24+
WHITESPACE "\n"
25+
BYTE_STRING "b\"\\u{DBFF}\"" error: unicode escape in byte string
26+
WHITESPACE "\n"
27+
BYTE_STRING "b\"\\xы\"" error: invalid character in numeric character escape
28+
WHITESPACE "\n"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
b"\💩"
2+
b"\●"
3+
b"\u{_0000}"
4+
b"\u{0000000}"
5+
b"\u{FFFFFF}"
6+
b"\u{ffffff}"
7+
b"\u{ffffff}"
8+
b"\u{DC00}"
9+
b"\u{DDDD}"
10+
b"\u{DFFF}"
11+
b"\u{D800}"
12+
b"\u{DAAA}"
13+
b"\u{DBFF}"
14+
b"\xы"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
C_STRING "c\"\\💩\"" error: unknown character escape
2+
WHITESPACE "\n"
3+
C_STRING "c\"\\●\"" error: unknown character escape
4+
WHITESPACE "\n"
5+
C_STRING "c\"\\u{_0000}\"" error: invalid start of unicode escape
6+
WHITESPACE "\n"
7+
C_STRING "c\"\\u{0000000}\"" error: overlong unicode escape
8+
WHITESPACE "\n"
9+
C_STRING "c\"\\u{FFFFFF}\"" error: invalid unicode character escape
10+
WHITESPACE "\n"
11+
C_STRING "c\"\\u{ffffff}\"" error: invalid unicode character escape
12+
WHITESPACE "\n"
13+
C_STRING "c\"\\u{ffffff}\"" error: invalid unicode character escape
14+
WHITESPACE "\n"
15+
C_STRING "c\"\\u{DC00}\"" error: invalid unicode character escape
16+
WHITESPACE "\n"
17+
C_STRING "c\"\\u{DDDD}\"" error: invalid unicode character escape
18+
WHITESPACE "\n"
19+
C_STRING "c\"\\u{DFFF}\"" error: invalid unicode character escape
20+
WHITESPACE "\n"
21+
C_STRING "c\"\\u{D800}\"" error: invalid unicode character escape
22+
WHITESPACE "\n"
23+
C_STRING "c\"\\u{DAAA}\"" error: invalid unicode character escape
24+
WHITESPACE "\n"
25+
C_STRING "c\"\\u{DBFF}\"" error: invalid unicode character escape
26+
WHITESPACE "\n"
27+
C_STRING "c\"\\xы\"" error: invalid character in numeric character escape
28+
WHITESPACE "\n"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
c"\💩"
2+
c"\●"
3+
c"\u{_0000}"
4+
c"\u{0000000}"
5+
c"\u{FFFFFF}"
6+
c"\u{ffffff}"
7+
c"\u{ffffff}"
8+
c"\u{DC00}"
9+
c"\u{DDDD}"
10+
c"\u{DFFF}"
11+
c"\u{D800}"
12+
c"\u{DAAA}"
13+
c"\u{DBFF}"
14+
c"\xы"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
STRING "\"\\💩\"" error: unknown character escape
2+
WHITESPACE "\n"
3+
STRING "\"\\●\"" error: unknown character escape
4+
WHITESPACE "\n"
5+
STRING "\"\\u{_0000}\"" error: invalid start of unicode escape
6+
WHITESPACE "\n"
7+
STRING "\"\\u{0000000}\"" error: overlong unicode escape
8+
WHITESPACE "\n"
9+
STRING "\"\\u{FFFFFF}\"" error: invalid unicode character escape
10+
WHITESPACE "\n"
11+
STRING "\"\\u{ffffff}\"" error: invalid unicode character escape
12+
WHITESPACE "\n"
13+
STRING "\"\\u{ffffff}\"" error: invalid unicode character escape
14+
WHITESPACE "\n"
15+
STRING "\"\\u{DC00}\"" error: invalid unicode character escape
16+
WHITESPACE "\n"
17+
STRING "\"\\u{DDDD}\"" error: invalid unicode character escape
18+
WHITESPACE "\n"
19+
STRING "\"\\u{DFFF}\"" error: invalid unicode character escape
20+
WHITESPACE "\n"
21+
STRING "\"\\u{D800}\"" error: invalid unicode character escape
22+
WHITESPACE "\n"
23+
STRING "\"\\u{DAAA}\"" error: invalid unicode character escape
24+
WHITESPACE "\n"
25+
STRING "\"\\u{DBFF}\"" error: invalid unicode character escape
26+
WHITESPACE "\n"
27+
STRING "\"\\xы\"" error: invalid character in numeric character escape
28+
WHITESPACE "\n"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"\💩"
2+
"\●"
3+
"\u{_0000}"
4+
"\u{0000000}"
5+
"\u{FFFFFF}"
6+
"\u{ffffff}"
7+
"\u{ffffff}"
8+
"\u{DC00}"
9+
"\u{DDDD}"
10+
"\u{DFFF}"
11+
"\u{D800}"
12+
"\u{DAAA}"
13+
"\u{DBFF}"
14+
"\xы"

0 commit comments

Comments
 (0)