From 5dbd6f9a5589c47f83a8ec3a125ef9f2930806c4 Mon Sep 17 00:00:00 2001 From: Ethiraric Date: Fri, 19 Jan 2024 21:57:39 +0100 Subject: [PATCH] Fix use of dashes in flow contexts. --- saphyr/src/scanner.rs | 12 ++++++++++-- saphyr/tests/yaml-test-suite.rs | 3 --- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/saphyr/src/scanner.rs b/saphyr/src/scanner.rs index 6b3572f..528fd8e 100644 --- a/saphyr/src/scanner.rs +++ b/saphyr/src/scanner.rs @@ -2030,6 +2030,7 @@ impl> Scanner { Ok(()) } + #[allow(clippy::too_many_lines)] fn scan_plain_scalar(&mut self) -> Result { self.unroll_non_block_indents(); let indent = self.indent + 1; @@ -2044,7 +2045,6 @@ impl> Scanner { loop { /* Check for a document indicator. */ self.lookahead(4); - if self.mark.col == 0 && (((self.buffer[0] == '-') && (self.buffer[1] == '-') && (self.buffer[2] == '-')) || ((self.buffer[0] == '.') @@ -2058,6 +2058,14 @@ impl> Scanner { if self.ch() == '#' { break; } + + if self.flow_level > 0 && self.ch() == '-' && is_flow(self.buffer[1]) { + return Err(ScanError::new( + self.mark, + "plain scalar cannot start with '-' followed by ,[]{}", + )); + } + while !is_blankz(self.ch()) { // indicators can end a plain scalar, see 7.3.3. Plain Style match self.ch() { @@ -2066,7 +2074,7 @@ impl> Scanner { { break; } - ',' | '[' | ']' | '{' | '}' if self.flow_level > 0 => break, + c if is_flow(c) && self.flow_level > 0 => break, _ => {} } diff --git a/saphyr/tests/yaml-test-suite.rs b/saphyr/tests/yaml-test-suite.rs index f807ed7..3637689 100644 --- a/saphyr/tests/yaml-test-suite.rs +++ b/saphyr/tests/yaml-test-suite.rs @@ -297,9 +297,6 @@ fn expected_events(expected_tree: &str) -> Vec { #[rustfmt::skip] static EXPECTED_FAILURES: &[&str] = &[ - // Dashes in flow sequence (should be forbidden) - "G5U8", - "YJV2", // Misc "9MMW", // Mapping key in implicit mapping in flow sequence(!) "G9HC", // Anchor indent problem(?)