diff --git a/serde_macros/src/lib.rs b/serde_macros/src/lib.rs index e92a9786..2205e70c 100644 --- a/serde_macros/src/lib.rs +++ b/serde_macros/src/lib.rs @@ -625,6 +625,10 @@ fn deserialize_substructure( &trait_generics ); + let value_ty = builder.ty().path() + .segment(substr.type_ident).with_generics(trait_generics.clone()).build() + .build(); + match *substr.fields { StaticStruct(ref struct_def, ref fields) => { deserialize_struct( @@ -633,7 +637,7 @@ fn deserialize_substructure( &builder, substr.type_ident, substr.type_ident, - cx.path(span, vec![substr.type_ident]), + builder.path().id(substr.type_ident).build(), fields, state, struct_def, @@ -641,6 +645,7 @@ fn deserialize_substructure( visitor_item, visitor_ty, visitor_expr, + value_ty, ) } StaticEnum(ref enum_def, ref fields) => { @@ -653,6 +658,7 @@ fn deserialize_substructure( enum_def, &trait_generics, &type_generics, + value_ty, ) } _ => cx.bug("expected StaticEnum or StaticStruct in derive(Deserialize)") @@ -705,11 +711,8 @@ fn deserialize_struct( visitor_item: P, visitor_ty: P, visitor_expr: P, + value_ty: P, ) -> P { - let value_ty = builder.ty().path() - .segment(type_ident).with_generics(trait_generics.clone()).build() - .build(); - match *fields { Unnamed(ref fields) => { if fields.is_empty() { @@ -1184,6 +1187,7 @@ fn deserialize_enum( enum_def: &EnumDef, trait_generics: &ast::Generics, type_generics: &ast::Generics, + value_ty: P, ) -> P { let where_clause = &trait_generics.where_clause; @@ -1192,10 +1196,6 @@ fn deserialize_enum( trait_generics, ); - let value_ty = builder.ty().path() - .segment(type_ident).with_generics(type_generics.clone()).build() - .build(); - let type_name = builder.expr().str(type_ident); // Match arms to extract a variant from a string @@ -1269,15 +1269,15 @@ fn deserialize_enum_variant( trait_generics: &ast::Generics, type_generics: &ast::Generics, ) -> P { - let variant_path = cx.path(span, vec![type_ident, variant_ident]); + let variant_path = builder.path() + .ids(&[type_ident, variant_ident]) + .build(); match *fields { Unnamed(ref fields) if fields.is_empty() => { - let result = cx.expr_path(variant_path); - quote_expr!(cx, { try!($state.visit_unit()); - Ok($result) + Ok($variant_path) }) } @@ -1322,7 +1322,6 @@ fn deserialize_enum_variant_seq( ) -> P { let where_clause = &trait_generics.where_clause; - // Create the field names for the fields. let field_names: Vec = (0 .. fields.len()) .map(|i| token::str_to_ident(&format!("__field{}", i))) @@ -1357,7 +1356,6 @@ fn deserialize_enum_variant_seq( }) } - fn deserialize_enum_variant_map( cx: &ExtCtxt, span: Span,