From 9e4052cc2ee12751ba94909ff479bd03df141ac4 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 7 Jan 2018 14:56:08 +0300 Subject: Test utils --- src/parser/event_parser/grammar.rs | 26 +++++++++++++++++++++++--- src/tree/file_builder.rs | 9 +++------ 2 files changed, 26 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/parser/event_parser/grammar.rs b/src/parser/event_parser/grammar.rs index 79ef8b31c..e1f717714 100644 --- a/src/parser/event_parser/grammar.rs +++ b/src/parser/event_parser/grammar.rs @@ -8,7 +8,12 @@ pub fn file(p: &mut Parser) { node(p, FILE, |p| { shebang(p); inner_attributes(p); - many(p, |p| skip_to_first(p, item_first, item)); + many(p, |p| { + skip_to_first( + p, item_first, item, + "expected item", + ) + }); }) } @@ -84,19 +89,34 @@ fn comma_list bool>(p: &mut Parser, f: F) { } -fn skip_to_first(p: &mut Parser, cond: C, f: F) -> bool +fn skip_to_first(p: &mut Parser, cond: C, f: F, message: &str) -> bool where C: Fn(&Parser) -> bool, F: FnOnce(&mut Parser), { + let mut skipped = false; loop { if cond(p) { + if skipped { + p.finish(); + } f(p); return true; } - if p.bump().is_none() { + if p.is_eof() { + if skipped { + p.finish(); + } return false; } + if !skipped { + p.start(ERROR); + p.error() + .message(message) + .emit(); + } + p.bump().unwrap(); + skipped = true; } } diff --git a/src/tree/file_builder.rs b/src/tree/file_builder.rs index b07f4027b..37bd5b2c8 100644 --- a/src/tree/file_builder.rs +++ b/src/tree/file_builder.rs @@ -73,7 +73,9 @@ impl FileBuilder { pub fn finish(self) -> File { assert!( self.in_progress.is_empty(), - "some nodes in FileBuilder are unfinished" + "some nodes in FileBuilder are unfinished: {:?}", + self.in_progress.iter().map(|&(idx, _)| self.nodes[idx].kind) + .collect::>() ); assert!( self.pos == (self.text.len() as u32).into(), @@ -122,11 +124,6 @@ impl FileBuilder { let idx = self.current_id(); &mut self.nodes[idx] } - - fn current_sibling(&mut self) -> Option<&mut NodeData> { - let idx = self.in_progress.last().unwrap().1?; - Some(&mut self.nodes[idx]) - } } fn fill(slot: &mut Option, value: T) { -- cgit v1.2.3