From 3ef933647ab6adf841d8323a712101f37851eff9 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Sat, 7 Dec 2013 13:41:11 +1100 Subject: 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/libsyntax/codemap.rs | 16 +++++++++++++++- src/libsyntax/diagnostic.rs | 7 ++++++- src/libsyntax/ext/expand.rs | 7 ++++++- 3 files changed, 27 insertions(+), 3 deletions(-) (limited to 'src/libsyntax') 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} +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 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, } }); -- cgit 1.4.1-3-g733a5