Skip to content

Commit c05b7bd

Browse files
committed
resolve: Remove struct_field_visibilities_untracked
1 parent 901f1c9 commit c05b7bd

File tree

5 files changed

+37
-50
lines changed

5 files changed

+37
-50
lines changed

compiler/rustc_metadata/src/rmeta/decoder.rs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
930930
self.root.tables.generics_of.get(self, item_id).unwrap().decode((self, sess))
931931
}
932932

933-
fn get_visibility(self, id: DefIndex) -> ty::Visibility<DefId> {
933+
fn get_visibility(self, id: DefIndex) -> Visibility<DefId> {
934934
self.root
935935
.tables
936936
.visibility
@@ -1148,19 +1148,6 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
11481148
.map(move |index| respan(self.get_span(index, sess), self.item_name(index)))
11491149
}
11501150

1151-
fn get_struct_field_visibilities(
1152-
self,
1153-
id: DefIndex,
1154-
) -> impl Iterator<Item = Visibility<DefId>> + 'a {
1155-
self.root
1156-
.tables
1157-
.children
1158-
.get(self, id)
1159-
.expect("fields not encoded for a struct")
1160-
.decode(self)
1161-
.map(move |field_index| self.get_visibility(field_index))
1162-
}
1163-
11641151
fn get_inherent_implementations_for_type(
11651152
self,
11661153
tcx: TyCtxt<'tcx>,

compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use rustc_middle::middle::exported_symbols::ExportedSymbol;
1515
use rustc_middle::middle::stability::DeprecationEntry;
1616
use rustc_middle::ty::fast_reject::SimplifiedType;
1717
use rustc_middle::ty::query::{ExternProviders, Providers};
18-
use rustc_middle::ty::{self, TyCtxt, Visibility};
18+
use rustc_middle::ty::{self, TyCtxt};
1919
use rustc_session::cstore::{CrateSource, CrateStore};
2020
use rustc_session::{Session, StableCrateId};
2121
use rustc_span::hygiene::{ExpnHash, ExpnId};
@@ -515,13 +515,6 @@ impl CStore {
515515
self.get_crate_data(def.krate).get_struct_field_names(def.index, sess)
516516
}
517517

518-
pub fn struct_field_visibilities_untracked(
519-
&self,
520-
def: DefId,
521-
) -> impl Iterator<Item = Visibility<DefId>> + '_ {
522-
self.get_crate_data(def.krate).get_struct_field_visibilities(def.index)
523-
}
524-
525518
pub fn ctor_untracked(&self, def: DefId) -> Option<(CtorKind, DefId)> {
526519
self.get_crate_data(def.krate).get_ctor(def.index)
527520
}

compiler/rustc_resolve/src/build_reduced_graph.rs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
789789

790790
self.r
791791
.struct_constructors
792-
.insert(def_id, (ctor_res, ctor_vis.to_def_id(), ret_fields));
792+
.insert(local_def_id, (ctor_res, ctor_vis.to_def_id(), ret_fields));
793793
}
794794
}
795795

