Fix error with comments after tags.
This commit is contained in:
parent
cbba46fa72
commit
9ee2d113bc
2 changed files with 32 additions and 17 deletions
|
@ -506,7 +506,7 @@ impl<T: Iterator<Item = char>> Scanner<T> {
|
|||
|
||||
/// 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<T: Iterator<Item = char>> Scanner<T> {
|
|||
'\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<T: Iterator<Item = char>> Scanner<T> {
|
|||
}
|
||||
'\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<T: Iterator<Item = char>> Scanner<T> {
|
|||
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<T: Iterator<Item = char>> Scanner<T> {
|
|||
|
||||
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<Token, ScanError> {
|
||||
|
@ -2046,7 +2040,7 @@ impl<T: Iterator<Item = char>> Scanner<T> {
|
|||
'\\' if !single && is_break(self.buffer[1]) => {
|
||||
self.lookahead(3);
|
||||
self.skip_non_blank();
|
||||
self.skip_line();
|
||||
self.skip_linebreak();
|
||||
*leading_blanks = true;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
|
Loading…
Reference in a new issue