tamer: xir::flat: Ignore whitespace both before and after root

DEV-7145
main
Mike Gerwitz 2022-07-29 00:30:44 -04:00
parent 4f2b27f944
commit 8778976018
2 changed files with 36 additions and 6 deletions

View File

@ -367,13 +367,15 @@ where
Transition(st).ok(XirfToken::Comment(sym, span))
}
(PreRoot(_), tok @ XirToken::Open(..)) => {
Self::parse_node(tok, stack)
// Ignore whitespace before or after root.
(st @ (PreRoot(_) | Done), XirToken::Text(sym, _))
if is_whitespace(sym) =>
{
Transition(st).incomplete()
}
// Ignore whitespace before root.
(st @ PreRoot(_), XirToken::Text(sym, _)) if is_whitespace(sym) => {
Transition(st).incomplete()
(PreRoot(_), tok @ XirToken::Open(..)) => {
Self::parse_node(tok, stack)
}
(st @ PreRoot(_), tok) => {
@ -419,7 +421,7 @@ where
PreRoot(_) => write!(f, "expecting document root"),
NodeExpected => write!(f, "expecting a node"),
AttrExpected(sa) => Display::fmt(sa, f),
Done => write!(f, "done parsing"),
Done => write!(f, "done parsing document root"),
}
}
}

View File

@ -449,6 +449,34 @@ fn comment_before_or_after_root_ok() {
);
}
// Similar to above,
// but with whitespace.
#[test]
fn whitespace_before_or_after_root_ok() {
let name = "root";
let ws = " ".unwrap_into();
let toks = [
XirToken::Text(ws, S),
xir_open(name, S2),
xir_close_empty(S3),
XirToken::Text(ws, S4),
]
.into_iter();
let sut = parse::<1, RefinedText>(toks);
assert_eq!(
Ok(vec![
Parsed::Incomplete,
Parsed::Object(open(name, S2, Depth(0))),
Parsed::Object(close_empty(S3, Depth(0))),
Parsed::Incomplete,
]),
sut.collect(),
);
}
// But there must be no content at the end of the document after the closing
// root node.
// This does not test every applicable token;