7500: Fix ast::String::value not properly escaping in some cases r=Veykril a=Veykril

Fixes #7496
bors r+


Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
bors[bot] 2021-01-30 17:12:56 +00:00 committed by GitHub
commit 286d90de2d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -173,7 +173,7 @@ impl ast::String {
buf.capacity() == 0,
) {
(Ok(c), false) => buf.push(c),
(Ok(c), true) if Some(c) == text_iter.next() => (),
(Ok(c), true) if char_range.len() == 1 && Some(c) == text_iter.next() => (),
(Ok(c), true) => {
buf.reserve_exact(text.len());
buf.push_str(&text[..char_range.start]);
@ -659,7 +659,7 @@ impl Radix {
#[cfg(test)]
mod tests {
use crate::ast::{make, FloatNumber, IntNumber};
use crate::ast::{self, make, FloatNumber, IntNumber};
fn check_float_suffix<'a>(lit: &str, expected: impl Into<Option<&'a str>>) {
assert_eq!(FloatNumber { syntax: make::tokens::literal(lit) }.suffix(), expected.into());
@ -692,4 +692,21 @@ mod tests {
check_int_suffix("0o11u32", "u32");
check_int_suffix("0xffu32", "u32");
}
fn check_string_value<'a>(lit: &str, expected: impl Into<Option<&'a str>>) {
assert_eq!(
ast::String { syntax: make::tokens::literal(&format!("\"{}\"", lit)) }
.value()
.as_deref(),
expected.into()
);
}
#[test]
fn test_string_escape() {
check_string_value(r"foobar", "foobar");
check_string_value(r"\foobar", None);
check_string_value(r"\nfoobar", "\nfoobar");
check_string_value(r"C:\\Windows\\System32\\", "C:\\Windows\\System32\\");
}
}