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, {