Skip to content

Commit 8889703

Browse files
authored
Auto merge of #36414 - nnethercote:char_lit, r=jseyfried
Improve char_lit's readability and speed This is my first contribution to rustc. Please let me know if I've done anything wrong. (I ran `make tidy` before making the pull request.)
2 parents 85592fb + 826f673 commit 8889703

File tree

1 file changed

+16
-19
lines changed

1 file changed

+16
-19
lines changed

src/libsyntax/parse/mod.rs

+16-19
Original file line numberDiff line numberDiff line change
@@ -287,29 +287,21 @@ pub fn char_lit(lit: &str) -> (char, isize) {
287287
use std::char;
288288

289289
let mut chars = lit.chars();
290-
let c = match (chars.next(), chars.next()) {
290+
match (chars.next(), chars.next()) {
291291
(Some(c), None) if c != '\\' => return (c, 1),
292292
(Some('\\'), Some(c)) => match c {
293-
'"' => Some('"'),
294-
'n' => Some('\n'),
295-
'r' => Some('\r'),
296-
't' => Some('\t'),
297-
'\\' => Some('\\'),
298-
'\'' => Some('\''),
299-
'0' => Some('\0'),
300-
_ => { None }
293+
'"' => return ('"', 2),
294+
'n' => return ('\n', 2),
295+
'r' => return ('\r', 2),
296+
't' => return ('\t', 2),
297+
'\\' => return ('\\', 2),
298+
'\'' => return ('\'', 2),
299+
'0' => return ('\0', 2),
300+
_ => {}
301301
},
302302
_ => panic!("lexer accepted invalid char escape `{}`", lit)
303303
};
304304

305-
match c {
306-
Some(x) => return (x, 2),
307-
None => { }
308-
}
309-
310-
let msg = format!("lexer should have rejected a bad character escape {}", lit);
311-
let msg2 = &msg[..];
312-
313305
fn esc(len: usize, lit: &str) -> Option<(char, isize)> {
314306
u32::from_str_radix(&lit[2..len], 16).ok()
315307
.and_then(char::from_u32)
@@ -318,7 +310,10 @@ pub fn char_lit(lit: &str) -> (char, isize) {
318310

319311
let unicode_escape = || -> Option<(char, isize)> {
320312
if lit.as_bytes()[2] == b'{' {
321-
let idx = lit.find('}').expect(msg2);
313+
let idx = lit.find('}').unwrap_or_else(|| {
314+
panic!("lexer should have rejected a bad character escape {}", lit)
315+
});
316+
322317
let subslice = &lit[3..idx];
323318
u32::from_str_radix(subslice, 16).ok()
324319
.and_then(char::from_u32)
@@ -334,7 +329,9 @@ pub fn char_lit(lit: &str) -> (char, isize) {
334329
'u' => unicode_escape(),
335330
'U' => esc(10, lit),
336331
_ => None,
337-
}.expect(msg2);
332+
}.unwrap_or_else(|| {
333+
panic!("lexer should have rejected a bad character escape {}", lit)
334+
})
338335
}
339336

340337
/// Parse a string representing a string literal into its final form. Does

0 commit comments

Comments
 (0)