Skip to content

Commit 0eb7936

Browse files
committed
Fix error with comments after tags.
1 parent 0b42882 commit 0eb7936

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

src/scanner.rs

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ impl<T: Iterator<Item = char>> Scanner<T> {
511511

512512
/// Consume a linebreak (either CR, LF or CRLF), if any. Do nothing if there's none.
513513
#[inline]
514-
fn skip_line(&mut self) {
514+
fn skip_linebreak(&mut self) {
515515
if self.buffer[0] == '\r' && self.buffer[1] == '\n' {
516516
// While technically not a blank, this does not matter as `self.leading_whitespace`
517517
// will be reset by `skip_nl`.
@@ -848,7 +848,7 @@ impl<T: Iterator<Item = char>> Scanner<T> {
848848
'\t' | ' ' => self.skip_blank(),
849849
'\n' | '\r' => {
850850
self.lookahead(2);
851-
self.skip_line();
851+
self.skip_linebreak();
852852
if self.flow_level == 0 {
853853
self.allow_simple_key();
854854
}
@@ -879,7 +879,7 @@ impl<T: Iterator<Item = char>> Scanner<T> {
879879
}
880880
'\n' | '\r' => {
881881
self.lookahead(2);
882-
self.skip_line();
882+
self.skip_linebreak();
883883
if self.flow_level == 0 {
884884
self.allow_simple_key();
885885
}
@@ -976,8 +976,6 @@ impl<T: Iterator<Item = char>> Scanner<T> {
976976
self.disallow_simple_key();
977977

978978
let tok = self.scan_directive()?;
979-
self.skip_ws_to_eol(SkipTabs::Yes)?;
980-
981979
self.tokens.push_back(tok);
982980

983981
Ok(())
@@ -1009,20 +1007,16 @@ impl<T: Iterator<Item = char>> Scanner<T> {
10091007

10101008
self.skip_ws_to_eol(SkipTabs::Yes)?;
10111009

1012-
if !is_breakz(self.ch()) {
1013-
return Err(ScanError::new(
1010+
if is_breakz(self.ch()) {
1011+
self.lookahead(2);
1012+
self.skip_linebreak();
1013+
Ok(tok)
1014+
} else {
1015+
Err(ScanError::new(
10141016
start_mark,
10151017
"while scanning a directive, did not find expected comment or line break",
1016-
));
1017-
}
1018-
1019-
// Eat a line break
1020-
if is_break(self.ch()) {
1021-
self.lookahead(2);
1022-
self.skip_line();
1018+
))
10231019
}
1024-
1025-
Ok(tok)
10261020
}
10271021

10281022
fn scan_version_directive_value(&mut self, mark: &Marker) -> Result<Token, ScanError> {
@@ -2048,7 +2042,7 @@ impl<T: Iterator<Item = char>> Scanner<T> {
20482042
'\\' if !single && is_break(self.buffer[1]) => {
20492043
self.lookahead(3);
20502044
self.skip_non_blank();
2051-
self.skip_line();
2045+
self.skip_linebreak();
20522046
*leading_blanks = true;
20532047
break;
20542048
}

tests/basic.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,21 @@ fn test_issue_65_mwe() {
245245
assert!(YamlLoader::load_from_str(b).is_err());
246246
}
247247

248+
#[test]
249+
fn test_comment_after_tag() {
250+
// https://github.com/Ethiraric/yaml-rust2/issues/21#issuecomment-2053513507
251+
let s = "
252+
%YAML 1.2
253+
# This is a comment
254+
--- #-------
255+
foobar";
256+
257+
assert_eq!(
258+
YamlLoader::load_from_str(s),
259+
Ok(vec![Yaml::String(String::from("foobar"))])
260+
);
261+
}
262+
248263
#[test]
249264
fn test_bad_docstart() {
250265
assert!(YamlLoader::load_from_str("---This used to cause an infinite loop").is_ok());

0 commit comments

Comments
 (0)