diff --git a/serde_macros/src/lib.rs b/serde_macros/src/lib.rs
index 95f78481..3e51cd63 100644
--- a/serde_macros/src/lib.rs
+++ b/serde_macros/src/lib.rs
@@ -1168,6 +1168,10 @@ fn deserialize_enum(
)
.build();
+ let type_generics = builder.from_generics(trait_generics.clone())
+ .strip_bounds()
+ .build();
+
// Build `__Visitor(PhantomData, PhantomData, ...)`
let (visitor_struct, visitor_expr) = if generics.ty_params.is_empty() {
(
@@ -1219,7 +1223,8 @@ fn deserialize_enum(
cx.expr_ident(span, cx.ident_of("visitor")),
variant_ptr,
&value_ty,
- generics,
+ &trait_generics,
+ &type_generics,
);
let s = builder.expr().str(name);
@@ -1303,7 +1308,8 @@ fn deserialize_enum_variant(
state: P,
variant_ptr: &P,
value_ty: &P,
- generics: &ast::Generics,
+ trait_generics: &ast::Generics,
+ type_generics: &ast::Generics,
) -> P {
let variant_path = cx.path(span, vec![type_ident, variant_ident]);
@@ -1323,7 +1329,8 @@ fn deserialize_enum_variant(
builder,
&*fields,
variant_path,
- generics,
+ trait_generics,
+ type_generics,
state,
value_ty,
)
@@ -1335,7 +1342,8 @@ fn deserialize_enum_variant(
builder,
&*fields,
variant_path,
- generics,
+ trait_generics,
+ type_generics,
state,
value_ty,
variant_ptr,
@@ -1349,21 +1357,13 @@ fn deserialize_enum_variant_seq(
builder: &aster::AstBuilder,
fields: &[Span],
variant_path: ast::Path,
- generics: &ast::Generics,
+ trait_generics: &ast::Generics,
+ type_generics: &ast::Generics,
state: P,
value_ty: &P,
) -> P {
- let trait_generics = builder.from_generics(generics.clone())
- .add_ty_param_bound(
- builder.path().global().ids(&["serde", "de", "Deserialize"]).build()
- )
- .build();
-
let where_clause = &trait_generics.where_clause;
- let type_generics = builder.from_generics(trait_generics.clone())
- .strip_bounds()
- .build();
// Create the field names for the fields.
let field_names: Vec = (0 .. fields.len())
@@ -1379,7 +1379,7 @@ fn deserialize_enum_variant_seq(
let (visitor_struct, visitor_expr) = deserialize_struct_unnamed_field_visitor(
builder,
- generics
+ trait_generics,
);
quote_expr!(cx, {
@@ -1406,23 +1406,14 @@ fn deserialize_enum_variant_map(
builder: &aster::AstBuilder,
fields: &[(Ident, Span)],
variant_path: ast::Path,
- generics: &ast::Generics,
+ trait_generics: &ast::Generics,
+ type_generics: &ast::Generics,
state: P,
value_ty: &P,
variant_ptr: &P,
) -> P {
- let trait_generics = builder.from_generics(generics.clone())
- .add_ty_param_bound(
- builder.path().global().ids(&["serde", "de", "Deserialize"]).build()
- )
- .build();
-
let where_clause = &trait_generics.where_clause;
- let type_generics = builder.from_generics(trait_generics.clone())
- .strip_bounds()
- .build();
-
// Create the field names for the fields.
let field_names: Vec = (0 .. fields.len())
.map(|i| token::str_to_ident(&format!("__field{}", i)))
@@ -1454,7 +1445,7 @@ fn deserialize_enum_variant_map(
let (visitor_struct, visitor_expr) = deserialize_struct_unnamed_field_visitor(
builder,
- generics
+ trait_generics
);
quote_expr!(cx, {