From 7b10f6f6be3d8ce1e9bd45761d3bcb5d4ad1ac1c Mon Sep 17 00:00:00 2001 From: Jelte Fennema Date: Sat, 15 Jul 2023 16:51:31 +0200 Subject: [PATCH] Re-export traits This is blocked until [trait aliases are allowed][1]. Because right new we'd also export any derives from std with the same name. This showed up with the Debug derive. But if rust starts implementing more derives for their built in types in std, then the same issue would occur for other traits. [1]: https://github.com/rust-lang/rust/issues/41517 --- impl/src/add_like.rs | 2 +- impl/src/as_mut.rs | 1 - impl/src/as_ref.rs | 1 - impl/src/deref.rs | 1 - impl/src/deref_mut.rs | 1 - impl/src/error.rs | 14 +++--- impl/src/from_str.rs | 1 - impl/src/index.rs | 1 - impl/src/index_mut.rs | 1 - impl/src/into_iterator.rs | 1 - impl/src/is_variant.rs | 1 - impl/src/mul_assign_like.rs | 1 - impl/src/mul_like.rs | 1 - impl/src/sum_like.rs | 1 - impl/src/try_into.rs | 1 - impl/src/try_unwrap.rs | 1 - impl/src/unwrap.rs | 1 - impl/src/utils.rs | 22 +-------- src/fmt.rs | 2 + src/lib.rs | 98 +++++++++++++++++++++++++++++++++++-- tests/display.rs | 1 - tests/error/mod.rs | 5 -- 22 files changed, 104 insertions(+), 55 deletions(-) diff --git a/impl/src/add_like.rs b/impl/src/add_like.rs index 58296217..58076461 100644 --- a/impl/src/add_like.rs +++ b/impl/src/add_like.rs @@ -42,7 +42,7 @@ pub fn expand(input: &DeriveInput, trait_name: &str) -> TokenStream { quote! { #[automatically_derived] - impl #impl_generics ::core::ops::#trait_ident for #input_type #ty_generics #where_clause { + impl #impl_generics ::derive_more::#trait_ident for #input_type #ty_generics #where_clause { type Output = #output_type; #[inline] diff --git a/impl/src/as_mut.rs b/impl/src/as_mut.rs index 2e6979a7..1d05adc5 100644 --- a/impl/src/as_mut.rs +++ b/impl/src/as_mut.rs @@ -10,7 +10,6 @@ pub fn expand(input: &DeriveInput, trait_name: &'static str) -> Result Result Result Result Option<&(dyn ::derive_more::__private::Error + 'static)> { + fn source(&self) -> Option<&(dyn ::derive_more::Error + 'static)> { use ::derive_more::__private::AsDynError; #source } @@ -73,7 +72,7 @@ pub fn expand( &generics, quote! { where - #(#bounds: ::core::fmt::Debug + ::core::fmt::Display + ::derive_more::__private::Error + 'static),* + #(#bounds: ::core::fmt::Debug + ::core::fmt::Display + ::derive_more::Error + 'static),* }, ); } @@ -82,7 +81,7 @@ pub fn expand( let render = quote! { #[automatically_derived] - impl #impl_generics ::derive_more::__private::Error for #ident #ty_generics #where_clause { + impl #impl_generics ::derive_more::Error for #ident #ty_generics #where_clause { #source #provide } @@ -120,7 +119,6 @@ fn render_enum( let state = State::from_variant( state.input, state.trait_name, - state.trait_module.clone(), state.trait_attr.clone(), allowed_attr_params(), variant, @@ -207,7 +205,7 @@ impl<'input, 'state> ParsedFields<'input, 'state> { let source_provider = self.source.map(|source| { let source_expr = &self.data.members[source]; quote! { - ::derive_more::__private::Error::provide(&#source_expr, demand); + ::derive_more::Error::provide(&#source_expr, demand); } }); let backtrace_provider = self @@ -237,7 +235,7 @@ impl<'input, 'state> ParsedFields<'input, 'state> { let pattern = self.data.matcher(&[source], &[quote! { source }]); Some(quote! { #pattern => { - ::derive_more::__private::Error::provide(source, demand); + ::derive_more::Error::provide(source, demand); } }) } @@ -249,7 +247,7 @@ impl<'input, 'state> ParsedFields<'input, 'state> { Some(quote! { #pattern => { demand.provide_ref::<::std::backtrace::Backtrace>(backtrace); - ::derive_more::__private::Error::provide(source, demand); + ::derive_more::Error::provide(source, demand); } }) } diff --git a/impl/src/from_str.rs b/impl/src/from_str.rs index 0d3773dd..aefd670c 100644 --- a/impl/src/from_str.rs +++ b/impl/src/from_str.rs @@ -9,7 +9,6 @@ pub fn expand(input: &DeriveInput, trait_name: &'static str) -> Result Result Result Result Result Result Result Result Result Result Result { pub trait_name: &'static str, pub trait_ident: Ident, pub method_ident: Ident, - pub trait_module: TokenStream, pub trait_path: TokenStream, pub trait_path_params: Vec, pub trait_attr: String, @@ -314,13 +313,11 @@ impl<'input> State<'input> { pub fn new<'arg_input>( input: &'arg_input DeriveInput, trait_name: &'static str, - trait_module: TokenStream, trait_attr: String, ) -> Result> { State::new_impl( input, trait_name, - trait_module, trait_attr, AttrParams::default(), true, @@ -330,13 +327,11 @@ impl<'input> State<'input> { pub fn with_field_ignore<'arg_input>( input: &'arg_input DeriveInput, trait_name: &'static str, - trait_module: TokenStream, trait_attr: String, ) -> Result> { State::new_impl( input, trait_name, - trait_module, trait_attr, AttrParams::new(vec!["ignore"]), true, @@ -346,13 +341,11 @@ impl<'input> State<'input> { pub fn with_field_ignore_and_forward<'arg_input>( input: &'arg_input DeriveInput, trait_name: &'static str, - trait_module: TokenStream, trait_attr: String, ) -> Result> { State::new_impl( input, trait_name, - trait_module, trait_attr, AttrParams::new(vec!["ignore", "forward"]), true, @@ -362,13 +355,11 @@ impl<'input> State<'input> { pub fn with_field_ignore_and_refs<'arg_input>( input: &'arg_input DeriveInput, trait_name: &'static str, - trait_module: TokenStream, trait_attr: String, ) -> Result> { State::new_impl( input, trait_name, - trait_module, trait_attr, AttrParams::new(vec!["ignore", "owned", "ref", "ref_mut"]), true, @@ -378,14 +369,12 @@ impl<'input> State<'input> { pub fn with_attr_params<'arg_input>( input: &'arg_input DeriveInput, trait_name: &'static str, - trait_module: TokenStream, trait_attr: String, allowed_attr_params: AttrParams, ) -> Result> { State::new_impl( input, trait_name, - trait_module, trait_attr, allowed_attr_params, true, @@ -395,7 +384,6 @@ impl<'input> State<'input> { pub fn with_type_bound<'arg_input>( input: &'arg_input DeriveInput, trait_name: &'static str, - trait_module: TokenStream, trait_attr: String, allowed_attr_params: AttrParams, add_type_bound: bool, @@ -403,7 +391,6 @@ impl<'input> State<'input> { Self::new_impl( input, trait_name, - trait_module, trait_attr, allowed_attr_params, add_type_bound, @@ -413,7 +400,6 @@ impl<'input> State<'input> { fn new_impl<'arg_input>( input: &'arg_input DeriveInput, trait_name: &'static str, - trait_module: TokenStream, trait_attr: String, allowed_attr_params: AttrParams, add_type_bound: bool, @@ -421,7 +407,7 @@ impl<'input> State<'input> { let trait_name = trait_name.trim_end_matches("ToInner"); let trait_ident = format_ident!("{trait_name}"); let method_ident = format_ident!("{trait_attr}"); - let trait_path = quote! { #trait_module::#trait_ident }; + let trait_path = quote! { ::derive_more::#trait_ident }; let (derive_type, fields, variants): (_, Vec<_>, Vec<_>) = match input.data { Data::Struct(ref data_struct) => match data_struct.fields { Fields::Unnamed(ref fields) => { @@ -516,7 +502,6 @@ impl<'input> State<'input> { State::from_variant( input, trait_name, - trait_module.clone(), trait_attr.clone(), allowed_attr_params.clone(), variant, @@ -539,7 +524,6 @@ impl<'input> State<'input> { trait_name, trait_ident, method_ident, - trait_module, trait_path, trait_path_params: vec![], trait_attr, @@ -558,7 +542,6 @@ impl<'input> State<'input> { pub fn from_variant<'arg_input>( input: &'arg_input DeriveInput, trait_name: &'static str, - trait_module: TokenStream, trait_attr: String, allowed_attr_params: AttrParams, variant: &'arg_input Variant, @@ -567,7 +550,7 @@ impl<'input> State<'input> { let trait_name = trait_name.trim_end_matches("ToInner"); let trait_ident = format_ident!("{trait_name}"); let method_ident = format_ident!("{trait_attr}"); - let trait_path = quote! { #trait_module::#trait_ident }; + let trait_path = quote! { ::derive_more::#trait_ident }; let (derive_type, fields): (_, Vec<_>) = match variant.fields { Fields::Unnamed(ref fields) => { (DeriveType::Unnamed, unnamed_to_vec(fields)) @@ -593,7 +576,6 @@ impl<'input> State<'input> { Ok(State { input, trait_name, - trait_module, trait_path, trait_path_params: vec![], trait_attr, diff --git a/src/fmt.rs b/src/fmt.rs index 311bfb77..80d7a774 100644 --- a/src/fmt.rs +++ b/src/fmt.rs @@ -1,6 +1,8 @@ //! [`core::fmt::DebugTuple`] reimplementation with //! [`DebugTuple::finish_non_exhaustive()`] method. +use ::core; +use core::prelude::v1::*; use core::fmt::{Debug, Formatter, Result, Write}; /// Same as [`core::fmt::DebugTuple`], but with diff --git a/src/lib.rs b/src/lib.rs index 19b642a8..0ccdf88a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -77,11 +77,6 @@ mod vendor; // Not public API. #[doc(hidden)] pub mod __private { - #[cfg(all(feature = "error", not(feature = "std")))] - pub use ::core::error::Error; - #[cfg(all(feature = "error", feature = "std"))] - pub use ::std::error::Error; - #[cfg(feature = "error")] pub use crate::vendor::thiserror::aserror::AsDynError; @@ -89,6 +84,99 @@ pub mod __private { pub use crate::fmt::{debug_tuple, DebugTuple}; } +// re-export all the traits for easy usage. But hide their docs because otherwise they clutter +// the actual docs +#[cfg(feature = "add")] +#[doc(hidden)] +pub use core::ops::{Add, BitAnd, BitOr, BitXor, Sub}; + +#[cfg(feature = "add_assign")] +#[doc(hidden)] +pub use core::ops::{AddAssign, BitAndAssign, BitOrAssign, BitXorAssign, SubAssign}; + +#[cfg(feature = "as_ref")] +#[doc(hidden)] +pub use core::convert::AsRef; + +#[cfg(feature = "as_mut")] +#[doc(hidden)] +pub use core::convert::AsMut; + +// XXX: Uncommenting this causes our own derive to not be visible anymore, because the derive +// from std takes precedence somehow. +// #[cfg(feature = "debug")] +// #[doc(hidden)] +// pub use core::fmt::Debug; + +#[cfg(feature = "deref")] +#[doc(hidden)] +pub use core::ops::Deref; + +#[cfg(feature = "deref_mut")] +#[doc(hidden)] +pub use core::ops::DerefMut; + +#[cfg(feature = "display")] +#[doc(hidden)] +pub use core::fmt::{ + Binary, Display, LowerExp, LowerHex, Octal, Pointer, UpperExp, UpperHex, +}; + +#[cfg(all(feature = "error", not(feature = "std")))] +#[doc(hidden)] +pub use core::error::Error; +#[cfg(all(feature = "error", feature = "std"))] +#[doc(hidden)] +pub use std::error::Error; + +#[cfg(feature = "from")] +#[doc(hidden)] +pub use core::convert::From; + +#[cfg(feature = "from_str")] +#[doc(hidden)] +pub use core::str::FromStr; + +#[cfg(feature = "index")] +#[doc(hidden)] +pub use core::ops::Index; + +#[cfg(feature = "index_mut")] +#[doc(hidden)] +pub use core::ops::IndexMut; + +#[cfg(feature = "into")] +#[doc(hidden)] +pub use core::convert::Into; + +#[cfg(feature = "into_iterator")] +#[doc(hidden)] +pub use core::iter::IntoIterator; + +#[cfg(feature = "iterator")] +#[doc(hidden)] +pub use core::iter::Iterator; + +#[cfg(feature = "mul")] +#[doc(hidden)] +pub use core::ops::{Div, Mul, Rem, Shl, Shr}; + +#[cfg(feature = "mul_assign")] +#[doc(hidden)] +pub use core::ops::{DivAssign, MulAssign, RemAssign, ShlAssign, ShrAssign}; + +#[cfg(feature = "not")] +#[doc(hidden)] +pub use core::ops::{Neg, Not}; + +#[cfg(feature = "sum")] +#[doc(hidden)] +pub use core::iter::{Product, Sum}; + +#[cfg(feature = "try_into")] +#[doc(hidden)] +pub use core::convert::TryInto; + #[cfg(not(any( feature = "full", feature = "add_assign", diff --git a/tests/display.rs b/tests/display.rs index 8683c8c3..cab2c047 100644 --- a/tests/display.rs +++ b/tests/display.rs @@ -11,7 +11,6 @@ use alloc::{ string::{String, ToString}, vec::Vec, }; -use core::fmt::{Binary, Display}; use derive_more::{Binary, Display, Octal, UpperHex}; diff --git a/tests/error/mod.rs b/tests/error/mod.rs index a041ec17..352d40aa 100644 --- a/tests/error/mod.rs +++ b/tests/error/mod.rs @@ -1,8 +1,3 @@ -#[cfg(not(feature = "std"))] -use core::error::Error; -#[cfg(feature = "std")] -use std::error::Error; - use derive_more::Error; /// Derives `std::fmt::Display` for structs/enums.