More fixes towards invalid tabs.

This commit is contained in:
Ethiraric 2023-12-22 16:11:07 +01:00
parent 88833f8a06
commit a80091795b
2 changed files with 45 additions and 2 deletions

View file

@ -638,6 +638,50 @@ impl<T: Iterator<Item = char>> Scanner<T> {
Ok(()) Ok(())
} }
/// Skip over YAML whitespace (` `, `\n`, `\r`).
///
/// # Errors
/// This function returns an error if the character after the whitespaces is a tab (`\t`)
/// character or if no whitespace was found.
fn skip_yaml_whitespace(&mut self) -> ScanResult {
let mut need_whitespace = true;
loop {
match self.look_ch() {
' ' => {
self.skip();
need_whitespace = false;
}
'\n' | '\r' => {
self.lookahead(2);
self.skip_line();
if self.flow_level == 0 {
self.allow_simple_key();
}
need_whitespace = false;
}
'#' => {
while !is_breakz(self.ch()) {
self.skip();
self.lookahead(1);
}
}
_ => break,
}
}
if need_whitespace {
Err(ScanError::new(self.mark(), "expected whitespace"))
} else if self.ch() == '\t' {
Err(ScanError::new(
self.mark(),
"tabs disallowed in this context",
))
} else {
Ok(())
}
}
fn fetch_stream_start(&mut self) { fn fetch_stream_start(&mut self) {
let mark = self.mark; let mark = self.mark;
self.indent = -1; self.indent = -1;
@ -1760,6 +1804,7 @@ impl<T: Iterator<Item = char>> Scanner<T> {
} }
self.skip(); self.skip();
self.skip_yaml_whitespace()?;
self.tokens.push_back(Token(start_mark, TokenType::Key)); self.tokens.push_back(Token(start_mark, TokenType::Key));
Ok(()) Ok(())
} }

View file

@ -299,7 +299,6 @@ fn expected_events(expected_tree: &str) -> Vec<String> {
static EXPECTED_FAILURES: &[&str] = &[ static EXPECTED_FAILURES: &[&str] = &[
// These seem to be plain bugs // These seem to be plain bugs
// TAB as start of plain scalar instead of whitespace // TAB as start of plain scalar instead of whitespace
"Y79Y-06",
"Y79Y-03", // unexpected pass "Y79Y-03", // unexpected pass
"Y79Y-04", // unexpected pass "Y79Y-04", // unexpected pass
"Y79Y-05", // unexpected pass "Y79Y-05", // unexpected pass
@ -307,7 +306,6 @@ static EXPECTED_FAILURES: &[&str] = &[
"DK95-04", "DK95-04",
// TABs after marker ? or : (space required?) // TABs after marker ? or : (space required?)
"Y79Y-07", "Y79Y-07",
"Y79Y-08",
"Y79Y-09", "Y79Y-09",
// Other TABs // Other TABs
"DK95-01", // in double-quoted scalar "DK95-01", // in double-quoted scalar