aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-07-30 13:25:52 +0100
committerAleksey Kladov <[email protected]>2018-07-30 13:25:52 +0100
commit333e140a50658151002c9287aa68855358bedd56 (patch)
tree21cd482ab080b00d5b93ebaf8e9096644bafa4b3 /src
parentd30a2e4fac9267066dc53d71c4695843f95e6269 (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.rs52
-rw-r--r--src/utils.rs46
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;
3use std::io::Read; 3use std::io::Read;
4 4
5use libsyntax2::{ 5use libsyntax2::{
6 parse, utils::dump_tree_green 6 parse, utils::dump_tree
7}; 7};
8 8
9fn main() { 9fn 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;
27mod parser; 27mod parser;
28mod syntax_kinds; 28mod syntax_kinds;
29mod yellow; 29mod yellow;
30/// Utilities for simple uses of the parser.
31pub mod utils;
30 32
31pub use { 33pub 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.
46pub 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 @@
1use std::{collections::BTreeSet, fmt::Write};
2use {SyntaxError, SyntaxNode, SyntaxNodeRef};
3
4/// Parse a file and create a string representation of the resulting parse tree.
5pub 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}