From 2ab4e2042d5c8313bd5ad4a2c2c2d3da153a021b Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Wed, 26 Mar 2014 17:15:37 +1300 Subject: [PATCH] deriving should give expn_info Ensure that all generated code from deriving attributes get an expn_info in their span. --- src/libsyntax/ext/deriving/clone.rs | 1 + src/libsyntax/ext/deriving/generic.rs | 2 ++ src/libsyntax/ext/deriving/mod.rs | 13 ++++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/libsyntax/ext/deriving/clone.rs b/src/libsyntax/ext/deriving/clone.rs index 3cbccae664bec..bb3636e682817 100644 --- a/src/libsyntax/ext/deriving/clone.rs +++ b/src/libsyntax/ext/deriving/clone.rs @@ -19,6 +19,7 @@ pub fn expand_deriving_clone(cx: &mut ExtCtxt, mitem: @MetaItem, item: @Item, push: |@Item|) { + assert!(span.expn_info.is_some(), "derived trait should have expn_info set"); let trait_def = TraitDef { span: span, attributes: Vec::new(), diff --git a/src/libsyntax/ext/deriving/generic.rs b/src/libsyntax/ext/deriving/generic.rs index 89a8b2cd336d5..b30fe48c2accd 100644 --- a/src/libsyntax/ext/deriving/generic.rs +++ b/src/libsyntax/ext/deriving/generic.rs @@ -408,6 +408,7 @@ impl<'a> TraitDef<'a> { InternedString::new("automatically_derived"))); let opt_trait_ref = Some(trait_ref); let ident = ast_util::impl_pretty_name(&opt_trait_ref, self_type); + assert!(self.span.expn_info.is_some(), "Should have expansion info") cx.item( self.span, ident, @@ -613,6 +614,7 @@ impl<'a> MethodDef<'a> { Vec::new() }; + assert!(trait_.span.expn_info.is_some(), "Should have expansion info") // Create the method. @ast::Method { ident: method_ident, diff --git a/src/libsyntax/ext/deriving/mod.rs b/src/libsyntax/ext/deriving/mod.rs index 5a980cb9de90b..f9251df8a4dd3 100644 --- a/src/libsyntax/ext/deriving/mod.rs +++ b/src/libsyntax/ext/deriving/mod.rs @@ -20,6 +20,7 @@ library. use ast::{Item, MetaItem, MetaList, MetaNameValue, MetaWord}; use ext::base::ExtCtxt; +use codemap; use codemap::Span; pub mod clone; @@ -65,7 +66,17 @@ pub fn expand_meta_deriving(cx: &mut ExtCtxt, MetaNameValue(ref tname, _) | MetaList(ref tname, _) | MetaWord(ref tname) => { - macro_rules! expand(($func:path) => ($func(cx, titem.span, + let mut span = titem.span; + span.expn_info = Some(@codemap::ExpnInfo { + call_site: span, + callee: codemap::NameAndSpan { + name: format!("deriving({})", tname.get()), + format: codemap::MacroAttribute, + span: None, + } + }); + + macro_rules! expand(($func:path) => ($func(cx, span, titem, item, |i| push(i)))); match tname.get() {