1 use rustc::session::Session;
7 use syntax::parse::lexer::{self, StringReader};
8 use syntax::parse::token::{self, Token};
12 pub struct SpanUtils<'a> {
13 pub sess: &'a Session,
14 // FIXME given that we clone SpanUtils all over the place, this err_count is
15 // probably useless and any logic relying on it is bogus.
16 pub err_count: Cell<isize>,
19 impl<'a> SpanUtils<'a> {
20 pub fn new(sess: &'a Session) -> SpanUtils<'a> {
23 err_count: Cell::new(0),
27 pub fn make_filename_string(&self, file: &SourceFile) -> String {
29 FileName::Real(path) if !file.name_was_remapped => {
30 if path.is_absolute() {
31 self.sess.source_map().path_mapping()
32 .map_prefix(path.clone()).0
36 self.sess.working_dir.0
42 // If the file name is already remapped, we assume the user
43 // configured it the way they wanted to, so use that directly
44 filename => filename.to_string()
48 pub fn snippet(&self, span: Span) -> String {
49 match self.sess.source_map().span_to_snippet(span) {
51 Err(_) => String::new(),
55 pub fn retokenise_span(&self, span: Span) -> StringReader<'a> {
56 lexer::StringReader::retokenize(&self.sess.parse_sess, span)
59 pub fn sub_span_of_token(&self, span: Span, tok: Token) -> Option<Span> {
60 let mut toks = self.retokenise_span(span);
62 let next = toks.real_token();
63 if next.tok == token::Eof {
72 // // Return the name for a macro definition (identifier after first `!`)
73 // pub fn span_for_macro_def_name(&self, span: Span) -> Option<Span> {
74 // let mut toks = self.retokenise_span(span);
76 // let ts = toks.real_token();
77 // if ts.tok == token::Eof {
80 // if ts.tok == token::Not {
81 // let ts = toks.real_token();
82 // if ts.tok.is_ident() {
83 // return Some(ts.sp);
91 // // Return the name for a macro use (identifier before first `!`).
92 // pub fn span_for_macro_use_name(&self, span:Span) -> Option<Span> {
93 // let mut toks = self.retokenise_span(span);
94 // let mut prev = toks.real_token();
96 // if prev.tok == token::Eof {
99 // let ts = toks.real_token();
100 // if ts.tok == token::Not {
101 // if prev.tok.is_ident() {
102 // return Some(prev.sp);
111 /// Return true if the span is generated code, and
112 /// it is not a subspan of the root callsite.
114 /// Used to filter out spans of minimal value,
115 /// such as references to macro internal variables.
116 pub fn filter_generated(&self, span: Span) -> bool {
117 if generated_code(span) {
121 //If the span comes from a fake source_file, filter it.
124 .lookup_char_pos(span.lo())
130 macro_rules! filter {
131 ($util: expr, $parent: expr) => {
132 if $util.filter_generated($parent) {