From f808430497525663dd3f62c294a3ae1762abdc22 Mon Sep 17 00:00:00 2001 From: Cameron Steffen Date: Wed, 26 Oct 2022 16:18:39 -0500 Subject: [PATCH] Factor out ITEM_REFS --- compiler/rustc_hir/src/lang_items.rs | 26 +++++++++++++------------ compiler/rustc_passes/src/lang_items.rs | 15 +++++++------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/compiler/rustc_hir/src/lang_items.rs b/compiler/rustc_hir/src/lang_items.rs index 0735f58a922..9d1d84e32bb 100644 --- a/compiler/rustc_hir/src/lang_items.rs +++ b/compiler/rustc_hir/src/lang_items.rs @@ -12,14 +12,11 @@ use crate::{MethodKind, Target}; use rustc_ast as ast; -use rustc_data_structures::fx::FxIndexMap; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_macros::HashStable_Generic; use rustc_span::symbol::{kw, sym, Symbol}; use rustc_span::Span; -use std::sync::LazyLock; - pub enum LangItemGroup { Op, Fn, @@ -104,6 +101,14 @@ pub fn name(self) -> Symbol { } } + /// Opposite of [`LangItem::name`] + pub fn from_name(name: Symbol) -> Option { + match name { + $( $module::$name => Some(LangItem::$variant), )* + _ => None, + } + } + /// The [group](LangItemGroup) that this lang item belongs to, /// or `None` if it doesn't belong to a group. pub fn group(self) -> Option { @@ -113,6 +118,12 @@ pub fn group(self) -> Option { } } + pub fn target(self) -> Target { + match self { + $( LangItem::$variant => $target, )* + } + } + pub fn required_generics(&self) -> GenericRequirement { match self { $( LangItem::$variant => $generics, )* @@ -145,15 +156,6 @@ pub fn $method(&self) -> Option { } )* } - - /// A mapping from the name of the lang item to its order and the form it must be of. - pub static ITEM_REFS: LazyLock> = LazyLock::new(|| { - let mut item_refs = FxIndexMap::default(); - $( item_refs.insert($module::$name, (LangItem::$variant as usize, $target)); )* - item_refs - }); - -// End of the macro } } diff --git a/compiler/rustc_passes/src/lang_items.rs b/compiler/rustc_passes/src/lang_items.rs index cbd62ef4325..54be30d9fe5 100644 --- a/compiler/rustc_passes/src/lang_items.rs +++ b/compiler/rustc_passes/src/lang_items.rs @@ -16,7 +16,7 @@ use rustc_hir as hir; use rustc_hir::def::DefKind; use rustc_hir::def_id::DefId; -use rustc_hir::lang_items::{extract, GenericRequirement, ITEM_REFS}; +use rustc_hir::lang_items::{extract, GenericRequirement}; use rustc_hir::{HirId, LangItem, LanguageItems, Target}; use rustc_middle::ty::TyCtxt; use rustc_session::cstore::ExternCrate; @@ -43,17 +43,17 @@ fn new(tcx: TyCtxt<'tcx>) -> LanguageItemCollector<'tcx> { fn check_for_lang(&mut self, actual_target: Target, hir_id: HirId) { let attrs = self.tcx.hir().attrs(hir_id); if let Some((name, span)) = extract(&attrs) { - match ITEM_REFS.get(&name).cloned() { + match LangItem::from_name(name) { // Known lang item with attribute on correct target. - Some((item_index, expected_target)) if actual_target == expected_target => { - self.collect_item_extended(item_index, hir_id, span); + Some(lang_item) if actual_target == lang_item.target() => { + self.collect_item_extended(lang_item, hir_id, span); } // Known lang item with attribute on incorrect target. - Some((_, expected_target)) => { + Some(lang_item) => { self.tcx.sess.emit_err(LangItemOnIncorrectTarget { span, name, - expected_target, + expected_target: lang_item.target(), actual_target, }); } @@ -147,9 +147,8 @@ fn collect_item(&mut self, lang_item: LangItem, item_def_id: DefId) { // Like collect_item() above, but also checks whether the lang item is declared // with the right number of generic arguments. - fn collect_item_extended(&mut self, item_index: usize, hir_id: HirId, span: Span) { + fn collect_item_extended(&mut self, lang_item: LangItem, hir_id: HirId, span: Span) { let item_def_id = self.tcx.hir().local_def_id(hir_id).to_def_id(); - let lang_item = LangItem::from_u32(item_index as u32).unwrap(); let name = lang_item.name(); // Now check whether the lang_item has the expected number of generic