Skip to content

Commit

Permalink
fix macros
Browse files Browse the repository at this point in the history
  • Loading branch information
oscartbeaumont committed Dec 25, 2023
1 parent c5652a3 commit 6d3e99a
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 45 deletions.
2 changes: 1 addition & 1 deletion macros/src/type/enum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ pub fn parse_enum(
generics
.get(#i)
.cloned()
.unwrap_or_else(|| <#ident as #crate_ref::Type>::reference(type_map, std::borrow::Cow::Borrowed(&[])).inner)
.unwrap_or_else(|| <#ident as #crate_ref::Type>::reference(type_map, &[]).inner)
)
}
});
Expand Down
37 changes: 29 additions & 8 deletions macros/src/type/generics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,16 +80,29 @@ pub fn add_type_to_where_clause(ty: &TokenStream, generics: &Generics) -> Option
}
}

type DtGenericFn = fn(&TokenStream, TokenStream) -> TokenStream;
fn dt_generic_fn(f: DtGenericFn) -> DtGenericFn {
f
}

pub fn construct_datatype(
var_ident: Ident,
ty: &Type,
generic_idents: &[(usize, &Ident)],
crate_ref: &TokenStream,
inline: bool,
) -> syn::Result<TokenStream> {
let (method, transform) = match inline {
true => (quote!(inline), quote!()),
false => (quote!(reference), quote!(.inner)),
let (method, transform, generics) = match inline {
true => (
quote!(inline),
quote!(),
dt_generic_fn(|crate_ref, tokens| quote!(#crate_ref::Generics::Provided(#tokens))),
),
false => (
quote!(reference),
quote!(.inner),
dt_generic_fn(|_, tokens| tokens),
),
};

let path = match ty {
Expand All @@ -115,10 +128,11 @@ pub fn construct_datatype(
.enumerate()
.map(|(i, _)| format_ident!("{}_{}", &var_ident, i));

let generics = generics(&crate_ref, quote!(&[#(#generic_var_idents),*]));
return Ok(quote! {
#(#elems)*

let #var_ident = <#ty as #crate_ref::Type>::#method(type_map, &[#(#generic_var_idents),*])#transform;
let #var_ident = <#ty as #crate_ref::Type>::#method(type_map, #generics)#transform;
});
}
Type::Paren(p) => {
Expand All @@ -134,10 +148,11 @@ pub fn construct_datatype(
inline,
)?;

let generics = generics(&crate_ref, quote!(&[#elem_var_ident]));
return Ok(quote! {
#elem

let #var_ident = <#ty as #crate_ref::Type>::#method(type_map, &[#elem_var_ident])#transform;
let #var_ident = <#ty as #crate_ref::Type>::#method(type_map, #generics)#transform;
});
}
Type::Ptr(TypePtr { elem, .. }) | Type::Reference(TypeReference { elem, .. }) => {
Expand All @@ -151,8 +166,9 @@ pub fn construct_datatype(
));
}
Type::Macro(m) => {
let generics = generics(&crate_ref, quote!(&[]));
return Ok(quote! {
let #var_ident = <#m as #crate_ref::Type>::#method(type_map, std::borrow::Cow::Borrowed(&[]))#transform;
let #var_ident = <#m as #crate_ref::Type>::#method(type_map, #generics)#transform;
});
}
ty => {
Expand All @@ -172,10 +188,14 @@ pub fn construct_datatype(
.find(|(_, ident)| ident == &type_ident)
{
let type_ident = type_ident.to_string();
let generics = generics(
&crate_ref,
quote!(&[#crate_ref::DataType::Generic(std::borrow::Cow::Borrowed(#type_ident).into())]),
);
return Ok(quote! {
let #var_ident = generics.get(#i).cloned().unwrap_or_else(
|| {
<#generic_ident as #crate_ref::Type>::#method(type_map, &[#crate_ref::DataType::Generic(std::borrow::Cow::Borrowed(#type_ident).into())])#transform
<#generic_ident as #crate_ref::Type>::#method(type_map, #generics)#transform
},
);
});
Expand Down Expand Up @@ -218,9 +238,10 @@ pub fn construct_datatype(
.iter()
.map(|(i, _)| format_ident!("{}_{}", &var_ident, i));

let generics = generics(&crate_ref, quote!(&[#(#generic_var_idents),*]));
Ok(quote! {
#(#generic_vars)*

let #var_ident = <#ty as #crate_ref::Type>::#method(type_map, &[#(#generic_var_idents),*])#transform;
let #var_ident = <#ty as #crate_ref::Type>::#method(type_map, #generics)#transform;
})
}
56 changes: 22 additions & 34 deletions macros/src/type/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,26 +135,16 @@ pub fn derive(input: proc_macro::TokenStream) -> syn::Result<proc_macro::TokenSt
#[automatically_derived]
#type_impl_heading {
fn inline(type_map: &mut #crate_ref::TypeMap, generics: #crate_ref::Generics) -> #crate_ref::DataType {
// let generics = match generics {
let generics = match generics {
#crate_ref::Generics::Definition => DEFINITION_GENERICS,
#crate_ref::Generics::Provided(generics) => generics,
};

// };


// #inlines


// fn definition(type_map: &mut #crate_ref::TypeMap) -> #crate_ref::DataType {
// Self::inline(
// type_map,
// &DEFINITION_GENERICS
// )
// }
todo!();
#inlines
}

fn reference(type_map: &mut #crate_ref::TypeMap, generics: &[#crate_ref::DataType]) -> #crate_ref::reference::Reference {
// #reference
todo!();
#reference
}
}

Expand All @@ -164,27 +154,25 @@ pub fn derive(input: proc_macro::TokenStream) -> syn::Result<proc_macro::TokenSt
const IMPL_LOCATION: #crate_ref::ImplLocation = IMPL_LOCATION;

fn named_data_type(type_map: &mut #crate_ref::TypeMap, generics: &[#crate_ref::DataType]) -> #crate_ref::NamedDataType {
// #crate_ref::internal::construct::named_data_type(
// #name.into(),
// #comments.into(),
// #deprecated,
// SID,
// IMPL_LOCATION,
// <Self as #crate_ref::Type>::inline(type_map, generics)
// )
todo!();
#crate_ref::internal::construct::named_data_type(
#name.into(),
#comments.into(),
#deprecated,
SID,
IMPL_LOCATION,
<Self as #crate_ref::Type>::inline(type_map, #crate_ref::Generics::Provided(generics))
)
}

fn definition_named_data_type(type_map: &mut #crate_ref::TypeMap) -> #crate_ref::NamedDataType {
// #crate_ref::internal::construct::named_data_type(
// #name.into(),
// #comments.into(),
// #deprecated,
// SID,
// IMPL_LOCATION,
// <Self as #crate_ref::Type>::definition(type_map)
// )
todo!();
#crate_ref::internal::construct::named_data_type(
#name.into(),
#comments.into(),
#deprecated,
SID,
IMPL_LOCATION,
<Self as #crate_ref::Type>::inline(type_map, #crate_ref::Generics::Definition)
)
}
}

Expand Down
2 changes: 1 addition & 1 deletion macros/src/type/struct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ pub fn parse_struct(
generics
.get(#i)
.cloned()
.unwrap_or_else(|| <#ident as #crate_ref::Type>::reference(type_map, std::borrow::Cow::Borrowed(&[])).inner)
.unwrap_or_else(|| <#ident as #crate_ref::Type>::reference(type_map, &[]).inner)
}
});
let reference_generics =
Expand Down
2 changes: 2 additions & 0 deletions src/type/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,11 @@ pub trait NamedType: Type {
const SID: SpectaID;
const IMPL_LOCATION: ImplLocation; // TODO: I don't think this is used so maybe remove it?

// TODO: Should take `Generics` instead of `&[DataType]` but I plan to remove this trait so not fixing it for now.
/// this is equivalent to [Type::inline] but returns a [NamedDataType] instead.
fn named_data_type(type_map: &mut TypeMap, generics: &[DataType]) -> NamedDataType;

// TODO: Just remove this method given we removed `Type::definition`
/// this is equivalent to [Type::definition] but returns a [NamedDataType] instead.
fn definition_named_data_type(type_map: &mut TypeMap) -> NamedDataType;
}
Expand Down
2 changes: 1 addition & 1 deletion tests/ty_override.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use specta::Type;
use specta::{Any, Type};

use crate::ts::assert_ts;

Expand Down

0 comments on commit 6d3e99a

Please sign in to comment.