@@ -14,7 +14,6 @@ use std::collections::HashMap;
14
14
use std:: hash:: Hash ;
15
15
use std:: iter:: FromIterator ;
16
16
use std:: ops:: Bound ;
17
- use std:: str:: FromStr ;
18
17
use std:: { ascii, vec:: IntoIter } ;
19
18
20
19
type Group = tt:: Subtree ;
@@ -278,6 +277,42 @@ impl server::FreeFunctions for Rustc {
278
277
}
279
278
}
280
279
280
+ fn subtree_replace_token_ids_with_unspecified ( subtree : tt:: Subtree ) -> tt:: Subtree {
281
+ tt:: Subtree {
282
+ delimiter : subtree. delimiter . map ( |d| tt:: Delimiter { id : tt:: TokenId :: unspecified ( ) , ..d } ) ,
283
+ token_trees : subtree
284
+ . token_trees
285
+ . into_iter ( )
286
+ . map ( |t| token_tree_replace_token_ids_with_unspecified ( t) )
287
+ . collect ( ) ,
288
+ }
289
+ }
290
+
291
+ fn token_tree_replace_token_ids_with_unspecified ( tt : tt:: TokenTree ) -> tt:: TokenTree {
292
+ match tt {
293
+ tt:: TokenTree :: Leaf ( leaf) => {
294
+ tt:: TokenTree :: Leaf ( leaf_replace_token_ids_with_unspecified ( leaf) )
295
+ }
296
+ tt:: TokenTree :: Subtree ( subtree) => {
297
+ tt:: TokenTree :: Subtree ( subtree_replace_token_ids_with_unspecified ( subtree) )
298
+ }
299
+ }
300
+ }
301
+
302
+ fn leaf_replace_token_ids_with_unspecified ( leaf : tt:: Leaf ) -> tt:: Leaf {
303
+ match leaf {
304
+ tt:: Leaf :: Literal ( lit) => {
305
+ tt:: Leaf :: Literal ( tt:: Literal { id : tt:: TokenId :: unspecified ( ) , ..lit } )
306
+ }
307
+ tt:: Leaf :: Punct ( punct) => {
308
+ tt:: Leaf :: Punct ( tt:: Punct { id : tt:: TokenId :: unspecified ( ) , ..punct } )
309
+ }
310
+ tt:: Leaf :: Ident ( ident) => {
311
+ tt:: Leaf :: Ident ( tt:: Ident { id : tt:: TokenId :: unspecified ( ) , ..ident } )
312
+ }
313
+ }
314
+ }
315
+
281
316
impl server:: TokenStream for Rustc {
282
317
fn new ( & mut self ) -> Self :: TokenStream {
283
318
Self :: TokenStream :: new ( )
@@ -287,7 +322,8 @@ impl server::TokenStream for Rustc {
287
322
stream. is_empty ( )
288
323
}
289
324
fn from_str ( & mut self , src : & str ) -> Self :: TokenStream {
290
- Self :: TokenStream :: from_str ( src) . expect ( "cannot parse string" )
325
+ let ( subtree, _) = mbe:: parse_to_token_tree ( src) . expect ( "cannot parse string" ) ;
326
+ TokenStream :: with_subtree ( subtree_replace_token_ids_with_unspecified ( subtree) )
291
327
}
292
328
fn to_string ( & mut self , stream : & Self :: TokenStream ) -> String {
293
329
stream. to_string ( )
0 commit comments