diff options
| author | Graydon Hoare <graydon@mozilla.com> | 2012-05-31 15:31:13 -0700 |
|---|---|---|
| committer | Graydon Hoare <graydon@mozilla.com> | 2012-05-31 15:32:29 -0700 |
| commit | 57f399bd638c211005e8565609e928db33ebf864 (patch) | |
| tree | 05d9289af9058f1509f976c1c73e722ab87cec1b /src/libsyntax | |
| parent | c2ce2741a773b94d3a8f7293cb598322bc61f89d (diff) | |
| download | rust-57f399bd638c211005e8565609e928db33ebf864.tar.gz rust-57f399bd638c211005e8565609e928db33ebf864.zip | |
Implement 2 kinds of char / str escaping. Use in rustc. Close #2306.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/parse/lexer.rs | 1 | ||||
| -rw-r--r-- | src/libsyntax/parse/token.rs | 13 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 26 |
3 files changed, 8 insertions, 32 deletions
diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs index 63dc85e865d..bef5f6d1fd8 100644 --- a/src/libsyntax/parse/lexer.rs +++ b/src/libsyntax/parse/lexer.rs @@ -434,6 +434,7 @@ fn next_token_inner(rdr: reader) -> token::token { 't' { c2 = '\t'; } '\\' { c2 = '\\'; } '\'' { c2 = '\''; } + '"' { c2 = '"'; } 'x' { c2 = scan_numeric_escape(rdr, 2u); } 'u' { c2 = scan_numeric_escape(rdr, 4u); } 'U' { c2 = scan_numeric_escape(rdr, 8u); } diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 1c6f240cf82..044509a5144 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -122,11 +122,7 @@ fn to_str(in: interner<str>, t: token) -> str { /* Literals */ LIT_INT(c, ast::ty_char) { - // FIXME: escape. - let mut tmp = "'"; - str::push_char(tmp, c as char); - str::push_char(tmp, '\''); - ret tmp; + ret "'" + char::escape_default(c as char) + "'"; } LIT_INT(i, t) { ret int::to_str(i as int, 10u) + ast_util::int_ty_to_str(t); @@ -138,10 +134,11 @@ fn to_str(in: interner<str>, t: token) -> str { ret interner::get::<str>(in, s) + ast_util::float_ty_to_str(t); } - LIT_STR(s) { // FIXME: escape. - ret "\"" + interner::get::<str>(in, s) + "\""; + LIT_STR(s) { + ret "\"" + + str::escape_default(interner::get::<str>(in, s)) + + "\""; } - /* Name components */ IDENT(s, _) { ret interner::get::<str>(in, s); diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 8206bfd2a4a..dd935533b7f 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1609,7 +1609,7 @@ fn print_literal(s: ps, &&lit: @ast::lit) { alt lit.node { ast::lit_str(st) { print_string(s, st); } ast::lit_int(ch, ast::ty_char) { - word(s.s, "'" + escape_str(str::from_char(ch as char), '\'') + "'"); + word(s.s, "'" + char::escape_default(ch as char) + "'"); } ast::lit_int(i, t) { if i < 0_i64 { @@ -1714,32 +1714,10 @@ fn print_comment(s: ps, cmnt: comments::cmnt) { fn print_string(s: ps, st: str) { word(s.s, "\""); - word(s.s, escape_str(st, '"')); + word(s.s, str::escape_default(st)); word(s.s, "\""); } -fn escape_str(st: str, to_escape: char) -> str { - let mut out: str = ""; - let len = str::len(st); - let mut i = 0u; - while i < len { - alt st[i] as char { - '\n' { out += "\\n"; } - '\t' { out += "\\t"; } - '\r' { out += "\\r"; } - '\\' { out += "\\\\"; } - cur { - if cur == to_escape { out += "\\"; } - // FIXME some (or all?) non-ascii things should be escaped - // (See #2306) - str::push_char(out, cur); - } - } - i += 1u; - } - ret out; -} - fn to_str<T>(t: T, f: fn@(ps, T)) -> str { let buffer = io::mem_buffer(); let s = rust_printer(io::mem_buffer_writer(buffer)); |
