Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Work around bug in rust-analyzer to make auto-imports work nicely #376

Merged
merged 2 commits into from
Jul 4, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
304 changes: 209 additions & 95 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,169 +137,283 @@ macro_rules! re_export_traits((

#[cfg(all(feature = $feature, any(not(docsrs), ci)))]
#[doc(hidden)]
pub use crate::$new_module_name::*;
pub use crate::all_traits_and_derives::$new_module_name::*;
}
);

re_export_traits!(
"add",
add_traits,
core::ops,
Add,
BitAnd,
BitOr,
BitXor,
Sub,
);
re_export_traits!(
"add_assign",
add_assign_traits,
core::ops,
AddAssign,
BitAndAssign,
BitOrAssign,
BitXorAssign,
SubAssign,
);
re_export_traits!("as_ref", as_ref_traits, core::convert, AsMut, AsRef);
re_export_traits!("debug", debug_traits, core::fmt, Debug);
re_export_traits!("deref", deref_traits, core::ops, Deref);
re_export_traits!("deref_mut", deref_mut_traits, core::ops, DerefMut);
re_export_traits!(
"display",
display_traits,
core::fmt,
Binary,
Display,
LowerExp,
LowerHex,
Octal,
Pointer,
UpperExp,
UpperHex,
);
mod all_traits_and_derives {
re_export_traits!(
"add",
add_traits,
core::ops,
Add,
BitAnd,
BitOr,
BitXor,
Sub,
);
re_export_traits!(
"add_assign",
add_assign_traits,
core::ops,
AddAssign,
BitAndAssign,
BitOrAssign,
BitXorAssign,
SubAssign,
);
re_export_traits!("as_ref", as_ref_traits, core::convert, AsMut, AsRef);
re_export_traits!("debug", debug_traits, core::fmt, Debug);
re_export_traits!("deref", deref_traits, core::ops, Deref);
re_export_traits!("deref_mut", deref_mut_traits, core::ops, DerefMut);
re_export_traits!(
"display",
display_traits,
core::fmt,
Binary,
Display,
LowerExp,
LowerHex,
Octal,
Pointer,
UpperExp,
UpperHex,
);

#[cfg(not(feature = "std"))]
re_export_traits!("error", error_traits, core::error, Error);
#[cfg(feature = "std")]
re_export_traits!("error", error_traits, std::error, Error);

re_export_traits!("from", from_traits, core::convert, From);

re_export_traits!("from_str", from_str_traits, core::str, FromStr);

re_export_traits!("index", index_traits, core::ops, Index);

re_export_traits!("index_mut", index_mut_traits, core::ops, IndexMut);

re_export_traits!("into", into_traits, core::convert, Into);

re_export_traits!(
"into_iterator",
into_iterator_traits,
core::iter,
IntoIterator,
);

re_export_traits!("mul", mul_traits, core::ops, Div, Mul, Rem, Shl, Shr);

#[cfg(feature = "mul_assign")]
re_export_traits!(
"mul_assign",
mul_assign_traits,
core::ops,
DivAssign,
MulAssign,
RemAssign,
ShlAssign,
ShrAssign,
);

re_export_traits!("not", not_traits, core::ops, Neg, Not);

re_export_traits!("sum", sum_traits, core::iter, Product, Sum);

re_export_traits!("try_from", try_from_traits, core::convert, TryFrom);

re_export_traits!("try_into", try_into_traits, core::convert, TryInto);

// Now re-export our own derives by their exact name to overwrite any derives that the trait
// re-exporting might inadvertently pull into scope.
#[cfg(feature = "add")]
pub use derive_more_impl::{Add, BitAnd, BitOr, BitXor, Sub};

#[cfg(feature = "add_assign")]
pub use derive_more_impl::{
AddAssign, BitAndAssign, BitOrAssign, BitXorAssign, SubAssign,
};

#[cfg(not(feature = "std"))]
re_export_traits!("error", error_traits, core::error, Error);
#[cfg(feature = "std")]
re_export_traits!("error", error_traits, std::error, Error);
#[cfg(feature = "as_ref")]
pub use derive_more_impl::{AsMut, AsRef};

re_export_traits!("from", from_traits, core::convert, From);
#[cfg(feature = "constructor")]
pub use derive_more_impl::Constructor;

re_export_traits!("from_str", from_str_traits, core::str, FromStr);
#[cfg(feature = "debug")]
pub use derive_more_impl::Debug;

re_export_traits!("index", index_traits, core::ops, Index);
#[cfg(feature = "deref")]
pub use derive_more_impl::Deref;

re_export_traits!("index_mut", index_mut_traits, core::ops, IndexMut);
#[cfg(feature = "deref_mut")]
pub use derive_more_impl::DerefMut;

re_export_traits!("into", into_traits, core::convert, Into);
#[cfg(feature = "display")]
pub use derive_more_impl::{
Binary, Display, LowerExp, LowerHex, Octal, Pointer, UpperExp, UpperHex,
};

re_export_traits!(
"into_iterator",
into_iterator_traits,
core::iter,
IntoIterator,
);
#[cfg(feature = "error")]
pub use derive_more_impl::Error;

re_export_traits!("mul", mul_traits, core::ops, Div, Mul, Rem, Shl, Shr);
#[cfg(feature = "from")]
pub use derive_more_impl::From;

#[cfg(feature = "mul_assign")]
re_export_traits!(
"mul_assign",
mul_assign_traits,
core::ops,
DivAssign,
MulAssign,
RemAssign,
ShlAssign,
ShrAssign,
);
#[cfg(feature = "from_str")]
pub use derive_more_impl::FromStr;

#[cfg(feature = "index")]
pub use derive_more_impl::Index;

#[cfg(feature = "index_mut")]
pub use derive_more_impl::IndexMut;

#[cfg(feature = "into")]
pub use derive_more_impl::Into;

re_export_traits!("not", not_traits, core::ops, Neg, Not);
#[cfg(feature = "into_iterator")]
pub use derive_more_impl::IntoIterator;

re_export_traits!("sum", sum_traits, core::iter, Product, Sum);
#[cfg(feature = "is_variant")]
pub use derive_more_impl::IsVariant;

re_export_traits!("try_from", try_from_traits, core::convert, TryFrom);
#[cfg(feature = "mul")]
pub use derive_more_impl::{Div, Mul, Rem, Shl, Shr};

re_export_traits!("try_into", try_into_traits, core::convert, TryInto);
#[cfg(feature = "mul_assign")]
pub use derive_more_impl::{DivAssign, MulAssign, RemAssign, ShlAssign, ShrAssign};

// Now re-export our own derives by their exact name to overwrite any derives that the trait
// re-exporting might inadvertently pull into scope.
#[cfg(feature = "not")]
pub use derive_more_impl::{Neg, Not};

#[cfg(feature = "sum")]
pub use derive_more_impl::{Product, Sum};

#[cfg(feature = "try_from")]
pub use derive_more_impl::TryFrom;

#[cfg(feature = "try_into")]
pub use derive_more_impl::TryInto;

#[cfg(feature = "try_unwrap")]
pub use derive_more_impl::TryUnwrap;

#[cfg(feature = "unwrap")]
pub use derive_more_impl::Unwrap;
}

