Always create a root definition when creating a new Definitions object.

This commit is contained in:
marmeladema 2020-06-21 15:49:38 +01:00
parent f60513ec8d
commit 1d3f49f536
5 changed files with 40 additions and 31 deletions

View file

@ -210,7 +210,7 @@ pub trait Resolver {
fn local_def_id(&self, node: NodeId) -> LocalDefId; fn local_def_id(&self, node: NodeId) -> LocalDefId;
fn create_def_with_parent( fn create_def(
&mut self, &mut self,
parent: LocalDefId, parent: LocalDefId,
node_id: ast::NodeId, node_id: ast::NodeId,
@ -449,7 +449,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
match tree.kind { match tree.kind {
UseTreeKind::Simple(_, id1, id2) => { UseTreeKind::Simple(_, id1, id2) => {
for &id in &[id1, id2] { for &id in &[id1, id2] {
self.lctx.resolver.create_def_with_parent( self.lctx.resolver.create_def(
owner, owner,
id, id,
DefPathData::Misc, DefPathData::Misc,
@ -696,7 +696,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
*local_id_counter += 1; *local_id_counter += 1;
let owner = this.resolver.opt_local_def_id(owner).expect( let owner = this.resolver.opt_local_def_id(owner).expect(
"you forgot to call `create_def_with_parent` or are lowering node-IDs \ "you forgot to call `create_def` or are lowering node-IDs \
that do not belong to the current owner", that do not belong to the current owner",
); );
@ -824,7 +824,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
}; };
// Add a definition for the in-band lifetime def. // Add a definition for the in-band lifetime def.
self.resolver.create_def_with_parent( self.resolver.create_def(
parent_def_id, parent_def_id,
node_id, node_id,
DefPathData::LifetimeNs(str_name), DefPathData::LifetimeNs(str_name),
@ -1112,7 +1112,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
let impl_trait_node_id = self.resolver.next_node_id(); let impl_trait_node_id = self.resolver.next_node_id();
let parent_def_id = self.current_hir_id_owner.last().unwrap().0; let parent_def_id = self.current_hir_id_owner.last().unwrap().0;
self.resolver.create_def_with_parent( self.resolver.create_def(
parent_def_id, parent_def_id,
impl_trait_node_id, impl_trait_node_id,
DefPathData::ImplTrait, DefPathData::ImplTrait,
@ -1178,7 +1178,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
let node_id = self.resolver.next_node_id(); let node_id = self.resolver.next_node_id();
// Add a definition for the in-band const def. // Add a definition for the in-band const def.
self.resolver.create_def_with_parent( self.resolver.create_def(
parent_def_id, parent_def_id,
node_id, node_id,
DefPathData::AnonConst, DefPathData::AnonConst,
@ -1644,7 +1644,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
let def_node_id = self.context.resolver.next_node_id(); let def_node_id = self.context.resolver.next_node_id();
let hir_id = let hir_id =
self.context.lower_node_id_with_owner(def_node_id, self.opaque_ty_id); self.context.lower_node_id_with_owner(def_node_id, self.opaque_ty_id);
self.context.resolver.create_def_with_parent( self.context.resolver.create_def(
self.parent, self.parent,
def_node_id, def_node_id,
DefPathData::LifetimeNs(name.ident().name), DefPathData::LifetimeNs(name.ident().name),

View file

@ -71,9 +71,9 @@ impl DefPathTable {
} }
/// The definition table containing node definitions. /// The definition table containing node definitions.
/// It holds the `DefPathTable` for local `DefId`s/`DefPath`s and it also stores a /// It holds the `DefPathTable` for `LocalDefId`s/`DefPath`s.
/// mapping from `NodeId`s to local `DefId`s. /// It also stores mappings to convert `LocalDefId`s to/from `HirId`s.
#[derive(Clone, Default)] #[derive(Clone)]
pub struct Definitions { pub struct Definitions {
table: DefPathTable, table: DefPathTable,
@ -328,11 +328,7 @@ impl Definitions {
} }
/// Adds a root definition (no parent) and a few other reserved definitions. /// Adds a root definition (no parent) and a few other reserved definitions.
pub fn create_root_def( pub fn new(crate_name: &str, crate_disambiguator: CrateDisambiguator) -> Definitions {
&mut self,
crate_name: &str,
crate_disambiguator: CrateDisambiguator,
) -> LocalDefId {
let key = DefKey { let key = DefKey {
parent: None, parent: None,
disambiguated_data: DisambiguatedDefPathData { disambiguated_data: DisambiguatedDefPathData {
@ -344,24 +340,34 @@ impl Definitions {
let parent_hash = DefKey::root_parent_stable_hash(crate_name, crate_disambiguator); let parent_hash = DefKey::root_parent_stable_hash(crate_name, crate_disambiguator);
let def_path_hash = key.compute_stable_hash(parent_hash); let def_path_hash = key.compute_stable_hash(parent_hash);
// Create the definition. // Create the root definition.
let root = LocalDefId { local_def_index: self.table.allocate(key, def_path_hash) }; let mut table = DefPathTable::default();
let root = LocalDefId { local_def_index: table.allocate(key, def_path_hash) };
assert_eq!(root.local_def_index, CRATE_DEF_INDEX); assert_eq!(root.local_def_index, CRATE_DEF_INDEX);
root Definitions {
table,
def_id_to_hir_id: Default::default(),
hir_id_to_def_id: Default::default(),
expansions_that_defined: Default::default(),
next_disambiguator: Default::default(),
parent_modules_of_macro_defs: Default::default(),
}
}
/// Retrieves the root definition.
pub fn get_root_def(&self) -> LocalDefId {
LocalDefId { local_def_index: CRATE_DEF_INDEX }
} }
/// Adds a definition with a parent definition. /// Adds a definition with a parent definition.
pub fn create_def_with_parent( pub fn create_def(
&mut self, &mut self,
parent: LocalDefId, parent: LocalDefId,
data: DefPathData, data: DefPathData,
expn_id: ExpnId, expn_id: ExpnId,
) -> LocalDefId { ) -> LocalDefId {
debug!( debug!("create_def(parent={:?}, data={:?}, expn_id={:?})", parent, data, expn_id);
"create_def_with_parent(parent={:?}, data={:?}, expn_id={:?})",
parent, data, expn_id
);
// The root node must be created with `create_root_def()`. // The root node must be created with `create_root_def()`.
assert!(data != DefPathData::CrateRoot); assert!(data != DefPathData::CrateRoot);
@ -382,7 +388,7 @@ impl Definitions {
let parent_hash = self.table.def_path_hash(parent.local_def_index); let parent_hash = self.table.def_path_hash(parent.local_def_index);
let def_path_hash = key.compute_stable_hash(parent_hash); let def_path_hash = key.compute_stable_hash(parent_hash);
debug!("create_def_with_parent: after disambiguation, key = {:?}", key); debug!("create_def: after disambiguation, key = {:?}", key);
// Create the definition. // Create the definition.
let def_id = LocalDefId { local_def_index: self.table.allocate(key, def_path_hash) }; let def_id = LocalDefId { local_def_index: self.table.allocate(key, def_path_hash) };

View file

@ -734,7 +734,10 @@ pub fn create_global_ctxt<'tcx>(
arena: &'tcx WorkerLocal<Arena<'tcx>>, arena: &'tcx WorkerLocal<Arena<'tcx>>,
) -> QueryContext<'tcx> { ) -> QueryContext<'tcx> {
let sess = &compiler.session(); let sess = &compiler.session();
let defs: &'tcx Definitions = arena.alloc(mem::take(&mut resolver_outputs.definitions)); let defs: &'tcx Definitions = arena.alloc(mem::replace(
&mut resolver_outputs.definitions,
Definitions::new(crate_name, sess.local_crate_disambiguator()),
));
let query_result_on_disk_cache = rustc_incremental::load_query_result_cache(sess); let query_result_on_disk_cache = rustc_incremental::load_query_result_cache(sess);

View file

@ -32,7 +32,7 @@ impl<'a, 'b> DefCollector<'a, 'b> {
fn create_def(&mut self, node_id: NodeId, data: DefPathData, span: Span) -> LocalDefId { fn create_def(&mut self, node_id: NodeId, data: DefPathData, span: Span) -> LocalDefId {
let parent_def = self.parent_def; let parent_def = self.parent_def;
debug!("create_def(node_id={:?}, data={:?}, parent_def={:?})", node_id, data, parent_def); debug!("create_def(node_id={:?}, data={:?}, parent_def={:?})", node_id, data, parent_def);
self.resolver.create_def_with_parent(parent_def, node_id, data, self.expansion, span) self.resolver.create_def(parent_def, node_id, data, self.expansion, span)
} }
fn with_parent<F: FnOnce(&mut Self)>(&mut self, parent_def: LocalDefId, f: F) { fn with_parent<F: FnOnce(&mut Self)>(&mut self, parent_def: LocalDefId, f: F) {

View file

@ -1126,7 +1126,7 @@ impl ResolverAstLowering for Resolver<'_> {
} }
/// Adds a definition with a parent definition. /// Adds a definition with a parent definition.
fn create_def_with_parent( fn create_def(
&mut self, &mut self,
parent: LocalDefId, parent: LocalDefId,
node_id: ast::NodeId, node_id: ast::NodeId,
@ -1142,7 +1142,7 @@ impl ResolverAstLowering for Resolver<'_> {
self.definitions.def_key(self.node_id_to_def_id[&node_id]), self.definitions.def_key(self.node_id_to_def_id[&node_id]),
); );
let def_id = self.definitions.create_def_with_parent(parent, data, expn_id); let def_id = self.definitions.create_def(parent, data, expn_id);
assert_eq!(self.def_id_to_span.push(span), def_id); assert_eq!(self.def_id_to_span.push(span), def_id);
@ -1150,7 +1150,7 @@ impl ResolverAstLowering for Resolver<'_> {
// anything in the AST, so they don't have a `NodeId`. For these cases // anything in the AST, so they don't have a `NodeId`. For these cases
// we don't need a mapping from `NodeId` to `LocalDefId`. // we don't need a mapping from `NodeId` to `LocalDefId`.
if node_id != ast::DUMMY_NODE_ID { if node_id != ast::DUMMY_NODE_ID {
debug!("create_def_with_parent: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id); debug!("create_def: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id);
self.node_id_to_def_id.insert(node_id, def_id); self.node_id_to_def_id.insert(node_id, def_id);
} }
assert_eq!(self.def_id_to_node_id.push(node_id), def_id); assert_eq!(self.def_id_to_node_id.push(node_id), def_id);
@ -1187,8 +1187,8 @@ impl<'a> Resolver<'a> {
let mut module_map = FxHashMap::default(); let mut module_map = FxHashMap::default();
module_map.insert(LocalDefId { local_def_index: CRATE_DEF_INDEX }, graph_root); module_map.insert(LocalDefId { local_def_index: CRATE_DEF_INDEX }, graph_root);
let mut definitions = Definitions::default(); let definitions = Definitions::new(crate_name, session.local_crate_disambiguator());
let root = definitions.create_root_def(crate_name, session.local_crate_disambiguator()); let root = definitions.get_root_def();
let mut def_id_to_span = IndexVec::default(); let mut def_id_to_span = IndexVec::default();
assert_eq!(def_id_to_span.push(rustc_span::DUMMY_SP), root); assert_eq!(def_id_to_span.push(rustc_span::DUMMY_SP), root);