From e5632157b1a51976e691fc873472f53e629d1013 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Sun, 25 Jan 2015 00:29:24 -0500 Subject: [PATCH] Associated types support for deriving::generic::TraitDef --- src/libsyntax/ext/deriving/bounds.rs | 3 ++- src/libsyntax/ext/deriving/clone.rs | 3 ++- src/libsyntax/ext/deriving/cmp/eq.rs | 3 ++- src/libsyntax/ext/deriving/cmp/ord.rs | 3 ++- src/libsyntax/ext/deriving/cmp/totaleq.rs | 3 ++- src/libsyntax/ext/deriving/cmp/totalord.rs | 3 ++- src/libsyntax/ext/deriving/decodable.rs | 4 +++- src/libsyntax/ext/deriving/default.rs | 4 +++- src/libsyntax/ext/deriving/encodable.rs | 4 +++- src/libsyntax/ext/deriving/generic/mod.rs | 24 +++++++++++++++++++++- src/libsyntax/ext/deriving/hash.rs | 3 ++- src/libsyntax/ext/deriving/primitive.rs | 4 +++- src/libsyntax/ext/deriving/rand.rs | 3 ++- src/libsyntax/ext/deriving/show.rs | 7 ++++--- 14 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/libsyntax/ext/deriving/bounds.rs b/src/libsyntax/ext/deriving/bounds.rs index 8ac7e57bb81..9c85d3d28a7 100644 --- a/src/libsyntax/ext/deriving/bounds.rs +++ b/src/libsyntax/ext/deriving/bounds.rs @@ -51,7 +51,8 @@ pub fn expand_deriving_bound(cx: &mut ExtCtxt, path: Path::new(vec!("std", "marker", name)), additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), - methods: vec!() + methods: Vec::new(), + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) diff --git a/src/libsyntax/ext/deriving/clone.rs b/src/libsyntax/ext/deriving/clone.rs index 6498e8d2d58..e1dcc887778 100644 --- a/src/libsyntax/ext/deriving/clone.rs +++ b/src/libsyntax/ext/deriving/clone.rs @@ -44,7 +44,8 @@ pub fn expand_deriving_clone(cx: &mut ExtCtxt, cs_clone("Clone", c, s, sub) }), } - ) + ), + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) diff --git a/src/libsyntax/ext/deriving/cmp/eq.rs b/src/libsyntax/ext/deriving/cmp/eq.rs index c550c26c745..00971b96e92 100644 --- a/src/libsyntax/ext/deriving/cmp/eq.rs +++ b/src/libsyntax/ext/deriving/cmp/eq.rs @@ -88,7 +88,8 @@ macro_rules! md { methods: vec!( md!("eq", cs_eq), md!("ne", cs_ne) - ) + ), + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) } diff --git a/src/libsyntax/ext/deriving/cmp/ord.rs b/src/libsyntax/ext/deriving/cmp/ord.rs index 9f1850145b6..1f92f8d7b37 100644 --- a/src/libsyntax/ext/deriving/cmp/ord.rs +++ b/src/libsyntax/ext/deriving/cmp/ord.rs @@ -78,7 +78,8 @@ macro_rules! md { md!("le", true, true), md!("gt", false, false), md!("ge", false, true) - ] + ], + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) } diff --git a/src/libsyntax/ext/deriving/cmp/totaleq.rs b/src/libsyntax/ext/deriving/cmp/totaleq.rs index 9a2af6a3e0b..0429db3643b 100644 --- a/src/libsyntax/ext/deriving/cmp/totaleq.rs +++ b/src/libsyntax/ext/deriving/cmp/totaleq.rs @@ -61,7 +61,8 @@ fn cs_total_eq_assert(cx: &mut ExtCtxt, span: Span, substr: &Substructure) -> P< cs_total_eq_assert(a, b, c) }) } - ) + ), + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) } diff --git a/src/libsyntax/ext/deriving/cmp/totalord.rs b/src/libsyntax/ext/deriving/cmp/totalord.rs index 29d327142a6..e90c1aa6fce 100644 --- a/src/libsyntax/ext/deriving/cmp/totalord.rs +++ b/src/libsyntax/ext/deriving/cmp/totalord.rs @@ -45,7 +45,8 @@ pub fn expand_deriving_totalord(cx: &mut ExtCtxt, cs_cmp(a, b, c) }), } - ) + ), + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) diff --git a/src/libsyntax/ext/deriving/decodable.rs b/src/libsyntax/ext/deriving/decodable.rs index e458bd58e8b..9552dff941d 100644 --- a/src/libsyntax/ext/deriving/decodable.rs +++ b/src/libsyntax/ext/deriving/decodable.rs @@ -79,7 +79,9 @@ fn expand_deriving_decodable_imp(cx: &mut ExtCtxt, combine_substructure: combine_substructure(box |a, b, c| { decodable_substructure(a, b, c, krate) }), - }) + } + ), + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) diff --git a/src/libsyntax/ext/deriving/default.rs b/src/libsyntax/ext/deriving/default.rs index f8fdd8575bd..27f3c46c48f 100644 --- a/src/libsyntax/ext/deriving/default.rs +++ b/src/libsyntax/ext/deriving/default.rs @@ -43,7 +43,9 @@ pub fn expand_deriving_default(cx: &mut ExtCtxt, combine_substructure: combine_substructure(box |a, b, c| { default_substructure(a, b, c) }) - }) + } + ), + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) } diff --git a/src/libsyntax/ext/deriving/encodable.rs b/src/libsyntax/ext/deriving/encodable.rs index 4c78a7b6a0c..d0b2c2faf37 100644 --- a/src/libsyntax/ext/deriving/encodable.rs +++ b/src/libsyntax/ext/deriving/encodable.rs @@ -155,7 +155,9 @@ fn expand_deriving_encodable_imp(cx: &mut ExtCtxt, combine_substructure: combine_substructure(box |a, b, c| { encodable_substructure(a, b, c) }), - }) + } + ), + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) diff --git a/src/libsyntax/ext/deriving/generic/mod.rs b/src/libsyntax/ext/deriving/generic/mod.rs index 272b0464010..99c87741c6b 100644 --- a/src/libsyntax/ext/deriving/generic/mod.rs +++ b/src/libsyntax/ext/deriving/generic/mod.rs @@ -228,6 +228,8 @@ pub struct TraitDef<'a> { pub generics: LifetimeBounds<'a>, pub methods: Vec>, + + pub associated_types: Vec<(ast::Ident, Ty<'a>)>, } @@ -387,6 +389,22 @@ fn create_derived_impl(&self, methods: Vec>) -> P { let trait_path = self.path.to_path(cx, self.span, type_ident, generics); + // Transform associated types from `deriving::ty::Ty` into `ast::Typedef` + let associated_types = self.associated_types.iter().map(|&(ident, ref type_def)| { + P(ast::Typedef { + id: ast::DUMMY_NODE_ID, + span: self.span, + ident: ident, + vis: ast::Inherited, + attrs: Vec::new(), + typ: type_def.to_ty(cx, + self.span, + type_ident, + generics + ), + }) + }); + let Generics { mut lifetimes, ty_params, mut where_clause } = self.generics.to_generics(cx, self.span, type_ident, generics); let mut ty_params = ty_params.into_vec(); @@ -494,7 +512,11 @@ fn create_derived_impl(&self, methods.into_iter() .map(|method| { ast::MethodImplItem(method) - }).collect())) + }).chain( + associated_types.map(|type_| { + ast::TypeImplItem(type_) + }) + ).collect())) } fn expand_struct_def(&self, diff --git a/src/libsyntax/ext/deriving/hash.rs b/src/libsyntax/ext/deriving/hash.rs index 8dac864c2ae..e7f546b2691 100644 --- a/src/libsyntax/ext/deriving/hash.rs +++ b/src/libsyntax/ext/deriving/hash.rs @@ -54,7 +54,8 @@ pub fn expand_deriving_hash(cx: &mut ExtCtxt, hash_substructure(a, b, c) }) } - ) + ), + associated_types: Vec::new(), }; hash_trait_def.expand(cx, mitem, item, push); diff --git a/src/libsyntax/ext/deriving/primitive.rs b/src/libsyntax/ext/deriving/primitive.rs index c45fe1ceb20..c694b054ba3 100644 --- a/src/libsyntax/ext/deriving/primitive.rs +++ b/src/libsyntax/ext/deriving/primitive.rs @@ -65,7 +65,9 @@ pub fn expand_deriving_from_primitive(cx: &mut ExtCtxt, combine_substructure: combine_substructure(box |c, s, sub| { cs_from("u64", c, s, sub) }), - }) + } + ), + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) diff --git a/src/libsyntax/ext/deriving/rand.rs b/src/libsyntax/ext/deriving/rand.rs index bb902d7059c..9fd5091e194 100644 --- a/src/libsyntax/ext/deriving/rand.rs +++ b/src/libsyntax/ext/deriving/rand.rs @@ -49,7 +49,8 @@ pub fn expand_deriving_rand(cx: &mut ExtCtxt, rand_substructure(a, b, c) }) } - ) + ), + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) } diff --git a/src/libsyntax/ext/deriving/show.rs b/src/libsyntax/ext/deriving/show.rs index f5b5d4dda19..ec5941f58f3 100644 --- a/src/libsyntax/ext/deriving/show.rs +++ b/src/libsyntax/ext/deriving/show.rs @@ -35,10 +35,10 @@ pub fn expand_deriving_show(cx: &mut ExtCtxt, let trait_def = TraitDef { span: span, attributes: Vec::new(), - path: Path::new(vec!("std", "fmt", "Debug")), + path: Path::new(vec!["std", "fmt", "Debug"]), additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), - methods: vec!( + methods: vec![ MethodDef { name: "fmt", generics: LifetimeBounds::empty(), @@ -50,7 +50,8 @@ pub fn expand_deriving_show(cx: &mut ExtCtxt, show_substructure(a, b, c) }) } - ) + ], + associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) } -- 2.44.0