diff options
author | Aleksey Kladov <[email protected]> | 2018-07-30 13:25:52 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-07-30 13:25:52 +0100 |
commit | 333e140a50658151002c9287aa68855358bedd56 (patch) | |
tree | 21cd482ab080b00d5b93ebaf8e9096644bafa4b3 /src | |
parent | d30a2e4fac9267066dc53d71c4695843f95e6269 (diff) |
Mior
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/cli.rs (renamed from src/bin/cli/parse.rs) | 4 | ||||
-rw-r--r-- | src/lib.rs | 52 | ||||
-rw-r--r-- | src/utils.rs | 46 |
3 files changed, 50 insertions, 52 deletions
diff --git a/src/bin/cli/parse.rs b/src/bin/cli.rs index 563ea92f6..9e513edb2 100644 --- a/src/bin/cli/parse.rs +++ b/src/bin/cli.rs | |||
@@ -3,13 +3,13 @@ extern crate libsyntax2; | |||
3 | use std::io::Read; | 3 | use std::io::Read; |
4 | 4 | ||
5 | use libsyntax2::{ | 5 | use libsyntax2::{ |
6 | parse, utils::dump_tree_green | 6 | parse, utils::dump_tree |
7 | }; | 7 | }; |
8 | 8 | ||
9 | fn main() { | 9 | fn main() { |
10 | let text = read_input(); | 10 | let text = read_input(); |
11 | let file = parse(text); | 11 | let file = parse(text); |
12 | let tree = dump_tree_green(&file); | 12 | let tree = dump_tree(&file); |
13 | println!("{}", tree); | 13 | println!("{}", tree); |
14 | } | 14 | } |
15 | 15 | ||
diff --git a/src/lib.rs b/src/lib.rs index 91d060169..f85ee1eef 100644 --- a/src/lib.rs +++ b/src/lib.rs | |||
@@ -27,6 +27,8 @@ mod lexer; | |||
27 | mod parser; | 27 | mod parser; |
28 | mod syntax_kinds; | 28 | mod syntax_kinds; |
29 | mod yellow; | 29 | mod yellow; |
30 | /// Utilities for simple uses of the parser. | ||
31 | pub mod utils; | ||
30 | 32 | ||
31 | pub use { | 33 | pub use { |
32 | lexer::{tokenize, Token}, | 34 | lexer::{tokenize, Token}, |
@@ -42,53 +44,3 @@ pub fn parse(text: String) -> SyntaxNode { | |||
42 | parser::parse::<yellow::GreenBuilder>(text, &tokens) | 44 | parser::parse::<yellow::GreenBuilder>(text, &tokens) |
43 | } | 45 | } |
44 | 46 | ||
45 | /// Utilities for simple uses of the parser. | ||
46 | pub mod utils { | ||
47 | use std::{collections::BTreeSet, fmt::Write}; | ||
48 | |||
49 | use {SyntaxError, SyntaxNode, SyntaxNodeRef}; | ||
50 | |||
51 | /// Parse a file and create a string representation of the resulting parse tree. | ||
52 | pub fn dump_tree_green(syntax: &SyntaxNode) -> String { | ||
53 | let syntax = syntax.borrow(); | ||
54 | let mut errors: BTreeSet<_> = syntax.root.errors.iter().cloned().collect(); | ||
55 | let mut result = String::new(); | ||
56 | go(syntax, &mut result, 0, &mut errors); | ||
57 | return result; | ||
58 | |||
59 | fn go( | ||
60 | node: SyntaxNodeRef, | ||
61 | buff: &mut String, | ||
62 | level: usize, | ||
63 | errors: &mut BTreeSet<SyntaxError>, | ||
64 | ) { | ||
65 | buff.push_str(&String::from(" ").repeat(level)); | ||
66 | write!(buff, "{:?}\n", node).unwrap(); | ||
67 | let my_errors: Vec<_> = errors | ||
68 | .iter() | ||
69 | .filter(|e| e.offset == node.range().start()) | ||
70 | .cloned() | ||
71 | .collect(); | ||
72 | for err in my_errors { | ||
73 | errors.remove(&err); | ||
74 | buff.push_str(&String::from(" ").repeat(level)); | ||
75 | write!(buff, "err: `{}`\n", err.message).unwrap(); | ||
76 | } | ||
77 | |||
78 | for child in node.children() { | ||
79 | go(child, buff, level + 1, errors) | ||
80 | } | ||
81 | |||
82 | let my_errors: Vec<_> = errors | ||
83 | .iter() | ||
84 | .filter(|e| e.offset == node.range().end()) | ||
85 | .cloned() | ||
86 | .collect(); | ||
87 | for err in my_errors { | ||
88 | errors.remove(&err); | ||
89 | buff.push_str(&String::from(" ").repeat(level)); | ||
90 | write!(buff, "err: `{}`\n", err.message).unwrap(); | ||
91 | } | ||
92 | } | ||
93 | } | ||
94 | } | ||
diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 000000000..20991659a --- /dev/null +++ b/src/utils.rs | |||
@@ -0,0 +1,46 @@ | |||
1 | use std::{collections::BTreeSet, fmt::Write}; | ||
2 | use {SyntaxError, SyntaxNode, SyntaxNodeRef}; | ||
3 | |||
4 | /// Parse a file and create a string representation of the resulting parse tree. | ||
5 | pub fn dump_tree(syntax: &SyntaxNode) -> String { | ||
6 | let syntax = syntax.borrow(); | ||
7 | let mut errors: BTreeSet<_> = syntax.root.errors.iter().cloned().collect(); | ||
8 | let mut result = String::new(); | ||
9 | go(syntax, &mut result, 0, &mut errors); | ||
10 | return result; | ||
11 | |||
12 | fn go( | ||
13 | node: SyntaxNodeRef, | ||
14 | buff: &mut String, | ||
15 | level: usize, | ||
16 | errors: &mut BTreeSet<SyntaxError>, | ||
17 | ) { | ||
18 | buff.push_str(&String::from(" ").repeat(level)); | ||
19 | write!(buff, "{:?}\n", 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 | write!(buff, "err: `{}`\n", err.message).unwrap(); | ||
29 | } | ||
30 | |||
31 | for child in node.children() { | ||
32 | go(child, buff, level + 1, errors) | ||
33 | } | ||
34 | |||
35 | let my_errors: Vec<_> = errors | ||
36 | .iter() | ||
37 | .filter(|e| e.offset == node.range().end()) | ||
38 | .cloned() | ||
39 | .collect(); | ||
40 | for err in my_errors { | ||
41 | errors.remove(&err); | ||
42 | buff.push_str(&String::from(" ").repeat(level)); | ||
43 | write!(buff, "err: `{}`\n", err.message).unwrap(); | ||
44 | } | ||
45 | } | ||
46 | } | ||