From d93be73890d0db0d34afaaebd3db1b87d68fb9b7 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Tue, 16 Apr 2019 21:54:32 +0200 Subject: Prepare for nullary union variants --- dhall_generator/src/derive.rs | 35 ++++++++++--------------- dhall_generator/src/quote.rs | 59 ++++++++++++++++++++++++++++++------------- 2 files changed, 54 insertions(+), 40 deletions(-) (limited to 'dhall_generator/src') diff --git a/dhall_generator/src/derive.rs b/dhall_generator/src/derive.rs index 740081a..852ffc8 100644 --- a/dhall_generator/src/derive.rs +++ b/dhall_generator/src/derive.rs @@ -71,35 +71,26 @@ fn derive_for_enum( .iter() .map(|v| { let name = dhall_core::Label::from(v.ident.to_string()); - let ty = match &v.fields { + match &v.fields { + syn::Fields::Unit => Ok((name, None)), syn::Fields::Unnamed(fields) if fields.unnamed.is_empty() => { - Err(Error::new( - v.span(), - "Nullary variants are not supported", - )) + Ok((name, None)) } - syn::Fields::Unnamed(fields) if fields.unnamed.len() > 1 => { - Err(Error::new( - v.span(), - "Variants with more than one field are not supported", - )) + syn::Fields::Unnamed(fields) if fields.unnamed.len() == 1 => { + let ty = &fields.unnamed.iter().next().unwrap().ty; + constraints.push(ty.clone()); + let ty = get_simple_static_type(ty); + Ok((name, Some(quote!(#ty.into())))) } - syn::Fields::Unnamed(fields) => { - Ok(&fields.unnamed.iter().next().unwrap().ty) - } - syn::Fields::Named(_) => Err(Error::new( + syn::Fields::Unnamed(_) => Err(Error::new( v.span(), - "Named variants are not supported", + "Variants with more than one field are not supported", )), - syn::Fields::Unit => Err(Error::new( + syn::Fields::Named(_) => Err(Error::new( v.span(), - "Nullary variants are not supported", + "Named variants are not supported", )), - }; - let ty = ty?; - constraints.push(ty.clone()); - let ty = get_simple_static_type(ty); - Ok((name, quote!(#ty.into()))) + } }) .collect::>()?; diff --git a/dhall_generator/src/quote.rs b/dhall_generator/src/quote.rs index 89107a9..c335666 100644 --- a/dhall_generator/src/quote.rs +++ b/dhall_generator/src/quote.rs @@ -31,23 +31,6 @@ pub fn quote_exprf(expr: ExprF) -> TokenStream where TS: quote::ToTokens + std::fmt::Debug, { - let quote_map = |m: BTreeMap| -> TokenStream { - let entries = m.into_iter().map(|(k, v)| { - let k = quote_label(&k); - quote!(m.insert(#k, #v);) - }); - quote! { { - use std::collections::BTreeMap; - let mut m = BTreeMap::new(); - #( #entries )* - m - } } - }; - - let quote_vec = |e: Vec| -> TokenStream { - quote! { vec![ #(#e),* ] } - }; - use dhall_core::ExprF::*; match expr { Var(_) => unreachable!(), @@ -106,7 +89,7 @@ where quote! { dhall_core::ExprF::RecordLit(#m) } } UnionType(m) => { - let m = quote_map(m); + let m = quote_opt_map(m); quote! { dhall_core::ExprF::UnionType(#m) } } e => unimplemented!("{:?}", e), @@ -206,3 +189,43 @@ fn quote_label(l: &Label) -> TokenStream { fn rc(x: TokenStream) -> TokenStream { quote! { dhall_core::rc(#x) } } + +fn quote_opt(x: Option) -> TokenStream +where + TS: quote::ToTokens + std::fmt::Debug, +{ + match x { + Some(x) => quote!(Some(#x)), + None => quote!(None), + } +} + +fn quote_vec(e: Vec) -> TokenStream +where + TS: quote::ToTokens + std::fmt::Debug, +{ + quote! { vec![ #(#e),* ] } +} + +fn quote_map(m: BTreeMap) -> TokenStream +where + TS: quote::ToTokens + std::fmt::Debug, +{ + let entries = m.into_iter().map(|(k, v)| { + let k = quote_label(&k); + quote!(m.insert(#k, #v);) + }); + quote! { { + use std::collections::BTreeMap; + let mut m = BTreeMap::new(); + #( #entries )* + m + } } +} + +fn quote_opt_map(m: BTreeMap>) -> TokenStream +where + TS: quote::ToTokens + std::fmt::Debug, +{ + quote_map(m.into_iter().map(|(k, v)| (k, quote_opt(v))).collect()) +} -- cgit v1.2.3