aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_parser/src/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_parser/src/parser.rs')
-rw-r--r--crates/ra_parser/src/parser.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/crates/ra_parser/src/parser.rs b/crates/ra_parser/src/parser.rs
index a18458148..702669eb9 100644
--- a/crates/ra_parser/src/parser.rs
+++ b/crates/ra_parser/src/parser.rs
@@ -228,6 +228,29 @@ impl Marker {
228 } 228 }
229 } 229 }
230 } 230 }
231
232 /// Contract a node `cm` and complete as `cm`'s `kind`.
233 /// `cm` must be a child of `m` to work correctly.
234 /// ```
235 /// m--A m--A
236 /// +--cm--B -> +--B
237 /// +--C C
238 ///
239 /// [m: TOMBSTONE, A, cm: Start(k), B, Finish, C]
240 /// [m: Start(k), A, cm: TOMBSTONE, B, Finish, C]
241 /// ```
242 pub(crate) fn contract_child(mut self, p: &mut Parser, cm: CompletedMarker) -> CompletedMarker {
243 self.bomb.defuse();
244 match p.events[self.pos as usize] {
245 Event::Start { kind: ref mut slot, .. } => *slot = cm.kind(),
246 _ => unreachable!(),
247 };
248 match p.events[cm.0 as usize] {
249 Event::Start { kind: ref mut slot, .. } => *slot = TOMBSTONE,
250 _ => unreachable!(),
251 };
252 CompletedMarker::new(self.pos, cm.kind())
253 }
231} 254}
232 255
233pub(crate) struct CompletedMarker(u32, SyntaxKind); 256pub(crate) struct CompletedMarker(u32, SyntaxKind);