@@ -115,20 +115,29 @@ impl server::TokenStream for RustAnalyzer {
115
115
Self :: TokenStream :: from_iter ( vec ! [ tree] )
116
116
}
117
117
118
- bridge:: TokenTree :: Ident ( _symbol ) => {
119
- todo ! ( "convert Ident bridge=>TokenStream" ) ;
120
- // let IdentData(ident) = self.ident_interner. get(index ).clone();
121
- // let ident: tt::Ident = ident;
122
- // let leaf = tt::Leaf::from(ident);
123
- // let tree = TokenTree::from(leaf);
124
- // Self::TokenStream::from_iter(vec![tree])
118
+ bridge:: TokenTree :: Ident ( ident ) => {
119
+ // FIXME: handle raw idents
120
+ let text = SYMBOL_INTERNER . lock ( ) . unwrap ( ) . get ( & ident . sym ) . clone ( ) ;
121
+ let ident: tt:: Ident = tt :: Ident { text , id : ident. span } ;
122
+ let leaf = tt:: Leaf :: from ( ident) ;
123
+ let tree = TokenTree :: from ( leaf) ;
124
+ Self :: TokenStream :: from_iter ( vec ! [ tree] )
125
125
}
126
126
127
- bridge:: TokenTree :: Literal ( _literal) => {
128
- todo ! ( "convert Literal bridge=>TokenStream" ) ;
129
- // let leaf = tt::Leaf::from(literal);
130
- // let tree = TokenTree::from(leaf);
131
- // Self::TokenStream::from_iter(vec![tree])
127
+ bridge:: TokenTree :: Literal ( literal) => {
128
+ let symbol = SYMBOL_INTERNER . lock ( ) . unwrap ( ) . get ( & literal. symbol ) . clone ( ) ;
129
+
130
+ let text: tt:: SmolStr = if let Some ( suffix) = literal. suffix {
131
+ let suffix = SYMBOL_INTERNER . lock ( ) . unwrap ( ) . get ( & suffix) . clone ( ) ;
132
+ format ! ( "{symbol}{suffix}" ) . into ( )
133
+ } else {
134
+ symbol
135
+ } ;
136
+
137
+ let literal = tt:: Literal { text, id : literal. span } ;
138
+ let leaf = tt:: Leaf :: from ( literal) ;
139
+ let tree = TokenTree :: from ( leaf) ;
140
+ Self :: TokenStream :: from_iter ( vec ! [ tree] )
132
141
}
133
142
134
143
bridge:: TokenTree :: Punct ( p) => {
@@ -185,13 +194,23 @@ impl server::TokenStream for RustAnalyzer {
185
194
stream
186
195
. into_iter ( )
187
196
. map ( |tree| match tree {
188
- tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( _ident) ) => {
189
- todo ! ( "convert Ident tt=>bridge" ) ;
190
- // bridge::TokenTree::Ident(Symbol(self.ident_interner.intern(&IdentData(ident))))
197
+ tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( ident) ) => {
198
+ bridge:: TokenTree :: Ident ( bridge:: Ident {
199
+ sym : SYMBOL_INTERNER . lock ( ) . unwrap ( ) . intern ( & ident. text ) ,
200
+ // FIXME: handle raw idents
201
+ is_raw : false ,
202
+ span : ident. id ,
203
+ } )
191
204
}
192
- tt:: TokenTree :: Leaf ( tt:: Leaf :: Literal ( _lit) ) => {
193
- todo ! ( "convert Literal tt=>bridge" ) ;
194
- // bridge::TokenTree::Literal(lit)
205
+ tt:: TokenTree :: Leaf ( tt:: Leaf :: Literal ( lit) ) => {
206
+ bridge:: TokenTree :: Literal ( bridge:: Literal {
207
+ // FIXME: handle literal kinds
208
+ kind : bridge:: LitKind :: Err ,
209
+ symbol : SYMBOL_INTERNER . lock ( ) . unwrap ( ) . intern ( & lit. text ) ,
210
+ // FIXME: handle suffixes
211
+ suffix : None ,
212
+ span : lit. id ,
213
+ } )
195
214
}
196
215
tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) => {
197
216
bridge:: TokenTree :: Punct ( bridge:: Punct {
@@ -379,12 +398,12 @@ impl server::Server for RustAnalyzer {
379
398
}
380
399
}
381
400
382
- fn intern_symbol ( _ident : & str ) -> Self :: Symbol {
383
- todo ! ( "intern_symbol" )
401
+ fn intern_symbol ( ident : & str ) -> Self :: Symbol {
402
+ SYMBOL_INTERNER . lock ( ) . unwrap ( ) . intern ( & tt :: SmolStr :: from ( ident ) )
384
403
}
385
404
386
- fn with_symbol_string ( _symbol : & Self :: Symbol , _f : impl FnOnce ( & str ) ) {
387
- todo ! ( "with_symbol_string" )
405
+ fn with_symbol_string ( symbol : & Self :: Symbol , f : impl FnOnce ( & str ) ) {
406
+ f ( SYMBOL_INTERNER . lock ( ) . unwrap ( ) . get ( symbol ) . as_str ( ) )
388
407
}
389
408
}
390
409
0 commit comments