mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
rustc_metadata: Merge get_ctor_def_id
and get_ctor_kind
Also avoid decoding the whole `ty::AssocItem` to get a `has_self` flag
This commit is contained in:
parent
e100ec5bc7
commit
337ced2ef0
@ -1161,8 +1161,9 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
||||
// Re-export lists automatically contain constructors when necessary.
|
||||
match kind {
|
||||
DefKind::Struct => {
|
||||
if let Some(ctor_def_id) = self.get_ctor_def_id(child_index) {
|
||||
let ctor_kind = self.get_ctor_kind(child_index);
|
||||
if let Some((ctor_def_id, ctor_kind)) =
|
||||
self.get_ctor_def_id_and_kind(child_index)
|
||||
{
|
||||
let ctor_res =
|
||||
Res::Def(DefKind::Ctor(CtorOf::Struct, ctor_kind), ctor_def_id);
|
||||
let vis = self.get_visibility(ctor_def_id.index);
|
||||
@ -1174,8 +1175,9 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
||||
// value namespace, they are reserved for possible future use.
|
||||
// It's ok to use the variant's id as a ctor id since an
|
||||
// error will be reported on any use of such resolution anyway.
|
||||
let ctor_def_id = self.get_ctor_def_id(child_index).unwrap_or(def_id);
|
||||
let ctor_kind = self.get_ctor_kind(child_index);
|
||||
let (ctor_def_id, ctor_kind) = self
|
||||
.get_ctor_def_id_and_kind(child_index)
|
||||
.unwrap_or((def_id, CtorKind::Fictive));
|
||||
let ctor_res =
|
||||
Res::Def(DefKind::Ctor(CtorOf::Variant, ctor_kind), ctor_def_id);
|
||||
let mut vis = self.get_visibility(ctor_def_id.index);
|
||||
@ -1296,6 +1298,13 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
fn get_fn_has_self_parameter(&self, id: DefIndex) -> bool {
|
||||
match self.kind(id) {
|
||||
EntryKind::AssocFn(data) => data.decode(self).has_self,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
fn get_associated_item(&self, id: DefIndex, sess: &Session) -> ty::AssocItem {
|
||||
let def_key = self.def_key(id);
|
||||
let parent = self.local_def_id(def_key.parent.unwrap());
|
||||
@ -1326,22 +1335,11 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
||||
self.root.tables.variances.get(self, id).unwrap_or_else(Lazy::empty).decode(self)
|
||||
}
|
||||
|
||||
fn get_ctor_kind(&self, node_id: DefIndex) -> CtorKind {
|
||||
fn get_ctor_def_id_and_kind(&self, node_id: DefIndex) -> Option<(DefId, CtorKind)> {
|
||||
match self.kind(node_id) {
|
||||
EntryKind::Struct(data, _) | EntryKind::Union(data, _) | EntryKind::Variant(data) => {
|
||||
data.decode(self).ctor_kind
|
||||
}
|
||||
_ => CtorKind::Fictive,
|
||||
}
|
||||
}
|
||||
|
||||
fn get_ctor_def_id(&self, node_id: DefIndex) -> Option<DefId> {
|
||||
match self.kind(node_id) {
|
||||
EntryKind::Struct(data, _) => {
|
||||
data.decode(self).ctor.map(|index| self.local_def_id(index))
|
||||
}
|
||||
EntryKind::Variant(data) => {
|
||||
data.decode(self).ctor.map(|index| self.local_def_id(index))
|
||||
EntryKind::Struct(data, _) | EntryKind::Variant(data) => {
|
||||
let vdata = data.decode(self);
|
||||
vdata.ctor.map(|index| (self.local_def_id(index), vdata.ctor_kind))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
|
@ -388,9 +388,7 @@ impl CStore {
|
||||
}
|
||||
|
||||
pub fn ctor_def_id_and_kind_untracked(&self, def: DefId) -> Option<(DefId, CtorKind)> {
|
||||
self.get_crate_data(def.krate).get_ctor_def_id(def.index).map(|ctor_def_id| {
|
||||
(ctor_def_id, self.get_crate_data(def.krate).get_ctor_kind(def.index))
|
||||
})
|
||||
self.get_crate_data(def.krate).get_ctor_def_id_and_kind(def.index)
|
||||
}
|
||||
|
||||
pub fn visibility_untracked(&self, def: DefId) -> Visibility {
|
||||
@ -439,8 +437,8 @@ impl CStore {
|
||||
)
|
||||
}
|
||||
|
||||
pub fn associated_item_cloned_untracked(&self, def: DefId, sess: &Session) -> ty::AssocItem {
|
||||
self.get_crate_data(def.krate).get_associated_item(def.index, sess)
|
||||
pub fn fn_has_self_parameter_untracked(&self, def: DefId) -> bool {
|
||||
self.get_crate_data(def.krate).get_fn_has_self_parameter(def.index)
|
||||
}
|
||||
|
||||
pub fn crate_source_untracked(&self, cnum: CrateNum) -> CrateSource {
|
||||
|
@ -1016,10 +1016,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
self.insert_field_names(def_id, field_names);
|
||||
}
|
||||
Res::Def(DefKind::AssocFn, def_id) => {
|
||||
if cstore
|
||||
.associated_item_cloned_untracked(def_id, self.r.session)
|
||||
.fn_has_self_parameter
|
||||
{
|
||||
if cstore.fn_has_self_parameter_untracked(def_id) {
|
||||
self.r.has_self.insert(def_id);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user