about summary refs log tree commit diff
path: root/src/libsyntax_ext
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2016-09-09 14:53:15 -0700
committerDavid Tolnay <dtolnay@gmail.com>2016-09-09 18:50:05 -0700
commitfe41520fceb00427e797cc0b42f449f54967b104 (patch)
treef7afd5144f5548d05fc3b4dac931f95255201bb1 /src/libsyntax_ext
parent707a40f2065cb46d12c4f4991e6408585b315c92 (diff)
downloadrust-fe41520fceb00427e797cc0b42f449f54967b104.tar.gz
rust-fe41520fceb00427e797cc0b42f449f54967b104.zip
Add ExpnId to expanded procedural macro code
Diffstat (limited to 'src/libsyntax_ext')
-rw-r--r--src/libsyntax_ext/deriving/custom.rs20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/libsyntax_ext/deriving/custom.rs b/src/libsyntax_ext/deriving/custom.rs
index 716cf3a94b5..465fc0016e5 100644
--- a/src/libsyntax_ext/deriving/custom.rs
+++ b/src/libsyntax_ext/deriving/custom.rs
@@ -10,12 +10,14 @@
 
 use std::panic;
 
+use errors::FatalError;
 use rustc_macro::{TokenStream, __internal};
 use syntax::ast::{self, ItemKind};
-use syntax::codemap::Span;
+use syntax::codemap::{ExpnInfo, MacroAttribute, NameAndSpan, Span};
 use syntax::ext::base::*;
 use syntax::fold::{self, Folder};
-use errors::FatalError;
+use syntax::parse::token::intern;
+use syntax::print::pprust;
 
 pub struct CustomDerive {
     inner: fn(TokenStream) -> TokenStream,
@@ -31,7 +33,7 @@ impl MultiItemModifier for CustomDerive {
     fn expand(&self,
               ecx: &mut ExtCtxt,
               span: Span,
-              _meta_item: &ast::MetaItem,
+              meta_item: &ast::MetaItem,
               item: Annotatable)
               -> Vec<Annotatable> {
         let item = match item {
@@ -53,7 +55,17 @@ impl MultiItemModifier for CustomDerive {
             }
         }
 
-        let input_span = item.span;
+        let input_span = Span {
+            expn_id: ecx.codemap().record_expansion(ExpnInfo {
+                call_site: span,
+                callee: NameAndSpan {
+                    format: MacroAttribute(intern(&pprust::meta_item_to_string(meta_item))),
+                    span: Some(span),
+                    allow_internal_unstable: true,
+                },
+            }),
+            ..item.span
+        };
         let input = __internal::new_token_stream(item);
         let res = __internal::set_parse_sess(&ecx.parse_sess, || {
             let inner = self.inner;