Skip to content

Commit 1d3f49f

Browse files
committed
Always create a root definition when creating a new Definitions object.
1 parent f60513e commit 1d3f49f

File tree

5 files changed

+40
-31
lines changed

5 files changed

+40
-31
lines changed

src/librustc_ast_lowering/lib.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ pub trait Resolver {
210210

211211
fn local_def_id(&self, node: NodeId) -> LocalDefId;
212212

213-
fn create_def_with_parent(
213+
fn create_def(
214214
&mut self,
215215
parent: LocalDefId,
216216
node_id: ast::NodeId,
@@ -449,7 +449,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
449449
match tree.kind {
450450
UseTreeKind::Simple(_, id1, id2) => {
451451
for &id in &[id1, id2] {
452-
self.lctx.resolver.create_def_with_parent(
452+
self.lctx.resolver.create_def(
453453
owner,
454454
id,
455455
DefPathData::Misc,
@@ -696,7 +696,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
696696

697697
*local_id_counter += 1;
698698
let owner = this.resolver.opt_local_def_id(owner).expect(
699-
"you forgot to call `create_def_with_parent` or are lowering node-IDs \
699+
"you forgot to call `create_def` or are lowering node-IDs \
700700
that do not belong to the current owner",
701701
);
702702

@@ -824,7 +824,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
824824
};
825825

826826
// Add a definition for the in-band lifetime def.
827-
self.resolver.create_def_with_parent(
827+
self.resolver.create_def(
828828
parent_def_id,
829829
node_id,
830830
DefPathData::LifetimeNs(str_name),
@@ -1112,7 +1112,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
11121112

11131113
let impl_trait_node_id = self.resolver.next_node_id();
11141114
let parent_def_id = self.current_hir_id_owner.last().unwrap().0;
1115-
self.resolver.create_def_with_parent(
1115+
self.resolver.create_def(
11161116
parent_def_id,
11171117
impl_trait_node_id,
11181118
DefPathData::ImplTrait,
@@ -1178,7 +1178,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
11781178
let node_id = self.resolver.next_node_id();
11791179

11801180
// Add a definition for the in-band const def.
1181-
self.resolver.create_def_with_parent(
1181+
self.resolver.create_def(
11821182
parent_def_id,
11831183
node_id,
11841184
DefPathData::AnonConst,
@@ -1644,7 +1644,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
16441644
let def_node_id = self.context.resolver.next_node_id();
16451645
let hir_id =
16461646
self.context.lower_node_id_with_owner(def_node_id, self.opaque_ty_id);
1647-
self.context.resolver.create_def_with_parent(
1647+
self.context.resolver.create_def(
16481648
self.parent,
16491649
def_node_id,
16501650
DefPathData::LifetimeNs(name.ident().name),

src/librustc_hir/definitions.rs

+23-17
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ impl DefPathTable {
7171
}
7272

7373
/// The definition table containing node definitions.
74-
/// It holds the `DefPathTable` for local `DefId`s/`DefPath`s and it also stores a
75-
/// mapping from `NodeId`s to local `DefId`s.
76-
#[derive(Clone, Default)]
74+
/// It holds the `DefPathTable` for `LocalDefId`s/`DefPath`s.
75+
/// It also stores mappings to convert `LocalDefId`s to/from `HirId`s.
76+
#[derive(Clone)]
7777
pub struct Definitions {
7878
table: DefPathTable,
7979

@@ -328,11 +328,7 @@ impl Definitions {
328328
}
329329

330330
/// Adds a root definition (no parent) and a few other reserved definitions.
331-
pub fn create_root_def(
332-
&mut self,
333-
crate_name: &str,
334-
crate_disambiguator: CrateDisambiguator,
335-
) -> LocalDefId {
331+
pub fn new(crate_name: &str, crate_disambiguator: CrateDisambiguator) -> Definitions {
336332
let key = DefKey {
337333
parent: None,
338334
disambiguated_data: DisambiguatedDefPathData {
@@ -344,24 +340,34 @@ impl Definitions {
344340
let parent_hash = DefKey::root_parent_stable_hash(crate_name, crate_disambiguator);
345341
let def_path_hash = key.compute_stable_hash(parent_hash);
346342

347-
// Create the definition.
348-
let root = LocalDefId { local_def_index: self.table.allocate(key, def_path_hash) };
343+
// Create the root definition.
344+
let mut table = DefPathTable::default();
345+
let root = LocalDefId { local_def_index: table.allocate(key, def_path_hash) };
349346
assert_eq!(root.local_def_index, CRATE_DEF_INDEX);
350347

351-
root
348+
Definitions {
349+
table,
350+
def_id_to_hir_id: Default::default(),
351+
hir_id_to_def_id: Default::default(),
352+
expansions_that_defined: Default::default(),
353+
next_disambiguator: Default::default(),
354+
parent_modules_of_macro_defs: Default::default(),
355+
}
356+
}
357+
358+
/// Retrieves the root definition.
359+
pub fn get_root_def(&self) -> LocalDefId {
360+
LocalDefId { local_def_index: CRATE_DEF_INDEX }
352361
}
353362

354363
/// Adds a definition with a parent definition.
355-
pub fn create_def_with_parent(
364+
pub fn create_def(
356365
&mut self,
357366
parent: LocalDefId,
358367
data: DefPathData,
359368
expn_id: ExpnId,
360369
) -> LocalDefId {
361-
debug!(
362-
"create_def_with_parent(parent={:?}, data={:?}, expn_id={:?})",
363-
parent, data, expn_id
364-
);
370+
debug!("create_def(parent={:?}, data={:?}, expn_id={:?})", parent, data, expn_id);
365371

366372
// The root node must be created with `create_root_def()`.
367373
assert!(data != DefPathData::CrateRoot);
@@ -382,7 +388,7 @@ impl Definitions {
382388
let parent_hash = self.table.def_path_hash(parent.local_def_index);
383389
let def_path_hash = key.compute_stable_hash(parent_hash);
384390

385-
debug!("create_def_with_parent: after disambiguation, key = {:?}", key);
391+
debug!("create_def: after disambiguation, key = {:?}", key);
386392

387393
// Create the definition.
388394
let def_id = LocalDefId { local_def_index: self.table.allocate(key, def_path_hash) };

src/librustc_interface/passes.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,10 @@ pub fn create_global_ctxt<'tcx>(
734734
arena: &'tcx WorkerLocal<Arena<'tcx>>,
735735
) -> QueryContext<'tcx> {
736736
let sess = &compiler.session();
737-
let defs: &'tcx Definitions = arena.alloc(mem::take(&mut resolver_outputs.definitions));
737+
let defs: &'tcx Definitions = arena.alloc(mem::replace(
738+
&mut resolver_outputs.definitions,
739+
Definitions::new(crate_name, sess.local_crate_disambiguator()),
740+
));
738741

739742
let query_result_on_disk_cache = rustc_incremental::load_query_result_cache(sess);
740743

src/librustc_resolve/def_collector.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ impl<'a, 'b> DefCollector<'a, 'b> {
3232
fn create_def(&mut self, node_id: NodeId, data: DefPathData, span: Span) -> LocalDefId {
3333
let parent_def = self.parent_def;
3434
debug!("create_def(node_id={:?}, data={:?}, parent_def={:?})", node_id, data, parent_def);
35-
self.resolver.create_def_with_parent(parent_def, node_id, data, self.expansion, span)
35+
self.resolver.create_def(parent_def, node_id, data, self.expansion, span)
3636
}
3737

3838
fn with_parent<F: FnOnce(&mut Self)>(&mut self, parent_def: LocalDefId, f: F) {

src/librustc_resolve/lib.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -1126,7 +1126,7 @@ impl ResolverAstLowering for Resolver<'_> {
11261126
}
11271127

11281128
/// Adds a definition with a parent definition.
1129-
fn create_def_with_parent(
1129+
fn create_def(
11301130
&mut self,
11311131
parent: LocalDefId,
11321132
node_id: ast::NodeId,
@@ -1142,15 +1142,15 @@ impl ResolverAstLowering for Resolver<'_> {
11421142
self.definitions.def_key(self.node_id_to_def_id[&node_id]),
11431143
);
11441144

1145-
let def_id = self.definitions.create_def_with_parent(parent, data, expn_id);
1145+
let def_id = self.definitions.create_def(parent, data, expn_id);
11461146

11471147
assert_eq!(self.def_id_to_span.push(span), def_id);
11481148

11491149
// Some things for which we allocate `LocalDefId`s don't correspond to
11501150
// anything in the AST, so they don't have a `NodeId`. For these cases
11511151
// we don't need a mapping from `NodeId` to `LocalDefId`.
11521152
if node_id != ast::DUMMY_NODE_ID {
1153-
debug!("create_def_with_parent: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id);
1153+
debug!("create_def: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id);
11541154
self.node_id_to_def_id.insert(node_id, def_id);
11551155
}
11561156
assert_eq!(self.def_id_to_node_id.push(node_id), def_id);
@@ -1187,8 +1187,8 @@ impl<'a> Resolver<'a> {
11871187
let mut module_map = FxHashMap::default();
11881188
module_map.insert(LocalDefId { local_def_index: CRATE_DEF_INDEX }, graph_root);
11891189

1190-
let mut definitions = Definitions::default();
1191-
let root = definitions.create_root_def(crate_name, session.local_crate_disambiguator());
1190+
let definitions = Definitions::new(crate_name, session.local_crate_disambiguator());
1191+
let root = definitions.get_root_def();
11921192

11931193
let mut def_id_to_span = IndexVec::default();
11941194
assert_eq!(def_id_to_span.push(rustc_span::DUMMY_SP), root);

0 commit comments

Comments
 (0)