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