diff options
| author | Deadbeef <ent3rm4n@gmail.com> | 2024-06-26 16:36:42 +0000 |
|---|---|---|
| committer | Deadbeef <ent3rm4n@gmail.com> | 2024-06-28 15:44:20 +0000 |
| commit | 65a0bee0b77bad05c1bf29bd2dd855e554a9eaf5 (patch) | |
| tree | b3ef6f32a2b9602222ab6a4b6b2d967267b17d3d /compiler/rustc_ty_utils/src | |
| parent | 8b2fac9612e3840f9736bed31502b3b91ba01a08 (diff) | |
| download | rust-65a0bee0b77bad05c1bf29bd2dd855e554a9eaf5.tar.gz rust-65a0bee0b77bad05c1bf29bd2dd855e554a9eaf5.zip | |
address review comments
Diffstat (limited to 'compiler/rustc_ty_utils/src')
| -rw-r--r-- | compiler/rustc_ty_utils/src/assoc.rs | 99 |
1 files changed, 34 insertions, 65 deletions
diff --git a/compiler/rustc_ty_utils/src/assoc.rs b/compiler/rustc_ty_utils/src/assoc.rs index 6a55e83786c..6726db8bb54 100644 --- a/compiler/rustc_ty_utils/src/assoc.rs +++ b/compiler/rustc_ty_utils/src/assoc.rs @@ -184,12 +184,10 @@ fn associated_type_for_effects(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<De if !tcx.features().effects { return None; } - match tcx.def_kind(def_id) { + let (feed, parent_did) = match tcx.def_kind(def_id) { DefKind::Trait => { let trait_def_id = def_id; - let Some(attr) = tcx.get_attr(def_id, sym::const_trait) else { - return None; - }; + let attr = tcx.get_attr(def_id, sym::const_trait)?; let span = attr.span; let trait_assoc_ty = tcx.at(span).create_def(trait_def_id, kw::Empty, DefKind::AssocTy); @@ -197,8 +195,6 @@ fn associated_type_for_effects(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<De let local_def_id = trait_assoc_ty.def_id(); let def_id = local_def_id.to_def_id(); - trait_assoc_ty.feed_hir(); - // Copy span of the attribute. trait_assoc_ty.def_ident_span(Some(span)); @@ -213,47 +209,20 @@ fn associated_type_for_effects(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<De is_effects_desugaring: true, }); - // visibility is public. - trait_assoc_ty.visibility(ty::Visibility::Public); - // No default type trait_assoc_ty.defaultness(hir::Defaultness::Default { has_value: false }); trait_assoc_ty.is_type_alias_impl_trait(false); - // Copy generics_of of the trait, making the trait as parent. - trait_assoc_ty.generics_of({ - let parent_generics = tcx.generics_of(trait_def_id); - let parent_count = parent_generics.parent_count + parent_generics.own_params.len(); - - ty::Generics { - parent: Some(trait_def_id.to_def_id()), - parent_count, - own_params: vec![], - param_def_id_to_index: parent_generics.param_def_id_to_index.clone(), - has_self: false, - has_late_bound_regions: None, - host_effect_index: parent_generics.host_effect_index, - } - }); - - trait_assoc_ty.explicit_item_bounds(ty::EarlyBinder::bind(&[])); - trait_assoc_ty.explicit_item_super_predicates(ty::EarlyBinder::bind(&[])); - - // There are no inferred outlives for the synthesized associated type. - trait_assoc_ty.inferred_outlives_of(&[]); - - Some(def_id) + (trait_assoc_ty, trait_def_id) } DefKind::Impl { .. } => { let impl_def_id = def_id; - let Some(trait_id) = tcx.trait_id_of_impl(def_id.to_def_id()) else { return None }; + let trait_id = tcx.trait_id_of_impl(def_id.to_def_id())?; // first get the DefId of the assoc type on the trait, if there is not, // then we don't need to generate it on the impl. - let Some(trait_assoc_id) = tcx.associated_type_for_effects(trait_id) else { - return None; - }; + let trait_assoc_id = tcx.associated_type_for_effects(trait_id)?; // FIXME(effects): span let span = tcx.def_ident_span(def_id).unwrap(); @@ -263,8 +232,6 @@ fn associated_type_for_effects(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<De let local_def_id = impl_assoc_ty.def_id(); let def_id = local_def_id.to_def_id(); - impl_assoc_ty.feed_hir(); - impl_assoc_ty.def_ident_span(Some(span)); impl_assoc_ty.associated_item(ty::AssocItem { @@ -278,9 +245,6 @@ fn associated_type_for_effects(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<De is_effects_desugaring: true, }); - // visibility is public. - impl_assoc_ty.visibility(ty::Visibility::Public); - // no default value. impl_assoc_ty.defaultness(hir::Defaultness::Final); @@ -298,36 +262,41 @@ fn associated_type_for_effects(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<De ty::GenericArgs::empty(), ))); - // Copy generics_of of the impl, making the impl as parent. - impl_assoc_ty.generics_of({ - let parent_generics = tcx.generics_of(impl_def_id); - let parent_count = parent_generics.parent_count + parent_generics.own_params.len(); - - ty::Generics { - parent: Some(impl_def_id.to_def_id()), - parent_count, - own_params: vec![], - param_def_id_to_index: parent_generics.param_def_id_to_index.clone(), - has_self: false, - has_late_bound_regions: None, - host_effect_index: parent_generics.host_effect_index, - } - }); - - // impl_assoc_ty.explicit_item_bounds(ty::EarlyBinder::bind(&[])); - impl_assoc_ty.explicit_item_super_predicates(ty::EarlyBinder::bind(&[])); - - // There are no inferred outlives for the synthesized associated type. - impl_assoc_ty.inferred_outlives_of(&[]); - - Some(def_id) + (impl_assoc_ty, impl_def_id) } def_kind => bug!( "associated_type_for_effects: {:?} should be Trait or Impl but is {:?}", def_id, def_kind ), - } + }; + + feed.feed_hir(); + + // visibility is public. + feed.visibility(ty::Visibility::Public); + + // Copy generics_of of the trait/impl, making the trait/impl as parent. + feed.generics_of({ + let parent_generics = tcx.generics_of(parent_did); + let parent_count = parent_generics.parent_count + parent_generics.own_params.len(); + + ty::Generics { + parent: Some(parent_did.to_def_id()), + parent_count, + own_params: vec![], + param_def_id_to_index: parent_generics.param_def_id_to_index.clone(), + has_self: false, + has_late_bound_regions: None, + host_effect_index: parent_generics.host_effect_index, + } + }); + feed.explicit_item_super_predicates(ty::EarlyBinder::bind(&[])); + + // There are no inferred outlives for the synthesized associated type. + feed.inferred_outlives_of(&[]); + + Some(feed.def_id().to_def_id()) } /// Given an `fn_def_id` of a trait or a trait implementation: |
