Emit proper error for escape sequence overflow
Before this commit, escape sequences above std::char::MAX ('\u{10ffff}') would overflow and cause a panic. This commit replaces an `unwrap` with `ok_or` and a clearer error message. This message will likely change in the future in order to better conform to the `dart-sass` implementation which currently also fails to cleanly handle this overflow. See https://github.com/kaj/rsass/pull/73
This commit is contained in:
parent
eea8bdbc25
commit
223dade62b
@ -121,8 +121,9 @@ fn escape<I: Iterator<Item = Token>>(
|
||||
Some(t) => t,
|
||||
None => return Ok(String::new()),
|
||||
};
|
||||
let mut span = first.pos();
|
||||
if first.kind == '\n' {
|
||||
return Err(("Expected escape sequence.", first.pos()).into());
|
||||
return Err(("Expected escape sequence.", span).into());
|
||||
} else if first.kind.is_ascii_hexdigit() {
|
||||
for _ in 0..6 {
|
||||
let next = match toks.peek() {
|
||||
@ -133,16 +134,19 @@ fn escape<I: Iterator<Item = Token>>(
|
||||
break;
|
||||
}
|
||||
value *= 16;
|
||||
span = span.merge(next.pos());
|
||||
value += as_hex(toks.next().unwrap().kind)
|
||||
}
|
||||
if toks.peek().is_some() && toks.peek().unwrap().kind.is_whitespace() {
|
||||
toks.next();
|
||||
}
|
||||
} else {
|
||||
value = toks.next().unwrap().kind as u32;
|
||||
let next = toks.next().unwrap();
|
||||
span = span.merge(next.pos());
|
||||
value = next.kind as u32;
|
||||
}
|
||||
|
||||
let c = std::char::from_u32(value).unwrap();
|
||||
let c = std::char::from_u32(value).ok_or(("Invalid escape sequence.", span))?;
|
||||
if (identifier_start && is_name_start(c) && !c.is_digit(10))
|
||||
|| (!identifier_start && is_name(c))
|
||||
{
|
||||
|
@ -168,3 +168,7 @@ test!(
|
||||
"a {\n color: \\9;\n}\n",
|
||||
"a {\n color: \\9 ;\n}\n"
|
||||
);
|
||||
error!(
|
||||
escape_sequence_does_not_fit_inside_char,
|
||||
"a {\n color: \\110000;\n}\n", "Error: Invalid escape sequence."
|
||||
);
|
||||
|
Loading…
x
Reference in New Issue
Block a user