1 use crate::generated_code;
2 use rustc::session::Session;
3 use rustc_parse::lexer::{self, StringReader};
4 use syntax::token::{self, TokenKind};
8 pub struct SpanUtils<'a> {
12 impl<'a> SpanUtils<'a> {
13 pub fn new(sess: &'a Session) -> SpanUtils<'a> {
19 pub fn make_filename_string(&self, file: &SourceFile) -> String {
21 FileName::Real(path) if !file.name_was_remapped => {
22 if path.is_absolute() {
23 self.sess.source_map().path_mapping()
24 .map_prefix(path.clone()).0
28 self.sess.working_dir.0
34 // If the file name is already remapped, we assume the user
35 // configured it the way they wanted to, so use that directly
36 filename => filename.to_string()
40 pub fn snippet(&self, span: Span) -> String {
41 match self.sess.source_map().span_to_snippet(span) {
43 Err(_) => String::new(),
47 pub fn retokenise_span(&self, span: Span) -> StringReader<'a> {
48 lexer::StringReader::retokenize(&self.sess.parse_sess, span)
51 pub fn sub_span_of_token(&self, span: Span, tok: TokenKind) -> Option<Span> {
52 let mut toks = self.retokenise_span(span);
54 let next = toks.next_token();
55 if next == token::Eof {
59 return Some(next.span);
64 // // Return the name for a macro definition (identifier after first `!`)
65 // pub fn span_for_macro_def_name(&self, span: Span) -> Option<Span> {
66 // let mut toks = self.retokenise_span(span);
68 // let ts = toks.real_token();
69 // if ts == token::Eof {
72 // if ts == token::Not {
73 // let ts = toks.real_token();
74 // if ts.kind.is_ident() {
75 // return Some(ts.sp);
83 // // Return the name for a macro use (identifier before first `!`).
84 // pub fn span_for_macro_use_name(&self, span:Span) -> Option<Span> {
85 // let mut toks = self.retokenise_span(span);
86 // let mut prev = toks.real_token();
88 // if prev == token::Eof {
91 // let ts = toks.real_token();
92 // if ts == token::Not {
93 // if prev.kind.is_ident() {
94 // return Some(prev.sp);
103 /// Return true if the span is generated code, and
104 /// it is not a subspan of the root callsite.
106 /// Used to filter out spans of minimal value,
107 /// such as references to macro internal variables.
108 pub fn filter_generated(&self, span: Span) -> bool {
109 if generated_code(span) {
113 //If the span comes from a fake source_file, filter it.
116 .lookup_char_pos(span.lo())
122 macro_rules! filter {
123 ($util: expr, $parent: expr) => {
124 if $util.filter_generated($parent) {