@@ -1006,19 +1006,7 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
10061006
}
10071007
// Record some extra data for better diagnostics.
10081008
match res {
1009-
Res::Def(DefKind::Struct, def_id) => {
1010-
let ctor = self.r.cstore().ctor_untracked(def_id);
1011-
if let Some((ctor_kind, ctor_def_id)) = ctor {
1012-
let ctor_res = Res::Def(DefKind::Ctor(CtorOf::Struct, ctor_kind), ctor_def_id);
1013-
let ctor_vis = self.r.tcx.visibility(ctor_def_id);
1014-
let field_visibilities =
1015-
self.r.cstore().struct_field_visibilities_untracked(def_id).collect();
1016-
self.r
1017-
.struct_constructors
1018-
.insert(def_id, (ctor_res, ctor_vis, field_visibilities));
1019-
}
1020-
self.insert_field_names_extern(def_id)
1021-
}
1009+
Res::Def(DefKind::Struct, def_id) => self.insert_field_names_extern(def_id),
10221010
Res::Def(DefKind::Union, def_id) => self.insert_field_names_extern(def_id),
10231011
Res::Def(DefKind::AssocFn, def_id) => {
10241012
if self.r.cstore().fn_has_self_parameter_untracked(def_id, self.r.tcx.sess) {

compiler/rustc_resolve/src/late/diagnostics.rs

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1408,19 +1408,38 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
14081408
self.suggest_using_enum_variant(err, source, def_id, span);
14091409
}
14101410
(Res::Def(DefKind::Struct, def_id), source) if ns == ValueNS => {
1411-
let (ctor_def, ctor_vis, fields) =
1412-
if let Some(struct_ctor) = self.r.struct_constructors.get(&def_id).cloned() {
1413-
if let PathSource::Expr(Some(parent)) = source {
1414-
if let ExprKind::Field(..) | ExprKind::MethodCall(..) = parent.kind {
1415-
bad_struct_syntax_suggestion(def_id);
1416-
return true;
1417-
}
1411+
let struct_ctor = match def_id.as_local() {
1412+
Some(def_id) => self.r.struct_constructors.get(&def_id).cloned(),
1413+
None => {
1414+
let ctor = self.r.cstore().ctor_untracked(def_id);
1415+
ctor.map(|(ctor_kind, ctor_def_id)| {
1416+
let ctor_res =
1417+
Res::Def(DefKind::Ctor(CtorOf::Struct, ctor_kind), ctor_def_id);
1418+
let ctor_vis = self.r.tcx.visibility(ctor_def_id);
1419+
let field_visibilities = self
1420+
.r
1421+
.tcx
1422+
.associated_item_def_ids(def_id)
1423+
.iter()
1424+
.map(|field_id| self.r.tcx.visibility(field_id))
1425+
.collect();
1426+
(ctor_res, ctor_vis, field_visibilities)
1427+
})
1428+
}
1429+
};
1430+
1431+
let (ctor_def, ctor_vis, fields) = if let Some(struct_ctor) = struct_ctor {
1432+
if let PathSource::Expr(Some(parent)) = source {
1433+
if let ExprKind::Field(..) | ExprKind::MethodCall(..) = parent.kind {
1434+
bad_struct_syntax_suggestion(def_id);
1435+
return true;
14181436
}
1419-
struct_ctor
1420-
} else {
1421-
bad_struct_syntax_suggestion(def_id);
1422-
return true;
1423-
};
1437+
}
1438+
struct_ctor
1439+
} else {
1440+
bad_struct_syntax_suggestion(def_id);
1441+
return true;
1442+
};
14241443

14251444
let is_accessible = self.r.is_accessible_from(ctor_vis, self.parent_scope.module);
14261445
if !is_expected(ctor_def) || is_accessible {

compiler/rustc_resolve/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use rustc_errors::{
3535
use rustc_expand::base::{DeriveResolutions, SyntaxExtension, SyntaxExtensionKind};
3636
use rustc_hir::def::Namespace::{self, *};
3737
use rustc_hir::def::{self, CtorOf, DefKind, DocLinkResMap, LifetimeRes, PartialRes, PerNS};
38-
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId};
38+
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LocalDefIdMap};
3939
use rustc_hir::def_id::{CRATE_DEF_ID, LOCAL_CRATE};
4040
use rustc_hir::definitions::DefPathData;
4141
use rustc_hir::TraitCandidate;
@@ -1009,7 +1009,7 @@ pub struct Resolver<'a, 'tcx> {
10091009
/// Table for mapping struct IDs into struct constructor IDs,
10101010
/// it's not used during normal resolution, only for better error reporting.
10111011
/// Also includes of list of each fields visibility
1012-
struct_constructors: DefIdMap<(Res, ty::Visibility<DefId>, Vec<ty::Visibility<DefId>>)>,
1012+
struct_constructors: LocalDefIdMap<(Res, ty::Visibility<DefId>, Vec<ty::Visibility<DefId>>)>,
10131013

10141014
/// Features enabled for this crate.
10151015
active_features: FxHashSet<Symbol>,

0 commit comments

Comments
 (0)