1 use rustc::session::Session;
3 use crate::generated_code;
5 use syntax::parse::lexer::{self, StringReader};
6 use syntax::token::{self, TokenKind};
10 pub struct SpanUtils<'a> {
11 pub sess: &'a Session,
14 impl<'a> SpanUtils<'a> {
15 pub fn new(sess: &'a Session) -> SpanUtils<'a> {
21 pub fn make_filename_string(&self, file: &SourceFile) -> String {
23 FileName::Real(path) if !file.name_was_remapped => {
24 if path.is_absolute() {
25 self.sess.source_map().path_mapping()
26 .map_prefix(path.clone()).0
30 self.sess.working_dir.0
36 // If the file name is already remapped, we assume the user
37 // configured it the way they wanted to, so use that directly
38 filename => filename.to_string()
42 pub fn snippet(&self, span: Span) -> String {
43 match self.sess.source_map().span_to_snippet(span) {
45 Err(_) => String::new(),
49 pub fn retokenise_span(&self, span: Span) -> StringReader<'a> {
50 lexer::StringReader::retokenize(&self.sess.parse_sess, span)
53 pub fn sub_span_of_token(&self, span: Span, tok: TokenKind) -> Option<Span> {
54 let mut toks = self.retokenise_span(span);
56 let next = toks.next_token();
57 if next == token::Eof {
61 return Some(next.span);
66 // // Return the name for a macro definition (identifier after first `!`)
67 // pub fn span_for_macro_def_name(&self, span: Span) -> Option<Span> {
68 // let mut toks = self.retokenise_span(span);
70 // let ts = toks.real_token();
71 // if ts == token::Eof {
74 // if ts == token::Not {
75 // let ts = toks.real_token();
76 // if ts.kind.is_ident() {
77 // return Some(ts.sp);
85 // // Return the name for a macro use (identifier before first `!`).
86 // pub fn span_for_macro_use_name(&self, span:Span) -> Option<Span> {
87 // let mut toks = self.retokenise_span(span);
88 // let mut prev = toks.real_token();
90 // if prev == token::Eof {
93 // let ts = toks.real_token();
94 // if ts == token::Not {
95 // if prev.kind.is_ident() {
96 // return Some(prev.sp);
105 /// Return true if the span is generated code, and
106 /// it is not a subspan of the root callsite.
108 /// Used to filter out spans of minimal value,
109 /// such as references to macro internal variables.
110 pub fn filter_generated(&self, span: Span) -> bool {
111 if generated_code(span) {
115 //If the span comes from a fake source_file, filter it.
118 .lookup_char_pos(span.lo())
124 macro_rules! filter {
125 ($util: expr, $parent: expr) => {
126 if $util.filter_generated($parent) {