From 3ef933647ab6adf841d8323a712101f37851eff9 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Sat, 7 Dec 2013 13:41:11 +1100 Subject: [PATCH] syntax: print expansion info from #[attribute] macros in the correct format. Previously, any attempt to use this information from inside something like #[deriving(Foo)] would result in it printing like `deriving(Foo)!`. --- src/librustc/front/test.rs | 3 ++- src/libsyntax/codemap.rs | 16 +++++++++++++++- src/libsyntax/diagnostic.rs | 7 ++++++- src/libsyntax/ext/expand.rs | 7 ++++++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/librustc/front/test.rs b/src/librustc/front/test.rs index ca82502f84be..cf8dbfdcad6a 100644 --- a/src/librustc/front/test.rs +++ b/src/librustc/front/test.rs @@ -18,7 +18,7 @@ use std::vec; use syntax::ast_util::*; use syntax::attr::AttrMetaMethods; use syntax::attr; -use syntax::codemap::{dummy_sp, Span, ExpnInfo, NameAndSpan}; +use syntax::codemap::{dummy_sp, Span, ExpnInfo, NameAndSpan, MacroAttribute}; use syntax::codemap; use syntax::ext::base::ExtCtxt; use syntax::fold::ast_fold; @@ -158,6 +158,7 @@ fn generate_test_harness(sess: session::Session, crate: ast::Crate) call_site: dummy_sp(), callee: NameAndSpan { name: @"test", + format: MacroAttribute, span: None } }); diff --git a/src/libsyntax/codemap.rs b/src/libsyntax/codemap.rs index f7590e7b4ed5..f4cb19bfa247 100644 --- a/src/libsyntax/codemap.rs +++ b/src/libsyntax/codemap.rs @@ -161,8 +161,22 @@ pub struct LocWithOpt { // used to be structural records. Better names, anyone? pub struct FileMapAndLine {fm: @FileMap, line: uint} pub struct FileMapAndBytePos {fm: @FileMap, pos: BytePos} + #[deriving(IterBytes)] -pub struct NameAndSpan {name: @str, span: Option} +pub enum MacroFormat { + // e.g. #[deriving(...)] + MacroAttribute, + // e.g. `format!()` + MacroBang +} + +#[deriving(IterBytes)] +pub struct NameAndSpan { + name: @str, + // the format with which the macro was invoked. + format: MacroFormat, + span: Option +} /// Extra information for tracking macro expansion of spans #[deriving(IterBytes)] diff --git a/src/libsyntax/diagnostic.rs b/src/libsyntax/diagnostic.rs index 36e6bf32451f..59f33bc77696 100644 --- a/src/libsyntax/diagnostic.rs +++ b/src/libsyntax/diagnostic.rs @@ -342,8 +342,13 @@ fn highlight_lines(cm: @codemap::CodeMap, fn print_macro_backtrace(cm: @codemap::CodeMap, sp: Span) { for ei in sp.expn_info.iter() { let ss = ei.callee.span.as_ref().map_default(~"", |span| cm.span_to_str(*span)); + let (pre, post) = match ei.callee.format { + codemap::MacroAttribute => ("#[", "]"), + codemap::MacroBang => ("", "!") + }; + print_diagnostic(ss, note, - format!("in expansion of {}!", ei.callee.name)); + format!("in expansion of {}{}{}", pre, ei.callee.name, post)); let ss = cm.span_to_str(ei.call_site); print_diagnostic(ss, note, "expansion site"); print_macro_backtrace(cm, ei.call_site); diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 1d040c109847..4bb35457182f 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -18,7 +18,7 @@ use ext::build::AstBuilder; use attr; use attr::AttrMetaMethods; use codemap; -use codemap::{Span, Spanned, ExpnInfo, NameAndSpan}; +use codemap::{Span, Spanned, ExpnInfo, NameAndSpan, MacroBang, MacroAttribute}; use ext::base::*; use fold::*; use opt_vec; @@ -69,6 +69,7 @@ pub fn expand_expr(extsbox: @mut SyntaxEnv, call_site: e.span, callee: NameAndSpan { name: extnamestr, + format: MacroBang, span: exp_span, }, }); @@ -257,6 +258,7 @@ pub fn expand_mod_items(extsbox: @mut SyntaxEnv, call_site: attr.span, callee: NameAndSpan { name: mname, + format: MacroAttribute, span: None } }); @@ -352,6 +354,7 @@ pub fn expand_item_mac(extsbox: @mut SyntaxEnv, call_site: it.span, callee: NameAndSpan { name: extnamestr, + format: MacroBang, span: span } }); @@ -370,6 +373,7 @@ pub fn expand_item_mac(extsbox: @mut SyntaxEnv, call_site: it.span, callee: NameAndSpan { name: extnamestr, + format: MacroBang, span: span } }); @@ -459,6 +463,7 @@ pub fn expand_stmt(extsbox: @mut SyntaxEnv, call_site: s.span, callee: NameAndSpan { name: extnamestr, + format: MacroBang, span: exp_span, } });