Remove enum_from_u32.

It's a macro that just creates an enum with a `from_u32` method. It has
two arms. One is unused and the other has a single use.

This commit inlines that single use and removes the whole macro. This
increases readability because we don't have two different macros
interacting (`enum_from_u32` and `language_item_table`).
This commit is contained in:
Nicholas Nethercote 2024-05-06 13:51:15 +10:00
parent d3d01e1cd3
commit 58a06b6a99
3 changed files with 19 additions and 51 deletions

View File

@ -62,7 +62,6 @@ pub mod fx;
pub mod graph; pub mod graph;
pub mod intern; pub mod intern;
pub mod jobserver; pub mod jobserver;
pub mod macros;
pub mod marker; pub mod marker;
pub mod memmap; pub mod memmap;
pub mod obligation_forest; pub mod obligation_forest;

View File

@ -1,37 +0,0 @@
#[macro_export]
macro_rules! enum_from_u32 {
($(#[$attr:meta])* pub enum $name:ident {
$($(#[$var_attr:meta])* $variant:ident = $e:expr,)*
}) => {
$(#[$attr])*
pub enum $name {
$($(#[$var_attr])* $variant = $e),*
}
impl $name {
pub fn from_u32(u: u32) -> Option<$name> {
$(if u == $name::$variant as u32 {
return Some($name::$variant)
})*
None
}
}
};
($(#[$attr:meta])* pub enum $name:ident {
$($(#[$var_attr:meta])* $variant:ident,)*
}) => {
$(#[$attr])*
pub enum $name {
$($(#[$var_attr])* $variant,)*
}
impl $name {
pub fn from_u32(u: u32) -> Option<$name> {
$(if u == $name::$variant as u32 {
return Some($name::$variant)
})*
None
}
}
}
}

View File

@ -55,21 +55,27 @@ macro_rules! language_item_table {
( (
$( $(#[$attr:meta])* $variant:ident, $module:ident :: $name:ident, $method:ident, $target:expr, $generics:expr; )* $( $(#[$attr:meta])* $variant:ident, $module:ident :: $name:ident, $method:ident, $target:expr, $generics:expr; )*
) => { ) => {
/// A representation of all the valid lang items in Rust.
rustc_data_structures::enum_from_u32! { #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Encodable, Decodable)]
/// A representation of all the valid lang items in Rust. pub enum LangItem {
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Encodable, Decodable)] $(
pub enum LangItem { #[doc = concat!("The `", stringify!($name), "` lang item.")]
$( $(#[$attr])*
#[doc = concat!("The `", stringify!($name), "` lang item.")] $variant,
/// )*
$(#[$attr])*
$variant,
)*
}
} }
impl LangItem { impl LangItem {
fn from_u32(u: u32) -> Option<LangItem> {
// This implementation is clumsy, but makes no assumptions
// about how discriminant tags are allocated within the
// range `0 .. std::mem::variant_count::<LangItem>()`.
$(if u == LangItem::$variant as u32 {
return Some(LangItem::$variant)
})*
None
}
/// Returns the `name` symbol in `#[lang = "$name"]`. /// Returns the `name` symbol in `#[lang = "$name"]`.
/// For example, [`LangItem::PartialEq`]`.name()` /// For example, [`LangItem::PartialEq`]`.name()`
/// would result in [`sym::eq`] since it is `#[lang = "eq"]`. /// would result in [`sym::eq`] since it is `#[lang = "eq"]`.
@ -147,7 +153,7 @@ language_item_table! {
Clone, sym::clone, clone_trait, Target::Trait, GenericRequirement::None; Clone, sym::clone, clone_trait, Target::Trait, GenericRequirement::None;
Sync, sym::sync, sync_trait, Target::Trait, GenericRequirement::Exact(0); Sync, sym::sync, sync_trait, Target::Trait, GenericRequirement::Exact(0);
DiscriminantKind, sym::discriminant_kind, discriminant_kind_trait, Target::Trait, GenericRequirement::None; DiscriminantKind, sym::discriminant_kind, discriminant_kind_trait, Target::Trait, GenericRequirement::None;
/// The associated item of the [`DiscriminantKind`] trait. /// The associated item of the `DiscriminantKind` trait.
Discriminant, sym::discriminant_type, discriminant_type, Target::AssocTy, GenericRequirement::None; Discriminant, sym::discriminant_type, discriminant_type, Target::AssocTy, GenericRequirement::None;
PointeeTrait, sym::pointee_trait, pointee_trait, Target::Trait, GenericRequirement::None; PointeeTrait, sym::pointee_trait, pointee_trait, Target::Trait, GenericRequirement::None;