Make print_macro_backtrace non-recursive
This commit is contained in:
@@ -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(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user