about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-09-12 07:43:57 -0700
committerGitHub <noreply@github.com>2016-09-12 07:43:57 -0700
commit888970370a3f4b9e8be399869581422c67638d7b (patch)
tree85b2f525bff72888321cb2fd94148475b93643b3
parent85592fbe60ee4e6878bb1f11da0243c3a3a440f3 (diff)
parent826f673664023e79e86409296d3d67527c9b0a5a (diff)
downloadrust-888970370a3f4b9e8be399869581422c67638d7b.tar.gz
rust-888970370a3f4b9e8be399869581422c67638d7b.zip
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.)
-rw-r--r--src/libsyntax/parse/mod.rs35
1 files changed, 16 insertions, 19 deletions
diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs
index af95e44a567..a1eceb6921c 100644
--- a/src/libsyntax/parse/mod.rs
+++ b/src/libsyntax/parse/mod.rs
@@ -287,29 +287,21 @@ pub fn char_lit(lit: &str) -> (char, isize) {
     use std::char;
 
     let mut chars = lit.chars();
-    let c = match (chars.next(), chars.next()) {
+    match (chars.next(), chars.next()) {
         (Some(c), None) if c != '\\' => return (c, 1),
         (Some('\\'), Some(c)) => match c {
-            '"' => Some('"'),
-            'n' => Some('\n'),
-            'r' => Some('\r'),
-            't' => Some('\t'),
-            '\\' => Some('\\'),
-            '\'' => Some('\''),
-            '0' => Some('\0'),
-            _ => { None }
+            '"' => return ('"', 2),
+            'n' => return ('\n', 2),
+            'r' => return ('\r', 2),
+            't' => return ('\t', 2),
+            '\\' => return ('\\', 2),
+            '\'' => return ('\'', 2),
+            '0' => return ('\0', 2),
+            _ => {}
         },
         _ => panic!("lexer accepted invalid char escape `{}`", lit)
     };
 
-    match c {
-        Some(x) => return (x, 2),
-        None => { }
-    }
-
-    let msg = format!("lexer should have rejected a bad character escape {}", lit);
-    let msg2 = &msg[..];
-
     fn esc(len: usize, lit: &str) -> Option<(char, isize)> {
         u32::from_str_radix(&lit[2..len], 16).ok()
         .and_then(char::from_u32)
@@ -318,7 +310,10 @@ pub fn char_lit(lit: &str) -> (char, isize) {
 
     let unicode_escape = || -> Option<(char, isize)> {
         if lit.as_bytes()[2] == b'{' {
-            let idx = lit.find('}').expect(msg2);
+            let idx = lit.find('}').unwrap_or_else(|| {
+                panic!("lexer should have rejected a bad character escape {}", lit)
+            });
+
             let subslice = &lit[3..idx];
             u32::from_str_radix(subslice, 16).ok()
                 .and_then(char::from_u32)
@@ -334,7 +329,9 @@ pub fn char_lit(lit: &str) -> (char, isize) {
         'u' => unicode_escape(),
         'U' => esc(10, lit),
         _ => None,
-    }.expect(msg2);
+    }.unwrap_or_else(|| {
+        panic!("lexer should have rejected a bad character escape {}", lit)
+    })
 }
 
 /// Parse a string representing a string literal into its final form. Does