From 6c2ce5515064011b2fde064ff18f178465383bce Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sat, 30 Jan 2021 16:31:19 +0100 Subject: Fix ast::String::value not properly escaping in some cases --- crates/syntax/src/ast/token_ext.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/crates/syntax/src/ast/token_ext.rs b/crates/syntax/src/ast/token_ext.rs index 5e07ec7d1..044e3e5e8 100644 --- a/crates/syntax/src/ast/token_ext.rs +++ b/crates/syntax/src/ast/token_ext.rs @@ -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>) { 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>) { + 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\\"); + } } -- cgit v1.2.3