diff options
| author | Corey Richardson <corey@octayn.net> | 2014-12-02 16:48:48 -0800 |
|---|---|---|
| committer | Corey Richardson <corey@octayn.net> | 2014-12-03 15:10:51 -0800 |
| commit | 2e1a50121ef265214c5e2a7d82fe40b4928575ab (patch) | |
| tree | 391319435315ac8bc9107694bd383967f4c04dc1 /src/libsyntax/parse/mod.rs | |
| parent | 3a325c666d2cb7e297bf3057ff2442f96a79428b (diff) | |
| download | rust-2e1a50121ef265214c5e2a7d82fe40b4928575ab.tar.gz rust-2e1a50121ef265214c5e2a7d82fe40b4928575ab.zip | |
syntax: support ES6-style unicode escapes
First half of bootstrapping https://github.com/rust-lang/rfcs/pull/446
Diffstat (limited to 'src/libsyntax/parse/mod.rs')
| -rw-r--r-- | src/libsyntax/parse/mod.rs | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index b46f7cdfe22..8d0c2de048a 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -393,16 +393,28 @@ pub fn char_lit(lit: &str) -> (char, int) { let msg = format!("lexer should have rejected a bad character escape {}", lit); let msg2 = msg.as_slice(); - let esc: |uint| -> Option<(char, int)> = |len| + fn esc(len: uint, lit: &str) -> Option<(char, int)> { num::from_str_radix(lit.slice(2, len), 16) .and_then(char::from_u32) - .map(|x| (x, len as int)); + .map(|x| (x, len as int)) + } + + let unicode_escape: || -> Option<(char, int)> = || + if lit.as_bytes()[2] == b'{' { + let idx = lit.find('}').expect(msg2); + let subslice = lit.slice(3, idx); + num::from_str_radix(subslice, 16) + .and_then(char::from_u32) + .map(|x| (x, subslice.char_len() as int + 4)) + } else { + esc(6, lit) + }; // Unicode escapes return match lit.as_bytes()[1] as char { - 'x' | 'X' => esc(4), - 'u' => esc(6), - 'U' => esc(10), + 'x' | 'X' => esc(4, lit), + 'u' => unicode_escape(), + 'U' => esc(10, lit), _ => None, }.expect(msg2); } |
