Skip to content

Commit 1df9b8a

Browse files
committed
Create node Item and AdtDef for anonymous adts
1 parent b2da370 commit 1df9b8a

File tree

51 files changed

+195
-328
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+195
-328
lines changed

compiler/rustc_ast/src/ast.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2093,9 +2093,9 @@ pub enum TyKind {
20932093
/// A tuple (`(A, B, C, D,...)`).
20942094
Tup(ThinVec<P<Ty>>),
20952095
/// An anonymous struct type i.e. `struct { foo: Type }`
2096-
AnonStruct(ThinVec<FieldDef>),
2096+
AnonStruct(NodeId, ThinVec<FieldDef>),
20972097
/// An anonymous union type i.e. `union { bar: Type }`
2098-
AnonUnion(ThinVec<FieldDef>),
2098+
AnonUnion(NodeId, ThinVec<FieldDef>),
20992099
/// A path (`module::module::...::Type`), optionally
21002100
/// "qualified", e.g., `<Vec<T> as SomeTrait>::SomeType`.
21012101
///

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,8 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
509509
visit_vec(bounds, |bound| vis.visit_param_bound(bound));
510510
}
511511
TyKind::MacCall(mac) => vis.visit_mac_call(mac),
512-
TyKind::AnonStruct(fields) | TyKind::AnonUnion(fields) => {
512+
TyKind::AnonStruct(id, fields) | TyKind::AnonUnion(id, fields) => {
513+
vis.visit_id(id);
513514
fields.flat_map_in_place(|field| vis.flat_map_field_def(field));
514515
}
515516
}

compiler/rustc_ast/src/visit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, typ: &'a Ty) {
438438
TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err => {}
439439
TyKind::MacCall(mac) => visitor.visit_mac_call(mac),
440440
TyKind::Never | TyKind::CVarArgs => {}
441-
TyKind::AnonStruct(ref fields, ..) | TyKind::AnonUnion(ref fields, ..) => {
441+
TyKind::AnonStruct(_, ref fields) | TyKind::AnonUnion(_, ref fields) => {
442442
walk_list!(visitor, visit_field_def, fields)
443443
}
444444
}

compiler/rustc_ast_lowering/src/item.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
708708
}
709709
}
710710

