Make print_macro_backtrace non-recursive

This commit is contained in:
Jonas Schievink
2015-09-10 21:22:59 +02:00
parent 9577e42682
commit 49d8b0dcbe

View File

@@ -727,30 +727,34 @@ impl EmitterWriter {
cm: &codemap::CodeMap, cm: &codemap::CodeMap,
sp: Span) sp: Span)
-> io::Result<()> { -> io::Result<()> {
let cs = try!(cm.with_expn_info(sp.expn_id, |expn_info| -> io::Result<_> { let mut sp_opt = Some(sp);
match expn_info { while let Some(sp) = sp_opt {
Some(ei) => { sp_opt = try!(cm.with_expn_info(sp.expn_id, |expn_info| -> io::Result<_> {
let ss = ei.callee.span.map_or(String::new(), match expn_info {
|span| cm.span_to_string(span)); Some(ei) => {
let (pre, post) = match ei.callee.format { let ss = ei.callee.span.map_or(String::new(),
codemap::MacroAttribute(..) => ("#[", "]"), |span| cm.span_to_string(span));
codemap::MacroBang(..) => ("", "!"), let (pre, post) = match ei.callee.format {
codemap::CompilerExpansion(..) => ("", ""), codemap::MacroAttribute(..) => ("#[", "]"),
}; codemap::MacroBang(..) => ("", "!"),
try!(self.print_diagnostic(&ss, Note, codemap::CompilerExpansion(..) => ("", ""),
&format!("in expansion of {}{}{}", };
pre, try!(self.print_diagnostic(&ss, Note,
ei.callee.name(), &format!("in expansion of {}{}{}",
post), pre,
None)); ei.callee.name(),
let ss = cm.span_to_string(ei.call_site); post),
try!(self.print_diagnostic(&ss, Note, "expansion site", None)); None));
Ok(Some(ei.call_site)) let ss = cm.span_to_string(ei.call_site);
try!(self.print_diagnostic(&ss, Note, "expansion site", None));
Ok(Some(ei.call_site))
}
None => Ok(None)
} }
None => Ok(None) }));
} }
}));
cs.map_or(Ok(()), |call_site| self.print_macro_backtrace(cm, call_site)) Ok(())
} }
} }