diff --git a/parser/src/scanner.rs b/parser/src/scanner.rs index d0b5e2b..3d6b3c1 100644 --- a/parser/src/scanner.rs +++ b/parser/src/scanner.rs @@ -647,11 +647,11 @@ impl> Scanner { self.lookahead(1); - if !is_blankz(self.ch()) { + if is_blankz(self.ch()) { + Ok(Token(*mark, TokenType::TagDirective(handle, prefix))) + } else { Err(ScanError::new(*mark, "while scanning TAG, did not find expected whitespace or line break")) - } else { - Ok(Token(*mark, TokenType::TagDirective(handle, prefix))) } } @@ -1305,28 +1305,33 @@ impl> Scanner { while is_blank(self.ch()) || is_break(self.ch()) { if is_blank(self.ch()) { // Consume a space or a tab character. - if !leading_blanks { - whitespaces.push(self.ch()); + if leading_blanks { self.skip(); } else { + whitespaces.push(self.ch()); self.skip(); } } else { self.lookahead(2); // Check if it is a first line break. - if !leading_blanks { + if leading_blanks { + self.read_break(&mut trailing_breaks); + } else { whitespaces.clear(); self.read_break(&mut leading_break); leading_blanks = true; - } else { - self.read_break(&mut trailing_breaks); } } self.lookahead(1); } // Join the whitespaces or fold line breaks. if leading_blanks { - if !leading_break.is_empty() { + if leading_break.is_empty() { + string.extend(leading_break.chars()); + string.extend(trailing_breaks.chars()); + trailing_breaks.clear(); + leading_break.clear(); + } else { if trailing_breaks.is_empty() { string.push(' '); } else { @@ -1334,11 +1339,6 @@ impl> Scanner { trailing_breaks.clear(); } leading_break.clear(); - } else { - string.extend(leading_break.chars()); - string.extend(trailing_breaks.chars()); - trailing_breaks.clear(); - leading_break.clear(); } } else { string.extend(whitespaces.chars()); @@ -1407,7 +1407,12 @@ impl> Scanner { if leading_blanks || !whitespaces.is_empty() { if leading_blanks { - if !leading_break.is_empty() { + if leading_break.is_empty() { + string.extend(leading_break.chars()); + string.extend(trailing_breaks.chars()); + trailing_breaks.clear(); + leading_break.clear(); + } else { if trailing_breaks.is_empty() { string.push(' '); } else { @@ -1415,11 +1420,7 @@ impl> Scanner { trailing_breaks.clear(); } leading_break.clear(); - } else { - string.extend(leading_break.chars()); - string.extend(trailing_breaks.chars()); - trailing_breaks.clear(); - leading_break.clear(); + } leading_blanks = false; } else { @@ -1444,21 +1445,21 @@ impl> Scanner { "while scanning a plain scalar, found a tab")); } - if !leading_blanks { - whitespaces.push(self.ch()); + if leading_blanks { self.skip(); } else { + whitespaces.push(self.ch()); self.skip(); } } else { self.lookahead(2); // Check if it is a first line break - if !leading_blanks { + if leading_blanks { + self.read_break(&mut trailing_breaks); + } else { whitespaces.clear(); self.read_break(&mut leading_break); leading_blanks = true; - } else { - self.read_break(&mut trailing_breaks); } } self.lookahead(1); diff --git a/parser/src/yaml.rs b/parser/src/yaml.rs index 6db2a1b..6ea5cb9 100644 --- a/parser/src/yaml.rs +++ b/parser/src/yaml.rs @@ -154,7 +154,9 @@ impl YamlLoader { if node.1 > 0 { self.anchor_map.insert(node.1, node.0.clone()); } - if !self.doc_stack.is_empty() { + if self.doc_stack.is_empty() { + self.doc_stack.push(node); + } else { let parent = self.doc_stack.last_mut().unwrap(); match *parent { (Yaml::Array(ref mut v), _) => v.push(node.0), @@ -172,8 +174,6 @@ impl YamlLoader { }, _ => unreachable!(), } - } else { - self.doc_stack.push(node); } }