@@ -149,6 +149,10 @@ impl TokenMap {
149
149
}
150
150
}
151
151
}
152
+
153
+ fn remove_delim ( & mut self , token_id : tt:: TokenId ) {
154
+ self . entries . retain ( |( tid, _) | * tid != token_id) ;
155
+ }
152
156
}
153
157
154
158
/// Returns the textual content of a doc comment block as a quoted string
@@ -245,8 +249,15 @@ impl TokenIdAlloc {
245
249
token_id
246
250
}
247
251
248
- fn close_delim ( & mut self , id : tt:: TokenId , close_abs_range : TextRange ) {
249
- self . map . update_close_delim ( id, close_abs_range - self . global_offset ) ;
252
+ fn close_delim ( & mut self , id : tt:: TokenId , close_abs_range : Option < TextRange > ) {
253
+ match close_abs_range {
254
+ None => {
255
+ self . map . remove_delim ( id) ;
256
+ }
257
+ Some ( close) => {
258
+ self . map . update_close_delim ( id, close - self . global_offset ) ;
259
+ }
260
+ }
250
261
}
251
262
}
252
263
@@ -318,10 +329,22 @@ trait TokenConvertor {
318
329
self . collect_leaf ( & mut subtree. token_trees ) ;
319
330
}
320
331
let last_range = match self . bump ( ) {
321
- None => return ,
332
+ None => {
333
+ // For error resilience, we insert an char punct for the opening delim here
334
+ self . id_alloc ( ) . close_delim ( id, None ) ;
335
+ let leaf: tt:: Leaf = tt:: Punct {
336
+ id : self . id_alloc ( ) . alloc ( range) ,
337
+ char : token. to_char ( ) . unwrap ( ) ,
338
+ spacing : tt:: Spacing :: Alone ,
339
+ }
340
+ . into ( ) ;
341
+ result. push ( leaf. into ( ) ) ;
342
+ result. extend ( subtree. token_trees ) ;
343
+ return ;
344
+ }
322
345
Some ( it) => it. 1 ,
323
346
} ;
324
- self . id_alloc ( ) . close_delim ( id, last_range) ;
347
+ self . id_alloc ( ) . close_delim ( id, Some ( last_range) ) ;
325
348
subtree. into ( )
326
349
} else {
327
350
let spacing = match self . peek ( ) {
0 commit comments