Skip to content

Commit c240b2b

Browse files
author
addie.sh
committed
dump generics
1 parent 5ea817c commit c240b2b

12 files changed

Lines changed: 135 additions & 0 deletions

File tree

compiler/rustc_attr_parsing/src/attributes/rustc_dump.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,24 @@ impl SingleAttributeParser for RustcDumpDefPathParser {
4141
}
4242
}
4343

44+
pub(crate) struct RustcDumpGenericsParser;
45+
46+
impl NoArgsAttributeParser for RustcDumpGenericsParser {
47+
const PATH: &[Symbol] = &[sym::rustc_dump_generics];
48+
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
49+
Allow(Target::Struct),
50+
Allow(Target::Enum),
51+
Allow(Target::Union),
52+
Allow(Target::Trait),
53+
Allow(Target::Fn),
54+
Allow(Target::Closure),
55+
Allow(Target::Union),
56+
Allow(Target::TyAlias),
57+
Allow(Target::TraitAlias),
58+
]);
59+
const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpGenerics;
60+
}
61+
4462
pub(crate) struct RustcDumpHiddenTypeOfOpaquesParser;
4563

4664
impl NoArgsAttributeParser for RustcDumpHiddenTypeOfOpaquesParser {

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ attribute_parsers!(
271271
Single<WithoutArgs<RustcDenyExplicitImplParser>>,
272272
Single<WithoutArgs<RustcDoNotConstCheckParser>>,
273273
Single<WithoutArgs<RustcDumpDefParentsParser>>,
274+
Single<WithoutArgs<RustcDumpGenericsParser>>,
274275
Single<WithoutArgs<RustcDumpHiddenTypeOfOpaquesParser>>,
275276
Single<WithoutArgs<RustcDumpInferredOutlivesParser>>,
276277
Single<WithoutArgs<RustcDumpItemBoundsParser>>,

compiler/rustc_feature/src/builtin_attrs.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,7 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
749749
rustc_attr!(TEST, rustc_strict_coherence),
750750
rustc_attr!(TEST, rustc_dump_variances),
751751
rustc_attr!(TEST, rustc_dump_variances_of_opaques),
752+
rustc_attr!(TEST, rustc_dump_generics),
752753
rustc_attr!(TEST, rustc_dump_hidden_type_of_opaques),
753754
rustc_attr!(TEST, rustc_dump_layout),
754755
rustc_attr!(TEST, rustc_abi),

compiler/rustc_hir/src/attrs/data_structures.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,6 +1359,9 @@ pub enum AttributeKind {
13591359
/// Represents `#[rustc_dump_def_path]`
13601360
RustcDumpDefPath(Span),
13611361

1362+
/// Represents `#[rustc_dump_generics]`
1363+
RustcDumpGenerics,
1364+
13621365
/// Represents `#[rustc_dump_hidden_type_of_opaques]`
13631366
RustcDumpHiddenTypeOfOpaques,
13641367

compiler/rustc_hir/src/attrs/encode_cross_crate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ impl AttributeKind {
126126
RustcDummy => No,
127127
RustcDumpDefParents => No,
128128
RustcDumpDefPath(..) => No,
129+
RustcDumpGenerics => No,
129130
RustcDumpHiddenTypeOfOpaques => No,
130131
RustcDumpInferredOutlives => No,
131132
RustcDumpItemBounds => No,

compiler/rustc_hir_analysis/src/collect/dump.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,24 @@ use rustc_middle::hir::nested_filter;
66
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt, Unnormalized};
77
use rustc_span::sym;
88

9+
pub(crate) fn generics(tcx: TyCtxt<'_>) {
10+
for iid in tcx.hir_free_items() {
11+
let did = iid.owner_id.def_id;
12+
if find_attr!(tcx, did, RustcDumpGenerics) {
13+
let span = tcx.def_span(did);
14+
15+
let mut diag = tcx
16+
.dcx()
17+
.struct_span_err(span, format!("{}: {did:?}", sym::rustc_dump_generics.as_str()));
18+
19+
let current_did = did.to_def_id();
20+
let generics = tcx.generics_of(current_did);
21+
diag.span_note(tcx.def_span(did), format!("{generics:#?}"));
22+
diag.emit();
23+
}
24+
}
25+
}
26+
927
pub(crate) fn opaque_hidden_types(tcx: TyCtxt<'_>) {
1028
if !find_attr!(tcx, crate, RustcDumpHiddenTypeOfOpaques) {
1129
return;

compiler/rustc_hir_analysis/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ pub fn check_crate(tcx: TyCtxt<'_>) {
201201
tcx.sess.time("dumping_rustc_attr_data", || {
202202
outlives::dump::inferred_outlives(tcx);
203203
variance::dump::variances(tcx);
204+
collect::dump::generics(tcx);
204205
collect::dump::opaque_hidden_types(tcx);
205206
collect::dump::predicates_and_item_bounds(tcx);
206207
collect::dump::def_parents(tcx);

compiler/rustc_passes/src/check_attr.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
342342
AttributeKind::RustcDummy => (),
343343
AttributeKind::RustcDumpDefParents => (),
344344
AttributeKind::RustcDumpDefPath(..) => (),
345+
AttributeKind::RustcDumpGenerics => (),
345346
AttributeKind::RustcDumpHiddenTypeOfOpaques => (),
346347
AttributeKind::RustcDumpInferredOutlives => (),
347348
AttributeKind::RustcDumpItemBounds => (),

compiler/rustc_span/src/symbol.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1739,6 +1739,7 @@ symbols! {
17391739
rustc_dummy,
17401740
rustc_dump_def_parents,
17411741
rustc_dump_def_path,
1742+
rustc_dump_generics,
17421743
rustc_dump_hidden_type_of_opaques,
17431744
rustc_dump_inferred_outlives,
17441745
rustc_dump_item_bounds,

src/doc/rustc-dev-guide/src/compiler-debugging.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ Here are some notable ones:
275275
|----------------|-------------|
276276
| `rustc_dump_def_parents` | Dumps the chain of `DefId` parents of certain definitions. |
277277
| `rustc_dump_def_path` | Dumps the [`def_path_str`] of an item. |
278+
| `rustc_dump_generics` | Dumps the generics of an item. |
278279
| `rustc_dump_hidden_type_of_opaques` | Dumps the [hidden type of each opaque types][opaq] in the crate. |
279280
| `rustc_dump_inferred_outlives` | Dumps implied bounds of an item. More precisely, the [`inferred_outlives_of`] an item. |
280281
| `rustc_dump_item_bounds` | Dumps the [`item_bounds`] of an item. |

0 commit comments

Comments
 (0)