From 44d4a34d9c77824d01e878a97eb27c90bc4060cb Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Fri, 13 Jan 2023 13:11:04 +0100 Subject: [PATCH] macros: Add automatically_derived attribute to generated impl blocks --- crates/ruma-macros/src/identifiers.rs | 63 +++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/crates/ruma-macros/src/identifiers.rs b/crates/ruma-macros/src/identifiers.rs index 12e10875..b0c500d0 100644 --- a/crates/ruma-macros/src/identifiers.rs +++ b/crates/ruma-macros/src/identifiers.rs @@ -77,6 +77,7 @@ pub fn expand_id_zst(input: ItemStruct) -> syn::Result { Ok(quote! { #owned_decl + #[automatically_derived] impl #impl_generics #id_ty { pub(super) const fn from_borrowed(s: &str) -> &Self { unsafe { std::mem::transmute(s) } @@ -111,12 +112,14 @@ pub fn expand_id_zst(input: ItemStruct) -> syn::Result { } } + #[automatically_derived] impl #impl_generics Clone for Box<#id_ty> { fn clone(&self) -> Self { (**self).into() } } + #[automatically_derived] impl #impl_generics ToOwned for #id_ty { type Owned = #owned_ty; @@ -125,36 +128,42 @@ pub fn expand_id_zst(input: ItemStruct) -> syn::Result { } } + #[automatically_derived] impl #impl_generics AsRef for #id_ty { fn as_ref(&self) -> &str { self.as_str() } } + #[automatically_derived] impl #impl_generics AsRef for Box<#id_ty> { fn as_ref(&self) -> &str { self.as_str() } } + #[automatically_derived] impl #impl_generics From<&#id_ty> for String { fn from(id: &#id_ty) -> Self { id.as_str().to_owned() } } + #[automatically_derived] impl #impl_generics From> for String { fn from(id: Box<#id_ty>) -> Self { id.into_owned().into() } } + #[automatically_derived] impl #impl_generics From<&#id_ty> for Box<#id_ty> { fn from(id: &#id_ty) -> Self { <#id_ty>::from_box(id.as_str().into()) } } + #[automatically_derived] impl #impl_generics From<&#id_ty> for std::rc::Rc<#id_ty> { fn from(s: &#id_ty) -> std::rc::Rc<#id_ty> { let rc = std::rc::Rc::::from(s.as_str()); @@ -162,6 +171,7 @@ pub fn expand_id_zst(input: ItemStruct) -> syn::Result { } } + #[automatically_derived] impl #impl_generics From<&#id_ty> for std::sync::Arc<#id_ty> { fn from(s: &#id_ty) -> std::sync::Arc<#id_ty> { let arc = std::sync::Arc::::from(s.as_str()); @@ -169,24 +179,28 @@ pub fn expand_id_zst(input: ItemStruct) -> syn::Result { } } + #[automatically_derived] impl #impl_generics PartialEq<#id_ty> for Box<#id_ty> { fn eq(&self, other: &#id_ty) -> bool { self.as_str() == other.as_str() } } + #[automatically_derived] impl #impl_generics PartialEq<&'_ #id_ty> for Box<#id_ty> { fn eq(&self, other: &&#id_ty) -> bool { self.as_str() == other.as_str() } } + #[automatically_derived] impl #impl_generics PartialEq> for #id_ty { fn eq(&self, other: &Box<#id_ty>) -> bool { self.as_str() == other.as_str() } } + #[automatically_derived] impl #impl_generics PartialEq> for &'_ #id_ty { fn eq(&self, other: &Box<#id_ty>) -> bool { self.as_str() == other.as_str() @@ -226,6 +240,7 @@ fn expand_owned_id(input: &ItemStruct) -> TokenStream { inner: std::sync::Arc<#id_ty>, } + #[automatically_derived] impl #impl_generics #owned_ty { fn from_ref(v: &#id_ty) -> Self { Self { @@ -237,18 +252,21 @@ fn expand_owned_id(input: &ItemStruct) -> TokenStream { } } + #[automatically_derived] impl #impl_generics AsRef<#id_ty> for #owned_ty { fn as_ref(&self) -> &#id_ty { &*self.inner } } + #[automatically_derived] impl #impl_generics AsRef for #owned_ty { fn as_ref(&self) -> &str { (*self.inner).as_ref() } } + #[automatically_derived] impl #impl_generics From<#owned_ty> for String { fn from(id: #owned_ty) -> String { #[cfg(not(any(ruma_identifiers_storage = "Arc")))] @@ -258,12 +276,14 @@ fn expand_owned_id(input: &ItemStruct) -> TokenStream { } } + #[automatically_derived] impl #impl_generics std::clone::Clone for #owned_ty { fn clone(&self) -> Self { (&*self.inner).into() } } + #[automatically_derived] impl #impl_generics std::ops::Deref for #owned_ty { type Target = #id_ty; @@ -272,24 +292,28 @@ fn expand_owned_id(input: &ItemStruct) -> TokenStream { } } + #[automatically_derived] impl #impl_generics std::borrow::Borrow<#id_ty> for #owned_ty { fn borrow(&self) -> &#id_ty { self.as_ref() } } + #[automatically_derived] impl #impl_generics From<&'_ #id_ty> for #owned_ty { fn from(id: &#id_ty) -> #owned_ty { #owned { inner: id.into() } } } + #[automatically_derived] impl #impl_generics From> for #owned_ty { fn from(b: Box<#id_ty>) -> #owned_ty { Self { inner: b.into() } } } + #[automatically_derived] impl #impl_generics From> for #owned_ty { fn from(a: std::sync::Arc<#id_ty>) -> #owned_ty { Self { @@ -301,6 +325,7 @@ fn expand_owned_id(input: &ItemStruct) -> TokenStream { } } + #[automatically_derived] impl #impl_generics From<#owned_ty> for Box<#id_ty> { fn from(a: #owned_ty) -> Box<#id_ty> { #[cfg(not(any(ruma_identifiers_storage = "Arc")))] @@ -310,6 +335,7 @@ fn expand_owned_id(input: &ItemStruct) -> TokenStream { } } + #[automatically_derived] impl #impl_generics From<#owned_ty> for std::sync::Arc<#id_ty> { fn from(a: #owned_ty) -> std::sync::Arc<#id_ty> { #[cfg(not(any(ruma_identifiers_storage = "Arc")))] @@ -319,26 +345,31 @@ fn expand_owned_id(input: &ItemStruct) -> TokenStream { } } + #[automatically_derived] impl #impl_generics std::cmp::PartialEq for #owned_ty { fn eq(&self, other: &Self) -> bool { self.as_str() == other.as_str() } } + #[automatically_derived] impl #impl_generics std::cmp::Eq for #owned_ty {} + #[automatically_derived] impl #impl_generics std::cmp::PartialOrd for #owned_ty { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } + #[automatically_derived] impl #impl_generics std::cmp::Ord for #owned_ty { fn cmp(&self, other: &Self) -> std::cmp::Ordering { self.as_str().cmp(other.as_str()) } } + #[automatically_derived] impl #impl_generics std::hash::Hash for #owned_ty { fn hash(&self, state: &mut H) where @@ -350,48 +381,56 @@ fn expand_owned_id(input: &ItemStruct) -> TokenStream { #as_str_impls + #[automatically_derived] impl #impl_generics PartialEq<#id_ty> for #owned_ty { fn eq(&self, other: &#id_ty) -> bool { AsRef::<#id_ty>::as_ref(self) == other } } + #[automatically_derived] impl #impl_generics PartialEq<#owned_ty> for #id_ty { fn eq(&self, other: &#owned_ty) -> bool { self == AsRef::<#id_ty>::as_ref(other) } } + #[automatically_derived] impl #impl_generics PartialEq<&#id_ty> for #owned_ty { fn eq(&self, other: &&#id_ty) -> bool { AsRef::<#id_ty>::as_ref(self) == *other } } + #[automatically_derived] impl #impl_generics PartialEq<#owned_ty> for &#id_ty { fn eq(&self, other: &#owned_ty) -> bool { *self == AsRef::<#id_ty>::as_ref(other) } } + #[automatically_derived] impl #impl_generics PartialEq> for #owned_ty { fn eq(&self, other: &Box<#id_ty>) -> bool { AsRef::<#id_ty>::as_ref(self) == AsRef::<#id_ty>::as_ref(other) } } + #[automatically_derived] impl #impl_generics PartialEq<#owned_ty> for Box<#id_ty> { fn eq(&self, other: &#owned_ty) -> bool { AsRef::<#id_ty>::as_ref(self) == AsRef::<#id_ty>::as_ref(other) } } + #[automatically_derived] impl #impl_generics PartialEq> for #owned_ty { fn eq(&self, other: &std::sync::Arc<#id_ty>) -> bool { AsRef::<#id_ty>::as_ref(self) == AsRef::<#id_ty>::as_ref(other) } } + #[automatically_derived] impl #impl_generics PartialEq<#owned_ty> for std::sync::Arc<#id_ty> { fn eq(&self, other: &#owned_ty) -> bool { AsRef::<#id_ty>::as_ref(self) == AsRef::<#id_ty>::as_ref(other) @@ -416,6 +455,7 @@ fn expand_checked_impls(input: &ItemStruct, validate: Path) -> TokenStream { let owned_ty = quote! { #owned #ty_generics }; quote! { + #[automatically_derived] impl #impl_generics #id_ty { #[doc = #parse_doc_header] /// @@ -457,6 +497,7 @@ fn expand_checked_impls(input: &ItemStruct, validate: Path) -> TokenStream { } } + #[automatically_derived] impl<'de, #generic_params> serde::Deserialize<'de> for Box<#id_ty> { fn deserialize(deserializer: D) -> Result where @@ -473,6 +514,7 @@ fn expand_checked_impls(input: &ItemStruct, validate: Path) -> TokenStream { } } + #[automatically_derived] impl<'de, #generic_params> serde::Deserialize<'de> for #owned_ty { fn deserialize(deserializer: D) -> Result where @@ -489,6 +531,7 @@ fn expand_checked_impls(input: &ItemStruct, validate: Path) -> TokenStream { } } + #[automatically_derived] impl<'a, #generic_params> std::convert::TryFrom<&'a str> for &'a #id_ty { type Error = crate::IdParseError; @@ -498,6 +541,7 @@ fn expand_checked_impls(input: &ItemStruct, validate: Path) -> TokenStream { } } + #[automatically_derived] impl #impl_generics std::str::FromStr for Box<#id_ty> { type Err = crate::IdParseError; @@ -506,6 +550,7 @@ fn expand_checked_impls(input: &ItemStruct, validate: Path) -> TokenStream { } } + #[automatically_derived] impl #impl_generics std::convert::TryFrom<&str> for Box<#id_ty> { type Error = crate::IdParseError; @@ -514,6 +559,7 @@ fn expand_checked_impls(input: &ItemStruct, validate: Path) -> TokenStream { } } + #[automatically_derived] impl #impl_generics std::convert::TryFrom for Box<#id_ty> { type Error = crate::IdParseError; @@ -522,6 +568,7 @@ fn expand_checked_impls(input: &ItemStruct, validate: Path) -> TokenStream { } } + #[automatically_derived] impl #impl_generics std::str::FromStr for #owned_ty { type Err = crate::IdParseError; @@ -530,6 +577,7 @@ fn expand_checked_impls(input: &ItemStruct, validate: Path) -> TokenStream { } } + #[automatically_derived] impl #impl_generics std::convert::TryFrom<&str> for #owned_ty { type Error = crate::IdParseError; @@ -538,6 +586,7 @@ fn expand_checked_impls(input: &ItemStruct, validate: Path) -> TokenStream { } } + #[automatically_derived] impl #impl_generics std::convert::TryFrom for #owned_ty { type Error = crate::IdParseError; @@ -553,54 +602,63 @@ fn expand_unchecked_impls(input: &ItemStruct) -> TokenStream { let owned = format_ident!("Owned{id}"); quote! { + #[automatically_derived] impl<'a> From<&'a str> for &'a #id { fn from(s: &'a str) -> Self { #id::from_borrowed(s) } } + #[automatically_derived] impl From<&str> for #owned { fn from(s: &str) -> Self { <&#id>::from(s).into() } } + #[automatically_derived] impl From> for #owned { fn from(s: Box) -> Self { <&#id>::from(&*s).into() } } + #[automatically_derived] impl From for #owned { fn from(s: String) -> Self { <&#id>::from(s.as_str()).into() } } + #[automatically_derived] impl From<&str> for Box<#id> { fn from(s: &str) -> Self { #id::from_box(s.into()) } } + #[automatically_derived] impl From> for Box<#id> { fn from(s: Box) -> Self { #id::from_box(s) } } + #[automatically_derived] impl From for Box<#id> { fn from(s: String) -> Self { #id::from_box(s.into()) } } + #[automatically_derived] impl From> for Box { fn from(id: Box<#id>) -> Self { id.into_owned() } } + #[automatically_derived] impl<'de> serde::Deserialize<'de> for Box<#id> { fn deserialize(deserializer: D) -> Result where @@ -610,6 +668,7 @@ fn expand_unchecked_impls(input: &ItemStruct) -> TokenStream { } } + #[automatically_derived] impl<'de> serde::Deserialize<'de> for #owned { fn deserialize(deserializer: D) -> Result where @@ -626,18 +685,21 @@ fn expand_as_str_impls(ty: TokenStream, impl_generics: &ImplGenerics<'_>) -> Tok let partial_eq_string = expand_partial_eq_string(ty.clone(), impl_generics); quote! { + #[automatically_derived] impl #impl_generics std::fmt::Display for #ty { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.as_str()) } } + #[automatically_derived] impl #impl_generics std::fmt::Debug for #ty { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { ::fmt(self.as_str(), f) } } + #[automatically_derived] impl #impl_generics serde::Serialize for #ty { fn serialize(&self, serializer: S) -> Result where @@ -662,6 +724,7 @@ fn expand_partial_eq_string(ty: TokenStream, impl_generics: &ImplGenerics<'_>) - ]) .map(|(lhs, rhs)| { quote! { + #[automatically_derived] impl #impl_generics PartialEq<#rhs> for #lhs { fn eq(&self, other: &#rhs) -> bool { AsRef::::as_ref(self)