diff options
Diffstat (limited to 'crates/ra_parser/src/parser.rs')
-rw-r--r-- | crates/ra_parser/src/parser.rs | 23 |
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 | ||
233 | pub(crate) struct CompletedMarker(u32, SyntaxKind); | 256 | pub(crate) struct CompletedMarker(u32, SyntaxKind); |