diff options
| author | Huon Wilson <dbau.pp+github@gmail.com> | 2013-12-07 13:41:11 +1100 |
|---|---|---|
| committer | Huon Wilson <dbau.pp+github@gmail.com> | 2013-12-07 13:41:11 +1100 |
| commit | 3ef933647ab6adf841d8323a712101f37851eff9 (patch) | |
| tree | 545ae6c4fbd16b29189abb7bee7ef259a92b50b6 /src/libsyntax | |
| parent | 09a879460cfa42ecfd4a769bdc21e1d55b795bd8 (diff) | |
| download | rust-3ef933647ab6adf841d8323a712101f37851eff9.tar.gz rust-3ef933647ab6adf841d8323a712101f37851eff9.zip | |
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)!`.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/codemap.rs | 16 | ||||
| -rw-r--r-- | src/libsyntax/diagnostic.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 7 |
3 files changed, 27 insertions, 3 deletions
diff --git a/src/libsyntax/codemap.rs b/src/libsyntax/codemap.rs index f7590e7b4ed..f4cb19bfa24 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<Span>} +pub enum MacroFormat { + // e.g. #[deriving(...)] <item> + MacroAttribute, + // e.g. `format!()` + MacroBang +} + +#[deriving(IterBytes)] +pub struct NameAndSpan { + name: @str, + // the format with which the macro was invoked. + format: MacroFormat, + span: Option<Span> +} /// Extra information for tracking macro expansion of spans #[deriving(IterBytes)] diff --git a/src/libsyntax/diagnostic.rs b/src/libsyntax/diagnostic.rs index 36e6bf32451..59f33bc7769 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 1d040c10984..4bb35457182 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, } }); |
