diff options
| author | Huon Wilson <dbau.pp+github@gmail.com> | 2014-05-01 23:35:06 +1000 |
|---|---|---|
| committer | Huon Wilson <dbau.pp+github@gmail.com> | 2014-05-02 22:54:55 +1000 |
| commit | 5c424ba34ad8b45cfba4619832d23b0278ede696 (patch) | |
| tree | bd4d05b358352d1b306044a04545386bf3ded77e | |
| parent | 239557de6de72748a5c7604081b202d53f7d9ac9 (diff) | |
| download | rust-5c424ba34ad8b45cfba4619832d23b0278ede696.tar.gz rust-5c424ba34ad8b45cfba4619832d23b0278ede696.zip | |
syntax: store char literals/tokens as `char`s rather than u32s.
Clearly storing them as `char` is semantically nicer, but this also fixes a bug whereby `quote_expr!(cx, 'a')` wasn't working, because the code created by quotation was not matching the actual AST definitions.
| -rw-r--r-- | src/librustdoc/clean.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/ast.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/ext/bytes.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax/ext/concat.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/ext/format.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/parse/lexer.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax/parse/token.rs | 5 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 3 |
8 files changed, 13 insertions, 19 deletions
diff --git a/src/librustdoc/clean.rs b/src/librustdoc/clean.rs index cabfe695df7..06d768b4342 100644 --- a/src/librustdoc/clean.rs +++ b/src/librustdoc/clean.rs @@ -26,7 +26,6 @@ use rustc::metadata::decoder; use std::local_data; use std::strbuf::StrBuf; -use std; use core; use doctree; @@ -1246,7 +1245,7 @@ fn lit_to_str(lit: &ast::Lit) -> ~str { match lit.node { ast::LitStr(ref st, _) => st.get().to_owned(), ast::LitBinary(ref data) => format!("{:?}", data.as_slice()), - ast::LitChar(c) => "'".to_owned() + std::char::from_u32(c).unwrap().to_str() + "'", + ast::LitChar(c) => format!("'{}'", c), ast::LitInt(i, _t) => i.to_str(), ast::LitUint(u, _t) => u.to_str(), ast::LitIntUnsuffixed(i) => i.to_str(), diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 45f753d0e98..49617a44a86 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -653,7 +653,7 @@ pub type Lit = Spanned<Lit_>; pub enum Lit_ { LitStr(InternedString, StrStyle), LitBinary(Rc<Vec<u8> >), - LitChar(u32), + LitChar(char), LitInt(i64, IntTy), LitUint(u64, UintTy), LitIntUnsuffixed(i64), diff --git a/src/libsyntax/ext/bytes.rs b/src/libsyntax/ext/bytes.rs index f4680b27084..c6349d616ec 100644 --- a/src/libsyntax/ext/bytes.rs +++ b/src/libsyntax/ext/bytes.rs @@ -16,8 +16,6 @@ use ext::base::*; use ext::base; use ext::build::AstBuilder; -use std::char; - pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) -> ~base::MacResult { // Gather all argument expressions let exprs = match get_exprs_from_tts(cx, sp, tts) { @@ -59,7 +57,7 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) -> // char literal, push to vector expression ast::LitChar(v) => { - if char::from_u32(v).unwrap().is_ascii() { + if v.is_ascii() { bytes.push(cx.expr_u8(expr.span, v as u8)); } else { cx.span_err(expr.span, "non-ascii char literal in bytes!") diff --git a/src/libsyntax/ext/concat.rs b/src/libsyntax/ext/concat.rs index 123271c5b5e..fe7fa636e7d 100644 --- a/src/libsyntax/ext/concat.rs +++ b/src/libsyntax/ext/concat.rs @@ -14,7 +14,6 @@ use ext::base; use ext::build::AstBuilder; use parse::token; -use std::char; use std::strbuf::StrBuf; pub fn expand_syntax_ext(cx: &mut base::ExtCtxt, @@ -35,7 +34,7 @@ pub fn expand_syntax_ext(cx: &mut base::ExtCtxt, accumulator.push_str(s.get()); } ast::LitChar(c) => { - accumulator.push_char(char::from_u32(c).unwrap()); + accumulator.push_char(c); } ast::LitInt(i, _) | ast::LitIntUnsuffixed(i) => { accumulator.push_str(format!("{}", i)); diff --git a/src/libsyntax/ext/format.rs b/src/libsyntax/ext/format.rs index 84021f6362b..df79b105444 100644 --- a/src/libsyntax/ext/format.rs +++ b/src/libsyntax/ext/format.rs @@ -561,7 +561,7 @@ impl<'a, 'b> Context<'a, 'b> { // Translate the format let fill = match arg.format.fill { Some(c) => c, None => ' ' }; - let fill = self.ecx.expr_lit(sp, ast::LitChar(fill as u32)); + let fill = self.ecx.expr_lit(sp, ast::LitChar(fill)); let align = match arg.format.align { parse::AlignLeft => { self.ecx.path_global(sp, self.parsepath("AlignLeft")) diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs index 992d289b4e9..c1f6e21f923 100644 --- a/src/libsyntax/parse/lexer.rs +++ b/src/libsyntax/parse/lexer.rs @@ -874,7 +874,7 @@ fn next_token_inner(rdr: &mut StringReader) -> token::Token { "unterminated character constant".to_owned()); } bump(rdr); // advance curr past token - return token::LIT_CHAR(c2 as u32); + return token::LIT_CHAR(c2); } '"' => { let mut accum_str = StrBuf::new(); @@ -1097,17 +1097,17 @@ mod test { #[test] fn character_a() { assert_eq!(setup(&mk_sh(), "'a'".to_owned()).next_token().tok, - token::LIT_CHAR('a' as u32)); + token::LIT_CHAR('a')); } #[test] fn character_space() { assert_eq!(setup(&mk_sh(), "' '".to_owned()).next_token().tok, - token::LIT_CHAR(' ' as u32)); + token::LIT_CHAR(' ')); } #[test] fn character_escaped() { assert_eq!(setup(&mk_sh(), "'\\n'".to_owned()).next_token().tok, - token::LIT_CHAR('\n' as u32)); + token::LIT_CHAR('\n')); } #[test] fn lifetime_name() { @@ -1128,7 +1128,7 @@ mod test { #[test] fn nested_block_comments() { assert_eq!(setup(&mk_sh(), "/* /* */ */'a'".to_owned()).next_token().tok, - token::LIT_CHAR('a' as u32)); + token::LIT_CHAR('a')); } } diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 611ce7cc527..519a7d141d3 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -18,7 +18,6 @@ use util::interner; use serialize::{Decodable, Decoder, Encodable, Encoder}; use std::cast; -use std::char; use std::fmt; use std::local_data; use std::path::BytesContainer; @@ -81,7 +80,7 @@ pub enum Token { DOLLAR, /* Literals */ - LIT_CHAR(u32), + LIT_CHAR(char), LIT_INT(i64, ast::IntTy), LIT_UINT(u64, ast::UintTy), LIT_INT_UNSUFFIXED(i64), @@ -195,7 +194,7 @@ pub fn to_str(t: &Token) -> ~str { /* Literals */ LIT_CHAR(c) => { let mut res = StrBuf::from_str("'"); - char::from_u32(c).unwrap().escape_default(|c| { + c.escape_default(|c| { res.push_char(c); }); res.push_char('\''); diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 7ea4dcbf28a..afb66ab8317 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -26,7 +26,6 @@ use print::pp::{Breaks, Consistent, Inconsistent, eof}; use print::pp; use std::cast; -use std::char; use std::io::{IoResult, MemWriter}; use std::io; use std::rc::Rc; @@ -2196,7 +2195,7 @@ impl<'a> State<'a> { ast::LitStr(ref st, style) => self.print_string(st.get(), style), ast::LitChar(ch) => { let mut res = StrBuf::from_str("'"); - char::from_u32(ch).unwrap().escape_default(|c| res.push_char(c)); + ch.escape_default(|c| res.push_char(c)); res.push_char('\''); word(&mut self.s, res.into_owned()) } |
