From 4be21bd8119a0a229328c2ba44a5954344ec7781 Mon Sep 17 00:00:00 2001 From: Graham Esau Date: Fri, 16 Apr 2021 14:23:10 +0100 Subject: [PATCH] Refactor out "local_id" for type definitions --- schemars_derive/src/lib.rs | 2 +- schemars_derive/src/schema_exprs.rs | 39 +++++++++++++---------------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/schemars_derive/src/lib.rs b/schemars_derive/src/lib.rs index 5325f92..5fa4ac2 100644 --- a/schemars_derive/src/lib.rs +++ b/schemars_derive/src/lib.rs @@ -51,7 +51,7 @@ fn derive_json_schema( let (impl_generics, ty_generics, where_clause) = cont.generics.split_for_impl(); if let Some(transparent_field) = cont.transparent_field() { - let (ty, type_def) = schema_exprs::type_for_field_schema(transparent_field, 0); + let (ty, type_def) = schema_exprs::type_for_field_schema(transparent_field); return Ok(quote! { const _: () = { #crate_alias diff --git a/schemars_derive/src/schema_exprs.rs b/schemars_derive/src/schema_exprs.rs index 739641c..68dcec6 100644 --- a/schemars_derive/src/schema_exprs.rs +++ b/schemars_derive/src/schema_exprs.rs @@ -57,7 +57,7 @@ pub fn expr_for_repr(cont: &Container) -> Result { } fn expr_for_field(field: &Field, allow_ref: bool) -> TokenStream { - let (ty, type_def) = type_for_field_schema(field, 0); + let (ty, type_def) = type_for_field_schema(field); let span = field.original.span(); let gen = quote!(gen); @@ -86,18 +86,18 @@ fn expr_for_field(field: &Field, allow_ref: bool) -> TokenStream { field.validation_attrs.apply_to_schema(schema_expr) } -pub fn type_for_field_schema(field: &Field, local_id: usize) -> (syn::Type, Option) { +pub fn type_for_field_schema(field: &Field) -> (syn::Type, Option) { match &field.attrs.with { None => (field.ty.to_owned(), None), - Some(with_attr) => type_for_schema(with_attr, local_id), + Some(with_attr) => type_for_schema(with_attr), } } -fn type_for_schema(with_attr: &WithAttr, local_id: usize) -> (syn::Type, Option) { +fn type_for_schema(with_attr: &WithAttr) -> (syn::Type, Option) { match with_attr { WithAttr::Type(ty) => (ty.to_owned(), None), WithAttr::Function(fun) => { - let ty_name = format_ident!("_SchemarsSchemaWithFunction{}", local_id); + let ty_name = syn::Ident::new("_SchemarsSchemaWithFunction", Span::call_site()); let fn_name = fun.segments.last().unwrap().ident.to_string(); let type_def = quote_spanned! {fun.span()=> @@ -331,7 +331,7 @@ fn expr_for_adjacent_tagged_enum<'a>( fn expr_for_untagged_enum_variant(variant: &Variant, deny_unknown_fields: bool) -> TokenStream { if let Some(with_attr) = &variant.attrs.with { - let (ty, type_def) = type_for_schema(with_attr, 0); + let (ty, type_def) = type_for_schema(with_attr); let gen = quote!(gen); return quote_spanned! {variant.original.span()=> { @@ -354,7 +354,7 @@ fn expr_for_untagged_enum_variant_for_flatten( deny_unknown_fields: bool, ) -> Option { if let Some(with_attr) = &variant.attrs.with { - let (ty, type_def) = type_for_schema(with_attr, 0); + let (ty, type_def) = type_for_schema(with_attr); let gen = quote!(gen); return Some(quote_spanned! {variant.original.span()=> { @@ -421,18 +421,13 @@ fn expr_for_struct( SerdeDefault::Path(path) => Some(quote!(let container_default = #path();)), }; - let mut type_defs = Vec::new(); - let properties: Vec<_> = property_fields .into_iter() .map(|field| { let name = field.name(); let default = field_default_expr(field, set_container_default.is_some()); - let (ty, type_def) = type_for_field_schema(field, type_defs.len()); - if let Some(type_def) = type_def { - type_defs.push(type_def); - } + let (ty, type_def) = type_for_field_schema(field); let gen = quote!(gen); let schema_expr = if field.validation_attrs.required { @@ -470,8 +465,11 @@ fn expr_for_struct( let schema_expr = field.validation_attrs.apply_to_schema(schema_expr); quote! { - object_validation.properties.insert(#name.to_owned(), #schema_expr); - #maybe_insert_required + { + #type_def + object_validation.properties.insert(#name.to_owned(), #schema_expr); + #maybe_insert_required + } } }) .collect(); @@ -479,10 +477,7 @@ fn expr_for_struct( let flattens: Vec<_> = flattened_fields .into_iter() .map(|field| { - let (ty, type_def) = type_for_field_schema(field, type_defs.len()); - if let Some(type_def) = type_def { - type_defs.push(type_def); - } + let (ty, type_def) = type_for_field_schema(field); let required = if field.validation_attrs.required { quote!(Some(true)) @@ -492,7 +487,10 @@ fn expr_for_struct( let args = quote!(gen, #required); quote_spanned! {ty.span()=> - .flatten(schemars::_private::json_schema_for_flatten::<#ty>(#args)) + .flatten({ + #type_def + schemars::_private::json_schema_for_flatten::<#ty>(#args) + }) } }) .collect(); @@ -506,7 +504,6 @@ fn expr_for_struct( }; quote! { { - #(#type_defs)* #set_container_default let mut schema_object = schemars::schema::SchemaObject { instance_type: Some(schemars::schema::InstanceType::Object.into()),