Skip to content

Commit e1aeb7f

Browse files
committed
fix: handle errors for string byte string and c_string
1 parent 677e6f3 commit e1aeb7f

File tree

7 files changed

+167
-1
lines changed

7 files changed

+167
-1
lines changed

crates/parser/src/lexed_str.rs

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
//! Note that these tokens, unlike the tokens we feed into the parser, do
99
//! include info about comments and whitespace.
1010
11-
use rustc_dependencies::lexer as rustc_lexer;
11+
use rustc_dependencies::lexer::{
12+
self as rustc_lexer,
13+
unescape::{unescape_c_string, unescape_literal},
14+
};
1215

1316
use std::ops;
1417

@@ -284,18 +287,45 @@ impl<'a> Converter<'a> {
284287
rustc_lexer::LiteralKind::Str { terminated } => {
285288
if !terminated {
286289
err = "Missing trailing `\"` symbol to terminate the string literal";
290+
} else {
291+
let text = &self.res.text[self.offset + 1..][..len - 1];
292+
let i = text.rfind('"').unwrap();
293+
let text = &text[..i];
294+
rustc_lexer::unescape::unescape_literal(text, Mode::Str, &mut |_, res| {
295+
if let Err(e) = res {
296+
err = error_to_diagnostic_message(e, Mode::Str);
297+
}
298+
});
287299
}
288300
STRING
289301
}
290302
rustc_lexer::LiteralKind::ByteStr { terminated } => {
291303
if !terminated {
292304
err = "Missing trailing `\"` symbol to terminate the byte string literal";
305+
} else {
306+
let text = &self.res.text[self.offset + 2..][..len - 2];
307+
let i = text.rfind('"').unwrap();
308+
let text = &text[..i];
309+
rustc_lexer::unescape::unescape_literal(text, Mode::ByteStr, &mut |_, res| {
310+
if let Err(e) = res {
311+
err = error_to_diagnostic_message(e, Mode::ByteStr);
312+
}
313+
})
293314
}
294315
BYTE_STRING
295316
}
296317
rustc_lexer::LiteralKind::CStr { terminated } => {
297318
if !terminated {
298319
err = "Missing trailing `\"` symbol to terminate the string literal";
320+
} else {
321+
let text = &self.res.text[self.offset + 2..][..len - 2];
322+
let i = text.rfind('"').unwrap();
323+
let text = &text[..i];
324+
rustc_lexer::unescape::unescape_c_string(text, Mode::CStr, &mut |_, res| {
325+
if let Err(e) = res {
326+
err = error_to_diagnostic_message(e, Mode::CStr);
327+
}
328+
})
299329
}
300330
C_STRING
301331
}
@@ -360,3 +390,13 @@ fn error_to_diagnostic_message(error: EscapeError, mode: Mode) -> &'static str {
360390
EscapeError::MultipleSkippedLinesWarning => "",
361391
}
362392
}
393+
394+
fn fill_unescape_string_error(text: &str, mode: Mode, mut error_message: &str) {
395+
396+
rustc_lexer::unescape::unescape_c_string(text, mode, &mut |_, res| {
397+
if let Err(e) = res {
398+
error_message = error_to_diagnostic_message(e, mode);
399+
}
400+
});
401+
}
402+
Lines changed: 28 additions & 0 deletions
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"
Lines changed: 14 additions & 0 deletions
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ы"
Lines changed: 28 additions & 0 deletions
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"
Lines changed: 14 additions & 0 deletions
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ы"
Lines changed: 28 additions & 0 deletions
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"
Lines changed: 14 additions & 0 deletions
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)