diff --git a/yaserde_derive/src/common/field.rs b/yaserde_derive/src/common/field.rs index edff2be..42648fa 100644 --- a/yaserde_derive/src/common/field.rs +++ b/yaserde_derive/src/common/field.rs @@ -185,9 +185,8 @@ pub enum Field { } impl Field { - pub fn get_simple_type_visitor(&self) -> TokenStream { - let ident = format_ident!("visit_{}", self.to_string()); - quote! {#ident} + pub fn get_simple_type_visitor(&self) -> Ident { + format_ident!("visit_{}", self.to_string()) } } diff --git a/yaserde_derive/src/de/expand_enum.rs b/yaserde_derive/src/de/expand_enum.rs index f573be7..222f241 100644 --- a/yaserde_derive/src/de/expand_enum.rs +++ b/yaserde_derive/src/de/expand_enum.rs @@ -1,5 +1,5 @@ use crate::common::{Field, YaSerdeAttribute, YaSerdeField}; -use proc_macro2::TokenStream; +use proc_macro2::{Span, TokenStream}; use quote::quote; use syn::{DataEnum, Fields, Ident}; @@ -149,26 +149,25 @@ fn build_unnamed_field_visitors(fields: &syn::FieldsUnnamed) -> TokenStream { .iter() .map(|field| YaSerdeField::new(field.clone())) .enumerate() - .map(|(idx, field)| { + .filter_map(|(idx, field)| { let visitor_label = Ident::new(&format!("__Visitor_{}", idx), field.get_span()); - let make_visitor = - |visitor: &TokenStream, field_type: &TokenStream, fn_body: &TokenStream| { - Some(quote! { - #[allow(non_snake_case, non_camel_case_types)] - struct #visitor_label; - impl<'de> ::yaserde::Visitor<'de> for #visitor_label { - type Value = #field_type; + let make_visitor = |visitor: &Ident, field_type: &TokenStream, fn_body: &TokenStream| { + quote! { + #[allow(non_snake_case, non_camel_case_types)] + struct #visitor_label; + impl<'de> ::yaserde::Visitor<'de> for #visitor_label { + type Value = #field_type; - fn #visitor( - self, - v: &::std::primitive::str, - ) -> ::std::result::Result { - #fn_body - } + fn #visitor( + self, + v: &::std::primitive::str, + ) -> ::std::result::Result { + #fn_body } - }) - }; + } + } + }; let simple_type_visitor = |simple_type: Field| { let visitor = simple_type.get_simple_type_visitor(); @@ -189,8 +188,8 @@ fn build_unnamed_field_visitors(fields: &syn::FieldsUnnamed) -> TokenStream { .map(|s| s.ident.to_string()) .collect(); - make_visitor( - "e! { visit_str }, + Some(make_visitor( + &Ident::new("visit_str", Span::call_site()), "e! { #struct_name }, "e! { let content = "<".to_string() + #struct_id + ">" + v + ""; @@ -198,16 +197,15 @@ fn build_unnamed_field_visitors(fields: &syn::FieldsUnnamed) -> TokenStream { ::yaserde::de::from_str(&content); value }, - ) + )) } Field::FieldOption { data_type } | Field::FieldVec { data_type } => match *data_type { Field::FieldStruct { .. } => None, - simple_type => simple_type_visitor(simple_type), + simple_type => Some(simple_type_visitor(simple_type)), }, - simple_type => simple_type_visitor(simple_type), + simple_type => Some(simple_type_visitor(simple_type)), } }) - .filter_map(|f| f) .collect() } diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index e909022..2cffffa 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -229,7 +229,7 @@ pub fn parse( let label_name = field.renamed_label_without_namespace(); let visitor_label = build_visitor_ident(&label_name, field.get_span(), None); - let visit = |action: &TokenStream, visitor: &TokenStream, visitor_label: &Ident| { + let visit = |action: &TokenStream, visitor: &Ident, visitor_label: &Ident| { Some(quote! { for attr in attributes { if attr.name.local_name == #label_name { @@ -254,7 +254,7 @@ pub fn parse( let visit_struct = |struct_name: syn::Path, action: TokenStream| { visit( &action, - "e! { visit_str }, + &Ident::new("visit_str", Span::call_site()), &build_visitor_ident(&label_name, field.get_span(), Some(&struct_name)), ) }; @@ -421,7 +421,7 @@ pub fn parse( fn build_call_visitor( field_type: &TokenStream, - visitor: &TokenStream, + visitor: &Ident, action: &TokenStream, field: &YaSerdeField, root_attributes: &YaSerdeAttribute,