Always create a root definition when creating a new Definitions
object.
This commit is contained in:
parent
f60513ec8d
commit
1d3f49f536
5 changed files with 40 additions and 31 deletions
|
@ -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),
|
||||||
|
|
|
@ -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) };
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue