]> git.lizzy.rs Git - rust.git/blob - crates/proc-macro-srv/src/abis/abi_1_58/ra_server.rs
Auto merge of #12828 - fasterthanlime:proc-macro-srv-naming, r=Veykril
[rust.git] / crates / proc-macro-srv / src / abis / abi_1_58 / ra_server.rs
1 //! Rustc proc-macro server implementation with tt
2 //!
3 //! Based on idea from <https://github.com/fedochet/rust-proc-macro-expander>
4 //! The lib-proc-macro server backend is `TokenStream`-agnostic, such that
5 //! we could provide any TokenStream implementation.
6 //! The original idea from fedochet is using proc-macro2 as backend,
7 //! we use tt instead for better integration with RA.
8 //!
9 //! FIXME: No span and source file information is implemented yet
10
11 use super::proc_macro::bridge::{self, server};
12
13 use std::collections::HashMap;
14 use std::hash::Hash;
15 use std::iter::FromIterator;
16 use std::ops::Bound;
17 use std::{ascii, vec::IntoIter};
18
19 type Group = tt::Subtree;
20 type TokenTree = tt::TokenTree;
21 type Punct = tt::Punct;
22 type Spacing = tt::Spacing;
23 type Literal = tt::Literal;
24 type Span = tt::TokenId;
25
26 #[derive(Debug, Clone)]
27 pub struct TokenStream {
28     pub token_trees: Vec<TokenTree>,
29 }
30
31 impl TokenStream {
32     pub fn new() -> Self {
33         TokenStream { token_trees: Default::default() }
34     }
35
36     pub fn with_subtree(subtree: tt::Subtree) -> Self {
37         if subtree.delimiter.is_some() {
38             TokenStream { token_trees: vec![TokenTree::Subtree(subtree)] }
39         } else {
40             TokenStream { token_trees: subtree.token_trees }
41         }
42     }
43
44     pub fn into_subtree(self) -> tt::Subtree {
45         tt::Subtree { delimiter: None, token_trees: self.token_trees }
46     }
47
48     pub fn is_empty(&self) -> bool {
49         self.token_trees.is_empty()
50     }
51 }
52
53 /// Creates a token stream containing a single token tree.
54 impl From<TokenTree> for TokenStream {
55     fn from(tree: TokenTree) -> TokenStream {
56         TokenStream { token_trees: vec![tree] }
57     }
58 }
59
60 /// Collects a number of token trees into a single stream.
61 impl FromIterator<TokenTree> for TokenStream {
62     fn from_iter<I: IntoIterator<Item = TokenTree>>(trees: I) -> Self {
63         trees.into_iter().map(TokenStream::from).collect()
64     }
65 }
66
67 /// A "flattening" operation on token streams, collects token trees
68 /// from multiple token streams into a single stream.
69 impl FromIterator<TokenStream> for TokenStream {
70     fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self {
71         let mut builder = TokenStreamBuilder::new();
72         streams.into_iter().for_each(|stream| builder.push(stream));
73         builder.build()
74     }
75 }
76
77 impl Extend<TokenTree> for TokenStream {
78     fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, trees: I) {
79         self.extend(trees.into_iter().map(TokenStream::from));
80     }
81 }
82
83 impl Extend<TokenStream> for TokenStream {
84     fn extend<I: IntoIterator<Item = TokenStream>>(&mut self, streams: I) {
85         for item in streams {
86             for tkn in item {
87                 match tkn {
88                     tt::TokenTree::Subtree(subtree) if subtree.delimiter.is_none() => {
89                         self.token_trees.extend(subtree.token_trees);
90                     }
91                     _ => {
92                         self.token_trees.push(tkn);
93                     }
94                 }
95             }
96         }
97     }
98 }
99
100 #[derive(Clone)]
101 pub struct SourceFile {
102     // FIXME stub
103 }
104
105 type Level = super::proc_macro::Level;
106 type LineColumn = super::proc_macro::LineColumn;
107
108 /// A structure representing a diagnostic message and associated children
109 /// messages.
110 #[derive(Clone, Debug)]
111 pub struct Diagnostic {
112     level: Level,
113     message: String,
114     spans: Vec<Span>,
115     children: Vec<Diagnostic>,
116 }
117
118 impl Diagnostic {
119     /// Creates a new diagnostic with the given `level` and `message`.
120     pub fn new<T: Into<String>>(level: Level, message: T) -> Diagnostic {
121         Diagnostic { level, message: message.into(), spans: vec![], children: vec![] }
122     }
123 }
124
125 // Rustc Server Ident has to be `Copyable`
126 // We use a stub here for bypassing
127 #[derive(Hash, Eq, PartialEq, Copy, Clone)]
128 pub struct IdentId(u32);
129
130 #[derive(Clone, Hash, Eq, PartialEq)]
131 struct IdentData(tt::Ident);
132
133 #[derive(Default)]
134 struct IdentInterner {
135     idents: HashMap<IdentData, u32>,
136     ident_data: Vec<IdentData>,
137 }
138
139 impl IdentInterner {
140     fn intern(&mut self, data: &IdentData) -> u32 {
141         if let Some(index) = self.idents.get(data) {
142             return *index;
143         }
144
145         let index = self.idents.len() as u32;
146         self.ident_data.push(data.clone());
147         self.idents.insert(data.clone(), index);
148         index
149     }
150
151     fn get(&self, index: u32) -> &IdentData {
152         &self.ident_data[index as usize]
153     }
154
155     #[allow(unused)]
156     fn get_mut(&mut self, index: u32) -> &mut IdentData {
157         self.ident_data.get_mut(index as usize).expect("Should be consistent")
158     }
159 }
160
161 pub struct TokenStreamBuilder {
162     acc: TokenStream,
163 }
164
165 /// Public implementation details for the `TokenStream` type, such as iterators.
166 pub mod token_stream {
167     use std::str::FromStr;
168
169     use super::{TokenStream, TokenTree};
170
171     /// An iterator over `TokenStream`'s `TokenTree`s.
172     /// The iteration is "shallow", e.g., the iterator doesn't recurse into delimited groups,
173     /// and returns whole groups as token trees.
174     impl IntoIterator for TokenStream {
175         type Item = TokenTree;
176         type IntoIter = super::IntoIter<TokenTree>;
177
178         fn into_iter(self) -> Self::IntoIter {
179             self.token_trees.into_iter()
180         }
181     }
182
183     type LexError = String;
184
185     /// Attempts to break the string into tokens and parse those tokens into a token stream.
186     /// May fail for a number of reasons, for example, if the string contains unbalanced delimiters
187     /// or characters not existing in the language.
188     /// All tokens in the parsed stream get `Span::call_site()` spans.
189     ///
190     /// NOTE: some errors may cause panics instead of returning `LexError`. We reserve the right to
191     /// change these errors into `LexError`s later.
192     impl FromStr for TokenStream {
193         type Err = LexError;
194
195         fn from_str(src: &str) -> Result<TokenStream, LexError> {
196             let (subtree, _token_map) =
197                 mbe::parse_to_token_tree(src).ok_or("Failed to parse from mbe")?;
198
199             let subtree = subtree_replace_token_ids_with_unspecified(subtree);
200             Ok(TokenStream::with_subtree(subtree))
201         }
202     }
203
204     impl ToString for TokenStream {
205         fn to_string(&self) -> String {
206             tt::pretty(&self.token_trees)
207         }
208     }
209
210     fn subtree_replace_token_ids_with_unspecified(subtree: tt::Subtree) -> tt::Subtree {
211         tt::Subtree {
212             delimiter: subtree
213                 .delimiter
214                 .map(|d| tt::Delimiter { id: tt::TokenId::unspecified(), ..d }),
215             token_trees: subtree
216                 .token_trees
217                 .into_iter()
218                 .map(token_tree_replace_token_ids_with_unspecified)
219                 .collect(),
220         }
221     }
222
223     fn token_tree_replace_token_ids_with_unspecified(tt: tt::TokenTree) -> tt::TokenTree {
224         match tt {
225             tt::TokenTree::Leaf(leaf) => {
226                 tt::TokenTree::Leaf(leaf_replace_token_ids_with_unspecified(leaf))
227             }
228             tt::TokenTree::Subtree(subtree) => {
229                 tt::TokenTree::Subtree(subtree_replace_token_ids_with_unspecified(subtree))
230             }
231         }
232     }
233
234     fn leaf_replace_token_ids_with_unspecified(leaf: tt::Leaf) -> tt::Leaf {
235         match leaf {
236             tt::Leaf::Literal(lit) => {
237                 tt::Leaf::Literal(tt::Literal { id: tt::TokenId::unspecified(), ..lit })
238             }
239             tt::Leaf::Punct(punct) => {
240                 tt::Leaf::Punct(tt::Punct { id: tt::TokenId::unspecified(), ..punct })
241             }
242             tt::Leaf::Ident(ident) => {
243                 tt::Leaf::Ident(tt::Ident { id: tt::TokenId::unspecified(), ..ident })
244             }
245         }
246     }
247 }
248
249 impl TokenStreamBuilder {
250     fn new() -> TokenStreamBuilder {
251         TokenStreamBuilder { acc: TokenStream::new() }
252     }
253
254     fn push(&mut self, stream: TokenStream) {
255         self.acc.extend(stream.into_iter())
256     }
257
258     fn build(self) -> TokenStream {
259         self.acc
260     }
261 }
262
263 pub struct FreeFunctions;
264
265 #[derive(Clone)]
266 pub struct TokenStreamIter {
267     trees: IntoIter<TokenTree>,
268 }
269
270 #[derive(Default)]
271 pub struct RustAnalyzer {
272     ident_interner: IdentInterner,
273     // FIXME: store span information here.
274 }
275
276 impl server::Types for RustAnalyzer {
277     type FreeFunctions = FreeFunctions;
278     type TokenStream = TokenStream;
279     type TokenStreamBuilder = TokenStreamBuilder;
280     type TokenStreamIter = TokenStreamIter;
281     type Group = Group;
282     type Punct = Punct;
283     type Ident = IdentId;
284     type Literal = Literal;
285     type SourceFile = SourceFile;
286     type Diagnostic = Diagnostic;
287     type Span = Span;
288     type MultiSpan = Vec<Span>;
289 }
290
291 impl server::FreeFunctions for RustAnalyzer {
292     fn track_env_var(&mut self, _var: &str, _value: Option<&str>) {
293         // FIXME: track env var accesses
294         // https://github.com/rust-lang/rust/pull/71858
295     }
296     fn track_path(&mut self, _path: &str) {}
297 }
298
299 impl server::TokenStream for RustAnalyzer {
300     fn new(&mut self) -> Self::TokenStream {
301         Self::TokenStream::new()
302     }
303
304     fn is_empty(&mut self, stream: &Self::TokenStream) -> bool {
305         stream.is_empty()
306     }
307     fn from_str(&mut self, src: &str) -> Self::TokenStream {
308         use std::str::FromStr;
309
310         Self::TokenStream::from_str(src).expect("cannot parse string")
311     }
312     fn to_string(&mut self, stream: &Self::TokenStream) -> String {
313         stream.to_string()
314     }
315     fn from_token_tree(
316         &mut self,
317         tree: bridge::TokenTree<Self::Group, Self::Punct, Self::Ident, Self::Literal>,
318     ) -> Self::TokenStream {
319         match tree {
320             bridge::TokenTree::Group(group) => {
321                 let tree = TokenTree::from(group);
322                 Self::TokenStream::from_iter(vec![tree])
323             }
324
325             bridge::TokenTree::Ident(IdentId(index)) => {
326                 let IdentData(ident) = self.ident_interner.get(index).clone();
327                 let ident: tt::Ident = ident;
328                 let leaf = tt::Leaf::from(ident);
329                 let tree = TokenTree::from(leaf);
330                 Self::TokenStream::from_iter(vec![tree])
331             }
332
333             bridge::TokenTree::Literal(literal) => {
334                 let leaf = tt::Leaf::from(literal);
335                 let tree = TokenTree::from(leaf);
336                 Self::TokenStream::from_iter(vec![tree])
337             }
338
339             bridge::TokenTree::Punct(p) => {
340                 let leaf = tt::Leaf::from(p);
341                 let tree = TokenTree::from(leaf);
342                 Self::TokenStream::from_iter(vec![tree])
343             }
344         }
345     }
346
347     fn into_iter(&mut self, stream: Self::TokenStream) -> Self::TokenStreamIter {
348         let trees: Vec<TokenTree> = stream.into_iter().collect();
349         TokenStreamIter { trees: trees.into_iter() }
350     }
351
352     fn expand_expr(&mut self, self_: &Self::TokenStream) -> Result<Self::TokenStream, ()> {
353         Ok(self_.clone())
354     }
355 }
356
357 impl server::TokenStreamBuilder for RustAnalyzer {
358     fn new(&mut self) -> Self::TokenStreamBuilder {
359         Self::TokenStreamBuilder::new()
360     }
361     fn push(&mut self, builder: &mut Self::TokenStreamBuilder, stream: Self::TokenStream) {
362         builder.push(stream)
363     }
364     fn build(&mut self, builder: Self::TokenStreamBuilder) -> Self::TokenStream {
365         builder.build()
366     }
367 }
368
369 impl server::TokenStreamIter for RustAnalyzer {
370     fn next(
371         &mut self,
372         iter: &mut Self::TokenStreamIter,
373     ) -> Option<bridge::TokenTree<Self::Group, Self::Punct, Self::Ident, Self::Literal>> {
374         iter.trees.next().map(|tree| match tree {
375             TokenTree::Subtree(group) => bridge::TokenTree::Group(group),
376             TokenTree::Leaf(tt::Leaf::Ident(ident)) => {
377                 bridge::TokenTree::Ident(IdentId(self.ident_interner.intern(&IdentData(ident))))
378             }
379             TokenTree::Leaf(tt::Leaf::Literal(literal)) => bridge::TokenTree::Literal(literal),
380             TokenTree::Leaf(tt::Leaf::Punct(punct)) => bridge::TokenTree::Punct(punct),
381         })
382     }
383 }
384
385 fn delim_to_internal(d: bridge::Delimiter) -> Option<tt::Delimiter> {
386     let kind = match d {
387         bridge::Delimiter::Parenthesis => tt::DelimiterKind::Parenthesis,
388         bridge::Delimiter::Brace => tt::DelimiterKind::Brace,
389         bridge::Delimiter::Bracket => tt::DelimiterKind::Bracket,
390         bridge::Delimiter::None => return None,
391     };
392     Some(tt::Delimiter { id: tt::TokenId::unspecified(), kind })
393 }
394
395 fn delim_to_external(d: Option<tt::Delimiter>) -> bridge::Delimiter {
396     match d.map(|it| it.kind) {
397         Some(tt::DelimiterKind::Parenthesis) => bridge::Delimiter::Parenthesis,
398         Some(tt::DelimiterKind::Brace) => bridge::Delimiter::Brace,
399         Some(tt::DelimiterKind::Bracket) => bridge::Delimiter::Bracket,
400         None => bridge::Delimiter::None,
401     }
402 }
403
404 fn spacing_to_internal(spacing: bridge::Spacing) -> Spacing {
405     match spacing {
406         bridge::Spacing::Alone => Spacing::Alone,
407         bridge::Spacing::Joint => Spacing::Joint,
408     }
409 }
410
411 fn spacing_to_external(spacing: Spacing) -> bridge::Spacing {
412     match spacing {
413         Spacing::Alone => bridge::Spacing::Alone,
414         Spacing::Joint => bridge::Spacing::Joint,
415     }
416 }
417
418 impl server::Group for RustAnalyzer {
419     fn new(&mut self, delimiter: bridge::Delimiter, stream: Self::TokenStream) -> Self::Group {
420         Self::Group { delimiter: delim_to_internal(delimiter), token_trees: stream.token_trees }
421     }
422     fn delimiter(&mut self, group: &Self::Group) -> bridge::Delimiter {
423         delim_to_external(group.delimiter)
424     }
425
426     // NOTE: Return value of do not include delimiter
427     fn stream(&mut self, group: &Self::Group) -> Self::TokenStream {
428         TokenStream { token_trees: group.token_trees.clone() }
429     }
430
431     fn span(&mut self, group: &Self::Group) -> Self::Span {
432         group.delimiter.map(|it| it.id).unwrap_or_else(tt::TokenId::unspecified)
433     }
434
435     fn set_span(&mut self, group: &mut Self::Group, span: Self::Span) {
436         if let Some(delim) = &mut group.delimiter {
437             delim.id = span;
438         }
439     }
440
441     fn span_open(&mut self, group: &Self::Group) -> Self::Span {
442         // FIXME we only store one `TokenId` for the delimiters
443         group.delimiter.map(|it| it.id).unwrap_or_else(tt::TokenId::unspecified)
444     }
445
446     fn span_close(&mut self, group: &Self::Group) -> Self::Span {
447         // FIXME we only store one `TokenId` for the delimiters
448         group.delimiter.map(|it| it.id).unwrap_or_else(tt::TokenId::unspecified)
449     }
450 }
451
452 impl server::Punct for RustAnalyzer {
453     fn new(&mut self, ch: char, spacing: bridge::Spacing) -> Self::Punct {
454         tt::Punct {
455             char: ch,
456             spacing: spacing_to_internal(spacing),
457             id: tt::TokenId::unspecified(),
458         }
459     }
460     fn as_char(&mut self, punct: Self::Punct) -> char {
461         punct.char
462     }
463     fn spacing(&mut self, punct: Self::Punct) -> bridge::Spacing {
464         spacing_to_external(punct.spacing)
465     }
466     fn span(&mut self, punct: Self::Punct) -> Self::Span {
467         punct.id
468     }
469     fn with_span(&mut self, punct: Self::Punct, span: Self::Span) -> Self::Punct {
470         tt::Punct { id: span, ..punct }
471     }
472 }
473
474 impl server::Ident for RustAnalyzer {
475     fn new(&mut self, string: &str, span: Self::Span, _is_raw: bool) -> Self::Ident {
476         IdentId(self.ident_interner.intern(&IdentData(tt::Ident { text: string.into(), id: span })))
477     }
478
479     fn span(&mut self, ident: Self::Ident) -> Self::Span {
480         self.ident_interner.get(ident.0).0.id
481     }
482     fn with_span(&mut self, ident: Self::Ident, span: Self::Span) -> Self::Ident {
483         let data = self.ident_interner.get(ident.0);
484         let new = IdentData(tt::Ident { id: span, ..data.0.clone() });
485         IdentId(self.ident_interner.intern(&new))
486     }
487 }
488
489 impl server::Literal for RustAnalyzer {
490     fn debug_kind(&mut self, _literal: &Self::Literal) -> String {
491         // r-a: debug_kind and suffix are unsupported; corresponding client code has been changed to not call these.
492         // They must still be present to be ABI-compatible and work with upstream proc_macro.
493         "".to_owned()
494     }
495     fn from_str(&mut self, s: &str) -> Result<Self::Literal, ()> {
496         Ok(Literal { text: s.into(), id: tt::TokenId::unspecified() })
497     }
498     fn symbol(&mut self, literal: &Self::Literal) -> String {
499         literal.text.to_string()
500     }
501     fn suffix(&mut self, _literal: &Self::Literal) -> Option<String> {
502         None
503     }
504
505     fn to_string(&mut self, literal: &Self::Literal) -> String {
506         literal.to_string()
507     }
508
509     fn integer(&mut self, n: &str) -> Self::Literal {
510         let n = match n.parse::<i128>() {
511             Ok(n) => n.to_string(),
512             Err(_) => n.parse::<u128>().unwrap().to_string(),
513         };
514         Literal { text: n.into(), id: tt::TokenId::unspecified() }
515     }
516
517     fn typed_integer(&mut self, n: &str, kind: &str) -> Self::Literal {
518         macro_rules! def_suffixed_integer {
519             ($kind:ident, $($ty:ty),*) => {
520                 match $kind {
521                     $(
522                         stringify!($ty) => {
523                             let n: $ty = n.parse().unwrap();
524                             format!(concat!("{}", stringify!($ty)), n)
525                         }
526                     )*
527                     _ => unimplemented!("unknown args for typed_integer: n {}, kind {}", n, $kind),
528                 }
529             }
530         }
531
532         let text = def_suffixed_integer! {kind, u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize};
533
534         Literal { text: text.into(), id: tt::TokenId::unspecified() }
535     }
536
537     fn float(&mut self, n: &str) -> Self::Literal {
538         let n: f64 = n.parse().unwrap();
539         let mut text = f64::to_string(&n);
540         if !text.contains('.') {
541             text += ".0"
542         }
543         Literal { text: text.into(), id: tt::TokenId::unspecified() }
544     }
545
546     fn f32(&mut self, n: &str) -> Self::Literal {
547         let n: f32 = n.parse().unwrap();
548         let text = format!("{}f32", n);
549         Literal { text: text.into(), id: tt::TokenId::unspecified() }
550     }
551
552     fn f64(&mut self, n: &str) -> Self::Literal {
553         let n: f64 = n.parse().unwrap();
554         let text = format!("{}f64", n);
555         Literal { text: text.into(), id: tt::TokenId::unspecified() }
556     }
557
558     fn string(&mut self, string: &str) -> Self::Literal {
559         let mut escaped = String::new();
560         for ch in string.chars() {
561             escaped.extend(ch.escape_debug());
562         }
563         Literal { text: format!("\"{}\"", escaped).into(), id: tt::TokenId::unspecified() }
564     }
565
566     fn character(&mut self, ch: char) -> Self::Literal {
567         Literal { text: format!("'{}'", ch).into(), id: tt::TokenId::unspecified() }
568     }
569
570     fn byte_string(&mut self, bytes: &[u8]) -> Self::Literal {
571         let string = bytes
572             .iter()
573             .cloned()
574             .flat_map(ascii::escape_default)
575             .map(Into::<char>::into)
576             .collect::<String>();
577
578         Literal { text: format!("b\"{}\"", string).into(), id: tt::TokenId::unspecified() }
579     }
580
581     fn span(&mut self, literal: &Self::Literal) -> Self::Span {
582         literal.id
583     }
584
585     fn set_span(&mut self, literal: &mut Self::Literal, span: Self::Span) {
586         literal.id = span;
587     }
588
589     fn subspan(
590         &mut self,
591         _literal: &Self::Literal,
592         _start: Bound<usize>,
593         _end: Bound<usize>,
594     ) -> Option<Self::Span> {
595         // FIXME handle span
596         None
597     }
598 }
599
600 impl server::SourceFile for RustAnalyzer {
601     // FIXME these are all stubs
602     fn eq(&mut self, _file1: &Self::SourceFile, _file2: &Self::SourceFile) -> bool {
603         true
604     }
605     fn path(&mut self, _file: &Self::SourceFile) -> String {
606         String::new()
607     }
608     fn is_real(&mut self, _file: &Self::SourceFile) -> bool {
609         true
610     }
611 }
612
613 impl server::Diagnostic for RustAnalyzer {
614     fn new(&mut self, level: Level, msg: &str, spans: Self::MultiSpan) -> Self::Diagnostic {
615         let mut diag = Diagnostic::new(level, msg);
616         diag.spans = spans;
617         diag
618     }
619
620     fn sub(
621         &mut self,
622         _diag: &mut Self::Diagnostic,
623         _level: Level,
624         _msg: &str,
625         _spans: Self::MultiSpan,
626     ) {
627         // FIXME handle diagnostic
628         //
629     }
630
631     fn emit(&mut self, _diag: Self::Diagnostic) {
632         // FIXME handle diagnostic
633         // diag.emit()
634     }
635 }
636
637 impl server::Span for RustAnalyzer {
638     fn debug(&mut self, span: Self::Span) -> String {
639         format!("{:?}", span.0)
640     }
641     fn def_site(&mut self) -> Self::Span {
642         // MySpan(self.span_interner.intern(&MySpanData(Span::def_site())))
643         // FIXME handle span
644         tt::TokenId::unspecified()
645     }
646     fn call_site(&mut self) -> Self::Span {
647         // MySpan(self.span_interner.intern(&MySpanData(Span::call_site())))
648         // FIXME handle span
649         tt::TokenId::unspecified()
650     }
651     fn source_file(&mut self, _span: Self::Span) -> Self::SourceFile {
652         SourceFile {}
653     }
654     fn save_span(&mut self, _span: Self::Span) -> usize {
655         // FIXME stub
656         0
657     }
658     fn recover_proc_macro_span(&mut self, _id: usize) -> Self::Span {
659         // FIXME stub
660         tt::TokenId::unspecified()
661     }
662     /// Recent feature, not yet in the proc_macro
663     ///
664     /// See PR:
665     /// https://github.com/rust-lang/rust/pull/55780
666     fn source_text(&mut self, _span: Self::Span) -> Option<String> {
667         None
668     }
669
670     fn parent(&mut self, _span: Self::Span) -> Option<Self::Span> {
671         // FIXME handle span
672         None
673     }
674     fn source(&mut self, span: Self::Span) -> Self::Span {
675         // FIXME handle span
676         span
677     }
678     fn start(&mut self, _span: Self::Span) -> LineColumn {
679         // FIXME handle span
680         LineColumn { line: 0, column: 0 }
681     }
682     fn end(&mut self, _span: Self::Span) -> LineColumn {
683         // FIXME handle span
684         LineColumn { line: 0, column: 0 }
685     }
686     fn join(&mut self, first: Self::Span, _second: Self::Span) -> Option<Self::Span> {
687         // Just return the first span again, because some macros will unwrap the result.
688         Some(first)
689     }
690     fn resolved_at(&mut self, _span: Self::Span, _at: Self::Span) -> Self::Span {
691         // FIXME handle span
692         tt::TokenId::unspecified()
693     }
694
695     fn mixed_site(&mut self) -> Self::Span {
696         // FIXME handle span
697         tt::TokenId::unspecified()
698     }
699
700     fn after(&mut self, _self_: Self::Span) -> Self::Span {
701         tt::TokenId::unspecified()
702     }
703
704     fn before(&mut self, _self_: Self::Span) -> Self::Span {
705         tt::TokenId::unspecified()
706     }
707 }
708
709 impl server::MultiSpan for RustAnalyzer {
710     fn new(&mut self) -> Self::MultiSpan {
711         // FIXME handle span
712         vec![]
713     }
714
715     fn push(&mut self, other: &mut Self::MultiSpan, span: Self::Span) {
716         //TODP
717         other.push(span)
718     }
719 }
720
721 #[cfg(test)]
722 mod tests {
723     use super::super::proc_macro::bridge::server::Literal;
724     use super::*;
725
726     #[test]
727     fn test_ra_server_literals() {
728         let mut srv = RustAnalyzer { ident_interner: IdentInterner::default() };
729         assert_eq!(srv.integer("1234").text, "1234");
730
731         assert_eq!(srv.typed_integer("12", "u8").text, "12u8");
732         assert_eq!(srv.typed_integer("255", "u16").text, "255u16");
733         assert_eq!(srv.typed_integer("1234", "u32").text, "1234u32");
734         assert_eq!(srv.typed_integer("15846685", "u64").text, "15846685u64");
735         assert_eq!(srv.typed_integer("15846685258", "u128").text, "15846685258u128");
736         assert_eq!(srv.typed_integer("156788984", "usize").text, "156788984usize");
737         assert_eq!(srv.typed_integer("127", "i8").text, "127i8");
738         assert_eq!(srv.typed_integer("255", "i16").text, "255i16");
739         assert_eq!(srv.typed_integer("1234", "i32").text, "1234i32");
740         assert_eq!(srv.typed_integer("15846685", "i64").text, "15846685i64");
741         assert_eq!(srv.typed_integer("15846685258", "i128").text, "15846685258i128");
742         assert_eq!(srv.float("0").text, "0.0");
743         assert_eq!(srv.float("15684.5867").text, "15684.5867");
744         assert_eq!(srv.f32("15684.58").text, "15684.58f32");
745         assert_eq!(srv.f64("15684.58").text, "15684.58f64");
746
747         assert_eq!(srv.string("hello_world").text, "\"hello_world\"");
748         assert_eq!(srv.character('c').text, "'c'");
749         assert_eq!(srv.byte_string(b"1234586\x88").text, "b\"1234586\\x88\"");
750
751         // u128::max
752         assert_eq!(
753             srv.integer("340282366920938463463374607431768211455").text,
754             "340282366920938463463374607431768211455"
755         );
756         // i128::min
757         assert_eq!(
758             srv.integer("-170141183460469231731687303715884105728").text,
759             "-170141183460469231731687303715884105728"
760         );
761     }
762
763     #[test]
764     fn test_ra_server_to_string() {
765         let s = TokenStream {
766             token_trees: vec![
767                 tt::TokenTree::Leaf(tt::Leaf::Ident(tt::Ident {
768                     text: "struct".into(),
769                     id: tt::TokenId::unspecified(),
770                 })),
771                 tt::TokenTree::Leaf(tt::Leaf::Ident(tt::Ident {
772                     text: "T".into(),
773                     id: tt::TokenId::unspecified(),
774                 })),
775                 tt::TokenTree::Subtree(tt::Subtree {
776                     delimiter: Some(tt::Delimiter {
777                         id: tt::TokenId::unspecified(),
778                         kind: tt::DelimiterKind::Brace,
779                     }),
780                     token_trees: vec![],
781                 }),
782             ],
783         };
784
785         assert_eq!(s.to_string(), "struct T {}");
786     }
787
788     #[test]
789     fn test_ra_server_from_str() {
790         use std::str::FromStr;
791         let subtree_paren_a = tt::TokenTree::Subtree(tt::Subtree {
792             delimiter: Some(tt::Delimiter {
793                 id: tt::TokenId::unspecified(),
794                 kind: tt::DelimiterKind::Parenthesis,
795             }),
796             token_trees: vec![tt::TokenTree::Leaf(tt::Leaf::Ident(tt::Ident {
797                 text: "a".into(),
798                 id: tt::TokenId::unspecified(),
799             }))],
800         });
801
802         let t1 = TokenStream::from_str("(a)").unwrap();
803         assert_eq!(t1.token_trees.len(), 1);
804         assert_eq!(t1.token_trees[0], subtree_paren_a);
805
806         let t2 = TokenStream::from_str("(a);").unwrap();
807         assert_eq!(t2.token_trees.len(), 2);
808         assert_eq!(t2.token_trees[0], subtree_paren_a);
809
810         let underscore = TokenStream::from_str("_").unwrap();
811         assert_eq!(
812             underscore.token_trees[0],
813             tt::TokenTree::Leaf(tt::Leaf::Ident(tt::Ident {
814                 text: "_".into(),
815                 id: tt::TokenId::unspecified(),
816             }))
817         );
818     }
819 }