aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/parser_impl/event.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax/src/parser_impl/event.rs')
-rw-r--r--crates/ra_syntax/src/parser_impl/event.rs41
1 files changed, 10 insertions, 31 deletions
diff --git a/crates/ra_syntax/src/parser_impl/event.rs b/crates/ra_syntax/src/parser_impl/event.rs
index 33e10ef85..677876ab5 100644
--- a/crates/ra_syntax/src/parser_impl/event.rs
+++ b/crates/ra_syntax/src/parser_impl/event.rs
@@ -86,10 +86,7 @@ pub(crate) enum Event {
86 86
87impl Event { 87impl Event {
88 pub(crate) fn tombstone() -> Self { 88 pub(crate) fn tombstone() -> Self {
89 Event::Start { 89 Event::Start { kind: TOMBSTONE, forward_parent: None }
90 kind: TOMBSTONE,
91 forward_parent: None,
92 }
93 } 90 }
94} 91}
95 92
@@ -109,14 +106,7 @@ impl<'a, S: Sink> EventProcessor<'a, S> {
109 tokens: &'a [Token], 106 tokens: &'a [Token],
110 events: &'a mut [Event], 107 events: &'a mut [Event],
111 ) -> EventProcessor<'a, S> { 108 ) -> EventProcessor<'a, S> {
112 EventProcessor { 109 EventProcessor { sink, text_pos: 0.into(), text, token_pos: 0, tokens, events }
113 sink,
114 text_pos: 0.into(),
115 text,
116 token_pos: 0,
117 tokens,
118 events,
119 }
120 } 110 }
121 111
122 /// Generate the syntax tree with the control of events. 112 /// Generate the syntax tree with the control of events.
@@ -125,14 +115,9 @@ impl<'a, S: Sink> EventProcessor<'a, S> {
125 115
126 for i in 0..self.events.len() { 116 for i in 0..self.events.len() {
127 match mem::replace(&mut self.events[i], Event::tombstone()) { 117 match mem::replace(&mut self.events[i], Event::tombstone()) {
128 Event::Start { 118 Event::Start { kind: TOMBSTONE, .. } => (),
129 kind: TOMBSTONE, ..
130 } => (),
131 119
132 Event::Start { 120 Event::Start { kind, forward_parent } => {
133 kind,
134 forward_parent,
135 } => {
136 // For events[A, B, C], B is A's forward_parent, C is B's forward_parent, 121 // For events[A, B, C], B is A's forward_parent, C is B's forward_parent,
137 // in the normal control flow, the parent-child relation: `A -> B -> C`, 122 // in the normal control flow, the parent-child relation: `A -> B -> C`,
138 // while with the magic forward_parent, it writes: `C <- B <- A`. 123 // while with the magic forward_parent, it writes: `C <- B <- A`.
@@ -145,10 +130,7 @@ impl<'a, S: Sink> EventProcessor<'a, S> {
145 idx += fwd as usize; 130 idx += fwd as usize;
146 // append `A`'s forward_parent `B` 131 // append `A`'s forward_parent `B`
147 fp = match mem::replace(&mut self.events[idx], Event::tombstone()) { 132 fp = match mem::replace(&mut self.events[idx], Event::tombstone()) {
148 Event::Start { 133 Event::Start { kind, forward_parent } => {
149 kind,
150 forward_parent,
151 } => {
152 forward_parents.push(kind); 134 forward_parents.push(kind);
153 forward_parent 135 forward_parent
154 } 136 }
@@ -174,10 +156,9 @@ impl<'a, S: Sink> EventProcessor<'a, S> {
174 .sum::<TextUnit>(); 156 .sum::<TextUnit>();
175 self.leaf(kind, len, n_raw_tokens); 157 self.leaf(kind, len, n_raw_tokens);
176 } 158 }
177 Event::Error { msg } => self.sink.error(SyntaxError::new( 159 Event::Error { msg } => self
178 SyntaxErrorKind::ParseError(msg), 160 .sink
179 self.text_pos, 161 .error(SyntaxError::new(SyntaxErrorKind::ParseError(msg), self.text_pos)),
180 )),
181 } 162 }
182 } 163 }
183 self.sink 164 self.sink
@@ -189,10 +170,8 @@ impl<'a, S: Sink> EventProcessor<'a, S> {
189 self.sink.start_branch(kind); 170 self.sink.start_branch(kind);
190 return; 171 return;
191 } 172 }
192 let n_trivias = self.tokens[self.token_pos..] 173 let n_trivias =
193 .iter() 174 self.tokens[self.token_pos..].iter().take_while(|it| it.kind.is_trivia()).count();
194 .take_while(|it| it.kind.is_trivia())
195 .count();
196 let leading_trivias = &self.tokens[self.token_pos..self.token_pos + n_trivias]; 175 let leading_trivias = &self.tokens[self.token_pos..self.token_pos + n_trivias];
197 let mut trivia_end = 176 let mut trivia_end =
198 self.text_pos + leading_trivias.iter().map(|it| it.len).sum::<TextUnit>(); 177 self.text_pos + leading_trivias.iter().map(|it| it.len).sum::<TextUnit>();