Skip to content

Commit

Permalink
Fix macro hygiene
Browse files Browse the repository at this point in the history
  • Loading branch information
teohhanhui committed Aug 31, 2023
1 parent e9a9790 commit fcdb951
Show file tree
Hide file tree
Showing 10 changed files with 426 additions and 225 deletions.
13 changes: 8 additions & 5 deletions autosurgeon-derive/src/attrs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,11 +118,14 @@ impl ReconcileWith {
Self::Module { module_name, .. } | Self::With { module_name, .. } => {
let k = syn::Lifetime::new("'k", Span::mixed_site());
Some(quote! {
fn hydrate_key<#k, D: autosurgeon::ReadDoc>(
fn hydrate_key<#k, D: ::autosurgeon::ReadDoc>(
doc: &D,
obj: &automerge::ObjId,
prop: autosurgeon::Prop<'_>,
) -> Result<autosurgeon::reconcile::LoadKey<Self::Key<#k>>, autosurgeon::ReconcileError> {
obj: &::automerge::ObjId,
prop: ::autosurgeon::Prop<'_>,
) -> ::std::result::Result<
::autosurgeon::reconcile::LoadKey<Self::Key<#k>>,
::autosurgeon::ReconcileError,
> {
#module_name::hydrate_key(doc, obj, prop)
}
})
Expand All @@ -136,7 +139,7 @@ impl ReconcileWith {
Self::Module { module_name, .. } | Self::With { module_name, .. } => {
let k = syn::Lifetime::new("'k", Span::mixed_site());
Some(quote! {
fn key<#k>(&#k self) -> autosurgeon::reconcile::LoadKey<Self::Key<#k>> {
fn key<#k>(&#k self) -> ::autosurgeon::reconcile::LoadKey<Self::Key<#k>> {
#module_name::key(#accessor)
}
})
Expand Down
82 changes: 45 additions & 37 deletions autosurgeon-derive/src/hydrate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ pub fn derive_hydrate(input: proc_macro::TokenStream) -> proc_macro::TokenStream
fn add_trait_bounds(mut generics: Generics) -> Generics {
for param in &mut generics.params {
if let GenericParam::Type(ref mut type_param) = *param {
type_param.bounds.push(parse_quote!(autosurgeon::Hydrate));
type_param.bounds.push(parse_quote!(::autosurgeon::Hydrate));
}
}
generics
Expand All @@ -55,12 +55,12 @@ fn on_hydrate_with(input: &DeriveInput, hydrate_with: &TokenStream) -> TokenStre
let name = &input.ident;

quote! {
impl #impl_generics autosurgeon::Hydrate for #name #ty_generics #where_clause {
fn hydrate<'a, D: autosurgeon::ReadDoc>(
impl #impl_generics ::autosurgeon::Hydrate for #name #ty_generics #where_clause {
fn hydrate<'a, D: ::autosurgeon::ReadDoc>(
doc: &D,
obj: &automerge::ObjId,
prop: autosurgeon::Prop<'a>,
) -> Result<Self, autosurgeon::HydrateError> {
obj: &::automerge::ObjId,
prop: ::autosurgeon::Prop<'a>,
) -> ::std::result::Result<Self, ::autosurgeon::HydrateError> {
#hydrate_with(doc, obj, prop)
}
}
Expand All @@ -87,7 +87,7 @@ fn on_struct(
let the_impl = gen_named_struct_impl(name, &fields);

Ok(quote! {
impl #impl_generics autosurgeon::Hydrate for #name #ty_generics #where_clause {
impl #impl_generics ::autosurgeon::Hydrate for #name #ty_generics #where_clause {
#the_impl
}
})
Expand Down Expand Up @@ -120,7 +120,7 @@ fn on_enum(
let hydrate_map = named_fields.hydrate_map();

Ok(quote! {
impl #impl_generics autosurgeon::Hydrate for #name #ty_generics
impl #impl_generics ::autosurgeon::Hydrate for #name #ty_generics
#where_clause
{
#hydrate_string
Expand Down Expand Up @@ -154,7 +154,7 @@ impl<'a> EnumUnitFields<'a> {
let ty = self.ty;
let branches = self.fields.iter().map(|i| {
let branch_name = i.to_string();
quote!(#branch_name => Ok(#ty::#i))
quote!(#branch_name => ::std::result::Result::Ok(#ty::#i))
});
quote!(#(#branches),*)
}
Expand All @@ -174,14 +174,16 @@ impl<'a> EnumUnitFields<'a> {

quote! {
fn hydrate_string(
val: &'_ str
) -> Result<Self, autosurgeon::HydrateError> {
val: &'_ ::std::primitive::str
) -> ::std::result::Result<Self, ::autosurgeon::HydrateError> {
match val {
#unit_branches,
other => Err(autosurgeon::HydrateError::unexpected(
#unit_error,
other.to_string(),
)),
other => ::std::result::Result::Err(
::autosurgeon::HydrateError::unexpected(
#unit_error,
::std::string::ToString::to_string(other),
),
),
}
}
}
Expand Down Expand Up @@ -210,14 +212,14 @@ impl<'a> EnumAsMapFields<'a> {
} else {
let stanzas = self.variants.iter().map(|v| v.visitor_def(self.ty));
quote! {
fn hydrate_map<D: autosurgeon::ReadDoc>(
fn hydrate_map<D: ::autosurgeon::ReadDoc>(
doc: &D,
obj: &automerge::ObjId,
) -> Result<Self, autosurgeon::HydrateError> {
obj: &::automerge::ObjId,
) -> ::std::result::Result<Self, ::autosurgeon::HydrateError> {
#(#stanzas)*
Err(autosurgeon::HydrateError::unexpected(
::std::result::Result::Err(::autosurgeon::HydrateError::unexpected(
"A map with one key",
"something else".to_string(),
::std::string::ToString::to_string("something else"),
))
}
}
Expand All @@ -232,9 +234,12 @@ fn gen_named_struct_impl(name: &syn::Ident, fields: &[named_field::NamedField])
let field_initializers = fields.iter().map(|f| f.initializer());

quote! {
fn hydrate_map<D: autosurgeon::ReadDoc>(doc: &D, #obj_ident: &automerge::ObjId) -> Result<Self, autosurgeon::HydrateError> {
fn hydrate_map<D: ::autosurgeon::ReadDoc>(
doc: &D,
#obj_ident: &::automerge::ObjId,
) -> ::std::result::Result<Self, ::autosurgeon::HydrateError> {
#(#field_hydrators)*
Ok(#name {
::std::result::Result::Ok(#name {
#(#field_initializers),*
})
}
Expand All @@ -258,27 +263,27 @@ fn gen_newtype_struct_wrapper(

if let Some(hydrate_with) = attrs.hydrate_with().map(|h| h.hydrate_with()) {
Ok(quote! {
impl #impl_generics autosurgeon::hydrate::Hydrate for #ty #ty_generics #where_clause {
fn hydrate<'a, D: autosurgeon::ReadDoc>(
impl #impl_generics ::autosurgeon::hydrate::Hydrate for #ty #ty_generics #where_clause {
fn hydrate<'a, D: ::autosurgeon::ReadDoc>(
doc: &D,
obj: &automerge::ObjId,
prop: autosurgeon::Prop<'a>,
) -> Result<Self, autosurgeon::HydrateError> {
obj: &::automerge::ObjId,
prop: ::autosurgeon::Prop<'a>,
) -> ::std::result::Result<Self, ::autosurgeon::HydrateError> {
let inner = #hydrate_with(doc, obj, prop)?;
Ok(#ty(inner))
::std::result::Result::Ok(#ty(inner))
}
}
})
} else {
Ok(quote! {
impl #impl_generics autosurgeon::hydrate::Hydrate for #ty #ty_generics #where_clause {
fn hydrate<'a, D: autosurgeon::ReadDoc>(
impl #impl_generics ::autosurgeon::hydrate::Hydrate for #ty #ty_generics #where_clause {
fn hydrate<'a, D: ::autosurgeon::ReadDoc>(
doc: &D,
obj: &automerge::ObjId,
prop: autosurgeon::Prop<'a>,
) -> Result<Self, autosurgeon::HydrateError> {
obj: &::automerge::ObjId,
prop: ::autosurgeon::Prop<'a>,
) -> ::std::result::Result<Self, ::autosurgeon::HydrateError> {
let inner = #inner_ty::hydrate(doc, obj, prop)?;
Ok(#ty(inner))
::std::result::Result::Ok(#ty(inner))
}
}
})
Expand All @@ -305,10 +310,13 @@ fn gen_tuple_struct_wrapper(
let field_initializers = fields.iter().map(|f| f.initializer());

Ok(quote! {
impl #impl_generics autosurgeon::Hydrate for #name #ty_generics #where_clause {
fn hydrate_seq<D: autosurgeon::ReadDoc>(doc: &D, #obj_ident: &automerge::ObjId) -> Result<Self, autosurgeon::HydrateError> {
impl #impl_generics ::autosurgeon::Hydrate for #name #ty_generics #where_clause {
fn hydrate_seq<D: ::autosurgeon::ReadDoc>(
doc: &D,
#obj_ident: &::automerge::ObjId,
) -> ::std::result::Result<Self, ::autosurgeon::HydrateError> {
#(#field_hydrators)*
Ok(#name (
::std::result::Result::Ok(#name (
#(#field_initializers),*
))
}
Expand Down
8 changes: 6 additions & 2 deletions autosurgeon-derive/src/hydrate/named_field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,16 @@ impl<'a> NamedField<'a> {
if let Some(hydrate_with) = self.attrs.hydrate_with() {
let function_name = hydrate_with.hydrate_with();
quote! {
let #name = #function_name(doc, &#obj_ident, #string_name.into())?;
let #name = #function_name(
doc,
&#obj_ident,
::std::convert::Into::into(#string_name),
)?;
}
} else {
let span = self.field.span();
quote_spanned! {span=>
let #name = autosurgeon::hydrate_prop(doc, &#obj_ident, #string_name)?;
let #name = ::autosurgeon::hydrate_prop(doc, &#obj_ident, #string_name)?;
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions autosurgeon-derive/src/hydrate/newtype_field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@ impl<'a> NewtypeField<'a> {
if let Some(hydrate_with) = self.attrs.hydrate_with() {
let hydrate_func = hydrate_with.hydrate_with();
quote! {
let #target = #hydrate_func(doc, obj, #prop_ident.into())?;
let #target = #hydrate_func(doc, obj, ::std::convert::Into::into(#prop_ident))?;
}
} else {
let span = self.field.span();
quote_spanned! {span=>
let #target = autosurgeon::hydrate_prop(doc, obj, #prop_ident)?;
let #target = ::autosurgeon::hydrate_prop(doc, obj, #prop_ident)?;
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions autosurgeon-derive/src/hydrate/unnamed_field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ impl UnnamedField {
if let Some(hydrate_with) = self.attrs.hydrate_with() {
let function_name = hydrate_with.hydrate_with();
quote! {
let #name = #function_name(doc, &#obj_ident, #idx.into())?;
let #name = #function_name(doc, &#obj_ident, ::std::convert::Into::into(#idx))?;
}
} else {
let span = self.field.span();
quote_spanned! {span=>
let #name = autosurgeon::hydrate_prop(doc, &#obj_ident, #idx)?;
let #name = ::autosurgeon::hydrate_prop(doc, &#obj_ident, #idx)?;
}
}
}
Expand Down
26 changes: 17 additions & 9 deletions autosurgeon-derive/src/hydrate/variant_fields.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,10 @@ fn newtype_field_variant_stanza(

let hydrator = field.hydrate_into(&name, &variant_name_str);
quote! {
if doc.get(obj, #variant_name_str)?.is_some() {
if ::autosurgeon::ReadDoc::get(doc, obj, #variant_name_str)?.is_some() {
#hydrator
//let #name = autosurgeon::hydrate_prop(doc, obj, #variant_name_str)?;
return Ok(#ty::#variant_name(#name))
//let #name = ::autosurgeon::hydrate_prop(doc, obj, #variant_name_str)?;
return ::std::result::Result::Ok(#ty::#variant_name(#name))
}
}
}
Expand All @@ -97,10 +97,14 @@ fn named_field_variant_stanza(
let field_initializers = fields.iter().map(|f| f.initializer());

quote! {
if let Some((val, #obj_ident)) = doc.get(obj, #variant_name_str)? {
if matches!(val, automerge::Value::Object(automerge::ObjType::Map)) {
if let ::std::option::Option::Some((val, #obj_ident)) = ::autosurgeon::ReadDoc::get(
doc,
obj,
#variant_name_str,
)? {
if ::std::matches!(val, ::automerge::Value::Object(::automerge::ObjType::Map)) {
#(#field_hydrators)*
return Ok(#ty::#variant_name {
return ::std::result::Result::Ok(#ty::#variant_name {
#(#field_initializers),*
})
}
Expand All @@ -121,10 +125,14 @@ fn unnamed_field_variant_stanza(

let variant_name_str = variant_name.to_string();
quote! {
if let Some((val, #obj_ident)) = doc.get(obj, #variant_name_str)? {
if matches!(val, automerge::Value::Object(automerge::ObjType::List)) {
if let ::std::option::Option::Some((val, #obj_ident)) = ::autosurgeon::ReadDoc::get(
doc,
obj,
#variant_name_str,
)? {
if ::std::matches!(val, ::automerge::Value::Object(::automerge::ObjType::List)) {
#(#hydrators)*
return Ok(#ty::#variant_name(#(#initializers),*))
return ::std::result::Result::Ok(#ty::#variant_name(#(#initializers),*))
}
}
}
Expand Down
Loading

0 comments on commit fcdb951

Please sign in to comment.