aboutsummaryrefslogtreecommitdiff
path: root/src/parser/event_parser/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/event_parser/parser.rs')
-rw-r--r--src/parser/event_parser/parser.rs27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/parser/event_parser/parser.rs b/src/parser/event_parser/parser.rs
index 36452ef67..04ef4fb28 100644
--- a/src/parser/event_parser/parser.rs
+++ b/src/parser/event_parser/parser.rs
@@ -1,7 +1,7 @@
1use {Token, SyntaxKind, TextUnit}; 1use {Token, SyntaxKind, TextUnit};
2use super::{Event}; 2use super::{Event};
3use super::super::is_insignificant; 3use super::super::is_insignificant;
4use syntax_kinds::{WHITESPACE, COMMENT}; 4use syntax_kinds::{L_CURLY, R_CURLY, ERROR};
5 5
6pub struct Parser<'t> { 6pub struct Parser<'t> {
7 text: &'t str, 7 text: &'t str,
@@ -10,6 +10,7 @@ pub struct Parser<'t> {
10 10
11 pos: usize, 11 pos: usize,
12 events: Vec<Event>, 12 events: Vec<Event>,
13 curly_level: i32,
13} 14}
14 15
15impl<'t> Parser<'t> { 16impl<'t> Parser<'t> {
@@ -30,6 +31,7 @@ impl<'t> Parser<'t> {
30 31
31 pos: 0, 32 pos: 0,
32 events: Vec::new(), 33 events: Vec::new(),
34 curly_level: 0,
33 } 35 }
34 } 36 }
35 37
@@ -64,6 +66,11 @@ impl<'t> Parser<'t> {
64 66
65 pub(crate) fn bump(&mut self) -> Option<SyntaxKind> { 67 pub(crate) fn bump(&mut self) -> Option<SyntaxKind> {
66 let kind = self.current()?; 68 let kind = self.current()?;
69 match kind {
70 L_CURLY => self.curly_level += 1,
71 R_CURLY => self.curly_level -= 1,
72 _ => (),
73 }
67 self.pos += 1; 74 self.pos += 1;
68 self.event(Event::Token { kind, n_raw_tokens: 1 }); 75 self.event(Event::Token { kind, n_raw_tokens: 1 });
69 Some(kind) 76 Some(kind)
@@ -78,6 +85,24 @@ impl<'t> Parser<'t> {
78 } 85 }
79 } 86 }
80 87
88 pub(crate) fn curly_block<F: FnOnce(&mut Parser)>(&mut self, f: F) -> Result<(), ()> {
89 let level = self.curly_level;
90 self.expect(L_CURLY)?;
91 f(self);
92 assert!(self.curly_level > level);
93 if self.expect(R_CURLY).is_ok() {
94 return Ok(());
95 }
96 self.start(ERROR);
97 while self.curly_level > level {
98 if self.bump().is_none() {
99 break;
100 }
101 }
102 self.finish();
103 Ok(()) //???
104 }
105
81 fn event(&mut self, event: Event) { 106 fn event(&mut self, event: Event) {
82 self.events.push(event) 107 self.events.push(event)
83 } 108 }