Skip to content

Commit 6bdc396

Browse files
committed
Collect opaques on HIR.
1 parent 30917da commit 6bdc396

File tree

4 files changed

+33
-15
lines changed

4 files changed

+33
-15
lines changed

compiler/rustc_hir_analysis/src/collect/dump.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use rustc_hir::def::DefKind;
21
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
32
use rustc_hir::intravisit;
43
use rustc_middle::hir::nested_filter::OnlyBodies;
@@ -10,12 +9,10 @@ pub(crate) fn opaque_hidden_types(tcx: TyCtxt<'_>) {
109
return;
1110
}
1211

13-
for id in tcx.hir().items() {
14-
let DefKind::OpaqueTy = tcx.def_kind(id.owner_id) else { continue };
15-
16-
let ty = tcx.type_of(id.owner_id).instantiate_identity();
17-
18-
tcx.dcx().emit_err(crate::errors::TypeOf { span: tcx.def_span(id.owner_id), ty });
12+
for id in tcx.hir_crate_items(()).opaques() {
13+
let ty = tcx.type_of(id).instantiate_identity();
14+
let span = tcx.def_span(id);
15+
tcx.dcx().emit_err(crate::errors::TypeOf { span, ty });
1916
}
2017
}
2118

compiler/rustc_hir_analysis/src/variance/dump.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
1-
use rustc_hir::def::DefKind;
21
use rustc_hir::def_id::CRATE_DEF_ID;
32
use rustc_middle::ty::TyCtxt;
43
use rustc_span::symbol::sym;
54

65
pub(crate) fn variances(tcx: TyCtxt<'_>) {
7-
if tcx.has_attr(CRATE_DEF_ID, sym::rustc_variance_of_opaques) {
8-
for id in tcx.hir().items() {
9-
let DefKind::OpaqueTy = tcx.def_kind(id.owner_id) else { continue };
10-
11-
let variances = tcx.variances_of(id.owner_id);
6+
let crate_items = tcx.hir_crate_items(());
127

8+
if tcx.has_attr(CRATE_DEF_ID, sym::rustc_variance_of_opaques) {
9+
for id in crate_items.opaques() {
10+
let variances = tcx.variances_of(id);
1311
tcx.dcx().emit_err(crate::errors::VariancesOf {
14-
span: tcx.def_span(id.owner_id),
12+
span: tcx.def_span(id),
1513
variances: format!("{variances:?}"),
1614
});
1715
}
1816
}
1917

20-
for id in tcx.hir().items() {
18+
for id in crate_items.free_items() {
2119
if !tcx.has_attr(id.owner_id, sym::rustc_variance) {
2220
continue;
2321
}

compiler/rustc_middle/src/hir/map/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,7 @@ pub(super) fn hir_module_items(tcx: TyCtxt<'_>, module_id: LocalModDefId) -> Mod
12451245
impl_items,
12461246
foreign_items,
12471247
body_owners,
1248+
opaques,
12481249
..
12491250
} = collector;
12501251
return ModuleItems {
@@ -1254,6 +1255,7 @@ pub(super) fn hir_module_items(tcx: TyCtxt<'_>, module_id: LocalModDefId) -> Mod
12541255
impl_items: impl_items.into_boxed_slice(),
12551256
foreign_items: foreign_items.into_boxed_slice(),
12561257
body_owners: body_owners.into_boxed_slice(),
1258+
opaques: opaques.into_boxed_slice(),
12571259
};
12581260
}
12591261

@@ -1273,6 +1275,7 @@ pub(crate) fn hir_crate_items(tcx: TyCtxt<'_>, _: ()) -> ModuleItems {
12731275
impl_items,
12741276
foreign_items,
12751277
body_owners,
1278+
opaques,
12761279
..
12771280
} = collector;
12781281

@@ -1283,6 +1286,7 @@ pub(crate) fn hir_crate_items(tcx: TyCtxt<'_>, _: ()) -> ModuleItems {
12831286
impl_items: impl_items.into_boxed_slice(),
12841287
foreign_items: foreign_items.into_boxed_slice(),
12851288
body_owners: body_owners.into_boxed_slice(),
1289+
opaques: opaques.into_boxed_slice(),
12861290
};
12871291
}
12881292

@@ -1297,6 +1301,7 @@ struct ItemCollector<'tcx> {
12971301
impl_items: Vec<ImplItemId>,
12981302
foreign_items: Vec<ForeignItemId>,
12991303
body_owners: Vec<LocalDefId>,
1304+
opaques: Vec<LocalDefId>,
13001305
}
13011306

13021307
impl<'tcx> ItemCollector<'tcx> {
@@ -1310,6 +1315,7 @@ impl<'tcx> ItemCollector<'tcx> {
13101315
impl_items: Vec::default(),
13111316
foreign_items: Vec::default(),
13121317
body_owners: Vec::default(),
1318+
opaques: Vec::default(),
13131319
}
13141320
}
13151321
}
@@ -1355,6 +1361,11 @@ impl<'hir> Visitor<'hir> for ItemCollector<'hir> {
13551361
intravisit::walk_inline_const(self, c)
13561362
}
13571363

1364+
fn visit_opaque_ty(&mut self, o: &'hir OpaqueTy<'hir>) {
1365+
self.opaques.push(o.def_id);
1366+
intravisit::walk_opaque_ty(self, o)
1367+
}
1368+
13581369
fn visit_expr(&mut self, ex: &'hir Expr<'hir>) {
13591370
if let ExprKind::Closure(closure) = ex.kind {
13601371
self.body_owners.push(closure.def_id);

compiler/rustc_middle/src/hir/mod.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ pub struct ModuleItems {
2828
trait_items: Box<[TraitItemId]>,
2929
impl_items: Box<[ImplItemId]>,
3030
foreign_items: Box<[ForeignItemId]>,
31+
opaques: Box<[LocalDefId]>,
3132
body_owners: Box<[LocalDefId]>,
3233
}
3334

@@ -65,6 +66,10 @@ impl ModuleItems {
6566
.chain(self.foreign_items.iter().map(|id| id.owner_id))
6667
}
6768

69+
pub fn opaques(&self) -> impl Iterator<Item = LocalDefId> + '_ {
70+
self.opaques.iter().copied()
71+
}
72+
6873
pub fn definitions(&self) -> impl Iterator<Item = LocalDefId> + '_ {
6974
self.owners().map(|id| id.def_id)
7075
}
@@ -96,6 +101,13 @@ impl ModuleItems {
96101
) -> Result<(), ErrorGuaranteed> {
97102
try_par_for_each_in(&self.foreign_items[..], |&id| f(id))
98103
}
104+
105+
pub fn par_opaques(
106+
&self,
107+
f: impl Fn(LocalDefId) -> Result<(), ErrorGuaranteed> + DynSend + DynSync,
108+
) -> Result<(), ErrorGuaranteed> {
109+
try_par_for_each_in(&self.opaques[..], |&id| f(id))
110+
}
99111
}
100112

101113
impl<'tcx> TyCtxt<'tcx> {

0 commit comments

Comments
 (0)