aboutsummaryrefslogtreecommitdiff
path: root/src/parser/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/mod.rs')
-rw-r--r--src/parser/mod.rs30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index 5ec4b8e93..d04ed1e75 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -1,4 +1,4 @@
1use {Token, File, FileBuilder, Sink, SyntaxKind}; 1use {File, FileBuilder, Sink, SyntaxKind, Token};
2 2
3use syntax_kinds::*; 3use syntax_kinds::*;
4use tree::TOMBSTONE; 4use tree::TOMBSTONE;
@@ -6,17 +6,12 @@ use tree::TOMBSTONE;
6mod event_parser; 6mod event_parser;
7use self::event_parser::Event; 7use self::event_parser::Event;
8 8
9
10pub fn parse(text: String, tokens: &[Token]) -> File { 9pub fn parse(text: String, tokens: &[Token]) -> File {
11 let events = event_parser::parse(&text, tokens); 10 let events = event_parser::parse(&text, tokens);
12 from_events_to_file(text, tokens, events) 11 from_events_to_file(text, tokens, events)
13} 12}
14 13
15fn from_events_to_file( 14fn from_events_to_file(text: String, tokens: &[Token], events: Vec<Event>) -> File {
16 text: String,
17 tokens: &[Token],
18 events: Vec<Event>,
19) -> File {
20 let mut builder = FileBuilder::new(text); 15 let mut builder = FileBuilder::new(text);
21 let mut idx = 0; 16 let mut idx = 0;
22 17
@@ -26,18 +21,23 @@ fn from_events_to_file(
26 for (i, event) in events.iter().enumerate() { 21 for (i, event) in events.iter().enumerate() {
27 if holes.last() == Some(&i) { 22 if holes.last() == Some(&i) {
28 holes.pop(); 23 holes.pop();
29 continue 24 continue;
30 } 25 }
31 26
32 match event { 27 match event {
33 &Event::Start { kind: TOMBSTONE, .. } => (), 28 &Event::Start {
29 kind: TOMBSTONE, ..
30 } => (),
34 31
35 &Event::Start { .. } => { 32 &Event::Start { .. } => {
36 forward_parents.clear(); 33 forward_parents.clear();
37 let mut idx = i; 34 let mut idx = i;
38 loop { 35 loop {
39 let (kind, fwd) = match events[idx] { 36 let (kind, fwd) = match events[idx] {
40 Event::Start { kind, forward_parent } => (kind, forward_parent), 37 Event::Start {
38 kind,
39 forward_parent,
40 } => (kind, forward_parent),
41 _ => unreachable!(), 41 _ => unreachable!(),
42 }; 42 };
43 forward_parents.push((idx, kind)); 43 forward_parents.push((idx, kind));
@@ -64,8 +64,11 @@ fn from_events_to_file(
64 } 64 }
65 } 65 }
66 builder.finish_internal() 66 builder.finish_internal()
67 }, 67 }
68 &Event::Token { kind: _, mut n_raw_tokens } => loop { 68 &Event::Token {
69 kind: _,
70 mut n_raw_tokens,
71 } => loop {
69 let token = tokens[idx]; 72 let token = tokens[idx];
70 if !is_insignificant(token.kind) { 73 if !is_insignificant(token.kind) {
71 n_raw_tokens -= 1; 74 n_raw_tokens -= 1;
@@ -76,8 +79,7 @@ fn from_events_to_file(
76 break; 79 break;
77 } 80 }
78 }, 81 },
79 &Event::Error { ref message } => 82 &Event::Error { ref message } => builder.error().message(message.clone()).emit(),
80 builder.error().message(message.clone()).emit(),
81 } 83 }
82 } 84 }
83 builder.finish() 85 builder.finish()