diff options
-rw-r--r-- | cli/src/main.rs | 4 | ||||
-rw-r--r-- | src/algo/walk.rs | 4 | ||||
-rw-r--r-- | src/lib.rs | 2 | ||||
-rw-r--r-- | src/utils.rs | 76 | ||||
-rw-r--r-- | tests/data/parser/err/0001_item_recovery_in_file.txt | 2 | ||||
-rw-r--r-- | tests/data/parser/err/0004_use_path_bad_segment.txt | 2 | ||||
-rw-r--r-- | tests/data/parser/err/0007_stray_curly_in_file.txt | 2 | ||||
-rw-r--r-- | tests/data/parser/inline/0023_array_type_missing_semi.txt | 2 | ||||
-rw-r--r-- | tests/data/parser/inline/0029_fn_pointer_type_missing_fn.txt | 2 |
9 files changed, 48 insertions, 48 deletions
diff --git a/cli/src/main.rs b/cli/src/main.rs index ad7119533..707fbd94c 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs | |||
@@ -33,9 +33,7 @@ fn main() -> Result<()> { | |||
33 | .get_matches(); | 33 | .get_matches(); |
34 | match matches.subcommand() { | 34 | match matches.subcommand() { |
35 | ("parse", _) => { | 35 | ("parse", _) => { |
36 | let start = Instant::now(); | ||
37 | let tree = parse()?; | 36 | let tree = parse()?; |
38 | eprintln!("elapsed {:?}", start.elapsed()); | ||
39 | println!("{}", tree); | 37 | println!("{}", tree); |
40 | } | 38 | } |
41 | ("render-test", Some(matches)) => { | 39 | ("render-test", Some(matches)) => { |
@@ -53,7 +51,9 @@ fn main() -> Result<()> { | |||
53 | 51 | ||
54 | fn parse() -> Result<String> { | 52 | fn parse() -> Result<String> { |
55 | let text = read_stdin()?; | 53 | let text = read_stdin()?; |
54 | let start = Instant::now(); | ||
56 | let file = libsyntax2::parse(text); | 55 | let file = libsyntax2::parse(text); |
56 | eprintln!("elapsed {:?}", start.elapsed()); | ||
57 | let tree = libsyntax2::utils::dump_tree(&file); | 57 | let tree = libsyntax2::utils::dump_tree(&file); |
58 | Ok(tree) | 58 | Ok(tree) |
59 | } | 59 | } |
diff --git a/src/algo/walk.rs b/src/algo/walk.rs index c6d050251..a50ec2a09 100644 --- a/src/algo/walk.rs +++ b/src/algo/walk.rs | |||
@@ -8,12 +8,12 @@ pub fn preorder<'a>(root: SyntaxNodeRef<'a>) -> impl Iterator<Item = SyntaxNodeR | |||
8 | } | 8 | } |
9 | 9 | ||
10 | #[derive(Debug, Copy, Clone)] | 10 | #[derive(Debug, Copy, Clone)] |
11 | enum WalkEvent<'a> { | 11 | pub enum WalkEvent<'a> { |
12 | Enter(SyntaxNodeRef<'a>), | 12 | Enter(SyntaxNodeRef<'a>), |
13 | Exit(SyntaxNodeRef<'a>), | 13 | Exit(SyntaxNodeRef<'a>), |
14 | } | 14 | } |
15 | 15 | ||
16 | fn walk<'a>(root: SyntaxNodeRef<'a>) -> impl Iterator<Item = WalkEvent<'a>> { | 16 | pub fn walk<'a>(root: SyntaxNodeRef<'a>) -> impl Iterator<Item = WalkEvent<'a>> { |
17 | let mut done = false; | 17 | let mut done = false; |
18 | ::itertools::unfold(WalkEvent::Enter(root), move |pos| { | 18 | ::itertools::unfold(WalkEvent::Enter(root), move |pos| { |
19 | if done { | 19 | if done { |
diff --git a/src/lib.rs b/src/lib.rs index 953c9b860..a72d9e3cb 100644 --- a/src/lib.rs +++ b/src/lib.rs | |||
@@ -41,8 +41,6 @@ pub use { | |||
41 | yellow::{SyntaxNode, SyntaxNodeRef, SyntaxRoot, TreeRoot}, | 41 | yellow::{SyntaxNode, SyntaxNodeRef, SyntaxRoot, TreeRoot}, |
42 | }; | 42 | }; |
43 | 43 | ||
44 | pub(crate) use yellow::SyntaxError; | ||
45 | |||
46 | pub fn parse(text: String) -> SyntaxNode { | 44 | pub fn parse(text: String) -> SyntaxNode { |
47 | let tokens = tokenize(&text); | 45 | let tokens = tokenize(&text); |
48 | parser::parse::<yellow::GreenBuilder>(text, &tokens) | 46 | parser::parse::<yellow::GreenBuilder>(text, &tokens) |
diff --git a/src/utils.rs b/src/utils.rs index f99d31b36..327d89a24 100644 --- a/src/utils.rs +++ b/src/utils.rs | |||
@@ -1,46 +1,48 @@ | |||
1 | use std::{collections::BTreeSet, fmt::Write}; | 1 | use std::{fmt::Write}; |
2 | use {SyntaxError, SyntaxNode, SyntaxNodeRef}; | 2 | use { |
3 | SyntaxNode, | ||
4 | algo::walk::{WalkEvent, walk}, | ||
5 | }; | ||
3 | 6 | ||
4 | /// Parse a file and create a string representation of the resulting parse tree. | 7 | /// Parse a file and create a string representation of the resulting parse tree. |
5 | pub fn dump_tree(syntax: &SyntaxNode) -> String { | 8 | pub fn dump_tree(syntax: &SyntaxNode) -> String { |
6 | let syntax = syntax.as_ref(); | 9 | let syntax = syntax.as_ref(); |
7 | let mut errors: BTreeSet<_> = syntax.root.errors.iter().cloned().collect(); | 10 | let mut errors: Vec<_> = syntax.root.errors.iter().cloned().collect(); |
8 | let mut result = String::new(); | 11 | errors.sort_by_key(|e| e.offset); |
9 | go(syntax, &mut result, 0, &mut errors); | 12 | let mut err_pos = 0; |
10 | return result; | 13 | let mut level = 0; |
11 | 14 | let mut buf = String::new(); | |
12 | fn go( | 15 | macro_rules! indent { |
13 | node: SyntaxNodeRef, | 16 | () => { |
14 | buff: &mut String, | 17 | for _ in 0..level { |
15 | level: usize, | 18 | buf.push_str(" "); |
16 | errors: &mut BTreeSet<SyntaxError>, | 19 | } |
17 | ) { | 20 | }; |
18 | buff.push_str(&String::from(" ").repeat(level)); | 21 | } |
19 | writeln!(buff, "{:?}", node).unwrap(); | ||
20 | let my_errors: Vec<_> = errors | ||
21 | .iter() | ||
22 | .filter(|e| e.offset == node.range().start()) | ||
23 | .cloned() | ||
24 | .collect(); | ||
25 | for err in my_errors { | ||
26 | errors.remove(&err); | ||
27 | buff.push_str(&String::from(" ").repeat(level)); | ||
28 | writeln!(buff, "err: `{}`", err.message).unwrap(); | ||
29 | } | ||
30 | 22 | ||
31 | for child in node.children() { | 23 | for event in walk(syntax) { |
32 | go(child, buff, level + 1, errors) | 24 | match event { |
25 | WalkEvent::Enter(node) => { | ||
26 | indent!(); | ||
27 | writeln!(buf, "{:?}", node).unwrap(); | ||
28 | if node.first_child().is_none() { | ||
29 | let off = node.range().end(); | ||
30 | while err_pos < errors.len() && errors[err_pos].offset <= off { | ||
31 | indent!(); | ||
32 | writeln!(buf, "err: `{}`", errors[err_pos].message).unwrap(); | ||
33 | err_pos += 1; | ||
34 | } | ||
35 | } | ||
36 | level += 1; | ||
37 | }, | ||
38 | WalkEvent::Exit(_) => level -= 1, | ||
33 | } | 39 | } |
40 | } | ||
34 | 41 | ||
35 | let my_errors: Vec<_> = errors | 42 | assert_eq!(level, 0); |
36 | .iter() | 43 | for err in errors[err_pos..].iter() { |
37 | .filter(|e| e.offset == node.range().end()) | 44 | writeln!(buf, "err: `{}`", err.message).unwrap(); |
38 | .cloned() | ||
39 | .collect(); | ||
40 | for err in my_errors { | ||
41 | errors.remove(&err); | ||
42 | buff.push_str(&String::from(" ").repeat(level)); | ||
43 | writeln!(buff, "err: `{}`", err.message).unwrap(); | ||
44 | } | ||
45 | } | 45 | } |
46 | |||
47 | return buf; | ||
46 | } | 48 | } |
diff --git a/tests/data/parser/err/0001_item_recovery_in_file.txt b/tests/data/parser/err/0001_item_recovery_in_file.txt index 01bd2abe6..f35b97b48 100644 --- a/tests/data/parser/err/0001_item_recovery_in_file.txt +++ b/tests/data/parser/err/0001_item_recovery_in_file.txt | |||
@@ -1,7 +1,7 @@ | |||
1 | FILE@[0; 21) | 1 | FILE@[0; 21) |
2 | err: `expected item` | ||
3 | ERROR@[0; 3) | 2 | ERROR@[0; 3) |
4 | IF_KW@[0; 2) | 3 | IF_KW@[0; 2) |
4 | err: `expected item` | ||
5 | WHITESPACE@[2; 3) | 5 | WHITESPACE@[2; 3) |
6 | err: `expected item` | 6 | err: `expected item` |
7 | ERROR@[3; 10) | 7 | ERROR@[3; 10) |
diff --git a/tests/data/parser/err/0004_use_path_bad_segment.txt b/tests/data/parser/err/0004_use_path_bad_segment.txt index d9ff79ebe..d58bf263b 100644 --- a/tests/data/parser/err/0004_use_path_bad_segment.txt +++ b/tests/data/parser/err/0004_use_path_bad_segment.txt | |||
@@ -9,8 +9,8 @@ FILE@[0; 12) | |||
9 | WHITESPACE@[3; 4) | 9 | WHITESPACE@[3; 4) |
10 | IDENT@[4; 7) "foo" | 10 | IDENT@[4; 7) "foo" |
11 | COLONCOLON@[7; 9) | 11 | COLONCOLON@[7; 9) |
12 | err: `expected SEMI` | ||
13 | err: `expected identifier` | 12 | err: `expected identifier` |
13 | err: `expected SEMI` | ||
14 | err: `expected item` | 14 | err: `expected item` |
15 | PATH_SEGMENT@[9; 9) | 15 | PATH_SEGMENT@[9; 9) |
16 | ERROR@[9; 11) | 16 | ERROR@[9; 11) |
diff --git a/tests/data/parser/err/0007_stray_curly_in_file.txt b/tests/data/parser/err/0007_stray_curly_in_file.txt index 6995ec6ff..07c99e9fc 100644 --- a/tests/data/parser/err/0007_stray_curly_in_file.txt +++ b/tests/data/parser/err/0007_stray_curly_in_file.txt | |||
@@ -1,7 +1,7 @@ | |||
1 | FILE@[0; 31) | 1 | FILE@[0; 31) |
2 | err: `expected item` | ||
3 | ERROR@[0; 3) | 2 | ERROR@[0; 3) |
4 | R_CURLY@[0; 1) | 3 | R_CURLY@[0; 1) |
4 | err: `expected item` | ||
5 | WHITESPACE@[1; 3) | 5 | WHITESPACE@[1; 3) |
6 | STRUCT_ITEM@[3; 14) | 6 | STRUCT_ITEM@[3; 14) |
7 | STRUCT_KW@[3; 9) | 7 | STRUCT_KW@[3; 9) |
diff --git a/tests/data/parser/inline/0023_array_type_missing_semi.txt b/tests/data/parser/inline/0023_array_type_missing_semi.txt index cc280d5a7..9b210dcd4 100644 --- a/tests/data/parser/inline/0023_array_type_missing_semi.txt +++ b/tests/data/parser/inline/0023_array_type_missing_semi.txt | |||
@@ -13,8 +13,8 @@ FILE@[0; 18) | |||
13 | L_PAREN@[10; 11) | 13 | L_PAREN@[10; 11) |
14 | R_PAREN@[11; 12) | 14 | R_PAREN@[11; 12) |
15 | WHITESPACE@[12; 13) | 15 | WHITESPACE@[12; 13) |
16 | err: `expected SEMI` | ||
17 | err: `expected `;` or `]`` | 16 | err: `expected `;` or `]`` |
17 | err: `expected SEMI` | ||
18 | err: `expected item` | 18 | err: `expected item` |
19 | ERROR@[13; 15) | 19 | ERROR@[13; 15) |
20 | INT_NUMBER@[13; 15) | 20 | INT_NUMBER@[13; 15) |
diff --git a/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.txt b/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.txt index d6c27cf58..c99714ed4 100644 --- a/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.txt +++ b/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.txt | |||
@@ -8,8 +8,8 @@ FILE@[0; 20) | |||
8 | EQ@[7; 8) | 8 | EQ@[7; 8) |
9 | WHITESPACE@[8; 9) | 9 | WHITESPACE@[8; 9) |
10 | UNSAFE_KW@[9; 15) | 10 | UNSAFE_KW@[9; 15) |
11 | err: `expected SEMI` | ||
12 | err: `expected `fn`` | 11 | err: `expected `fn`` |
12 | err: `expected SEMI` | ||
13 | WHITESPACE@[15; 16) | 13 | WHITESPACE@[15; 16) |
14 | err: `expected item` | 14 | err: `expected item` |
15 | ERROR@[16; 17) | 15 | ERROR@[16; 17) |