@@ -318,7 +318,8 @@ impl Marker {
318
318
_ => unreachable ! ( ) ,
319
319
}
320
320
p. push_event ( Event :: Finish ) ;
321
- CompletedMarker :: new ( self . pos , kind)
321
+ let end_pos = p. events . len ( ) as u32 ;
322
+ CompletedMarker :: new ( self . pos , end_pos, kind)
322
323
}
323
324
324
325
/// Abandons the syntax tree node. All its children
@@ -336,13 +337,14 @@ impl Marker {
336
337
}
337
338
338
339
pub ( crate ) struct CompletedMarker {
339
- pos : u32 ,
340
+ start_pos : u32 ,
341
+ end_pos : u32 ,
340
342
kind : SyntaxKind ,
341
343
}
342
344
343
345
impl CompletedMarker {
344
- fn new ( pos : u32 , kind : SyntaxKind ) -> Self {
345
- CompletedMarker { pos , kind }
346
+ fn new ( start_pos : u32 , end_pos : u32 , kind : SyntaxKind ) -> Self {
347
+ CompletedMarker { start_pos , end_pos , kind }
346
348
}
347
349
348
350
/// This method allows to create a new node which starts
@@ -360,10 +362,10 @@ impl CompletedMarker {
360
362
/// distance to `NEWSTART` into forward_parent(=2 in this case);
361
363
pub ( crate ) fn precede ( self , p : & mut Parser < ' _ > ) -> Marker {
362
364
let new_pos = p. start ( ) ;
363
- let idx = self . pos as usize ;
365
+ let idx = self . start_pos as usize ;
364
366
match & mut p. events [ idx] {
365
367
Event :: Start { forward_parent, .. } => {
366
- * forward_parent = Some ( new_pos. pos - self . pos ) ;
368
+ * forward_parent = Some ( new_pos. pos - self . start_pos ) ;
367
369
}
368
370
_ => unreachable ! ( ) ,
369
371
}
@@ -376,7 +378,7 @@ impl CompletedMarker {
376
378
let idx = m. pos as usize ;
377
379
match & mut p. events [ idx] {
378
380
Event :: Start { forward_parent, .. } => {
379
- * forward_parent = Some ( self . pos - m. pos ) ;
381
+ * forward_parent = Some ( self . start_pos - m. pos ) ;
380
382
}
381
383
_ => unreachable ! ( ) ,
382
384
}
@@ -386,4 +388,13 @@ impl CompletedMarker {
386
388
pub ( crate ) fn kind ( & self ) -> SyntaxKind {
387
389
self . kind
388
390
}
391
+
392
+ pub ( crate ) fn last_token ( & self , p : & Parser < ' _ > ) -> Option < SyntaxKind > {
393
+ let end_pos = self . end_pos as usize ;
394
+ debug_assert_eq ! ( p. events[ end_pos - 1 ] , Event :: Finish ) ;
395
+ p. events [ ..end_pos] . iter ( ) . rev ( ) . find_map ( |event| match event {
396
+ Event :: Token { kind, .. } => Some ( * kind) ,
397
+ _ => None ,
398
+ } )
399
+ }
389
400
}
0 commit comments