fix(versionable): use full type path in proc macro

This avoids name clashes if user re-defines the type
This commit is contained in:
Nicolas Sarlin
2025-09-19 11:48:43 +02:00
committed by Nicolas Sarlin
parent 022cb3b18a
commit 4a73b7bb4b
2 changed files with 23 additions and 10 deletions

View File

@@ -8,7 +8,7 @@ use syn::{
use crate::{ use crate::{
add_lifetime_param, add_trait_where_clause, add_where_lifetime_bound_to_generics, add_lifetime_param, add_trait_where_clause, add_where_lifetime_bound_to_generics,
extend_where_clause, filter_unsized_bounds, parse_const_str, DESERIALIZE_TRAIT_NAME, extend_where_clause, filter_unsized_bounds, parse_const_str, DESERIALIZE_TRAIT_NAME,
LIFETIME_NAME, SERIALIZE_TRAIT_NAME, FROM_TRAIT_NAME, LIFETIME_NAME, RESULT_TYPE_NAME, SERIALIZE_TRAIT_NAME, TRY_FROM_TRAIT_NAME,
}; };
/// Generates an impl block for the From trait. This will be: /// Generates an impl block for the From trait. This will be:
@@ -28,9 +28,11 @@ pub(crate) fn generate_from_trait_impl(
from_variable_name: &str, from_variable_name: &str,
) -> syn::Result<ItemImpl> { ) -> syn::Result<ItemImpl> {
let from_variable = Ident::new(from_variable_name, Span::call_site()); let from_variable = Ident::new(from_variable_name, Span::call_site());
let from_trait: Path = parse_const_str(FROM_TRAIT_NAME);
Ok(parse_quote! { Ok(parse_quote! {
#[automatically_derived] #[automatically_derived]
impl #impl_generics From<#src> for #dest #where_clause { impl #impl_generics #from_trait<#src> for #dest #where_clause {
fn from(#from_variable: #src) -> Self { fn from(#from_variable: #src) -> Self {
#constructor #constructor
} }
@@ -57,11 +59,14 @@ pub(crate) fn generate_try_from_trait_impl(
from_variable_name: &str, from_variable_name: &str,
) -> syn::Result<ItemImpl> { ) -> syn::Result<ItemImpl> {
let from_variable = Ident::new(from_variable_name, Span::call_site()); let from_variable = Ident::new(from_variable_name, Span::call_site());
let result_type: Path = parse_const_str(RESULT_TYPE_NAME);
let try_from_trait: Path = parse_const_str(TRY_FROM_TRAIT_NAME);
Ok(parse_quote! { Ok(parse_quote! {
#[automatically_derived] #[automatically_derived]
impl #impl_generics TryFrom<#src> for #dest #where_clause { impl #impl_generics #try_from_trait<#src> for #dest #where_clause {
type Error = #error; type Error = #error;
fn try_from(#from_variable: #src) -> Result<Self, Self::Error> { fn try_from(#from_variable: #src) -> #result_type<Self, Self::Error> {
#constructor #constructor
} }
} }

View File

@@ -46,6 +46,7 @@ pub(crate) const UNVERSIONIZE_ERROR_NAME: &str = crate_full_path!("UnversionizeE
pub(crate) const SERIALIZE_TRAIT_NAME: &str = "::serde::Serialize"; pub(crate) const SERIALIZE_TRAIT_NAME: &str = "::serde::Serialize";
pub(crate) const DESERIALIZE_TRAIT_NAME: &str = "::serde::Deserialize"; pub(crate) const DESERIALIZE_TRAIT_NAME: &str = "::serde::Deserialize";
pub(crate) const DESERIALIZE_OWNED_TRAIT_NAME: &str = "::serde::de::DeserializeOwned"; pub(crate) const DESERIALIZE_OWNED_TRAIT_NAME: &str = "::serde::de::DeserializeOwned";
pub(crate) const TRY_FROM_TRAIT_NAME: &str = "::core::convert::TryFrom";
pub(crate) const FROM_TRAIT_NAME: &str = "::core::convert::From"; pub(crate) const FROM_TRAIT_NAME: &str = "::core::convert::From";
pub(crate) const TRY_INTO_TRAIT_NAME: &str = "::core::convert::TryInto"; pub(crate) const TRY_INTO_TRAIT_NAME: &str = "::core::convert::TryInto";
pub(crate) const INTO_TRAIT_NAME: &str = "::core::convert::Into"; pub(crate) const INTO_TRAIT_NAME: &str = "::core::convert::Into";
@@ -53,6 +54,8 @@ pub(crate) const ERROR_TRAIT_NAME: &str = "::core::error::Error";
pub(crate) const SYNC_TRAIT_NAME: &str = "::core::marker::Sync"; pub(crate) const SYNC_TRAIT_NAME: &str = "::core::marker::Sync";
pub(crate) const SEND_TRAIT_NAME: &str = "::core::marker::Send"; pub(crate) const SEND_TRAIT_NAME: &str = "::core::marker::Send";
pub(crate) const DEFAULT_TRAIT_NAME: &str = "::core::default::Default"; pub(crate) const DEFAULT_TRAIT_NAME: &str = "::core::default::Default";
pub(crate) const RESULT_TYPE_NAME: &str = "::core::result::Result";
pub(crate) const VEC_TYPE_NAME: &str = "::std::vec::Vec";
pub(crate) const STATIC_LIFETIME_NAME: &str = "'static"; pub(crate) const STATIC_LIFETIME_NAME: &str = "'static";
use associated::AssociatingTrait; use associated::AssociatingTrait;
@@ -240,6 +243,9 @@ pub fn derive_versionize(input: TokenStream) -> TokenStream {
let unversionize_body = implementor.unversionize_method_body(&unversionize_arg_name); let unversionize_body = implementor.unversionize_method_body(&unversionize_arg_name);
let unversionize_error: Path = parse_const_str(UNVERSIONIZE_ERROR_NAME); let unversionize_error: Path = parse_const_str(UNVERSIONIZE_ERROR_NAME);
let result_type: Path = parse_const_str(RESULT_TYPE_NAME);
let vec_type: Path = parse_const_str(VEC_TYPE_NAME);
quote! { quote! {
#version_trait_impl #version_trait_impl
@@ -269,7 +275,7 @@ pub fn derive_versionize(input: TokenStream) -> TokenStream {
impl #trait_impl_generics #unversionize_trait for #input_ident #ty_generics impl #trait_impl_generics #unversionize_trait for #input_ident #ty_generics
#unversionize_trait_where_clause #unversionize_trait_where_clause
{ {
fn unversionize(#unversionize_arg_name: Self::VersionedOwned) -> Result<Self, #unversionize_error> { fn unversionize(#unversionize_arg_name: Self::VersionedOwned) -> #result_type<Self, #unversionize_error> {
#unversionize_body #unversionize_body
} }
} }
@@ -278,7 +284,7 @@ pub fn derive_versionize(input: TokenStream) -> TokenStream {
impl #trait_impl_generics #versionize_slice_trait for #input_ident #ty_generics impl #trait_impl_generics #versionize_slice_trait for #input_ident #ty_generics
#versionize_trait_where_clause #versionize_trait_where_clause
{ {
type VersionedSlice<#lifetime> = Vec<<Self as #versionize_trait>::Versioned<#lifetime>> #versioned_type_where_clause; type VersionedSlice<#lifetime> = #vec_type<<Self as #versionize_trait>::Versioned<#lifetime>> #versioned_type_where_clause;
fn versionize_slice(slice: &[Self]) -> Self::VersionedSlice<'_> { fn versionize_slice(slice: &[Self]) -> Self::VersionedSlice<'_> {
slice.iter().map(|val| #versionize_trait::versionize(val)).collect() slice.iter().map(|val| #versionize_trait::versionize(val)).collect()
@@ -290,9 +296,9 @@ pub fn derive_versionize(input: TokenStream) -> TokenStream {
#versionize_owned_trait_where_clause #versionize_owned_trait_where_clause
{ {
type VersionedVec = Vec<<Self as #versionize_owned_trait>::VersionedOwned> #versioned_owned_type_where_clause; type VersionedVec = #vec_type<<Self as #versionize_owned_trait>::VersionedOwned> #versioned_owned_type_where_clause;
fn versionize_vec(vec: Vec<Self>) -> Self::VersionedVec { fn versionize_vec(vec: #vec_type<Self>) -> Self::VersionedVec {
vec.into_iter().map(|val| #versionize_owned_trait::versionize_owned(val)).collect() vec.into_iter().map(|val| #versionize_owned_trait::versionize_owned(val)).collect()
} }
} }
@@ -301,7 +307,7 @@ pub fn derive_versionize(input: TokenStream) -> TokenStream {
impl #trait_impl_generics #unversionize_vec_trait for #input_ident #ty_generics impl #trait_impl_generics #unversionize_vec_trait for #input_ident #ty_generics
#unversionize_trait_where_clause #unversionize_trait_where_clause
{ {
fn unversionize_vec(versioned: Self::VersionedVec) -> Result<Vec<Self>, #unversionize_error> { fn unversionize_vec(versioned: Self::VersionedVec) -> #result_type<#vec_type<Self>, #unversionize_error> {
versioned versioned
.into_iter() .into_iter()
.map(|versioned| <Self as #unversionize_trait>::unversionize(versioned)) .map(|versioned| <Self as #unversionize_trait>::unversionize(versioned))
@@ -346,6 +352,8 @@ pub fn derive_not_versioned(input: TokenStream) -> TokenStream {
let unversionize_error: Path = parse_const_str(UNVERSIONIZE_ERROR_NAME); let unversionize_error: Path = parse_const_str(UNVERSIONIZE_ERROR_NAME);
let lifetime = Lifetime::new(LIFETIME_NAME, Span::call_site()); let lifetime = Lifetime::new(LIFETIME_NAME, Span::call_site());
let result_type: Path = parse_const_str(RESULT_TYPE_NAME);
quote! { quote! {
#[automatically_derived] #[automatically_derived]
impl #impl_generics #versionize_trait for #input_ident #ty_generics #versionize_where_clause { impl #impl_generics #versionize_trait for #input_ident #ty_generics #versionize_where_clause {
@@ -367,7 +375,7 @@ pub fn derive_not_versioned(input: TokenStream) -> TokenStream {
#[automatically_derived] #[automatically_derived]
impl #impl_generics #unversionize_trait for #input_ident #ty_generics #versionize_owned_where_clause { impl #impl_generics #unversionize_trait for #input_ident #ty_generics #versionize_owned_where_clause {
fn unversionize(versioned: Self::VersionedOwned) -> Result<Self, #unversionize_error> { fn unversionize(versioned: Self::VersionedOwned) -> #result_type<Self, #unversionize_error> {
Ok(versioned) Ok(versioned)
} }
} }