Skip to content

Commit 63dc7da

Browse files
committed
Use char byte calculation using existing iterator
1 parent 735ac05 commit 63dc7da

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

src/libsyntax/parse/unescape.rs

+13-11
Original file line numberDiff line numberDiff line change
@@ -287,24 +287,26 @@ fn unescape_raw_str_or_byte_str<F>(literal_text: &str, mode: Mode, callback: &mu
287287
where
288288
F: FnMut(Range<usize>, Result<char, EscapeError>),
289289
{
290-
let mut byte_offset: usize = 0;
290+
assert!(mode.in_double_quotes());
291+
let initial_len = literal_text.len();
291292

292-
let mut chars = literal_text.chars().peekable();
293+
let mut chars = literal_text.chars();
293294
while let Some(curr) = chars.next() {
294-
let (result, scanned) = match (curr, chars.peek()) {
295+
let start = initial_len - chars.as_str().len() - curr.len_utf8();
296+
297+
let result = match (curr, chars.clone().next()) {
295298
('\r', Some('\n')) => {
296299
chars.next();
297-
(Ok('\n'), [Some('\r'), Some('\n')])
300+
Ok('\n')
298301
},
299-
('\r', _) =>
300-
(Err(EscapeError::BareCarriageReturn), [Some('\r'), None]),
302+
('\r', _) => Err(EscapeError::BareCarriageReturn),
301303
(c, _) if mode.is_bytes() && !c.is_ascii() =>
302-
(Err(EscapeError::NonAsciiCharInByteString), [Some(c), None]),
303-
(c, _) => (Ok(c), [Some(c), None]),
304+
Err(EscapeError::NonAsciiCharInByteString),
305+
(c, _) => Ok(c),
304306
};
305-
let len_utf8: usize = scanned.iter().filter_map(|&x| x).map(char::len_utf8).sum();
306-
callback(byte_offset..(byte_offset + len_utf8), result);
307-
byte_offset += len_utf8;
307+
let end = initial_len - chars.as_str().len();
308+
309+
callback(start..end, result);
308310
}
309311
}
310312

0 commit comments

Comments
 (0)