88//!
99//! FIXME: No span and source file information is implemented yet
1010
11- use super :: proc_macro:: bridge:: { self , server} ;
11+ use super :: proc_macro:: {
12+ self ,
13+ bridge:: { self , server} ,
14+ } ;
1215
1316mod token_stream;
1417pub use token_stream:: * ;
1518
16- use std :: ascii ;
17- use std :: collections :: HashMap ;
18- use std :: hash :: Hash ;
19+ mod symbol ;
20+ pub use symbol :: * ;
21+
1922use std:: iter:: FromIterator ;
20- use std:: ops:: Bound ;
2123
2224type Group = tt:: Subtree ;
2325type TokenTree = tt:: TokenTree ;
@@ -51,42 +53,6 @@ impl Diagnostic {
5153 }
5254}
5355
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-
9056pub struct FreeFunctions ;
9157
9258#[ derive( Default ) ]
@@ -141,12 +107,13 @@ impl server::TokenStream for RustAnalyzer {
141107 Self :: TokenStream :: from_iter ( vec ! [ tree] )
142108 }
143109
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])
150117 }
151118
152119 bridge:: TokenTree :: Literal ( literal) => {
@@ -210,7 +177,8 @@ impl server::TokenStream for RustAnalyzer {
210177 . into_iter ( )
211178 . map ( |tree| match tree {
212179 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))))
214182 }
215183 tt:: TokenTree :: Leaf ( tt:: Leaf :: Literal ( lit) ) => bridge:: TokenTree :: Literal ( lit) ,
216184 tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) => {
@@ -236,162 +204,36 @@ impl server::TokenStream for RustAnalyzer {
236204 }
237205}
238206
239- fn delim_to_internal ( d : bridge :: Delimiter ) -> Option < tt:: Delimiter > {
207+ fn delim_to_internal ( d : proc_macro :: Delimiter ) -> Option < tt:: Delimiter > {
240208 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 ,
245213 } ;
246214 Some ( tt:: Delimiter { id : tt:: TokenId :: unspecified ( ) , kind } )
247215}
248216
249- fn delim_to_external ( d : Option < tt:: Delimiter > ) -> bridge :: Delimiter {
217+ fn delim_to_external ( d : Option < tt:: Delimiter > ) -> proc_macro :: Delimiter {
250218 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 ,
255223 }
256224}
257225
258- fn spacing_to_internal ( spacing : bridge :: Spacing ) -> Spacing {
226+ fn spacing_to_internal ( spacing : proc_macro :: Spacing ) -> Spacing {
259227 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 ,
262230 }
263231}
264232
265- fn spacing_to_external ( spacing : Spacing ) -> bridge :: Spacing {
233+ fn spacing_to_external ( spacing : Spacing ) -> proc_macro :: Spacing {
266234 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 ,
395237 }
396238}
397239
0 commit comments