about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorHuon Wilson <dbau.pp+github@gmail.com>2013-12-07 13:41:11 +1100
committerHuon Wilson <dbau.pp+github@gmail.com>2013-12-07 13:41:11 +1100
commit3ef933647ab6adf841d8323a712101f37851eff9 (patch)
tree545ae6c4fbd16b29189abb7bee7ef259a92b50b6 /src/libsyntax
parent09a879460cfa42ecfd4a769bdc21e1d55b795bd8 (diff)
downloadrust-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.rs16
-rw-r--r--src/libsyntax/diagnostic.rs7
-rw-r--r--src/libsyntax/ext/expand.rs7
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,
                 }
             });