Look ahead before testing for EOF. (#12)
Look ahead before testing for EOF. This fixes panics in saphyr's test_multiline_trailing_newline and test_multiline_leading_newline tests, in which `self.input.next_is_z` would be called on an empty buffer and panic in `peek`
This commit is contained in:
parent
434f4521dd
commit
d82866555a
3 changed files with 47 additions and 3 deletions
|
@ -1709,11 +1709,11 @@ impl<T: Input> Scanner<T> {
|
||||||
self.scan_block_scalar_content_line(&mut string, &mut line_buffer);
|
self.scan_block_scalar_content_line(&mut string, &mut line_buffer);
|
||||||
|
|
||||||
// break on EOF
|
// break on EOF
|
||||||
|
self.input.lookahead(2);
|
||||||
if self.input.next_is_z() {
|
if self.input.next_is_z() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.input.lookahead(2);
|
|
||||||
self.read_break(&mut leading_break);
|
self.read_break(&mut leading_break);
|
||||||
|
|
||||||
// Eat the following indentation spaces and line breaks.
|
// Eat the following indentation spaces and line breaks.
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
use saphyr_parser::{Event, Parser, ScanError, TScalarStyle};
|
use saphyr_parser::{BufferedInput, Event, Parser, ScanError, TScalarStyle};
|
||||||
|
|
||||||
/// Run the parser through the string.
|
/// Run the parser through the string.
|
||||||
///
|
///
|
||||||
/// # Returns
|
/// # Returns
|
||||||
/// This functions returns the events if parsing succeeds, the error the parser returned otherwise.
|
/// This function returns the events if parsing succeeds, the error the parser returned otherwise.
|
||||||
fn run_parser(input: &str) -> Result<Vec<Event>, ScanError> {
|
fn run_parser(input: &str) -> Result<Vec<Event>, ScanError> {
|
||||||
let mut events = vec![];
|
let mut events = vec![];
|
||||||
for x in Parser::new_from_str(input) {
|
for x in Parser::new_from_str(input) {
|
||||||
|
@ -12,6 +12,18 @@ fn run_parser(input: &str) -> Result<Vec<Event>, ScanError> {
|
||||||
Ok(events)
|
Ok(events)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Run the parser through the string, using a `BufferedInput`
|
||||||
|
///
|
||||||
|
/// # Returns
|
||||||
|
/// This function returns the events if parsing succeeds, the error the parser returned otherwise.
|
||||||
|
fn run_parser_buffered(input: &str) -> Result<Vec<Event>, ScanError> {
|
||||||
|
let mut events = vec![];
|
||||||
|
for x in Parser::new(BufferedInput::new(input.chars())) {
|
||||||
|
events.push(x?.0);
|
||||||
|
}
|
||||||
|
Ok(events)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[allow(clippy::too_many_lines)]
|
#[allow(clippy::too_many_lines)]
|
||||||
fn test_issue1() {
|
fn test_issue1() {
|
||||||
|
@ -166,3 +178,19 @@ fn test_issue1() {
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_pr12() {
|
||||||
|
assert_eq!(
|
||||||
|
run_parser_buffered("---\n- |\n a").unwrap(),
|
||||||
|
[
|
||||||
|
Event::StreamStart,
|
||||||
|
Event::DocumentStart(true),
|
||||||
|
Event::SequenceStart(0, None),
|
||||||
|
Event::Scalar("a\n".to_string(), TScalarStyle::Literal, 0, None),
|
||||||
|
Event::SequenceEnd,
|
||||||
|
Event::DocumentEnd,
|
||||||
|
Event::StreamEnd,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -67,3 +67,19 @@ macro_rules! assert_next {
|
||||||
// auto generated from handler_spec_test.cpp
|
// auto generated from handler_spec_test.cpp
|
||||||
include!("specexamples.rs.inc");
|
include!("specexamples.rs.inc");
|
||||||
include!("spec_test.rs.inc");
|
include!("spec_test.rs.inc");
|
||||||
|
|
||||||
|
mod with_buffered_input {
|
||||||
|
use super::{Parser, TestEvent, YamlChecker};
|
||||||
|
|
||||||
|
fn str_to_test_events(docs: &str) -> Vec<TestEvent> {
|
||||||
|
use saphyr_parser::BufferedInput;
|
||||||
|
|
||||||
|
let mut p = YamlChecker { evs: Vec::new() };
|
||||||
|
let input = BufferedInput::new(docs.chars());
|
||||||
|
let mut parser = Parser::new(input);
|
||||||
|
parser.load(&mut p, true).unwrap();
|
||||||
|
p.evs
|
||||||
|
}
|
||||||
|
include!("specexamples.rs.inc");
|
||||||
|
include!("spec_test.rs.inc");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue