|
1 | 1 | use crate::generated_code;
|
2 |
| -use rustc_ast::token::{self, TokenKind}; |
3 |
| -use rustc_parse::lexer::{self, StringReader}; |
| 2 | +use rustc_data_structures::sync::Lrc; |
| 3 | +use rustc_lexer::{tokenize, TokenKind}; |
4 | 4 | use rustc_session::Session;
|
5 | 5 | use rustc_span::*;
|
6 | 6 |
|
@@ -43,61 +43,37 @@ impl<'a> SpanUtils<'a> {
|
43 | 43 | }
|
44 | 44 | }
|
45 | 45 |
|
46 |
| - pub fn retokenise_span(&self, span: Span) -> StringReader<'a> { |
47 |
| - lexer::StringReader::retokenize(&self.sess.parse_sess, span) |
48 |
| - } |
49 |
| - |
50 |
| - pub fn sub_span_of_token(&self, span: Span, tok: TokenKind) -> Option<Span> { |
51 |
| - let mut toks = self.retokenise_span(span); |
52 |
| - loop { |
53 |
| - let next = toks.next_token(); |
54 |
| - if next == token::Eof { |
55 |
| - return None; |
56 |
| - } |
57 |
| - if next == tok { |
58 |
| - return Some(next.span); |
59 |
| - } |
| 46 | + /// Finds the span of `*` token withing the larger `span`. |
| 47 | + pub fn sub_span_of_star(&self, mut span: Span) -> Option<Span> { |
| 48 | + let begin = self.sess.source_map().lookup_byte_offset(span.lo()); |
| 49 | + let end = self.sess.source_map().lookup_byte_offset(span.hi()); |
| 50 | + // Make the range zero-length if the span is invalid. |
| 51 | + if begin.sf.start_pos != end.sf.start_pos { |
| 52 | + span = span.shrink_to_lo(); |
60 | 53 | }
|
61 |
| - } |
62 | 54 |
|
63 |
| - // // Return the name for a macro definition (identifier after first `!`) |
64 |
| - // pub fn span_for_macro_def_name(&self, span: Span) -> Option<Span> { |
65 |
| - // let mut toks = self.retokenise_span(span); |
66 |
| - // loop { |
67 |
| - // let ts = toks.real_token(); |
68 |
| - // if ts == token::Eof { |
69 |
| - // return None; |
70 |
| - // } |
71 |
| - // if ts == token::Not { |
72 |
| - // let ts = toks.real_token(); |
73 |
| - // if ts.kind.is_ident() { |
74 |
| - // return Some(ts.sp); |
75 |
| - // } else { |
76 |
| - // return None; |
77 |
| - // } |
78 |
| - // } |
79 |
| - // } |
80 |
| - // } |
| 55 | + let sf = Lrc::clone(&begin.sf); |
81 | 56 |
|
82 |
| - // // Return the name for a macro use (identifier before first `!`). |
83 |
| - // pub fn span_for_macro_use_name(&self, span:Span) -> Option<Span> { |
84 |
| - // let mut toks = self.retokenise_span(span); |
85 |
| - // let mut prev = toks.real_token(); |
86 |
| - // loop { |
87 |
| - // if prev == token::Eof { |
88 |
| - // return None; |
89 |
| - // } |
90 |
| - // let ts = toks.real_token(); |
91 |
| - // if ts == token::Not { |
92 |
| - // if prev.kind.is_ident() { |
93 |
| - // return Some(prev.sp); |
94 |
| - // } else { |
95 |
| - // return None; |
96 |
| - // } |
97 |
| - // } |
98 |
| - // prev = ts; |
99 |
| - // } |
100 |
| - // } |
| 57 | + self.sess.source_map().ensure_source_file_source_present(Lrc::clone(&sf)); |
| 58 | + let src = |
| 59 | + sf.src.clone().or_else(|| sf.external_src.borrow().get_source().map(Lrc::clone))?; |
| 60 | + let to_index = |pos: BytePos| -> usize { (pos - sf.start_pos).0 as usize }; |
| 61 | + let text = &src[to_index(span.lo())..to_index(span.hi())]; |
| 62 | + let start_pos = { |
| 63 | + let mut pos = 0; |
| 64 | + tokenize(text) |
| 65 | + .map(|token| { |
| 66 | + let start = pos; |
| 67 | + pos += token.len; |
| 68 | + (start, token) |
| 69 | + }) |
| 70 | + .find(|(_pos, token)| token.kind == TokenKind::Star)? |
| 71 | + .0 |
| 72 | + }; |
| 73 | + let lo = span.lo() + BytePos(start_pos as u32); |
| 74 | + let hi = lo + BytePos(1); |
| 75 | + Some(span.with_lo(lo).with_hi(hi)) |
| 76 | + } |
101 | 77 |
|
102 | 78 | /// Return true if the span is generated code, and
|
103 | 79 | /// it is not a subspan of the root callsite.
|
|
0 commit comments