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.rs41
1 files changed, 37 insertions, 4 deletions
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index ccccd78f9..a632fbc01 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -8,17 +8,50 @@ use self::event_parser::Event;
8 8
9pub fn parse(text: String, tokens: &[Token]) -> File { 9pub fn parse(text: String, tokens: &[Token]) -> File {
10 let events = event_parser::parse(&text, tokens); 10 let events = event_parser::parse(&text, tokens);
11 from_events_to_file(text, events) 11 from_events_to_file(text, tokens, events)
12} 12}
13 13
14fn from_events_to_file(text: String, events: Vec<Event>) -> File { 14fn from_events_to_file(
15 text: String,
16 tokens: &[Token],
17 events: Vec<Event>,
18) -> File {
15 let mut builder = FileBuilder::new(text); 19 let mut builder = FileBuilder::new(text);
20 let mut idx = 0;
16 for event in events { 21 for event in events {
17 match event { 22 match event {
18 Event::Start { kind } => builder.start_internal(kind), 23 Event::Start { kind } => builder.start_internal(kind),
19 Event::Finish => builder.finish_internal(), 24 Event::Finish => {
20 Event::Token { .. } => unimplemented!(), 25 while idx < tokens.len() {
26 let token = tokens[idx];
27 if is_insignificant(token.kind) {
28 idx += 1;
29 builder.leaf(token.kind, token.len);
30 } else {
31 break;
32 }
33 }
34 builder.finish_internal()
35 },
36 Event::Token { kind, mut n_raw_tokens } => loop {
37 let token = tokens[idx];
38 if !is_insignificant(token.kind) {
39 n_raw_tokens -= 1;
40 }
41 idx += 1;
42 builder.leaf(token.kind, token.len);
43 if n_raw_tokens == 0 {
44 break;
45 }
46 },
21 } 47 }
22 } 48 }
23 builder.finish() 49 builder.finish()
24} 50}
51
52fn is_insignificant(kind: SyntaxKind) -> bool {
53 match kind {
54 WHITESPACE | COMMENT => true,
55 _ => false,
56 }
57} \ No newline at end of file