711-
pub(super) fn lower_field_def(&mut self, (index, f): (usize, &FieldDef)) -> hir::FieldDef<'hir> {
711+
pub(super) fn lower_field_def(
712+
&mut self,
713+
(index, f): (usize, &FieldDef),
714+
) -> hir::FieldDef<'hir> {
712715
let ty = if let TyKind::Path(qself, path) = &f.ty.kind {
713716
let t = self.lower_path_ty(
714717
&f.ty,

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,15 +1293,39 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
12931293
TyKind::Err => {
12941294
hir::TyKind::Err(self.tcx.sess.delay_span_bug(t.span, "TyKind::Err lowered"))
12951295
}
1296-
TyKind::AnonStruct(fields) => {
1297-
hir::TyKind::AnonStruct(
1298-
self.arena.alloc_from_iter(fields.iter().enumerate().map(|f| self.lower_field_def(f))),
1299-
)
1300-
}
1301-
TyKind::AnonUnion(fields) => {
1302-
hir::TyKind::AnonUnion(
1303-
self.arena.alloc_from_iter(fields.iter().enumerate().map(|f| self.lower_field_def(f))),
1304-
)
1296+
TyKind::AnonStruct(def_node_id, fields) | TyKind::AnonUnion(def_node_id, fields) => {
1297+
let def_path_data = match &t.kind {
1298+
TyKind::AnonStruct(..) => DefPathData::AnonStruct,
1299+
_ => DefPathData::AnonUnion,
1300+
};
1301+
let def_id = self.create_def(
1302+
self.current_hir_id_owner.def_id,
1303+
*def_node_id,
1304+
def_path_data,
1305+
t.span,
1306+
);
1307+
debug!(?def_id);
1308+
let owner_id = hir::OwnerId { def_id };
1309+
self.with_hir_id_owner(*def_node_id, |this| {
1310+
let fields = this.arena.alloc_from_iter(
1311+
fields.iter().enumerate().map(|f| this.lower_field_def(f)),
1312+
);
1313+
let span = t.span;
1314+
let variant_data = hir::VariantData::Struct(fields, false);
1315+
let generics = hir::Generics::empty();
1316+
let kind = match &t.kind {
1317+
TyKind::AnonStruct(..) => hir::ItemKind::Struct(variant_data, generics),
1318+
_ => hir::ItemKind::Union(variant_data, generics),
1319+
};
1320+
hir::OwnerNode::Item(this.arena.alloc(hir::Item {
1321+
ident: Ident::empty(),
1322+
owner_id,
1323+
kind,
1324+
span: this.lower_span(span),
1325+
vis_span: this.lower_span(span.shrink_to_lo()),
1326+
}))
1327+
});
1328+
hir::TyKind::AnonAdt(hir::ItemId { owner_id })
13051329
}
13061330
TyKind::Slice(ty) => hir::TyKind::Slice(self.lower_ty(ty, itctx)),
13071331
TyKind::Ptr(mt) => hir::TyKind::Ptr(self.lower_mt(mt, itctx)),

compiler/rustc_ast_passes/src/ast_validation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ impl<'a> AstValidator<'a> {
219219
}
220220
}
221221
}
222-
TyKind::AnonStruct(ref fields, ..) | TyKind::AnonUnion(ref fields, ..) => {
222+
TyKind::AnonStruct(_, ref fields) | TyKind::AnonUnion(_, ref fields) => {
223223
walk_list!(self, visit_field_def, fields)
224224
}
225225
_ => visit::walk_ty(self, t),

compiler/rustc_ast_pretty/src/pprust/state.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,11 +1053,11 @@ impl<'a> State<'a> {
10531053
}
10541054
self.pclose();
10551055
}
1056-
ast::TyKind::AnonStruct(fields) => {
1056+
ast::TyKind::AnonStruct(_, fields) => {
10571057
self.head("struct");
10581058
self.print_record_struct_body(&fields, ty.span);
10591059
}
1060-
ast::TyKind::AnonUnion(fields) => {
1060+
ast::TyKind::AnonUnion(_, fields) => {
10611061
self.head("union");
10621062
self.print_record_struct_body(&fields, ty.span);
10631063
}

compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ fn build_single_variant_union_fields<'ll, 'tcx>(
338338
enum_type_di_node,
339339
std::iter::once((
340340
variant_index,
341-
Cow::from(enum_adt_def.variant(variant_index).name_ref().as_str()),
341+
Cow::from(enum_adt_def.variant(variant_index).name.as_str()),
342342
)),
343343
);
344344

@@ -399,7 +399,7 @@ fn build_union_fields_for_enum<'ll, 'tcx>(
399399
cx,
400400
enum_type_di_node,
401401
variant_indices.clone().map(|variant_index| {
402-
let variant_name = Cow::from(enum_adt_def.variant(variant_index).name_ref().as_str());
402+
let variant_name = Cow::from(enum_adt_def.variant(variant_index).name.as_str());
403403
(variant_index, variant_name)
404404
}),
405405
);

compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ fn build_c_style_enum_di_node<'ll, 'tcx>(
9292
&compute_debuginfo_type_name(cx.tcx, enum_type_and_layout.ty, false),
9393
tag_base_type(cx, enum_type_and_layout),
9494
enum_adt_def.discriminants(cx.tcx).map(|(variant_index, discr)| {
95-
let name = Cow::from(enum_adt_def.variant(variant_index).name_ref().as_str());
95+
let name = Cow::from(enum_adt_def.variant(variant_index).name.as_str());
9696
(name, discr.val)
9797
}),
9898
containing_scope,
@@ -263,7 +263,7 @@ fn build_enum_variant_struct_type_di_node<'ll, 'tcx>(
263263
enum_type_and_layout.ty,
264264
variant_index,
265265
),
266-
variant_def.name().as_str(),
266+
variant_def.name.as_str(),
267267
// NOTE: We use size and align of enum_type, not from variant_layout:
268268
size_and_align_of(enum_type_and_layout),
269269
Some(enum_type_di_node),

compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/native.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ pub(super) fn build_enum_type_di_node<'ll, 'tcx>(
8484
.variant_range()
8585
.map(|variant_index| VariantMemberInfo {
8686
variant_index,
87-
variant_name: Cow::from(enum_adt_def.variant(variant_index).name_ref().as_str()),
87+
variant_name: Cow::from(enum_adt_def.variant(variant_index).name.as_str()),
8888
variant_struct_type_di_node: super::build_enum_variant_struct_type_di_node(
8989
cx,
9090
enum_type_and_layout,

0 commit comments

Comments
 (0)