diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-09-15 01:27:38 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-09-15 01:47:02 -0700 |
| commit | 640613892fc5ab055853b48934b6e4ecf895c2dd (patch) | |
| tree | 187f30d8b9ae662bc385558473e1c9c1fa5b6424 /src/libsyntax/ext | |
| parent | fd8c05ccc99642ed6be3516f24c8d876f2046eb4 (diff) | |
| download | rust-640613892fc5ab055853b48934b6e4ecf895c2dd.tar.gz rust-640613892fc5ab055853b48934b6e4ecf895c2dd.zip | |
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.
Diffstat (limited to 'src/libsyntax/ext')
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index e4c69c1973a..ac094c27a81 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -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 { |
