From 18f9e50b2d1aaf91992be9fd2f2a7e1866a943d3 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 7 Jan 2018 13:09:13 +0300 Subject: Error placement --- .../parser/err/0000_struct_field_missing_comma.txt | 6 ++++-- tests/parser.rs | 20 +++++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) (limited to 'tests') diff --git a/tests/data/parser/err/0000_struct_field_missing_comma.txt b/tests/data/parser/err/0000_struct_field_missing_comma.txt index e2e99bb63..55a4ad915 100644 --- a/tests/data/parser/err/0000_struct_field_missing_comma.txt +++ b/tests/data/parser/err/0000_struct_field_missing_comma.txt @@ -1,5 +1,5 @@ FILE@[0; 34) - STRUCT_ITEM@[0; 34) err: `expected COMMA` + STRUCT_ITEM@[0; 34) STRUCT_KW@[0; 6) WHITESPACE@[6; 7) IDENT@[7; 8) @@ -12,9 +12,11 @@ FILE@[0; 34) WHITESPACE@[17; 18) IDENT@[18; 21) WHITESPACE@[21; 26) + err: `expected COMMA` STRUCT_FIELD@[26; 33) IDENT@[26; 27) COLON@[27; 28) WHITESPACE@[28; 29) IDENT@[29; 32) - WHITESPACE@[32; \ No newline at end of file + WHITESPACE@[32; 33) + R_CURLY@[33; 34) diff --git a/tests/parser.rs b/tests/parser.rs index 206da2a64..43d04e491 100644 --- a/tests/parser.rs +++ b/tests/parser.rs @@ -7,7 +7,7 @@ use std::path::{PathBuf, Path}; use std::fs::read_dir; use std::fmt::Write; -use libsyntax2::{tokenize, parse, Token, Node, File, FileBuilder}; +use libsyntax2::{tokenize, parse, Node, File}; #[test] fn parser_tests() { @@ -70,14 +70,24 @@ fn dump_tree(file: &File) -> String { fn go(node: Node, buff: &mut String, level: usize) { buff.push_str(&String::from(" ").repeat(level)); - write!(buff, "{:?}", node).unwrap(); - for err in node.errors() { - write!(buff, " err: `{}`", err.message()).unwrap(); + write!(buff, "{:?}\n", node).unwrap(); + let my_errors = node.errors().filter(|e| e.after_child().is_none()); + let parent_errors = node.parent().into_iter() + .flat_map(|n| n.errors()) + .filter(|e| e.after_child() == Some(node)); + + for err in my_errors { + buff.push_str(&String::from(" ").repeat(level)); + write!(buff, "err: `{}`\n", err.message()).unwrap(); } - write!(buff, "\n").unwrap(); for child in node.children() { go(child, buff, level + 1) } + + for err in parent_errors { + buff.push_str(&String::from(" ").repeat(level)); + write!(buff, "err: `{}`\n", err.message()).unwrap(); + } } } -- cgit v1.2.3