Skip to content

Commit 7345a6c

Browse files
authored
Rollup merge of rust-lang#73587 - marmeladema:hir-id-ification-final, r=petrochenkov
Move remaining `NodeId` APIs from `Definitions` to `Resolver` Implements rust-lang#73291 (comment) TL;DR: it moves all fields that are only needed during name resolution passes into the `Resolver` and keep the rest in `Definitions`. This effectively enforces that all references to `NodeId`s are gone once HIR lowering is completed. After this, the only remaining work for rust-lang#50928 should be to adjust the dev guide. r? @petrochenkov
2 parents 92879b0 + bd4f6f0 commit 7345a6c

File tree

16 files changed

+258
-242
lines changed

16 files changed

+258
-242
lines changed

Cargo.lock

+1
Original file line numberDiff line numberDiff line change
@@ -4200,6 +4200,7 @@ dependencies = [
42004200
"rustc_expand",
42014201
"rustc_feature",
42024202
"rustc_hir",
4203+
"rustc_index",
42034204
"rustc_metadata",
42044205
"rustc_middle",
42054206
"rustc_session",

src/librustc_ast_lowering/item.rs

+6-11
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
253253
hir::ItemKind::Const(ty, body_id)
254254
}
255255
ItemKind::Fn(_, FnSig { ref decl, header }, ref generics, ref body) => {
256-
let fn_def_id = self.resolver.definitions().local_def_id(id);
256+
let fn_def_id = self.resolver.local_def_id(id);
257257
self.with_new_scopes(|this| {
258258
this.current_item = Some(ident.span);
259259

@@ -342,7 +342,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
342342
self_ty: ref ty,
343343
items: ref impl_items,
344344
} => {
345-
let def_id = self.resolver.definitions().local_def_id(id);
345+
let def_id = self.resolver.local_def_id(id);
346346

347347
// Lower the "impl header" first. This ordering is important
348348
// for in-band lifetimes! Consider `'a` here:
@@ -646,7 +646,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
646646
}
647647

648648
fn lower_foreign_item(&mut self, i: &ForeignItem) -> hir::ForeignItem<'hir> {
649-
let def_id = self.resolver.definitions().local_def_id(i.id);
649+
let def_id = self.resolver.local_def_id(i.id);
650650
hir::ForeignItem {
651651
hir_id: self.lower_node_id(i.id),
652652
ident: i.ident,
@@ -747,7 +747,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
747747
}
748748

749749
fn lower_trait_item(&mut self, i: &AssocItem) -> hir::TraitItem<'hir> {
750-
let trait_item_def_id = self.resolver.definitions().local_def_id(i.id);
750+
let trait_item_def_id = self.resolver.local_def_id(i.id);
751751

752752
let (generics, kind) = match i.kind {
753753
AssocItemKind::Const(_, ref ty, ref default) => {
@@ -812,7 +812,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
812812
}
813813

814814
fn lower_impl_item(&mut self, i: &AssocItem) -> hir::ImplItem<'hir> {
815-
let impl_item_def_id = self.resolver.definitions().local_def_id(i.id);
815+
let impl_item_def_id = self.resolver.local_def_id(i.id);
816816

817817
let (generics, kind) = match &i.kind {
818818
AssocItemKind::Const(_, ty, expr) => {
@@ -1320,12 +1320,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
13201320
if let Some(def_id) = def_id.as_local() {
13211321
for param in &generics.params {
13221322
if let GenericParamKind::Type { .. } = param.kind {
1323-
if def_id
1324-
== self
1325-
.resolver
1326-
.definitions()
1327-
.local_def_id(param.id)
1328-
{
1323+
if def_id == self.resolver.local_def_id(param.id) {
13291324
add_bounds
13301325
.entry(param.id)
13311326
.or_default()

src/librustc_ast_lowering/lib.rs

+38-14
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ use rustc_hir::def_id::{DefId, DefIdMap, LocalDefId, CRATE_DEF_INDEX};
5454
use rustc_hir::definitions::{DefKey, DefPathData, Definitions};
5555
use rustc_hir::intravisit;
5656
use rustc_hir::{ConstArg, GenericArg, ParamName};
57-
use rustc_index::vec::IndexVec;
57+
use rustc_index::vec::{Idx, IndexVec};
5858
use rustc_session::config::nightly_options;
5959
use rustc_session::lint::{builtin::BARE_TRAIT_OBJECTS, BuiltinLintDiagnostics, LintBuffer};
6060
use rustc_session::parse::ParseSess;
@@ -205,6 +205,19 @@ pub trait Resolver {
205205
fn next_node_id(&mut self) -> NodeId;
206206

207207
fn trait_map(&self) -> &NodeMap<Vec<hir::TraitCandidate>>;
208+
209+
fn opt_local_def_id(&self, node: NodeId) -> Option<LocalDefId>;
210+
211+
fn local_def_id(&self, node: NodeId) -> LocalDefId;
212+
213+
fn create_def(
214+
&mut self,
215+
parent: LocalDefId,
216+
node_id: ast::NodeId,
217+
data: DefPathData,
218+
expn_id: ExpnId,
219+
span: Span,
220+
) -> LocalDefId;
208221
}
209222

210223
type NtToTokenstream = fn(&Nonterminal, &ParseSess, Span) -> TokenStream;
@@ -436,7 +449,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
436449
match tree.kind {
437450
UseTreeKind::Simple(_, id1, id2) => {
438451
for &id in &[id1, id2] {
439-
self.lctx.resolver.definitions().create_def_with_parent(
452+
self.lctx.resolver.create_def(
440453
owner,
441454
id,
442455
DefPathData::Misc,
@@ -488,7 +501,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
488501
| ItemKind::Enum(_, ref generics)
489502
| ItemKind::TyAlias(_, ref generics, ..)
490503
| ItemKind::Trait(_, _, ref generics, ..) => {
491-
let def_id = self.lctx.resolver.definitions().local_def_id(item.id);
504+
let def_id = self.lctx.resolver.local_def_id(item.id);
492505
let count = generics
493506
.params
494507
.iter()
@@ -564,7 +577,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
564577
.map(|(&k, v)| (self.node_id_to_hir_id[k].unwrap(), v.clone()))
565578
.collect();
566579

567-
self.resolver.definitions().init_node_id_to_hir_id_mapping(self.node_id_to_hir_id);
580+
let mut def_id_to_hir_id = IndexVec::default();
581+
582+
for (node_id, hir_id) in self.node_id_to_hir_id.into_iter_enumerated() {
583+
if let Some(def_id) = self.resolver.opt_local_def_id(node_id) {
584+
if def_id_to_hir_id.len() <= def_id.index() {
585+
def_id_to_hir_id.resize(def_id.index() + 1, None);
586+
}
587+
def_id_to_hir_id[def_id] = hir_id;
588+
}
589+
}
590+
591+
self.resolver.definitions().init_def_id_to_hir_id_mapping(def_id_to_hir_id);
568592

569593
hir::Crate {
570594
item: hir::CrateItem { module, attrs, span: c.span },
@@ -628,7 +652,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
628652
.item_local_id_counters
629653
.insert(owner, HIR_ID_COUNTER_LOCKED)
630654
.unwrap_or_else(|| panic!("no `item_local_id_counters` entry for {:?}", owner));
631-
let def_id = self.resolver.definitions().local_def_id(owner);
655+
let def_id = self.resolver.local_def_id(owner);
632656
self.current_hir_id_owner.push((def_id, counter));
633657
let ret = f(self);
634658
let (new_def_id, new_counter) = self.current_hir_id_owner.pop().unwrap();
@@ -671,8 +695,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
671695
debug_assert!(local_id != HIR_ID_COUNTER_LOCKED);
672696

673697
*local_id_counter += 1;
674-
let owner = this.resolver.definitions().opt_local_def_id(owner).expect(
675-
"you forgot to call `create_def_with_parent` or are lowering node-IDs \
698+
let owner = this.resolver.opt_local_def_id(owner).expect(
699+
"you forgot to call `create_def` or are lowering node-IDs \
676700
that do not belong to the current owner",
677701
);
678702

@@ -800,7 +824,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
800824
};
801825

802826
// Add a definition for the in-band lifetime def.
803-
self.resolver.definitions().create_def_with_parent(
827+
self.resolver.create_def(
804828
parent_def_id,
805829
node_id,
806830
DefPathData::LifetimeNs(str_name),
@@ -1088,7 +1112,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
10881112

10891113
let impl_trait_node_id = self.resolver.next_node_id();
10901114
let parent_def_id = self.current_hir_id_owner.last().unwrap().0;
1091-
self.resolver.definitions().create_def_with_parent(
1115+
self.resolver.create_def(
10921116
parent_def_id,
10931117
impl_trait_node_id,
10941118
DefPathData::ImplTrait,
@@ -1154,7 +1178,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
11541178
let node_id = self.resolver.next_node_id();
11551179

11561180
// Add a definition for the in-band const def.
1157-
self.resolver.definitions().create_def_with_parent(
1181+
self.resolver.create_def(
11581182
parent_def_id,
11591183
node_id,
11601184
DefPathData::AnonConst,
@@ -1339,7 +1363,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
13391363
}
13401364
ImplTraitContext::Universal(in_band_ty_params) => {
13411365
// Add a definition for the in-band `Param`.
1342-
let def_id = self.resolver.definitions().local_def_id(def_node_id);
1366+
let def_id = self.resolver.local_def_id(def_node_id);
13431367

13441368
let hir_bounds = self.lower_param_bounds(
13451369
bounds,
@@ -1428,7 +1452,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
14281452
// frequently opened issues show.
14291453
let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::OpaqueTy, span, None);
14301454

1431-
let opaque_ty_def_id = self.resolver.definitions().local_def_id(opaque_ty_node_id);
1455+
let opaque_ty_def_id = self.resolver.local_def_id(opaque_ty_node_id);
14321456

14331457
self.allocate_hir_id_counter(opaque_ty_node_id);
14341458

@@ -1620,7 +1644,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
16201644
let def_node_id = self.context.resolver.next_node_id();
16211645
let hir_id =
16221646
self.context.lower_node_id_with_owner(def_node_id, self.opaque_ty_id);
1623-
self.context.resolver.definitions().create_def_with_parent(
1647+
self.context.resolver.create_def(
16241648
self.parent,
16251649
def_node_id,
16261650
DefPathData::LifetimeNs(name.ident().name),
@@ -1870,7 +1894,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
18701894

18711895
let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::Async, span, None);
18721896

1873-
let opaque_ty_def_id = self.resolver.definitions().local_def_id(opaque_ty_node_id);
1897+
let opaque_ty_def_id = self.resolver.local_def_id(opaque_ty_node_id);
18741898

18751899
self.allocate_hir_id_counter(opaque_ty_node_id);
18761900

0 commit comments

Comments
 (0)