Auto merge of #27319 - diaphore:pr_debug_osstr_escape, r=alexcrichton

I had to modify some tests : since `wtf8buf_show` and `wtf8_show` were doing the exact same thing, I repurposed `wtf8_show` to `wtf8buf_show_str` which ensures `Wtf8Buf` `Debug`-formats the same as `str`.

`write_str_escaped` might also be shared amongst other `fmt` but I just left it there within `Wtf8::fmt` for review.
This commit is contained in:
bors 2015-07-28 10:28:45 +00:00
commit 4c371bb6de
2 changed files with 27 additions and 17 deletions

View File

@ -1287,7 +1287,7 @@ impl Debug for str {
fn fmt(&self, f: &mut Formatter) -> Result {
try!(write!(f, "\""));
for c in self.chars().flat_map(|c| c.escape_default()) {
try!(write!(f, "{}", c));
try!(f.write_char(c))
}
write!(f, "\"")
}
@ -1306,7 +1306,7 @@ impl Debug for char {
use char::CharExt;
try!(write!(f, "'"));
for c in self.escape_default() {
try!(write!(f, "{}", c));
try!(f.write_char(c))
}
write!(f, "'")
}

View File

@ -426,26 +426,36 @@ impl Ord for Wtf8 {
/// and surrogates as `\u` followed by four hexadecimal digits.
/// Example: `"a\u{D800}"` for a slice with code points [U+0061, U+D800]
impl fmt::Debug for Wtf8 {
fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
fn write_str_escaped(f: &mut fmt::Formatter, s: &str) -> fmt::Result {
use fmt::Write;
for c in s.chars().flat_map(|c| c.escape_default()) {
try!(f.write_char(c))
}
Ok(())
}
try!(formatter.write_str("\""));
let mut pos = 0;
loop {
match self.next_surrogate(pos) {
None => break,
Some((surrogate_pos, surrogate)) => {
try!(formatter.write_str(unsafe {
// the data in this slice is valid UTF-8, transmute to &str
mem::transmute(&self.bytes[pos .. surrogate_pos])
}));
try!(write_str_escaped(
formatter,
unsafe { str::from_utf8_unchecked(
&self.bytes[pos .. surrogate_pos]
)},
));
try!(write!(formatter, "\\u{{{:X}}}", surrogate));
pos = surrogate_pos + 3;
}
}
}
try!(formatter.write_str(unsafe {
// the data in this slice is valid UTF-8, transmute to &str
mem::transmute(&self.bytes[pos..])
}));
try!(write_str_escaped(
formatter,
unsafe { str::from_utf8_unchecked(&self.bytes[pos..]) },
));
formatter.write_str("\"")
}
}
@ -1083,9 +1093,9 @@ mod tests {
#[test]
fn wtf8buf_show() {
let mut string = Wtf8Buf::from_str("aé 💩");
let mut string = Wtf8Buf::from_str("a\té 💩\r");
string.push(CodePoint::from_u32(0xD800).unwrap());
assert_eq!(format!("{:?}", string), r#""aé 💩\u{D800}""#);
assert_eq!(format!("{:?}", string), r#""a\t\u{e9} \u{1f4a9}\r\u{D800}""#);
}
#[test]
@ -1094,10 +1104,10 @@ mod tests {
}
#[test]
fn wtf8_show() {
let mut string = Wtf8Buf::from_str("aé 💩");
string.push(CodePoint::from_u32(0xD800).unwrap());
assert_eq!(format!("{:?}", string), r#""aé 💩\u{D800}""#);
fn wtf8buf_show_str() {
let text = "a\té 💩\r";
let mut string = Wtf8Buf::from_str(text);
assert_eq!(format!("{:?}", text), format!("{:?}", string));
}
#[test]