// Now re-export our own derives and the std traits by their exact name to make rust-analyzer
// recognize the #[doc(hidden)] flag.
// See issues:
// 1. https://github.com/rust-lang/rust-analyzer/issues/11698
// 2. https://github.com/rust-lang/rust-analyzer/issues/14079
#[cfg(feature = "add")]
pub use derive_more_impl::{Add, BitAnd, BitOr, BitXor, Sub};
#[doc(hidden)]
pub use all_traits_and_derives::{Add, BitAnd, BitOr, BitXor, Sub};

#[cfg(feature = "add_assign")]
pub use derive_more_impl::{
#[doc(hidden)]
pub use all_traits_and_derives::{
AddAssign, BitAndAssign, BitOrAssign, BitXorAssign, SubAssign,
};

#[cfg(feature = "as_ref")]
pub use derive_more_impl::{AsMut, AsRef};
#[doc(hidden)]
pub use all_traits_and_derives::{AsMut, AsRef};

#[cfg(feature = "constructor")]
pub use derive_more_impl::Constructor;
#[doc(hidden)]
pub use all_traits_and_derives::Constructor;

#[cfg(feature = "debug")]
pub use derive_more_impl::Debug;
#[doc(hidden)]
pub use all_traits_and_derives::Debug;

#[cfg(feature = "deref")]
pub use derive_more_impl::Deref;
#[doc(hidden)]
pub use all_traits_and_derives::Deref;

#[cfg(feature = "deref_mut")]
pub use derive_more_impl::DerefMut;
#[doc(hidden)]
pub use all_traits_and_derives::DerefMut;

#[cfg(feature = "display")]
pub use derive_more_impl::{
#[doc(hidden)]
pub use all_traits_and_derives::{
Binary, Display, LowerExp, LowerHex, Octal, Pointer, UpperExp, UpperHex,
};

#[cfg(feature = "error")]
pub use derive_more_impl::Error;
#[doc(hidden)]
pub use all_traits_and_derives::Error;

#[cfg(feature = "from")]
pub use derive_more_impl::From;
#[doc(hidden)]
pub use all_traits_and_derives::From;

#[cfg(feature = "from_str")]
pub use derive_more_impl::FromStr;
#[doc(hidden)]
pub use all_traits_and_derives::FromStr;

#[cfg(feature = "index")]
pub use derive_more_impl::Index;
#[doc(hidden)]
pub use all_traits_and_derives::Index;

#[cfg(feature = "index_mut")]
pub use derive_more_impl::IndexMut;
#[doc(hidden)]
pub use all_traits_and_derives::IndexMut;

#[cfg(feature = "into")]
pub use derive_more_impl::Into;
#[doc(hidden)]
pub use all_traits_and_derives::Into;

#[cfg(feature = "into_iterator")]
pub use derive_more_impl::IntoIterator;
#[doc(hidden)]
pub use all_traits_and_derives::IntoIterator;

#[cfg(feature = "is_variant")]
pub use derive_more_impl::IsVariant;
#[doc(hidden)]
pub use all_traits_and_derives::IsVariant;

#[cfg(feature = "mul")]
pub use derive_more_impl::{Div, Mul, Rem, Shl, Shr};
#[doc(hidden)]
pub use all_traits_and_derives::{Div, Mul, Rem, Shl, Shr};

#[cfg(feature = "mul_assign")]
pub use derive_more_impl::{DivAssign, MulAssign, RemAssign, ShlAssign, ShrAssign};
#[doc(hidden)]
pub use all_traits_and_derives::{
DivAssign, MulAssign, RemAssign, ShlAssign, ShrAssign,
};

#[cfg(feature = "not")]
pub use derive_more_impl::{Neg, Not};
#[doc(hidden)]
pub use all_traits_and_derives::{Neg, Not};

#[cfg(feature = "sum")]
pub use derive_more_impl::{Product, Sum};
#[doc(hidden)]
pub use all_traits_and_derives::{Product, Sum};

#[cfg(feature = "try_from")]
pub use derive_more_impl::TryFrom;
#[doc(hidden)]
pub use all_traits_and_derives::TryFrom;

#[cfg(feature = "try_into")]
pub use derive_more_impl::TryInto;
#[doc(hidden)]
pub use all_traits_and_derives::TryInto;

#[cfg(feature = "try_unwrap")]
pub use derive_more_impl::TryUnwrap;
#[doc(hidden)]
pub use all_traits_and_derives::TryUnwrap;

#[cfg(feature = "unwrap")]
pub use derive_more_impl::Unwrap;
#[doc(hidden)]
pub use all_traits_and_derives::Unwrap;

// Re-export the derive macros again to show docs for our derives (but not for traits). This is
// done using a glob import to not hit E0252.
#[allow(unused_imports)]
pub use derive_more_impl::*;

// Check if any feature is enabled
#[cfg(not(any(
Expand Down