Skip to content

Commit 9ce3519

Browse files
committed
resolve: Pre-intern builtin name bindings
1 parent 0b31792 commit 9ce3519

File tree

2 files changed

+31
-25
lines changed

2 files changed

+31
-25
lines changed

compiler/rustc_resolve/src/ident.rs

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
use rustc_ast::{self as ast, NodeId};
2-
use rustc_feature::is_builtin_attr_name;
32
use rustc_hir::def::{DefKind, Namespace, NonMacroAttrKind, PartialRes, PerNS};
4-
use rustc_hir::PrimTy;
53
use rustc_middle::bug;
64
use rustc_middle::ty;
75
use rustc_session::lint::builtin::PROC_MACRO_DERIVE_RESOLUTION_FALLBACK;
86
use rustc_session::lint::BuiltinLintDiagnostics;
97
use rustc_span::def_id::LocalDefId;
108
use rustc_span::hygiene::{ExpnId, ExpnKind, LocalExpnId, MacroKind, SyntaxContext};
119
use rustc_span::symbol::{kw, Ident};
12-
use rustc_span::{Span, DUMMY_SP};
10+
use rustc_span::Span;
1311

1412
use crate::errors::{ParamKindInEnumDiscriminant, ParamKindInNonTrivialAnonConst};
1513
use crate::late::{
@@ -562,17 +560,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
562560
)),
563561
}
564562
}
565-
Scope::BuiltinAttrs => {
566-
if is_builtin_attr_name(ident.name) {
567-
ok(
568-
Res::NonMacroAttr(NonMacroAttrKind::Builtin(ident.name)),
569-
DUMMY_SP,
570-
this.arenas,
571-
)
572-
} else {
573-
Err(Determinacy::Determined)
574-
}
575-
}
563+
Scope::BuiltinAttrs => match this.builtin_attrs_bindings.get(&ident.name) {
564+
Some(binding) => Ok((*binding, Flags::empty())),
565+
None => Err(Determinacy::Determined),
566+
},
576567
Scope::ExternPrelude => {
577568
match this.extern_prelude_get(ident, finalize.is_some()) {
578569
Some(binding) => Ok((binding, Flags::empty())),
@@ -603,8 +594,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
603594
}
604595
result
605596
}
606-
Scope::BuiltinTypes => match PrimTy::from_name(ident.name) {
607-
Some(prim_ty) => ok(Res::PrimTy(prim_ty), DUMMY_SP, this.arenas),
597+
Scope::BuiltinTypes => match this.builtin_types_bindings.get(&ident.name) {
598+
Some(binding) => Ok((*binding, Flags::empty())),
608599
None => Err(Determinacy::Determined),
609600
},
610601
};

compiler/rustc_resolve/src/lib.rs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,15 @@ use rustc_errors::{
3939
Applicability, DiagnosticBuilder, DiagnosticMessage, ErrorGuaranteed, SubdiagnosticMessage,
4040
};
4141
use rustc_expand::base::{DeriveResolutions, SyntaxExtension, SyntaxExtensionKind};
42+
use rustc_feature::BUILTIN_ATTRIBUTES;
4243
use rustc_fluent_macro::fluent_messages;
4344
use rustc_hir::def::Namespace::{self, *};
45+
use rustc_hir::def::NonMacroAttrKind;
4446
use rustc_hir::def::{self, CtorOf, DefKind, DocLinkResMap, LifetimeRes, PartialRes, PerNS};
4547
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LocalDefIdMap, LocalDefIdSet};
4648
use rustc_hir::def_id::{CRATE_DEF_ID, LOCAL_CRATE};
4749
use rustc_hir::definitions::DefPathData;
48-
use rustc_hir::TraitCandidate;
50+
use rustc_hir::{PrimTy, TraitCandidate};
4951
use rustc_index::IndexVec;
5052
use rustc_metadata::creader::{CStore, CrateLoader};
5153
use rustc_middle::metadata::ModChild;
@@ -996,6 +998,8 @@ pub struct Resolver<'a, 'tcx> {
996998

997999
arenas: &'a ResolverArenas<'a>,
9981000
dummy_binding: NameBinding<'a>,
1001+
builtin_types_bindings: FxHashMap<Symbol, NameBinding<'a>>,
1002+
builtin_attrs_bindings: FxHashMap<Symbol, NameBinding<'a>>,
9991003

10001004
used_extern_options: FxHashSet<Symbol>,
10011005
macro_names: FxHashSet<Ident>,
@@ -1283,6 +1287,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
12831287
let registered_tools = tcx.registered_tools(());
12841288

12851289
let features = tcx.features();
1290+
let pub_vis = ty::Visibility::<DefId>::Public;
12861291

12871292
let mut resolver = Resolver {
12881293
tcx,
@@ -1330,14 +1335,24 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
13301335
macro_expanded_macro_export_errors: BTreeSet::new(),
13311336

13321337
arenas,
1333-
dummy_binding: arenas.alloc_name_binding(NameBindingData {
1334-
kind: NameBindingKind::Res(Res::Err),
1335-
ambiguity: None,
1336-
warn_ambiguity: false,
1337-
expansion: LocalExpnId::ROOT,
1338-
span: DUMMY_SP,
1339-
vis: ty::Visibility::Public,
1340-
}),
1338+
dummy_binding: (Res::Err, pub_vis, DUMMY_SP, LocalExpnId::ROOT).to_name_binding(arenas),
1339+
builtin_types_bindings: PrimTy::ALL
1340+
.iter()
1341+
.map(|prim_ty| {
1342+
let binding = (Res::PrimTy(*prim_ty), pub_vis, DUMMY_SP, LocalExpnId::ROOT)
1343+
.to_name_binding(arenas);
1344+
(prim_ty.name(), binding)
1345+
})
1346+
.collect(),
1347+
builtin_attrs_bindings: BUILTIN_ATTRIBUTES
1348+
.iter()
1349+
.map(|builtin_attr| {
1350+
let res = Res::NonMacroAttr(NonMacroAttrKind::Builtin(builtin_attr.name));
1351+
let binding =
1352+
(res, pub_vis, DUMMY_SP, LocalExpnId::ROOT).to_name_binding(arenas);
1353+
(builtin_attr.name, binding)
1354+
})
1355+
.collect(),
13411356

13421357
used_extern_options: Default::default(),
13431358
macro_names: FxHashSet::default(),

0 commit comments

Comments
 (0)