Fix expand_stmt as well as expand_expr to use the correct span
The same fix as before is still relevant, I just forgot to update the expand_stmt macro expansion site. The tests for format!() suffice as tests for this change.
This commit is contained in:
parent
fd8c05ccc9
commit
640613892f
@ -81,20 +81,10 @@ pub fn expand_expr(extsbox: @mut SyntaxEnv,
|
||||
// be the root of the call stack. That's the most
|
||||
// relevant span and it's the actual invocation of
|
||||
// the macro.
|
||||
let mut relevant_info = cx.backtrace();
|
||||
let mut einfo = relevant_info.unwrap();
|
||||
loop {
|
||||
match relevant_info {
|
||||
None => { break }
|
||||
Some(e) => {
|
||||
einfo = e;
|
||||
relevant_info = einfo.call_site.expn_info;
|
||||
}
|
||||
}
|
||||
}
|
||||
let mac_span = original_span(cx);
|
||||
|
||||
let expanded =
|
||||
match expandfun(cx, einfo.call_site,
|
||||
match expandfun(cx, mac_span.call_site,
|
||||
marked_before, marked_ctxt) {
|
||||
MRExpr(e) => e,
|
||||
MRAny(expr_maker,_,_) => expr_maker(),
|
||||
@ -400,11 +390,11 @@ pub fn expand_stmt(extsbox: @mut SyntaxEnv,
|
||||
-> (Option<Stmt_>, Span) {
|
||||
// why the copying here and not in expand_expr?
|
||||
// looks like classic changed-in-only-one-place
|
||||
let (mac, pth, tts, semi, ctxt) = match *s {
|
||||
let (pth, tts, semi, ctxt) = match *s {
|
||||
StmtMac(ref mac, semi) => {
|
||||
match mac.node {
|
||||
mac_invoc_tt(ref pth, ref tts, ctxt) => {
|
||||
((*mac).clone(), pth, (*tts).clone(), semi, ctxt)
|
||||
(pth, (*tts).clone(), semi, ctxt)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -431,7 +421,13 @@ pub fn expand_stmt(extsbox: @mut SyntaxEnv,
|
||||
// mark before expansion:
|
||||
let marked_tts = mark_tts(tts,fm);
|
||||
let marked_ctxt = new_mark(fm,ctxt);
|
||||
let expanded = match expandfun(cx, mac.span, marked_tts, marked_ctxt) {
|
||||
|
||||
// See the comment in expand_expr for why we want the original span,
|
||||
// not the current mac.span.
|
||||
let mac_span = original_span(cx);
|
||||
|
||||
let expanded = match expandfun(cx, mac_span.call_site,
|
||||
marked_tts, marked_ctxt) {
|
||||
MRExpr(e) =>
|
||||
@codemap::Spanned { node: StmtExpr(e, ast::DUMMY_NODE_ID),
|
||||
span: e.span},
|
||||
@ -1270,6 +1266,20 @@ pub fn mtwt_cancel_outer_mark(tts: &[ast::token_tree], ctxt: ast::SyntaxContext)
|
||||
mark_tts(tts,outer_mark)
|
||||
}
|
||||
|
||||
fn original_span(cx: @ExtCtxt) -> @codemap::ExpnInfo {
|
||||
let mut relevant_info = cx.backtrace();
|
||||
let mut einfo = relevant_info.unwrap();
|
||||
loop {
|
||||
match relevant_info {
|
||||
None => { break }
|
||||
Some(e) => {
|
||||
einfo = e;
|
||||
relevant_info = einfo.call_site.expn_info;
|
||||
}
|
||||
}
|
||||
}
|
||||
return einfo;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
|
Loading…
x
Reference in New Issue
Block a user