diff --git a/parser/src/scanner.rs b/parser/src/scanner.rs index 33ec99b..c3df929 100644 --- a/parser/src/scanner.rs +++ b/parser/src/scanner.rs @@ -506,7 +506,7 @@ impl> Scanner { /// Consume a linebreak (either CR, LF or CRLF), if any. Do nothing if there's none. #[inline] - fn skip_line(&mut self) { + fn skip_linebreak(&mut self) { if self.buffer[0] == '\r' && self.buffer[1] == '\n' { // While technically not a blank, this does not matter as `self.leading_whitespace` // will be reset by `skip_nl`. @@ -843,7 +843,7 @@ impl> Scanner { '\t' | ' ' => self.skip_blank(), '\n' | '\r' => { self.lookahead(2); - self.skip_line(); + self.skip_linebreak(); if self.flow_level == 0 { self.allow_simple_key(); } @@ -874,7 +874,7 @@ impl> Scanner { } '\n' | '\r' => { self.lookahead(2); - self.skip_line(); + self.skip_linebreak(); if self.flow_level == 0 { self.allow_simple_key(); } @@ -971,8 +971,6 @@ impl> Scanner { self.disallow_simple_key(); let tok = self.scan_directive()?; - self.skip_ws_to_eol(SkipTabs::Yes)?; - self.tokens.push_back(tok); Ok(()) @@ -1004,20 +1002,16 @@ impl> Scanner { self.skip_ws_to_eol(SkipTabs::Yes)?; - if !is_breakz(self.ch()) { - return Err(ScanError::new_str( + if is_breakz(self.ch()) { + self.lookahead(2); + self.skip_linebreak(); + Ok(tok) + } else { + Err(ScanError::new_str( start_mark, "while scanning a directive, did not find expected comment or line break", - )); + )) } - - // Eat a line break - if is_break(self.ch()) { - self.lookahead(2); - self.skip_line(); - } - - Ok(tok) } fn scan_version_directive_value(&mut self, mark: &Marker) -> Result { @@ -2046,7 +2040,7 @@ impl> Scanner { '\\' if !single && is_break(self.buffer[1]) => { self.lookahead(3); self.skip_non_blank(); - self.skip_line(); + self.skip_linebreak(); *leading_blanks = true; break; } diff --git a/parser/tests/basic.rs b/parser/tests/basic.rs index b2d40d9..ac89929 100644 --- a/parser/tests/basic.rs +++ b/parser/tests/basic.rs @@ -181,6 +181,27 @@ fn test_issue_65_mwe() { assert!(run_parser(b).is_err()); } +#[test] +fn test_comment_after_tag() { + // https://github.com/Ethiraric/yaml-rust2/issues/21#issuecomment-2053513507 + let s = " +%YAML 1.2 +# This is a comment +--- #------- +foobar"; + + assert_eq!( + run_parser(s).unwrap(), + [ + Event::StreamStart, + Event::DocumentStart, + Event::Scalar("foobar".to_string(), TScalarStyle::Plain, 0, None), + Event::DocumentEnd, + Event::StreamEnd, + ] + ); +} + #[test] fn test_bad_docstart() { assert!(run_parser("---This used to cause an infinite loop").is_ok());