8
8
//!
9
9
//! FIXME: No span and source file information is implemented yet
10
10
11
- use super :: proc_macro:: bridge:: { self , server} ;
11
+ use super :: proc_macro:: {
12
+ self ,
13
+ bridge:: { self , server} ,
14
+ } ;
12
15
13
16
mod token_stream;
14
17
pub use token_stream:: * ;
15
18
16
- use std :: ascii ;
17
- use std :: collections :: HashMap ;
18
- use std :: hash :: Hash ;
19
+ mod symbol ;
20
+ pub use symbol :: * ;
21
+
19
22
use std:: iter:: FromIterator ;
20
- use std:: ops:: Bound ;
21
23
22
24
type Group = tt:: Subtree ;
23
25
type TokenTree = tt:: TokenTree ;
@@ -51,42 +53,6 @@ impl Diagnostic {
51
53
}
52
54
}
53
55
54
- // Rustc Server Ident has to be `Copyable`
55
- // We use a stub here for bypassing
56
- #[ derive( Hash , Eq , PartialEq , Copy , Clone ) ]
57
- pub struct IdentId ( u32 ) ;
58
-
59
- #[ derive( Clone , Hash , Eq , PartialEq ) ]
60
- struct IdentData ( tt:: Ident ) ;
61
-
62
- #[ derive( Default ) ]
63
- struct IdentInterner {
64
- idents : HashMap < IdentData , u32 > ,
65
- ident_data : Vec < IdentData > ,
66
- }
67
-
68
- impl IdentInterner {
69
- fn intern ( & mut self , data : & IdentData ) -> u32 {
70
- if let Some ( index) = self . idents . get ( data) {
71
- return * index;
72
- }
73
-
74
- let index = self . idents . len ( ) as u32 ;
75
- self . ident_data . push ( data. clone ( ) ) ;
76
- self . idents . insert ( data. clone ( ) , index) ;
77
- index
78
- }
79
-
80
- fn get ( & self , index : u32 ) -> & IdentData {
81
- & self . ident_data [ index as usize ]
82
- }
83
-
84
- #[ allow( unused) ]
85
- fn get_mut ( & mut self , index : u32 ) -> & mut IdentData {
86
- self . ident_data . get_mut ( index as usize ) . expect ( "Should be consistent" )
87
- }
88
- }
89
-
90
56
pub struct FreeFunctions ;
91
57
92
58
#[ derive( Default ) ]
@@ -141,12 +107,13 @@ impl server::TokenStream for RustAnalyzer {
141
107
Self :: TokenStream :: from_iter ( vec ! [ tree] )
142
108
}
143
109
144
- bridge:: TokenTree :: Ident ( IdentId ( index) ) => {
145
- let IdentData ( ident) = self . ident_interner . get ( index) . clone ( ) ;
146
- let ident: tt:: Ident = ident;
147
- let leaf = tt:: Leaf :: from ( ident) ;
148
- let tree = TokenTree :: from ( leaf) ;
149
- Self :: TokenStream :: from_iter ( vec ! [ tree] )
110
+ bridge:: TokenTree :: Ident ( symbol) => {
111
+ todo ! ( "implement" ) ;
112
+ // let IdentData(ident) = self.ident_interner.get(index).clone();
113
+ // let ident: tt::Ident = ident;
114
+ // let leaf = tt::Leaf::from(ident);
115
+ // let tree = TokenTree::from(leaf);
116
+ // Self::TokenStream::from_iter(vec![tree])
150
117
}
151
118
152
119
bridge:: TokenTree :: Literal ( literal) => {
@@ -210,7 +177,8 @@ impl server::TokenStream for RustAnalyzer {
210
177
. into_iter ( )
211
178
. map ( |tree| match tree {
212
179
tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( ident) ) => {
213
- bridge:: TokenTree :: Ident ( IdentId ( self . ident_interner . intern ( & IdentData ( ident) ) ) )
180
+ todo ! ( "implement" ) ;
181
+ // bridge::TokenTree::Ident(Symbol(self.ident_interner.intern(&IdentData(ident))))
214
182
}
215
183
tt:: TokenTree :: Leaf ( tt:: Leaf :: Literal ( lit) ) => bridge:: TokenTree :: Literal ( lit) ,
216
184
tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) => {
@@ -236,162 +204,36 @@ impl server::TokenStream for RustAnalyzer {
236
204
}
237
205
}
238
206
239
- fn delim_to_internal ( d : bridge :: Delimiter ) -> Option < tt:: Delimiter > {
207
+ fn delim_to_internal ( d : proc_macro :: Delimiter ) -> Option < tt:: Delimiter > {
240
208
let kind = match d {
241
- bridge :: Delimiter :: Parenthesis => tt:: DelimiterKind :: Parenthesis ,
242
- bridge :: Delimiter :: Brace => tt:: DelimiterKind :: Brace ,
243
- bridge :: Delimiter :: Bracket => tt:: DelimiterKind :: Bracket ,
244
- bridge :: Delimiter :: None => return None ,
209
+ proc_macro :: Delimiter :: Parenthesis => tt:: DelimiterKind :: Parenthesis ,
210
+ proc_macro :: Delimiter :: Brace => tt:: DelimiterKind :: Brace ,
211
+ proc_macro :: Delimiter :: Bracket => tt:: DelimiterKind :: Bracket ,
212
+ proc_macro :: Delimiter :: None => return None ,
245
213
} ;
246
214
Some ( tt:: Delimiter { id : tt:: TokenId :: unspecified ( ) , kind } )
247
215
}
248
216
249
- fn delim_to_external ( d : Option < tt:: Delimiter > ) -> bridge :: Delimiter {
217
+ fn delim_to_external ( d : Option < tt:: Delimiter > ) -> proc_macro :: Delimiter {
250
218
match d. map ( |it| it. kind ) {
251
- Some ( tt:: DelimiterKind :: Parenthesis ) => bridge :: Delimiter :: Parenthesis ,
252
- Some ( tt:: DelimiterKind :: Brace ) => bridge :: Delimiter :: Brace ,
253
- Some ( tt:: DelimiterKind :: Bracket ) => bridge :: Delimiter :: Bracket ,
254
- None => bridge :: Delimiter :: None ,
219
+ Some ( tt:: DelimiterKind :: Parenthesis ) => proc_macro :: Delimiter :: Parenthesis ,
220
+ Some ( tt:: DelimiterKind :: Brace ) => proc_macro :: Delimiter :: Brace ,
221
+ Some ( tt:: DelimiterKind :: Bracket ) => proc_macro :: Delimiter :: Bracket ,
222
+ None => proc_macro :: Delimiter :: None ,
255
223
}
256
224
}
257
225
258
- fn spacing_to_internal ( spacing : bridge :: Spacing ) -> Spacing {
226
+ fn spacing_to_internal ( spacing : proc_macro :: Spacing ) -> Spacing {
259
227
match spacing {
260
- bridge :: Spacing :: Alone => Spacing :: Alone ,
261
- bridge :: Spacing :: Joint => Spacing :: Joint ,
228
+ proc_macro :: Spacing :: Alone => Spacing :: Alone ,
229
+ proc_macro :: Spacing :: Joint => Spacing :: Joint ,
262
230
}
263
231
}
264
232
265
- fn spacing_to_external ( spacing : Spacing ) -> bridge :: Spacing {
233
+ fn spacing_to_external ( spacing : Spacing ) -> proc_macro :: Spacing {
266
234
match spacing {
267
- Spacing :: Alone => bridge:: Spacing :: Alone ,
268
- Spacing :: Joint => bridge:: Spacing :: Joint ,
269
- }
270
- }
271
-
272
- impl server:: Ident for RustAnalyzer {
273
- fn new ( & mut self , string : & str , span : Self :: Span , _is_raw : bool ) -> Self :: Ident {
274
- IdentId ( self . ident_interner . intern ( & IdentData ( tt:: Ident { text : string. into ( ) , id : span } ) ) )
275
- }
276
-
277
- fn span ( & mut self , ident : Self :: Ident ) -> Self :: Span {
278
- self . ident_interner . get ( ident. 0 ) . 0 . id
279
- }
280
- fn with_span ( & mut self , ident : Self :: Ident , span : Self :: Span ) -> Self :: Ident {
281
- let data = self . ident_interner . get ( ident. 0 ) ;
282
- let new = IdentData ( tt:: Ident { id : span, ..data. 0 . clone ( ) } ) ;
283
- IdentId ( self . ident_interner . intern ( & new) )
284
- }
285
- }
286
-
287
- impl server:: Literal for RustAnalyzer {
288
- fn debug_kind ( & mut self , _literal : & Self :: Literal ) -> String {
289
- // r-a: debug_kind and suffix are unsupported; corresponding client code has been changed to not call these.
290
- // They must still be present to be ABI-compatible and work with upstream proc_macro.
291
- "" . to_owned ( )
292
- }
293
- fn from_str ( & mut self , s : & str ) -> Result < Self :: Literal , ( ) > {
294
- Ok ( Literal { text : s. into ( ) , id : tt:: TokenId :: unspecified ( ) } )
295
- }
296
- fn symbol ( & mut self , literal : & Self :: Literal ) -> String {
297
- literal. text . to_string ( )
298
- }
299
- fn suffix ( & mut self , _literal : & Self :: Literal ) -> Option < String > {
300
- None
301
- }
302
-
303
- fn to_string ( & mut self , literal : & Self :: Literal ) -> String {
304
- literal. to_string ( )
305
- }
306
-
307
- fn integer ( & mut self , n : & str ) -> Self :: Literal {
308
- let n = match n. parse :: < i128 > ( ) {
309
- Ok ( n) => n. to_string ( ) ,
310
- Err ( _) => n. parse :: < u128 > ( ) . unwrap ( ) . to_string ( ) ,
311
- } ;
312
- Literal { text : n. into ( ) , id : tt:: TokenId :: unspecified ( ) }
313
- }
314
-
315
- fn typed_integer ( & mut self , n : & str , kind : & str ) -> Self :: Literal {
316
- macro_rules! def_suffixed_integer {
317
- ( $kind: ident, $( $ty: ty) ,* ) => {
318
- match $kind {
319
- $(
320
- stringify!( $ty) => {
321
- let n: $ty = n. parse( ) . unwrap( ) ;
322
- format!( concat!( "{}" , stringify!( $ty) ) , n)
323
- }
324
- ) *
325
- _ => unimplemented!( "unknown args for typed_integer: n {}, kind {}" , n, $kind) ,
326
- }
327
- }
328
- }
329
-
330
- let text = def_suffixed_integer ! { kind, u8 , u16 , u32 , u64 , u128 , usize , i8 , i16 , i32 , i64 , i128 , isize } ;
331
-
332
- Literal { text : text. into ( ) , id : tt:: TokenId :: unspecified ( ) }
333
- }
334
-
335
- fn float ( & mut self , n : & str ) -> Self :: Literal {
336
- let n: f64 = n. parse ( ) . unwrap ( ) ;
337
- let mut text = f64:: to_string ( & n) ;
338
- if !text. contains ( '.' ) {
339
- text += ".0"
340
- }
341
- Literal { text : text. into ( ) , id : tt:: TokenId :: unspecified ( ) }
342
- }
343
-
344
- fn f32 ( & mut self , n : & str ) -> Self :: Literal {
345
- let n: f32 = n. parse ( ) . unwrap ( ) ;
346
- let text = format ! ( "{}f32" , n) ;
347
- Literal { text : text. into ( ) , id : tt:: TokenId :: unspecified ( ) }
348
- }
349
-
350
- fn f64 ( & mut self , n : & str ) -> Self :: Literal {
351
- let n: f64 = n. parse ( ) . unwrap ( ) ;
352
- let text = format ! ( "{}f64" , n) ;
353
- Literal { text : text. into ( ) , id : tt:: TokenId :: unspecified ( ) }
354
- }
355
-
356
- fn string ( & mut self , string : & str ) -> Self :: Literal {
357
- let mut escaped = String :: new ( ) ;
358
- for ch in string. chars ( ) {
359
- escaped. extend ( ch. escape_debug ( ) ) ;
360
- }
361
- Literal { text : format ! ( "\" {}\" " , escaped) . into ( ) , id : tt:: TokenId :: unspecified ( ) }
362
- }
363
-
364
- fn character ( & mut self , ch : char ) -> Self :: Literal {
365
- Literal { text : format ! ( "'{}'" , ch) . into ( ) , id : tt:: TokenId :: unspecified ( ) }
366
- }
367
-
368
- fn byte_string ( & mut self , bytes : & [ u8 ] ) -> Self :: Literal {
369
- let string = bytes
370
- . iter ( )
371
- . cloned ( )
372
- . flat_map ( ascii:: escape_default)
373
- . map ( Into :: < char > :: into)
374
- . collect :: < String > ( ) ;
375
-
376
- Literal { text : format ! ( "b\" {}\" " , string) . into ( ) , id : tt:: TokenId :: unspecified ( ) }
377
- }
378
-
379
- fn span ( & mut self , literal : & Self :: Literal ) -> Self :: Span {
380
- literal. id
381
- }
382
-
383
- fn set_span ( & mut self , literal : & mut Self :: Literal , span : Self :: Span ) {
384
- literal. id = span;
385
- }
386
-
387
- fn subspan (
388
- & mut self ,
389
- _literal : & Self :: Literal ,
390
- _start : Bound < usize > ,
391
- _end : Bound < usize > ,
392
- ) -> Option < Self :: Span > {
393
- // FIXME handle span
394
- None
235
+ Spacing :: Alone => proc_macro:: Spacing :: Alone ,
236
+ Spacing :: Joint => proc_macro:: Spacing :: Joint ,
395
237
}
396
238
}
397
239
0 commit comments