|
1 | 1 | use crate::base::{ExtCtxt, ResolverExpand};
|
2 | 2 |
|
3 | 3 | use rustc_ast as ast;
|
4 |
| -use rustc_ast::token; |
5 |
| -use rustc_ast::token::Nonterminal; |
6 |
| -use rustc_ast::token::NtIdent; |
| 4 | +use rustc_ast::token::{self, Nonterminal, NtIdent, TokenKind}; |
7 | 5 | use rustc_ast::tokenstream::{self, CanSynthesizeMissingTokens};
|
8 | 6 | use rustc_ast::tokenstream::{DelimSpan, Spacing::*, TokenStream, TreeAndSpacing};
|
9 | 7 | use rustc_ast_pretty::pprust;
|
@@ -541,6 +539,33 @@ impl server::Ident for Rustc<'_> {
|
541 | 539 | }
|
542 | 540 |
|
543 | 541 | impl server::Literal for Rustc<'_> {
|
| 542 | + fn from_str(&mut self, s: &str) -> Result<Self::Literal, ()> { |
| 543 | + let override_span = None; |
| 544 | + let stream = parse_stream_from_source_str( |
| 545 | + FileName::proc_macro_source_code(s), |
| 546 | + s.to_owned(), |
| 547 | + self.sess, |
| 548 | + override_span, |
| 549 | + ); |
| 550 | + if stream.len() != 1 { |
| 551 | + return Err(()); |
| 552 | + } |
| 553 | + let tree = stream.into_trees().next().unwrap(); |
| 554 | + let token = match tree { |
| 555 | + tokenstream::TokenTree::Token(token) => token, |
| 556 | + tokenstream::TokenTree::Delimited { .. } => return Err(()), |
| 557 | + }; |
| 558 | + let span_data = token.span.data(); |
| 559 | + if (span_data.hi.0 - span_data.lo.0) as usize != s.len() { |
| 560 | + // There is a comment or whitespace adjacent to the literal. |
| 561 | + return Err(()); |
| 562 | + } |
| 563 | + let lit = match token.kind { |
| 564 | + TokenKind::Literal(lit) => lit, |
| 565 | + _ => return Err(()), |
| 566 | + }; |
| 567 | + Ok(Literal { lit, span: self.call_site }) |
| 568 | + } |
544 | 569 | fn debug_kind(&mut self, literal: &Self::Literal) -> String {
|
545 | 570 | format!("{:?}", literal.lit.kind)
|
546 | 571 | }
|
|
0 commit comments