Use an array in LanguageItems

This commit is contained in:
Cameron Steffen 2022-10-26 16:18:46 -05:00
parent f808430497
commit 1e349fb0dd
2 changed files with 13 additions and 13 deletions

View file

@ -39,7 +39,7 @@ macro_rules! expand_group {
pub struct LanguageItems { pub struct LanguageItems {
/// Mappings from lang items to their possibly found [`DefId`]s. /// Mappings from lang items to their possibly found [`DefId`]s.
/// The index corresponds to the order in [`LangItem`]. /// The index corresponds to the order in [`LangItem`].
items: Vec<Option<DefId>>, items: [Option<DefId>; std::mem::variant_count::<LangItem>()],
/// Lang items that were not found during collection. /// Lang items that were not found during collection.
pub missing: Vec<LangItem>, pub missing: Vec<LangItem>,
/// Mapping from [`LangItemGroup`] discriminants to all /// Mapping from [`LangItemGroup`] discriminants to all
@ -48,6 +48,17 @@ pub struct LanguageItems {
} }
impl LanguageItems { impl LanguageItems {
/// Construct an empty collection of lang items and no missing ones.
pub fn new() -> Self {
const EMPTY: Vec<DefId> = Vec::new();
Self {
items: [None; std::mem::variant_count::<LangItem>()],
missing: Vec::new(),
groups: [EMPTY; NUM_GROUPS],
}
}
pub fn get(&self, item: LangItem) -> Option<DefId> { pub fn get(&self, item: LangItem) -> Option<DefId> {
self.items[item as usize] self.items[item as usize]
} }
@ -132,18 +143,6 @@ macro_rules! language_item_table {
} }
impl LanguageItems { impl LanguageItems {
/// Construct an empty collection of lang items and no missing ones.
pub fn new() -> Self {
fn init_none(_: LangItem) -> Option<DefId> { None }
const EMPTY: Vec<DefId> = Vec::new();
Self {
items: vec![$(init_none(LangItem::$variant)),*],
missing: Vec::new(),
groups: [EMPTY; NUM_GROUPS],
}
}
/// Returns the [`DefId`]s of all lang items in a group. /// Returns the [`DefId`]s of all lang items in a group.
pub fn group(&self, group: LangItemGroup) -> &[DefId] { pub fn group(&self, group: LangItemGroup) -> &[DefId] {
self.groups[group as usize].as_ref() self.groups[group as usize].as_ref()

View file

@ -9,6 +9,7 @@
#![feature(min_specialization)] #![feature(min_specialization)]
#![feature(never_type)] #![feature(never_type)]
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
#![feature(variant_count)]
#![recursion_limit = "256"] #![recursion_limit = "256"]
#![deny(rustc::untranslatable_diagnostic)] #![deny(rustc::untranslatable_diagnostic)]
#![deny(rustc::diagnostic_outside_of_impl)] #![deny(rustc::diagnostic_outside_of_impl)]