ProjectionTy.item_def_id -> ProjectionTy.def_id
This commit is contained in:
parent
7f3af72606
commit
5c6afb850c
@ -235,7 +235,7 @@ fn push_debuginfo_type_name<'tcx>(
|
||||
let projection_bounds: SmallVec<[_; 4]> = trait_data
|
||||
.projection_bounds()
|
||||
.map(|bound| {
|
||||
let ExistentialProjection { item_def_id, term, .. } =
|
||||
let ExistentialProjection { def_id: item_def_id, term, .. } =
|
||||
tcx.erase_late_bound_regions(bound);
|
||||
// FIXME(associated_const_equality): allow for consts here
|
||||
(item_def_id, term.ty().unwrap())
|
||||
|
@ -59,7 +59,7 @@ fn print_type(mut self, ty: Ty<'tcx>) -> Result<Self::Type, Self::Error> {
|
||||
ty::Adt(ty::AdtDef(Interned(&ty::AdtDefData { did: def_id, .. }, _)), substs)
|
||||
| ty::FnDef(def_id, substs)
|
||||
| ty::Opaque(ty::OpaqueTy { def_id, substs })
|
||||
| ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs })
|
||||
| ty::Projection(ty::ProjectionTy { def_id, substs })
|
||||
| ty::Closure(def_id, substs)
|
||||
| ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs),
|
||||
ty::Foreign(def_id) => self.print_def_path(def_id, &[]),
|
||||
|
@ -1146,10 +1146,7 @@ fn add_predicates_for_ast_type_binding(
|
||||
|
||||
debug!(?substs_trait_ref_and_assoc_item);
|
||||
|
||||
ty::ProjectionTy {
|
||||
item_def_id: assoc_item.def_id,
|
||||
substs: substs_trait_ref_and_assoc_item,
|
||||
}
|
||||
ty::ProjectionTy { def_id: assoc_item.def_id, substs: substs_trait_ref_and_assoc_item }
|
||||
});
|
||||
|
||||
if !speculative {
|
||||
@ -1195,7 +1192,7 @@ fn add_predicates_for_ast_type_binding(
|
||||
// the "projection predicate" for:
|
||||
//
|
||||
// `<T as Iterator>::Item = u32`
|
||||
let assoc_item_def_id = projection_ty.skip_binder().item_def_id;
|
||||
let assoc_item_def_id = projection_ty.skip_binder().def_id;
|
||||
let def_kind = tcx.def_kind(assoc_item_def_id);
|
||||
match (def_kind, term.unpack()) {
|
||||
(hir::def::DefKind::AssocTy, ty::TermKind::Ty(_))
|
||||
|
@ -572,9 +572,9 @@ fn tcx<'a>(&'a self) -> TyCtxt<'tcx> {
|
||||
|
||||
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
if let ty::Projection(proj) = ty.kind()
|
||||
&& self.tcx().def_kind(proj.item_def_id) == DefKind::ImplTraitPlaceholder
|
||||
&& self.tcx().def_kind(proj.def_id) == DefKind::ImplTraitPlaceholder
|
||||
{
|
||||
if let Some((ty, _)) = self.types.get(&proj.item_def_id) {
|
||||
if let Some((ty, _)) = self.types.get(&proj.def_id) {
|
||||
return *ty;
|
||||
}
|
||||
//FIXME(RPITIT): Deny nested RPITIT in substs too
|
||||
@ -586,9 +586,9 @@ fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
span: self.span,
|
||||
kind: TypeVariableOriginKind::MiscVariable,
|
||||
});
|
||||
self.types.insert(proj.item_def_id, (infer_ty, proj.substs));
|
||||
self.types.insert(proj.def_id, (infer_ty, proj.substs));
|
||||
// Recurse into bounds
|
||||
for (pred, pred_span) in self.tcx().bound_explicit_item_bounds(proj.item_def_id).subst_iter_copied(self.tcx(), proj.substs) {
|
||||
for (pred, pred_span) in self.tcx().bound_explicit_item_bounds(proj.def_id).subst_iter_copied(self.tcx(), proj.substs) {
|
||||
let pred = pred.fold_with(self);
|
||||
let pred = self.ocx.normalize(
|
||||
&ObligationCause::misc(self.span, self.body_id),
|
||||
@ -601,7 +601,7 @@ fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
ObligationCause::new(
|
||||
self.span,
|
||||
self.body_id,
|
||||
ObligationCauseCode::BindingObligation(proj.item_def_id, pred_span),
|
||||
ObligationCauseCode::BindingObligation(proj.def_id, pred_span),
|
||||
),
|
||||
self.param_env,
|
||||
pred,
|
||||
@ -1735,7 +1735,7 @@ pub fn check_type_bounds<'tcx>(
|
||||
let mut predicates = param_env.caller_bounds().iter().collect::<Vec<_>>();
|
||||
match impl_ty_value.kind() {
|
||||
ty::Projection(proj)
|
||||
if proj.item_def_id == trait_ty.def_id && proj.substs == rebased_substs =>
|
||||
if proj.def_id == trait_ty.def_id && proj.substs == rebased_substs =>
|
||||
{
|
||||
// Don't include this predicate if the projected type is
|
||||
// exactly the same as the projection. This can occur in
|
||||
@ -1747,7 +1747,7 @@ pub fn check_type_bounds<'tcx>(
|
||||
ty::Binder::bind_with_vars(
|
||||
ty::ProjectionPredicate {
|
||||
projection_ty: ty::ProjectionTy {
|
||||
item_def_id: trait_ty.def_id,
|
||||
def_id: trait_ty.def_id,
|
||||
substs: rebased_substs,
|
||||
},
|
||||
term: impl_ty_value.into(),
|
||||
|
@ -352,11 +352,7 @@ fn bounds_from_generic_predicates<'tcx>(
|
||||
// insert the associated types where they correspond, but for now let's be "lazy" and
|
||||
// propose this instead of the following valid resugaring:
|
||||
// `T: Trait, Trait::Assoc = K` → `T: Trait<Assoc = K>`
|
||||
where_clauses.push(format!(
|
||||
"{} = {}",
|
||||
tcx.def_path_str(p.projection_ty.item_def_id),
|
||||
p.term,
|
||||
));
|
||||
where_clauses.push(format!("{} = {}", tcx.def_path_str(p.projection_ty.def_id), p.term,));
|
||||
}
|
||||
let where_clauses = if where_clauses.is_empty() {
|
||||
String::new()
|
||||
|
@ -759,7 +759,7 @@ impl<'tcx> TypeVisitor<'tcx> for GATSubstCollector<'tcx> {
|
||||
|
||||
fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow<Self::BreakTy> {
|
||||
match t.kind() {
|
||||
ty::Projection(p) if p.item_def_id == self.gat => {
|
||||
ty::Projection(p) if p.def_id == self.gat => {
|
||||
for (idx, subst) in p.substs.iter().enumerate() {
|
||||
match subst.unpack() {
|
||||
GenericArgKind::Lifetime(lt) if !lt.is_late_bound() => {
|
||||
@ -1593,11 +1593,11 @@ fn check_return_position_impl_trait_in_trait_bounds<'tcx>(
|
||||
for arg in fn_output.walk() {
|
||||
if let ty::GenericArgKind::Type(ty) = arg.unpack()
|
||||
&& let ty::Projection(proj) = ty.kind()
|
||||
&& tcx.def_kind(proj.item_def_id) == DefKind::ImplTraitPlaceholder
|
||||
&& tcx.impl_trait_in_trait_parent(proj.item_def_id) == fn_def_id.to_def_id()
|
||||
&& tcx.def_kind(proj.def_id) == DefKind::ImplTraitPlaceholder
|
||||
&& tcx.impl_trait_in_trait_parent(proj.def_id) == fn_def_id.to_def_id()
|
||||
{
|
||||
let span = tcx.def_span(proj.item_def_id);
|
||||
let bounds = wfcx.tcx().explicit_item_bounds(proj.item_def_id);
|
||||
let span = tcx.def_span(proj.def_id);
|
||||
let bounds = wfcx.tcx().explicit_item_bounds(proj.def_id);
|
||||
let wf_obligations = bounds.iter().flat_map(|&(bound, bound_span)| {
|
||||
let bound = ty::EarlyBinder(bound).subst(tcx, proj.substs);
|
||||
let normalized_bound = wfcx.normalize(span, None, bound);
|
||||
|
@ -413,7 +413,7 @@ pub(super) fn explicit_predicates_of<'tcx>(
|
||||
// supertrait).
|
||||
if let ty::Projection(projection) = ty.kind() {
|
||||
projection.substs == trait_identity_substs
|
||||
&& tcx.associated_item(projection.item_def_id).container_id(tcx) == def_id
|
||||
&& tcx.associated_item(projection.def_id).container_id(tcx) == def_id
|
||||
} else {
|
||||
false
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ pub(super) fn opt_const_param_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<
|
||||
// as a precaution for if it's ever allowed to elide lifetimes in GAT's. It currently isn't
|
||||
// but it can't hurt to be safe ^^
|
||||
if let ty::Projection(projection) = ty.kind() {
|
||||
let generics = tcx.generics_of(projection.item_def_id);
|
||||
let generics = tcx.generics_of(projection.def_id);
|
||||
|
||||
let arg_index = segment
|
||||
.args
|
||||
|
@ -202,7 +202,7 @@ fn insert_required_predicates_to_be_wf<'tcx>(
|
||||
debug!("Projection");
|
||||
check_explicit_predicates(
|
||||
tcx,
|
||||
tcx.parent(obj.item_def_id),
|
||||
tcx.parent(obj.def_id),
|
||||
obj.substs,
|
||||
required_predicates,
|
||||
explicit_map,
|
||||
|
@ -90,7 +90,7 @@ pub(crate) fn insert_outlives_predicate<'tcx>(
|
||||
// ```
|
||||
//
|
||||
// Here we want to add an explicit `where <T as Iterator>::Item: 'a`.
|
||||
let ty: Ty<'tcx> = tcx.mk_projection(proj_ty.item_def_id, proj_ty.substs);
|
||||
let ty: Ty<'tcx> = tcx.mk_projection(proj_ty.def_id, proj_ty.substs);
|
||||
required_predicates
|
||||
.entry(ty::OutlivesPredicate(ty.into(), outlived_region))
|
||||
.or_insert(span);
|
||||
|
@ -110,12 +110,13 @@ fn visit_region(&mut self, r: ty::Region<'tcx>) -> ControlFlow<Self::BreakTy> {
|
||||
|
||||
#[instrument(level = "trace", skip(self), ret)]
|
||||
fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow<Self::BreakTy> {
|
||||
match t.kind() {
|
||||
ty::Opaque(def_id, substs) => self.visit_opaque(*def_id, substs),
|
||||
// FIXME(alias): merge these
|
||||
match t.kind() {
|
||||
ty::Opaque(ty::OpaqueTy { def_id, substs }) => self.visit_opaque(*def_id, substs),
|
||||
ty::Projection(proj)
|
||||
if self.tcx.def_kind(proj.item_def_id) == DefKind::ImplTraitPlaceholder =>
|
||||
if self.tcx.def_kind(proj.def_id) == DefKind::ImplTraitPlaceholder =>
|
||||
{
|
||||
self.visit_opaque(proj.item_def_id, proj.substs)
|
||||
self.visit_opaque(proj.def_id, proj.substs)
|
||||
}
|
||||
_ => t.super_visit_with(self),
|
||||
}
|
||||
@ -167,7 +168,7 @@ fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow<Self::BreakTy> {
|
||||
}
|
||||
}
|
||||
ty::PredicateKind::Clause(ty::Clause::Projection(ty::ProjectionPredicate {
|
||||
projection_ty: ty::ProjectionTy { substs, item_def_id: _ },
|
||||
projection_ty: ty::ProjectionTy { substs, def_id: _ },
|
||||
term,
|
||||
})) => {
|
||||
for subst in &substs[1..] {
|
||||
|
@ -684,10 +684,10 @@ fn deduce_future_output_from_obligations(
|
||||
.find_map(|(p, s)| get_future_output(p, s))?,
|
||||
ty::Error(_) => return None,
|
||||
ty::Projection(proj)
|
||||
if self.tcx.def_kind(proj.item_def_id) == DefKind::ImplTraitPlaceholder =>
|
||||
if self.tcx.def_kind(proj.def_id) == DefKind::ImplTraitPlaceholder =>
|
||||
{
|
||||
self.tcx
|
||||
.bound_explicit_item_bounds(proj.item_def_id)
|
||||
.bound_explicit_item_bounds(proj.def_id)
|
||||
.subst_iter_copied(self.tcx, proj.substs)
|
||||
.find_map(|(p, s)| get_future_output(p, s))?
|
||||
}
|
||||
@ -743,11 +743,11 @@ fn deduce_future_output_from_projection(
|
||||
// The `Future` trait has only one associated item, `Output`,
|
||||
// so check that this is what we see.
|
||||
let output_assoc_item = self.tcx.associated_item_def_ids(future_trait)[0];
|
||||
if output_assoc_item != predicate.projection_ty.item_def_id {
|
||||
if output_assoc_item != predicate.projection_ty.def_id {
|
||||
span_bug!(
|
||||
cause_span,
|
||||
"projecting associated item `{:?}` from future, which is not Output `{:?}`",
|
||||
predicate.projection_ty.item_def_id,
|
||||
predicate.projection_ty.def_id,
|
||||
output_assoc_item,
|
||||
);
|
||||
}
|
||||
|
@ -177,7 +177,7 @@ pub(in super::super) fn extract_callable_info(
|
||||
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||
self.tcx.bound_item_bounds(def_id).subst(self.tcx, substs).iter().find_map(|pred| {
|
||||
if let ty::PredicateKind::Clause(ty::Clause::Projection(proj)) = pred.kind().skip_binder()
|
||||
&& Some(proj.projection_ty.item_def_id) == self.tcx.lang_items().fn_once_output()
|
||||
&& Some(proj.projection_ty.def_id) == self.tcx.lang_items().fn_once_output()
|
||||
// args tuple will always be substs[1]
|
||||
&& let ty::Tuple(args) = proj.projection_ty.substs.type_at(1).kind()
|
||||
{
|
||||
@ -194,7 +194,7 @@ pub(in super::super) fn extract_callable_info(
|
||||
ty::Dynamic(data, _, ty::Dyn) => {
|
||||
data.iter().find_map(|pred| {
|
||||
if let ty::ExistentialPredicate::Projection(proj) = pred.skip_binder()
|
||||
&& Some(proj.item_def_id) == self.tcx.lang_items().fn_once_output()
|
||||
&& Some(proj.def_id) == self.tcx.lang_items().fn_once_output()
|
||||
// for existential projection, substs are shifted over by 1
|
||||
&& let ty::Tuple(args) = proj.substs.type_at(0).kind()
|
||||
{
|
||||
@ -212,7 +212,7 @@ pub(in super::super) fn extract_callable_info(
|
||||
let def_id = self.tcx.generics_of(self.body_id.owner).type_param(¶m, self.tcx).def_id;
|
||||
self.tcx.predicates_of(self.body_id.owner).predicates.iter().find_map(|(pred, _)| {
|
||||
if let ty::PredicateKind::Clause(ty::Clause::Projection(proj)) = pred.kind().skip_binder()
|
||||
&& Some(proj.projection_ty.item_def_id) == self.tcx.lang_items().fn_once_output()
|
||||
&& Some(proj.projection_ty.def_id) == self.tcx.lang_items().fn_once_output()
|
||||
&& proj.projection_ty.self_ty() == found
|
||||
// args tuple will always be substs[1]
|
||||
&& let ty::Tuple(args) = proj.projection_ty.substs.type_at(1).kind()
|
||||
|
@ -559,7 +559,7 @@ pub fn report_method_error(
|
||||
|
||||
let quiet_projection_ty = ty::ProjectionTy {
|
||||
substs: substs_with_infer_self,
|
||||
item_def_id: projection_ty.item_def_id,
|
||||
def_id: projection_ty.def_id,
|
||||
};
|
||||
|
||||
let term = pred.skip_binder().term;
|
||||
@ -2269,7 +2269,7 @@ fn suggest_traits_to_import(
|
||||
t.def_id() == info.def_id
|
||||
}
|
||||
ty::PredicateKind::Clause(ty::Clause::Projection(p)) => {
|
||||
p.projection_ty.item_def_id == info.def_id
|
||||
p.projection_ty.def_id == info.def_id
|
||||
}
|
||||
_ => false,
|
||||
}
|
||||
|
@ -419,8 +419,8 @@ fn to_trace(
|
||||
a: Self,
|
||||
b: Self,
|
||||
) -> TypeTrace<'tcx> {
|
||||
let a_ty = tcx.mk_projection(a.item_def_id, a.substs);
|
||||
let b_ty = tcx.mk_projection(b.item_def_id, b.substs);
|
||||
let a_ty = tcx.mk_projection(a.def_id, a.substs);
|
||||
let b_ty = tcx.mk_projection(b.def_id, b.substs);
|
||||
TypeTrace {
|
||||
cause: cause.clone(),
|
||||
values: Terms(ExpectedFound::new(a_is_expected, a_ty.into(), b_ty.into())),
|
||||
|
@ -342,9 +342,9 @@ pub fn get_impl_future_output_ty(&self, ty: Ty<'tcx>) -> Option<Ty<'tcx>> {
|
||||
let (def_id, substs) = match *ty.kind() {
|
||||
ty::Opaque(ty::OpaqueTy { def_id, substs }) => (def_id, substs),
|
||||
ty::Projection(data)
|
||||
if self.tcx.def_kind(data.item_def_id) == DefKind::ImplTraitPlaceholder =>
|
||||
if self.tcx.def_kind(data.def_id) == DefKind::ImplTraitPlaceholder =>
|
||||
{
|
||||
(data.item_def_id, data.substs)
|
||||
(data.def_id, data.substs)
|
||||
}
|
||||
_ => return None,
|
||||
};
|
||||
@ -358,7 +358,7 @@ pub fn get_impl_future_output_ty(&self, ty: Ty<'tcx>) -> Option<Ty<'tcx>> {
|
||||
.kind()
|
||||
.map_bound(|kind| match kind {
|
||||
ty::PredicateKind::Clause(ty::Clause::Projection(projection_predicate))
|
||||
if projection_predicate.projection_ty.item_def_id == item_def_id =>
|
||||
if projection_predicate.projection_ty.def_id == item_def_id =>
|
||||
{
|
||||
projection_predicate.term.ty()
|
||||
}
|
||||
@ -1743,11 +1743,11 @@ enum Similar<'tcx> {
|
||||
)
|
||||
}
|
||||
(true, ty::Projection(proj))
|
||||
if self.tcx.def_kind(proj.item_def_id)
|
||||
if self.tcx.def_kind(proj.def_id)
|
||||
== DefKind::ImplTraitPlaceholder =>
|
||||
{
|
||||
let sm = self.tcx.sess.source_map();
|
||||
let pos = sm.lookup_char_pos(self.tcx.def_span(proj.item_def_id).lo());
|
||||
let pos = sm.lookup_char_pos(self.tcx.def_span(proj.def_id).lo());
|
||||
format!(
|
||||
" (trait associated opaque type at <{}:{}:{}>)",
|
||||
sm.filename_for_diagnostics(&pos.file.name),
|
||||
|
@ -509,7 +509,7 @@ pub fn could_remove_semicolon(
|
||||
(
|
||||
hir::ItemKind::OpaqueTy(hir::OpaqueTy { bounds: last_bounds, .. }),
|
||||
hir::ItemKind::OpaqueTy(hir::OpaqueTy { bounds: exp_bounds, .. }),
|
||||
) if iter::zip(*last_bounds, *exp_bounds).all(|(left, right)| {
|
||||
) if std::iter::zip(*last_bounds, *exp_bounds).all(|(left, right)| {
|
||||
match (left, right) {
|
||||
(
|
||||
hir::GenericBound::Trait(tl, ml),
|
||||
|
@ -490,10 +490,10 @@ fn visit_ty(&mut self, ty: Ty<'tcx>) -> ControlFlow<Self::BreakTy> {
|
||||
}
|
||||
|
||||
ty::Projection(proj)
|
||||
if self.tcx.def_kind(proj.item_def_id) == DefKind::ImplTraitPlaceholder =>
|
||||
if self.tcx.def_kind(proj.def_id) == DefKind::ImplTraitPlaceholder =>
|
||||
{
|
||||
// Skip lifetime paramters that are not captures.
|
||||
let variances = self.tcx.variances_of(proj.item_def_id);
|
||||
let variances = self.tcx.variances_of(proj.def_id);
|
||||
|
||||
for (v, s) in std::iter::zip(variances, proj.substs.iter()) {
|
||||
if *v != ty::Variance::Bivariant {
|
||||
@ -568,7 +568,7 @@ fn register_hidden_type(
|
||||
// FIXME(RPITIT): Don't replace RPITITs with inference vars.
|
||||
ty::Projection(projection_ty)
|
||||
if !projection_ty.has_escaping_bound_vars()
|
||||
&& tcx.def_kind(projection_ty.item_def_id)
|
||||
&& tcx.def_kind(projection_ty.def_id)
|
||||
!= DefKind::ImplTraitPlaceholder =>
|
||||
{
|
||||
self.infer_projection(
|
||||
@ -588,7 +588,7 @@ fn register_hidden_type(
|
||||
}
|
||||
// FIXME(RPITIT): This can go away when we move to associated types
|
||||
ty::Projection(proj)
|
||||
if def_id.to_def_id() == proj.item_def_id && substs == proj.substs =>
|
||||
if def_id.to_def_id() == proj.def_id && substs == proj.substs =>
|
||||
{
|
||||
hidden_ty
|
||||
}
|
||||
|
@ -355,11 +355,11 @@ fn projection_must_outlive(
|
||||
origin,
|
||||
region,
|
||||
GenericKind::Projection(projection_ty),
|
||||
projection_ty.item_def_id,
|
||||
projection_ty.def_id,
|
||||
projection_ty.substs,
|
||||
false,
|
||||
|ty| match ty.kind() {
|
||||
ty::Projection(projection_ty) => (projection_ty.item_def_id, projection_ty.substs),
|
||||
ty::Projection(projection_ty) => (projection_ty.def_id, projection_ty.substs),
|
||||
_ => bug!("expected only projection types from env, not {:?}", ty),
|
||||
},
|
||||
);
|
||||
|
@ -178,7 +178,7 @@ fn bound_from_single_component(
|
||||
),
|
||||
Component::Projection(projection_ty) => self.projection_opaque_bounds(
|
||||
GenericKind::Projection(projection_ty),
|
||||
projection_ty.item_def_id,
|
||||
projection_ty.def_id,
|
||||
projection_ty.substs,
|
||||
visited,
|
||||
),
|
||||
|
@ -21,7 +21,7 @@ pub fn infer_projection(
|
||||
recursion_depth: usize,
|
||||
obligations: &mut Vec<PredicateObligation<'tcx>>,
|
||||
) -> Ty<'tcx> {
|
||||
let def_id = projection_ty.item_def_id;
|
||||
let def_id = projection_ty.def_id;
|
||||
let ty_var = self.next_ty_var(TypeVariableOrigin {
|
||||
kind: TypeVariableOriginKind::NormalizeProjectionType,
|
||||
span: self.tcx.def_span(def_id),
|
||||
|
@ -773,7 +773,7 @@ impl<'tcx> GenericKind<'tcx> {
|
||||
pub fn to_ty(&self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> {
|
||||
match *self {
|
||||
GenericKind::Param(ref p) => p.to_ty(tcx),
|
||||
GenericKind::Projection(ref p) => tcx.mk_projection(p.item_def_id, p.substs),
|
||||
GenericKind::Projection(ref p) => tcx.mk_projection(p.def_id, p.substs),
|
||||
GenericKind::Opaque(def_id, substs) => tcx.mk_opaque(def_id, substs),
|
||||
}
|
||||
}
|
||||
|
@ -259,8 +259,7 @@ fn elaborate(&mut self, obligation: &PredicateObligation<'tcx>) {
|
||||
Component::Projection(projection) => {
|
||||
// We might end up here if we have `Foo<<Bar as Baz>::Assoc>: 'a`.
|
||||
// With this, we can deduce that `<Bar as Baz>::Assoc: 'a`.
|
||||
let ty =
|
||||
tcx.mk_projection(projection.item_def_id, projection.substs);
|
||||
let ty = tcx.mk_projection(projection.def_id, projection.substs);
|
||||
Some(ty::PredicateKind::Clause(ty::Clause::TypeOutlives(
|
||||
ty::OutlivesPredicate(ty, r_min),
|
||||
)))
|
||||
|
@ -82,7 +82,7 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'tcx>) {
|
||||
let Some(proj_term) = proj.term.ty() else { continue };
|
||||
|
||||
let proj_ty =
|
||||
cx.tcx.mk_projection(proj.projection_ty.item_def_id, proj.projection_ty.substs);
|
||||
cx.tcx.mk_projection(proj.projection_ty.def_id, proj.projection_ty.substs);
|
||||
// For every instance of the projection type in the bounds,
|
||||
// replace them with the term we're assigning to the associated
|
||||
// type in our opaque type.
|
||||
@ -97,7 +97,7 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'tcx>) {
|
||||
// with `impl Send: OtherTrait`.
|
||||
for (assoc_pred, assoc_pred_span) in cx
|
||||
.tcx
|
||||
.bound_explicit_item_bounds(proj.projection_ty.item_def_id)
|
||||
.bound_explicit_item_bounds(proj.projection_ty.def_id)
|
||||
.subst_iter_copied(cx.tcx, &proj.projection_ty.substs)
|
||||
{
|
||||
let assoc_pred = assoc_pred.fold_with(proj_replacer);
|
||||
|
@ -1112,7 +1112,7 @@ fn should_encode_trait_impl_trait_tys<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) ->
|
||||
tcx.fn_sig(trait_item_def_id).skip_binder().output().walk().any(|arg| {
|
||||
if let ty::GenericArgKind::Type(ty) = arg.unpack()
|
||||
&& let ty::Projection(data) = ty.kind()
|
||||
&& tcx.def_kind(data.item_def_id) == DefKind::ImplTraitPlaceholder
|
||||
&& tcx.def_kind(data.def_id) == DefKind::ImplTraitPlaceholder
|
||||
{
|
||||
true
|
||||
} else {
|
||||
|
@ -2599,7 +2599,7 @@ pub fn mk_projection(self, item_def_id: DefId, substs: SubstsRef<'tcx>) -> Ty<'t
|
||||
substs.len(),
|
||||
"wrong number of generic parameters for {item_def_id:?}: {substs:?}",
|
||||
);
|
||||
self.mk_ty(Projection(ProjectionTy { item_def_id, substs }))
|
||||
self.mk_ty(Projection(ProjectionTy { def_id: item_def_id, substs }))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -443,7 +443,7 @@ pub fn note_and_explain_type_err(
|
||||
diag.note("an associated type was expected, but a different one was found");
|
||||
}
|
||||
(ty::Param(p), ty::Projection(proj)) | (ty::Projection(proj), ty::Param(p))
|
||||
if self.def_kind(proj.item_def_id) != DefKind::ImplTraitPlaceholder =>
|
||||
if self.def_kind(proj.def_id) != DefKind::ImplTraitPlaceholder =>
|
||||
{
|
||||
let generics = self.generics_of(body_owner_def_id);
|
||||
let p_span = self.def_span(generics.type_param(p, self).def_id);
|
||||
@ -466,7 +466,7 @@ pub fn note_and_explain_type_err(
|
||||
let (trait_ref, assoc_substs) = proj.trait_ref_and_own_substs(self);
|
||||
let path =
|
||||
self.def_path_str_with_substs(trait_ref.def_id, trait_ref.substs);
|
||||
let item_name = self.item_name(proj.item_def_id);
|
||||
let item_name = self.item_name(proj.def_id);
|
||||
let item_args = self.format_generic_args(assoc_substs);
|
||||
|
||||
let path = if path.ends_with('>') {
|
||||
@ -553,7 +553,7 @@ fn foo(&self, x: T) -> T { x }
|
||||
diag.span_label(p_span, "this type parameter");
|
||||
}
|
||||
}
|
||||
(ty::Projection(proj_ty), _) if self.def_kind(proj_ty.item_def_id) != DefKind::ImplTraitPlaceholder => {
|
||||
(ty::Projection(proj_ty), _) if self.def_kind(proj_ty.def_id) != DefKind::ImplTraitPlaceholder => {
|
||||
self.expected_projection(
|
||||
diag,
|
||||
proj_ty,
|
||||
@ -562,7 +562,7 @@ fn foo(&self, x: T) -> T { x }
|
||||
cause.code(),
|
||||
);
|
||||
}
|
||||
(_, ty::Projection(proj_ty)) if self.def_kind(proj_ty.item_def_id) != DefKind::ImplTraitPlaceholder => {
|
||||
(_, ty::Projection(proj_ty)) if self.def_kind(proj_ty.def_id) != DefKind::ImplTraitPlaceholder => {
|
||||
let msg = format!(
|
||||
"consider constraining the associated type `{}` to `{}`",
|
||||
values.found, values.expected,
|
||||
@ -627,7 +627,7 @@ fn suggest_constraint(
|
||||
proj_ty: &ty::ProjectionTy<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
) -> bool {
|
||||
let assoc = self.associated_item(proj_ty.item_def_id);
|
||||
let assoc = self.associated_item(proj_ty.def_id);
|
||||
let (trait_ref, assoc_substs) = proj_ty.trait_ref_and_own_substs(self);
|
||||
if let Some(item) = self.hir().get_if_local(body_owner_def_id) {
|
||||
if let Some(hir_generics) = item.generics() {
|
||||
@ -703,7 +703,7 @@ fn expected_projection(
|
||||
);
|
||||
let impl_comparison =
|
||||
matches!(cause_code, ObligationCauseCode::CompareImplItemObligation { .. });
|
||||
let assoc = self.associated_item(proj_ty.item_def_id);
|
||||
let assoc = self.associated_item(proj_ty.def_id);
|
||||
if !callable_scope || impl_comparison {
|
||||
// We do not want to suggest calling functions when the reason of the
|
||||
// type error is a comparison of an `impl` with its `trait` or when the
|
||||
@ -716,7 +716,7 @@ fn expected_projection(
|
||||
diag,
|
||||
assoc.container_id(self),
|
||||
current_method_ident,
|
||||
proj_ty.item_def_id,
|
||||
proj_ty.def_id,
|
||||
values.expected,
|
||||
);
|
||||
// Possibly suggest constraining the associated type to conform to the
|
||||
@ -778,7 +778,7 @@ fn suggest_constraining_opaque_associated_type(
|
||||
proj_ty: &ty::ProjectionTy<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
) -> bool {
|
||||
let assoc = self.associated_item(proj_ty.item_def_id);
|
||||
let assoc = self.associated_item(proj_ty.def_id);
|
||||
if let ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) = *proj_ty.self_ty().kind() {
|
||||
let opaque_local_def_id = def_id.as_local();
|
||||
let opaque_hir_ty = if let Some(opaque_local_def_id) = opaque_local_def_id {
|
||||
@ -828,7 +828,7 @@ fn point_at_methods_that_satisfy_associated_type(
|
||||
.filter_map(|(_, item)| {
|
||||
let method = self.fn_sig(item.def_id);
|
||||
match *method.output().skip_binder().kind() {
|
||||
ty::Projection(ty::ProjectionTy { item_def_id, .. })
|
||||
ty::Projection(ty::ProjectionTy { def_id: item_def_id, .. })
|
||||
if item_def_id == proj_ty_item_def_id =>
|
||||
{
|
||||
Some((
|
||||
|
@ -1046,7 +1046,7 @@ pub fn term(&self) -> Binder<'tcx, Term<'tcx>> {
|
||||
/// associated type, which is in `tcx.associated_item(projection_def_id()).container`.
|
||||
pub fn projection_def_id(&self) -> DefId {
|
||||
// Ok to skip binder since trait `DefId` does not care about regions.
|
||||
self.skip_binder().projection_ty.item_def_id
|
||||
self.skip_binder().projection_ty.def_id
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -720,9 +720,9 @@ fn pretty_print_type(mut self, ty: Ty<'tcx>) -> Result<Self::Type, Self::Error>
|
||||
}
|
||||
ty::Projection(ref data) => {
|
||||
if !(self.should_print_verbose() || NO_QUERIES.with(|q| q.get()))
|
||||
&& self.tcx().def_kind(data.item_def_id) == DefKind::ImplTraitPlaceholder
|
||||
&& self.tcx().def_kind(data.def_id) == DefKind::ImplTraitPlaceholder
|
||||
{
|
||||
return self.pretty_print_opaque_impl_type(data.item_def_id, data.substs);
|
||||
return self.pretty_print_opaque_impl_type(data.def_id, data.substs);
|
||||
} else {
|
||||
p!(print(data))
|
||||
}
|
||||
@ -1022,7 +1022,7 @@ fn pretty_print_opaque_impl_type(
|
||||
// unless we can find out what generator return type it comes from.
|
||||
let term = if let Some(ty) = term.skip_binder().ty()
|
||||
&& let ty::Projection(proj) = ty.kind()
|
||||
&& let Some(assoc) = tcx.opt_associated_item(proj.item_def_id)
|
||||
&& let Some(assoc) = tcx.opt_associated_item(proj.def_id)
|
||||
&& assoc.trait_container(tcx) == tcx.lang_items().gen_trait()
|
||||
&& assoc.name == rustc_span::sym::Return
|
||||
{
|
||||
@ -2655,7 +2655,7 @@ pub struct PrintClosureAsImpl<'tcx> {
|
||||
}
|
||||
|
||||
ty::ExistentialProjection<'tcx> {
|
||||
let name = cx.tcx().associated_item(self.item_def_id).name;
|
||||
let name = cx.tcx().associated_item(self.def_id).name;
|
||||
p!(write("{} = ", name), print(self.term))
|
||||
}
|
||||
|
||||
@ -2743,7 +2743,7 @@ pub struct PrintClosureAsImpl<'tcx> {
|
||||
}
|
||||
|
||||
ty::ProjectionTy<'tcx> {
|
||||
p!(print_def_path(self.item_def_id, self.substs));
|
||||
p!(print_def_path(self.def_id, self.substs));
|
||||
}
|
||||
|
||||
ty::ClosureKind {
|
||||
|
@ -276,15 +276,11 @@ fn relate<R: TypeRelation<'tcx>>(
|
||||
a: ty::ProjectionTy<'tcx>,
|
||||
b: ty::ProjectionTy<'tcx>,
|
||||
) -> RelateResult<'tcx, ty::ProjectionTy<'tcx>> {
|
||||
if a.item_def_id != b.item_def_id {
|
||||
Err(TypeError::ProjectionMismatched(expected_found(
|
||||
relation,
|
||||
a.item_def_id,
|
||||
b.item_def_id,
|
||||
)))
|
||||
if a.def_id != b.def_id {
|
||||
Err(TypeError::ProjectionMismatched(expected_found(relation, a.def_id, b.def_id)))
|
||||
} else {
|
||||
let substs = relation.relate(a.substs, b.substs)?;
|
||||
Ok(ty::ProjectionTy { item_def_id: a.item_def_id, substs: &substs })
|
||||
Ok(ty::ProjectionTy { def_id: a.def_id, substs: &substs })
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -295,12 +291,8 @@ fn relate<R: TypeRelation<'tcx>>(
|
||||
a: ty::ExistentialProjection<'tcx>,
|
||||
b: ty::ExistentialProjection<'tcx>,
|
||||
) -> RelateResult<'tcx, ty::ExistentialProjection<'tcx>> {
|
||||
if a.item_def_id != b.item_def_id {
|
||||
Err(TypeError::ProjectionMismatched(expected_found(
|
||||
relation,
|
||||
a.item_def_id,
|
||||
b.item_def_id,
|
||||
)))
|
||||
if a.def_id != b.def_id {
|
||||
Err(TypeError::ProjectionMismatched(expected_found(relation, a.def_id, b.def_id)))
|
||||
} else {
|
||||
let term = relation.relate_with_variance(
|
||||
ty::Invariant,
|
||||
@ -314,7 +306,7 @@ fn relate<R: TypeRelation<'tcx>>(
|
||||
a.substs,
|
||||
b.substs,
|
||||
)?;
|
||||
Ok(ty::ExistentialProjection { item_def_id: a.item_def_id, substs, term })
|
||||
Ok(ty::ExistentialProjection { def_id: a.def_id, substs, term })
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -561,7 +553,7 @@ pub fn super_relate_tys<'tcx, R: TypeRelation<'tcx>>(
|
||||
// these two are already handled downstream in case of lazy normalization
|
||||
(&ty::Projection(a_data), &ty::Projection(b_data)) => {
|
||||
let projection_ty = relation.relate(a_data, b_data)?;
|
||||
Ok(tcx.mk_projection(projection_ty.item_def_id, projection_ty.substs))
|
||||
Ok(tcx.mk_projection(projection_ty.def_id, projection_ty.substs))
|
||||
}
|
||||
|
||||
(
|
||||
|
@ -693,7 +693,7 @@ pub fn stable_cmp(&self, tcx: TyCtxt<'tcx>, other: &Self) -> Ordering {
|
||||
match (*self, *other) {
|
||||
(Trait(_), Trait(_)) => Ordering::Equal,
|
||||
(Projection(ref a), Projection(ref b)) => {
|
||||
tcx.def_path_hash(a.item_def_id).cmp(&tcx.def_path_hash(b.item_def_id))
|
||||
tcx.def_path_hash(a.def_id).cmp(&tcx.def_path_hash(b.def_id))
|
||||
}
|
||||
(AutoTrait(ref a), AutoTrait(ref b)) => {
|
||||
tcx.def_path_hash(*a).cmp(&tcx.def_path_hash(*b))
|
||||
@ -1152,15 +1152,15 @@ pub struct ProjectionTy<'tcx> {
|
||||
/// Note that this is not the `DefId` of the `TraitRef` containing this
|
||||
/// associated type, which is in `tcx.associated_item(item_def_id).container`,
|
||||
/// aka. `tcx.parent(item_def_id).unwrap()`.
|
||||
pub item_def_id: DefId,
|
||||
pub def_id: DefId,
|
||||
}
|
||||
|
||||
impl<'tcx> ProjectionTy<'tcx> {
|
||||
pub fn trait_def_id(&self, tcx: TyCtxt<'tcx>) -> DefId {
|
||||
match tcx.def_kind(self.item_def_id) {
|
||||
DefKind::AssocTy | DefKind::AssocConst => tcx.parent(self.item_def_id),
|
||||
match tcx.def_kind(self.def_id) {
|
||||
DefKind::AssocTy | DefKind::AssocConst => tcx.parent(self.def_id),
|
||||
DefKind::ImplTraitPlaceholder => {
|
||||
tcx.parent(tcx.impl_trait_in_trait_parent(self.item_def_id))
|
||||
tcx.parent(tcx.impl_trait_in_trait_parent(self.def_id))
|
||||
}
|
||||
kind => bug!("unexpected DefKind in ProjectionTy: {kind:?}"),
|
||||
}
|
||||
@ -1173,7 +1173,7 @@ pub fn trait_ref_and_own_substs(
|
||||
&self,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
) -> (ty::TraitRef<'tcx>, &'tcx [ty::GenericArg<'tcx>]) {
|
||||
let def_id = tcx.parent(self.item_def_id);
|
||||
let def_id = tcx.parent(self.def_id);
|
||||
assert_eq!(tcx.def_kind(def_id), DefKind::Trait);
|
||||
let trait_generics = tcx.generics_of(def_id);
|
||||
(
|
||||
@ -1415,7 +1415,7 @@ fn from(var: BoundVar) -> Self {
|
||||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, TyEncodable, TyDecodable)]
|
||||
#[derive(HashStable, TypeFoldable, TypeVisitable, Lift)]
|
||||
pub struct ExistentialProjection<'tcx> {
|
||||
pub item_def_id: DefId,
|
||||
pub def_id: DefId,
|
||||
pub substs: SubstsRef<'tcx>,
|
||||
pub term: Term<'tcx>,
|
||||
}
|
||||
@ -1428,7 +1428,7 @@ impl<'tcx> ExistentialProjection<'tcx> {
|
||||
/// then this function would return an `exists T. T: Iterator` existential trait
|
||||
/// reference.
|
||||
pub fn trait_ref(&self, tcx: TyCtxt<'tcx>) -> ty::ExistentialTraitRef<'tcx> {
|
||||
let def_id = tcx.parent(self.item_def_id);
|
||||
let def_id = tcx.parent(self.def_id);
|
||||
let subst_count = tcx.generics_of(def_id).count() - 1;
|
||||
let substs = tcx.intern_substs(&self.substs[..subst_count]);
|
||||
ty::ExistentialTraitRef { def_id, substs }
|
||||
@ -1444,7 +1444,7 @@ pub fn with_self_ty(
|
||||
|
||||
ty::ProjectionPredicate {
|
||||
projection_ty: ty::ProjectionTy {
|
||||
item_def_id: self.item_def_id,
|
||||
def_id: self.def_id,
|
||||
substs: tcx.mk_substs_trait(self_ty, self.substs),
|
||||
},
|
||||
term: self.term,
|
||||
@ -1459,7 +1459,7 @@ pub fn erase_self_ty(
|
||||
projection_predicate.projection_ty.substs.type_at(0);
|
||||
|
||||
Self {
|
||||
item_def_id: projection_predicate.projection_ty.item_def_id,
|
||||
def_id: projection_predicate.projection_ty.def_id,
|
||||
substs: tcx.intern_substs(&projection_predicate.projection_ty.substs[1..]),
|
||||
term: projection_predicate.term,
|
||||
}
|
||||
@ -1476,7 +1476,7 @@ pub fn with_self_ty(
|
||||
}
|
||||
|
||||
pub fn item_def_id(&self) -> DefId {
|
||||
self.skip_binder().item_def_id
|
||||
self.skip_binder().def_id
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -123,13 +123,13 @@ fn visit_projection_ty(
|
||||
projection: ty::ProjectionTy<'tcx>,
|
||||
) -> ControlFlow<V::BreakTy> {
|
||||
let tcx = self.def_id_visitor.tcx();
|
||||
let (trait_ref, assoc_substs) = if tcx.def_kind(projection.item_def_id)
|
||||
let (trait_ref, assoc_substs) = if tcx.def_kind(projection.def_id)
|
||||
!= DefKind::ImplTraitPlaceholder
|
||||
{
|
||||
projection.trait_ref_and_own_substs(tcx)
|
||||
} else {
|
||||
// HACK(RPITIT): Remove this when RPITITs are lowered to regular assoc tys
|
||||
let def_id = tcx.impl_trait_in_trait_parent(projection.item_def_id);
|
||||
let def_id = tcx.impl_trait_in_trait_parent(projection.def_id);
|
||||
let trait_generics = tcx.generics_of(def_id);
|
||||
(
|
||||
ty::TraitRef { def_id, substs: projection.substs.truncate_to(tcx, trait_generics) },
|
||||
|
@ -217,7 +217,7 @@ fn print_type(mut self, ty: Ty<'tcx>) -> Result<Self::Type, Self::Error> {
|
||||
// Print all nominal types as paths (unlike `pretty_print_type`).
|
||||
ty::FnDef(def_id, substs)
|
||||
| ty::Opaque(ty::OpaqueTy { def_id, substs })
|
||||
| ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs })
|
||||
| ty::Projection(ty::ProjectionTy { def_id, substs })
|
||||
| ty::Closure(def_id, substs)
|
||||
| ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs),
|
||||
|
||||
|
@ -240,7 +240,7 @@ fn encode_predicate<'tcx>(
|
||||
s.push_str(&encode_substs(tcx, trait_ref.substs, dict, options));
|
||||
}
|
||||
ty::ExistentialPredicate::Projection(projection) => {
|
||||
let name = encode_ty_name(tcx, projection.item_def_id);
|
||||
let name = encode_ty_name(tcx, projection.def_id);
|
||||
let _ = write!(s, "u{}{}", name.len(), &name);
|
||||
s.push_str(&encode_substs(tcx, projection.substs, dict, options));
|
||||
match projection.term.unpack() {
|
||||
|
@ -440,7 +440,7 @@ fn print_type(mut self, ty: Ty<'tcx>) -> Result<Self::Type, Self::Error> {
|
||||
ty::Adt(ty::AdtDef(Interned(&ty::AdtDefData { did: def_id, .. }, _)), substs)
|
||||
| ty::FnDef(def_id, substs)
|
||||
| ty::Opaque(ty::OpaqueTy { def_id, substs })
|
||||
| ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs })
|
||||
| ty::Projection(ty::ProjectionTy { def_id, substs })
|
||||
| ty::Closure(def_id, substs)
|
||||
| ty::Generator(def_id, substs, _) => {
|
||||
self = self.print_def_path(def_id, substs)?;
|
||||
@ -544,7 +544,7 @@ fn print_dyn_existential(
|
||||
cx = cx.print_def_path(trait_ref.def_id, trait_ref.substs)?;
|
||||
}
|
||||
ty::ExistentialPredicate::Projection(projection) => {
|
||||
let name = cx.tcx.associated_item(projection.item_def_id).name;
|
||||
let name = cx.tcx.associated_item(projection.def_id).name;
|
||||
cx.push("p");
|
||||
cx.push_ident(name.as_str());
|
||||
cx = match projection.term.unpack() {
|
||||
|
@ -1634,8 +1634,7 @@ fn report_projection_error(
|
||||
let normalized_ty = ocx.normalize(
|
||||
&obligation.cause,
|
||||
obligation.param_env,
|
||||
self.tcx
|
||||
.mk_projection(data.projection_ty.item_def_id, data.projection_ty.substs),
|
||||
self.tcx.mk_projection(data.projection_ty.def_id, data.projection_ty.substs),
|
||||
);
|
||||
|
||||
debug!(?obligation.cause, ?obligation.param_env);
|
||||
@ -1686,10 +1685,10 @@ fn report_projection_error(
|
||||
let secondary_span = match predicate.kind().skip_binder() {
|
||||
ty::PredicateKind::Clause(ty::Clause::Projection(proj)) => self
|
||||
.tcx
|
||||
.opt_associated_item(proj.projection_ty.item_def_id)
|
||||
.opt_associated_item(proj.projection_ty.def_id)
|
||||
.and_then(|trait_assoc_item| {
|
||||
self.tcx
|
||||
.trait_of_item(proj.projection_ty.item_def_id)
|
||||
.trait_of_item(proj.projection_ty.def_id)
|
||||
.map(|id| (trait_assoc_item, id))
|
||||
})
|
||||
.and_then(|(trait_assoc_item, id)| {
|
||||
@ -1745,7 +1744,7 @@ fn maybe_detailed_projection_msg(
|
||||
let trait_def_id = pred.projection_ty.trait_def_id(self.tcx);
|
||||
let self_ty = pred.projection_ty.self_ty();
|
||||
|
||||
if Some(pred.projection_ty.item_def_id) == self.tcx.lang_items().fn_once_output() {
|
||||
if Some(pred.projection_ty.def_id) == self.tcx.lang_items().fn_once_output() {
|
||||
Some(format!(
|
||||
"expected `{self_ty}` to be a {fn_kind} that returns `{expected_ty}`, but it returns `{normalized_ty}`",
|
||||
fn_kind = self_ty.prefix_string(self.tcx)
|
||||
|
@ -858,7 +858,7 @@ fn suggest_fn_call(
|
||||
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||
self.tcx.bound_item_bounds(def_id).subst(self.tcx, substs).iter().find_map(|pred| {
|
||||
if let ty::PredicateKind::Clause(ty::Clause::Projection(proj)) = pred.kind().skip_binder()
|
||||
&& Some(proj.projection_ty.item_def_id) == self.tcx.lang_items().fn_once_output()
|
||||
&& Some(proj.projection_ty.def_id) == self.tcx.lang_items().fn_once_output()
|
||||
// args tuple will always be substs[1]
|
||||
&& let ty::Tuple(args) = proj.projection_ty.substs.type_at(1).kind()
|
||||
{
|
||||
@ -875,7 +875,7 @@ fn suggest_fn_call(
|
||||
ty::Dynamic(data, _, ty::Dyn) => {
|
||||
data.iter().find_map(|pred| {
|
||||
if let ty::ExistentialPredicate::Projection(proj) = pred.skip_binder()
|
||||
&& Some(proj.item_def_id) == self.tcx.lang_items().fn_once_output()
|
||||
&& Some(proj.def_id) == self.tcx.lang_items().fn_once_output()
|
||||
// for existential projection, substs are shifted over by 1
|
||||
&& let ty::Tuple(args) = proj.substs.type_at(0).kind()
|
||||
{
|
||||
@ -892,7 +892,7 @@ fn suggest_fn_call(
|
||||
ty::Param(_) => {
|
||||
obligation.param_env.caller_bounds().iter().find_map(|pred| {
|
||||
if let ty::PredicateKind::Clause(ty::Clause::Projection(proj)) = pred.kind().skip_binder()
|
||||
&& Some(proj.projection_ty.item_def_id) == self.tcx.lang_items().fn_once_output()
|
||||
&& Some(proj.projection_ty.def_id) == self.tcx.lang_items().fn_once_output()
|
||||
&& proj.projection_ty.self_ty() == found
|
||||
// args tuple will always be substs[1]
|
||||
&& let ty::Tuple(args) = proj.projection_ty.substs.type_at(1).kind()
|
||||
@ -3248,7 +3248,7 @@ fn point_at_chain(
|
||||
// This corresponds to `<ExprTy as Iterator>::Item = _`.
|
||||
let trait_ref = ty::Binder::dummy(ty::PredicateKind::Clause(
|
||||
ty::Clause::Projection(ty::ProjectionPredicate {
|
||||
projection_ty: ty::ProjectionTy { substs, item_def_id: proj.item_def_id },
|
||||
projection_ty: ty::ProjectionTy { substs, def_id: proj.def_id },
|
||||
term: ty_var.into(),
|
||||
}),
|
||||
));
|
||||
@ -3263,7 +3263,7 @@ fn point_at_chain(
|
||||
if ocx.select_where_possible().is_empty() {
|
||||
// `ty_var` now holds the type that `Item` is for `ExprTy`.
|
||||
let ty_var = self.resolve_vars_if_possible(ty_var);
|
||||
assocs_in_this_method.push(Some((span, (proj.item_def_id, ty_var))));
|
||||
assocs_in_this_method.push(Some((span, (proj.def_id, ty_var))));
|
||||
} else {
|
||||
// `<ExprTy as Iterator>` didn't select, so likely we've
|
||||
// reached the end of the iterator chain, like the originating
|
||||
|
@ -589,7 +589,7 @@ fn object_ty_for_trait<'tcx>(
|
||||
let pred = obligation.predicate.to_opt_poly_projection_pred()?;
|
||||
Some(pred.map_bound(|p| {
|
||||
ty::ExistentialPredicate::Projection(ty::ExistentialProjection {
|
||||
item_def_id: p.projection_ty.item_def_id,
|
||||
def_id: p.projection_ty.def_id,
|
||||
substs: p.projection_ty.substs,
|
||||
term: p.term,
|
||||
})
|
||||
@ -795,7 +795,7 @@ fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow<Self::BreakTy> {
|
||||
}
|
||||
}
|
||||
ty::Projection(ref data)
|
||||
if self.tcx.def_kind(data.item_def_id) == DefKind::ImplTraitPlaceholder =>
|
||||
if self.tcx.def_kind(data.def_id) == DefKind::ImplTraitPlaceholder =>
|
||||
{
|
||||
// We'll deny these later in their own pass
|
||||
ControlFlow::CONTINUE
|
||||
@ -862,9 +862,9 @@ pub fn contains_illegal_impl_trait_in_trait<'tcx>(
|
||||
ty.skip_binder().walk().find_map(|arg| {
|
||||
if let ty::GenericArgKind::Type(ty) = arg.unpack()
|
||||
&& let ty::Projection(proj) = ty.kind()
|
||||
&& tcx.def_kind(proj.item_def_id) == DefKind::ImplTraitPlaceholder
|
||||
&& tcx.def_kind(proj.def_id) == DefKind::ImplTraitPlaceholder
|
||||
{
|
||||
Some(MethodViolationCode::ReferencesImplTraitInTrait(tcx.def_span(proj.item_def_id)))
|
||||
Some(MethodViolationCode::ReferencesImplTraitInTrait(tcx.def_span(proj.def_id)))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
|
@ -1189,10 +1189,9 @@ fn normalize_to_error<'a, 'tcx>(
|
||||
predicate: trait_ref.without_const().to_predicate(selcx.tcx()),
|
||||
};
|
||||
let tcx = selcx.infcx.tcx;
|
||||
let def_id = projection_ty.item_def_id;
|
||||
let new_value = selcx.infcx.next_ty_var(TypeVariableOrigin {
|
||||
kind: TypeVariableOriginKind::NormalizeProjectionType,
|
||||
span: tcx.def_span(def_id),
|
||||
span: tcx.def_span(projection_ty.def_id),
|
||||
});
|
||||
Normalized { value: new_value, obligations: vec![trait_obligation] }
|
||||
}
|
||||
@ -1270,7 +1269,7 @@ fn project<'cx, 'tcx>(
|
||||
// need to investigate whether or not this is fine.
|
||||
selcx
|
||||
.tcx()
|
||||
.mk_projection(obligation.predicate.item_def_id, obligation.predicate.substs)
|
||||
.mk_projection(obligation.predicate.def_id, obligation.predicate.substs)
|
||||
.into(),
|
||||
)),
|
||||
// Error occurred while trying to processing impls.
|
||||
@ -1290,13 +1289,12 @@ fn assemble_candidate_for_impl_trait_in_trait<'cx, 'tcx>(
|
||||
candidate_set: &mut ProjectionCandidateSet<'tcx>,
|
||||
) {
|
||||
let tcx = selcx.tcx();
|
||||
if tcx.def_kind(obligation.predicate.item_def_id) == DefKind::ImplTraitPlaceholder {
|
||||
let trait_fn_def_id = tcx.impl_trait_in_trait_parent(obligation.predicate.item_def_id);
|
||||
if tcx.def_kind(obligation.predicate.def_id) == DefKind::ImplTraitPlaceholder {
|
||||
let trait_fn_def_id = tcx.impl_trait_in_trait_parent(obligation.predicate.def_id);
|
||||
// If we are trying to project an RPITIT with trait's default `Self` parameter,
|
||||
// then we must be within a default trait body.
|
||||
if obligation.predicate.self_ty()
|
||||
== ty::InternalSubsts::identity_for_item(tcx, obligation.predicate.item_def_id)
|
||||
.type_at(0)
|
||||
== ty::InternalSubsts::identity_for_item(tcx, obligation.predicate.def_id).type_at(0)
|
||||
&& tcx.associated_item(trait_fn_def_id).defaultness(tcx).has_value()
|
||||
{
|
||||
candidate_set.push_candidate(ProjectionCandidate::ImplTraitInTrait(
|
||||
@ -1377,7 +1375,7 @@ fn assemble_candidates_from_trait_def<'cx, 'tcx>(
|
||||
// Check whether the self-type is itself a projection.
|
||||
// If so, extract what we know from the trait and try to come up with a good answer.
|
||||
let bounds = match *obligation.predicate.self_ty().kind() {
|
||||
ty::Projection(ref data) => tcx.bound_item_bounds(data.item_def_id).subst(tcx, data.substs),
|
||||
ty::Projection(ref data) => tcx.bound_item_bounds(data.def_id).subst(tcx, data.substs),
|
||||
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||
tcx.bound_item_bounds(def_id).subst(tcx, substs)
|
||||
}
|
||||
@ -1432,7 +1430,7 @@ fn assemble_candidates_from_object_ty<'cx, 'tcx>(
|
||||
};
|
||||
let env_predicates = data
|
||||
.projection_bounds()
|
||||
.filter(|bound| bound.item_def_id() == obligation.predicate.item_def_id)
|
||||
.filter(|bound| bound.item_def_id() == obligation.predicate.def_id)
|
||||
.map(|p| p.with_self_ty(tcx, object_ty).to_predicate(tcx));
|
||||
|
||||
assemble_candidates_from_predicates(
|
||||
@ -1464,7 +1462,7 @@ fn assemble_candidates_from_predicates<'cx, 'tcx>(
|
||||
predicate.kind().skip_binder()
|
||||
{
|
||||
let data = bound_predicate.rebind(data);
|
||||
if data.projection_def_id() != obligation.predicate.item_def_id {
|
||||
if data.projection_def_id() != obligation.predicate.def_id {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1505,7 +1503,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
||||
candidate_set: &mut ProjectionCandidateSet<'tcx>,
|
||||
) {
|
||||
// Can't assemble candidate from impl for RPITIT
|
||||
if selcx.tcx().def_kind(obligation.predicate.item_def_id) == DefKind::ImplTraitPlaceholder {
|
||||
if selcx.tcx().def_kind(obligation.predicate.def_id) == DefKind::ImplTraitPlaceholder {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1557,7 +1555,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
||||
// NOTE: This should be kept in sync with the similar code in
|
||||
// `rustc_ty_utils::instance::resolve_associated_item()`.
|
||||
let node_item =
|
||||
assoc_def(selcx, impl_data.impl_def_id, obligation.predicate.item_def_id)
|
||||
assoc_def(selcx, impl_data.impl_def_id, obligation.predicate.def_id)
|
||||
.map_err(|ErrorGuaranteed { .. }| ())?;
|
||||
|
||||
if node_item.is_final() {
|
||||
@ -1790,7 +1788,7 @@ fn confirm_candidate<'cx, 'tcx>(
|
||||
ProjectionCandidate::ImplTraitInTrait(ImplTraitInTraitCandidate::Trait) => Progress {
|
||||
term: selcx
|
||||
.tcx()
|
||||
.mk_opaque(obligation.predicate.item_def_id, obligation.predicate.substs)
|
||||
.mk_opaque(obligation.predicate.def_id, obligation.predicate.substs)
|
||||
.into(),
|
||||
obligations: vec![],
|
||||
},
|
||||
@ -1862,7 +1860,7 @@ fn confirm_generator_candidate<'cx, 'tcx>(
|
||||
gen_sig,
|
||||
)
|
||||
.map_bound(|(trait_ref, yield_ty, return_ty)| {
|
||||
let name = tcx.associated_item(obligation.predicate.item_def_id).name;
|
||||
let name = tcx.associated_item(obligation.predicate.def_id).name;
|
||||
let ty = if name == sym::Return {
|
||||
return_ty
|
||||
} else if name == sym::Yield {
|
||||
@ -1874,7 +1872,7 @@ fn confirm_generator_candidate<'cx, 'tcx>(
|
||||
ty::ProjectionPredicate {
|
||||
projection_ty: ty::ProjectionTy {
|
||||
substs: trait_ref.substs,
|
||||
item_def_id: obligation.predicate.item_def_id,
|
||||
def_id: obligation.predicate.def_id,
|
||||
},
|
||||
term: ty.into(),
|
||||
}
|
||||
@ -1911,12 +1909,12 @@ fn confirm_future_candidate<'cx, 'tcx>(
|
||||
gen_sig,
|
||||
)
|
||||
.map_bound(|(trait_ref, return_ty)| {
|
||||
debug_assert_eq!(tcx.associated_item(obligation.predicate.item_def_id).name, sym::Output);
|
||||
debug_assert_eq!(tcx.associated_item(obligation.predicate.def_id).name, sym::Output);
|
||||
|
||||
ty::ProjectionPredicate {
|
||||
projection_ty: ty::ProjectionTy {
|
||||
substs: trait_ref.substs,
|
||||
item_def_id: obligation.predicate.item_def_id,
|
||||
def_id: obligation.predicate.def_id,
|
||||
},
|
||||
term: return_ty.into(),
|
||||
}
|
||||
@ -1936,7 +1934,7 @@ fn confirm_builtin_candidate<'cx, 'tcx>(
|
||||
let self_ty = obligation.predicate.self_ty();
|
||||
let substs = tcx.mk_substs([self_ty.into()].iter());
|
||||
let lang_items = tcx.lang_items();
|
||||
let item_def_id = obligation.predicate.item_def_id;
|
||||
let item_def_id = obligation.predicate.def_id;
|
||||
let trait_def_id = tcx.trait_of_item(item_def_id).unwrap();
|
||||
let (term, obligations) = if lang_items.discriminant_kind_trait() == Some(trait_def_id) {
|
||||
let discriminant_def_id = tcx.require_lang_item(LangItem::Discriminant, None);
|
||||
@ -1970,8 +1968,10 @@ fn confirm_builtin_candidate<'cx, 'tcx>(
|
||||
bug!("unexpected builtin trait with associated type: {:?}", obligation.predicate);
|
||||
};
|
||||
|
||||
let predicate =
|
||||
ty::ProjectionPredicate { projection_ty: ty::ProjectionTy { substs, item_def_id }, term };
|
||||
let predicate = ty::ProjectionPredicate {
|
||||
projection_ty: ty::ProjectionTy { substs, def_id: item_def_id },
|
||||
term,
|
||||
};
|
||||
|
||||
confirm_param_env_candidate(selcx, obligation, ty::Binder::dummy(predicate), false)
|
||||
.with_addl_obligations(obligations)
|
||||
@ -2040,10 +2040,7 @@ fn confirm_callable_candidate<'cx, 'tcx>(
|
||||
flag,
|
||||
)
|
||||
.map_bound(|(trait_ref, ret_type)| ty::ProjectionPredicate {
|
||||
projection_ty: ty::ProjectionTy {
|
||||
substs: trait_ref.substs,
|
||||
item_def_id: fn_once_output_def_id,
|
||||
},
|
||||
projection_ty: ty::ProjectionTy { substs: trait_ref.substs, def_id: fn_once_output_def_id },
|
||||
term: ret_type.into(),
|
||||
});
|
||||
|
||||
@ -2124,7 +2121,7 @@ fn confirm_impl_candidate<'cx, 'tcx>(
|
||||
let tcx = selcx.tcx();
|
||||
|
||||
let ImplSourceUserDefinedData { impl_def_id, substs, mut nested } = impl_impl_source;
|
||||
let assoc_item_id = obligation.predicate.item_def_id;
|
||||
let assoc_item_id = obligation.predicate.def_id;
|
||||
let trait_def_id = tcx.trait_id_of_impl(impl_def_id).unwrap();
|
||||
|
||||
let param_env = obligation.param_env;
|
||||
@ -2224,7 +2221,7 @@ fn confirm_impl_trait_in_trait_candidate<'tcx>(
|
||||
let tcx = selcx.tcx();
|
||||
let mut obligations = data.nested;
|
||||
|
||||
let trait_fn_def_id = tcx.impl_trait_in_trait_parent(obligation.predicate.item_def_id);
|
||||
let trait_fn_def_id = tcx.impl_trait_in_trait_parent(obligation.predicate.def_id);
|
||||
let Ok(leaf_def) = assoc_def(selcx, data.impl_def_id, trait_fn_def_id) else {
|
||||
return Progress { term: tcx.ty_error().into(), obligations };
|
||||
};
|
||||
@ -2235,9 +2232,7 @@ fn confirm_impl_trait_in_trait_candidate<'tcx>(
|
||||
// Use the default `impl Trait` for the trait, e.g., for a default trait body
|
||||
if leaf_def.item.container == ty::AssocItemContainer::TraitContainer {
|
||||
return Progress {
|
||||
term: tcx
|
||||
.mk_opaque(obligation.predicate.item_def_id, obligation.predicate.substs)
|
||||
.into(),
|
||||
term: tcx.mk_opaque(obligation.predicate.def_id, obligation.predicate.substs).into(),
|
||||
obligations,
|
||||
};
|
||||
}
|
||||
@ -2304,7 +2299,7 @@ fn confirm_impl_trait_in_trait_candidate<'tcx>(
|
||||
obligation.recursion_depth + 1,
|
||||
tcx.bound_trait_impl_trait_tys(impl_fn_def_id)
|
||||
.map_bound(|tys| {
|
||||
tys.map_or_else(|_| tcx.ty_error(), |tys| tys[&obligation.predicate.item_def_id])
|
||||
tys.map_or_else(|_| tcx.ty_error(), |tys| tys[&obligation.predicate.def_id])
|
||||
})
|
||||
.subst(tcx, impl_fn_substs),
|
||||
&mut obligations,
|
||||
@ -2322,7 +2317,7 @@ fn assoc_ty_own_obligations<'cx, 'tcx>(
|
||||
) {
|
||||
let tcx = selcx.tcx();
|
||||
let own = tcx
|
||||
.predicates_of(obligation.predicate.item_def_id)
|
||||
.predicates_of(obligation.predicate.def_id)
|
||||
.instantiate_own(tcx, obligation.predicate.substs);
|
||||
for (predicate, span) in std::iter::zip(own.predicates, own.spans) {
|
||||
let normalized = normalize_with_depth_to(
|
||||
@ -2345,13 +2340,13 @@ fn assoc_ty_own_obligations<'cx, 'tcx>(
|
||||
ObligationCause::new(
|
||||
obligation.cause.span,
|
||||
obligation.cause.body_id,
|
||||
super::ItemObligation(obligation.predicate.item_def_id),
|
||||
super::ItemObligation(obligation.predicate.def_id),
|
||||
)
|
||||
} else {
|
||||
ObligationCause::new(
|
||||
obligation.cause.span,
|
||||
obligation.cause.body_id,
|
||||
super::BindingObligation(obligation.predicate.item_def_id, span),
|
||||
super::BindingObligation(obligation.predicate.def_id, span),
|
||||
)
|
||||
};
|
||||
nested.push(Obligation::with_depth(
|
||||
|
@ -537,7 +537,7 @@ fn need_migrate_deref_output_trait_object(
|
||||
self,
|
||||
param_env,
|
||||
ty::ProjectionTy {
|
||||
item_def_id: tcx.lang_items().deref_target()?,
|
||||
def_id: tcx.lang_items().deref_target()?,
|
||||
substs: trait_ref.substs,
|
||||
},
|
||||
cause.clone(),
|
||||
|
@ -155,7 +155,7 @@ fn confirm_projection_candidate(
|
||||
let placeholder_self_ty = placeholder_trait_predicate.self_ty();
|
||||
let placeholder_trait_predicate = ty::Binder::dummy(placeholder_trait_predicate);
|
||||
let (def_id, substs) = match *placeholder_self_ty.kind() {
|
||||
ty::Projection(proj) => (proj.item_def_id, proj.substs),
|
||||
ty::Projection(proj) => (proj.def_id, proj.substs),
|
||||
ty::Opaque(ty::OpaqueTy { def_id, substs }) => (def_id, substs),
|
||||
_ => bug!("projection candidate for unexpected type: {:?}", placeholder_self_ty),
|
||||
};
|
||||
|
@ -1595,7 +1595,7 @@ fn match_projection_obligation_against_definition_bounds(
|
||||
|
||||
let tcx = self.infcx.tcx;
|
||||
let (def_id, substs) = match *placeholder_trait_predicate.trait_ref.self_ty().kind() {
|
||||
ty::Projection(ref data) => (data.item_def_id, data.substs),
|
||||
ty::Projection(ref data) => (data.def_id, data.substs),
|
||||
ty::Opaque(ty::OpaqueTy { def_id, substs }) => (def_id, substs),
|
||||
_ => {
|
||||
span_bug!(
|
||||
@ -1745,7 +1745,7 @@ pub(super) fn match_projection_projections(
|
||||
});
|
||||
|
||||
if is_match {
|
||||
let generics = self.tcx().generics_of(obligation.predicate.item_def_id);
|
||||
let generics = self.tcx().generics_of(obligation.predicate.def_id);
|
||||
// FIXME(generic-associated-types): Addresses aggressive inference in #92917.
|
||||
// If this type is a GAT, and of the GAT substs resolve to something new,
|
||||
// that means that we must have newly inferred something about the GAT.
|
||||
|
@ -236,7 +236,7 @@ fn extend_cause_with_original_assoc_item_obligation<'tcx>(
|
||||
// `traits-assoc-type-in-supertrait-bad.rs`.
|
||||
if let Some(ty::Projection(projection_ty)) = proj.term.ty().map(|ty| ty.kind())
|
||||
&& let Some(&impl_item_id) =
|
||||
tcx.impl_item_implementor_ids(impl_def_id).get(&projection_ty.item_def_id)
|
||||
tcx.impl_item_implementor_ids(impl_def_id).get(&projection_ty.def_id)
|
||||
&& let Some(impl_item_span) = items
|
||||
.iter()
|
||||
.find(|item| item.id.owner_id.to_def_id() == impl_item_id)
|
||||
@ -249,9 +249,9 @@ fn extend_cause_with_original_assoc_item_obligation<'tcx>(
|
||||
// An associated item obligation born out of the `trait` failed to be met. An example
|
||||
// can be seen in `ui/associated-types/point-at-type-on-obligation-failure-2.rs`.
|
||||
debug!("extended_cause_with_original_assoc_item_obligation trait proj {:?}", pred);
|
||||
if let ty::Projection(ty::ProjectionTy { item_def_id, .. }) = *pred.self_ty().kind()
|
||||
if let ty::Projection(ty::ProjectionTy { def_id, .. }) = *pred.self_ty().kind()
|
||||
&& let Some(&impl_item_id) =
|
||||
tcx.impl_item_implementor_ids(impl_def_id).get(&item_def_id)
|
||||
tcx.impl_item_implementor_ids(impl_def_id).get(&def_id)
|
||||
&& let Some(impl_item_span) = items
|
||||
.iter()
|
||||
.find(|item| item.id.owner_id.to_def_id() == impl_item_id)
|
||||
@ -392,7 +392,7 @@ fn compute_projection(&mut self, data: ty::ProjectionTy<'tcx>) {
|
||||
// `i32: Copy`
|
||||
// ]
|
||||
// Projection types do not require const predicates.
|
||||
let obligations = self.nominal_obligations_without_const(data.item_def_id, data.substs);
|
||||
let obligations = self.nominal_obligations_without_const(data.def_id, data.substs);
|
||||
self.out.extend(obligations);
|
||||
|
||||
let tcx = self.tcx();
|
||||
|
@ -69,7 +69,7 @@ fn lower_into(self, interner: RustInterner<'tcx>) -> SubstsRef<'tcx> {
|
||||
impl<'tcx> LowerInto<'tcx, chalk_ir::AliasTy<RustInterner<'tcx>>> for ty::ProjectionTy<'tcx> {
|
||||
fn lower_into(self, interner: RustInterner<'tcx>) -> chalk_ir::AliasTy<RustInterner<'tcx>> {
|
||||
chalk_ir::AliasTy::Projection(chalk_ir::ProjectionTy {
|
||||
associated_ty_id: chalk_ir::AssocTypeId(self.item_def_id),
|
||||
associated_ty_id: chalk_ir::AssocTypeId(self.def_id),
|
||||
substitution: self.substs.lower_into(interner),
|
||||
})
|
||||
}
|
||||
@ -448,7 +448,7 @@ fn lower_into(self, interner: RustInterner<'tcx>) -> Ty<'tcx> {
|
||||
}),
|
||||
TyKind::AssociatedType(assoc_ty, substitution) => ty::Projection(ty::ProjectionTy {
|
||||
substs: substitution.lower_into(interner),
|
||||
item_def_id: assoc_ty.0,
|
||||
def_id: assoc_ty.0,
|
||||
}),
|
||||
TyKind::Foreign(def_id) => ty::Foreign(def_id.0),
|
||||
TyKind::Error => return interner.tcx.ty_error(),
|
||||
@ -458,7 +458,7 @@ fn lower_into(self, interner: RustInterner<'tcx>) -> Ty<'tcx> {
|
||||
}),
|
||||
TyKind::Alias(alias_ty) => match alias_ty {
|
||||
chalk_ir::AliasTy::Projection(projection) => ty::Projection(ty::ProjectionTy {
|
||||
item_def_id: projection.associated_ty_id.0,
|
||||
def_id: projection.associated_ty_id.0,
|
||||
substs: projection.substitution.lower_into(interner),
|
||||
}),
|
||||
chalk_ir::AliasTy::Opaque(opaque) => ty::Opaque(ty::OpaqueTy {
|
||||
@ -690,7 +690,7 @@ fn lower_into(
|
||||
binders.clone(),
|
||||
chalk_ir::WhereClause::AliasEq(chalk_ir::AliasEq {
|
||||
alias: chalk_ir::AliasTy::Projection(chalk_ir::ProjectionTy {
|
||||
associated_ty_id: chalk_ir::AssocTypeId(predicate.item_def_id),
|
||||
associated_ty_id: chalk_ir::AssocTypeId(predicate.def_id),
|
||||
substitution: interner
|
||||
.tcx
|
||||
.mk_substs_trait(self_ty, predicate.substs)
|
||||
@ -846,7 +846,7 @@ fn lower_into(
|
||||
let (trait_ref, own_substs) = self.projection_ty.trait_ref_and_own_substs(interner.tcx);
|
||||
chalk_solve::rust_ir::AliasEqBound {
|
||||
trait_bound: trait_ref.lower_into(interner),
|
||||
associated_ty_id: chalk_ir::AssocTypeId(self.projection_ty.item_def_id),
|
||||
associated_ty_id: chalk_ir::AssocTypeId(self.projection_ty.def_id),
|
||||
parameters: own_substs.iter().map(|arg| arg.lower_into(interner)).collect(),
|
||||
value: self.term.ty().unwrap().lower_into(interner),
|
||||
}
|
||||
|
@ -170,8 +170,7 @@ pub enum TyKind<I: Interner> {
|
||||
/// A tuple type. For example, `(i32, bool)`.
|
||||
Tuple(I::ListTy),
|
||||
|
||||
/// The projection of an associated type. For example,
|
||||
/// `<T as Trait<..>>::N`.
|
||||
/// A projection or opaque type. Both of these types
|
||||
Projection(I::ProjectionTy),
|
||||
|
||||
/// Opaque (`impl Trait`) type found in a return type.
|
||||
|
@ -418,10 +418,10 @@ fn clean_projection<'tcx>(
|
||||
cx: &mut DocContext<'tcx>,
|
||||
def_id: Option<DefId>,
|
||||
) -> Type {
|
||||
if cx.tcx.def_kind(ty.skip_binder().item_def_id) == DefKind::ImplTraitPlaceholder {
|
||||
if cx.tcx.def_kind(ty.skip_binder().def_id) == DefKind::ImplTraitPlaceholder {
|
||||
let bounds = cx
|
||||
.tcx
|
||||
.explicit_item_bounds(ty.skip_binder().item_def_id)
|
||||
.explicit_item_bounds(ty.skip_binder().def_id)
|
||||
.iter()
|
||||
.map(|(bound, _)| EarlyBinder(*bound).subst(cx.tcx, ty.skip_binder().substs))
|
||||
.collect::<Vec<_>>();
|
||||
@ -456,8 +456,8 @@ fn projection_to_path_segment<'tcx>(
|
||||
ty: ty::Binder<'tcx, ty::ProjectionTy<'tcx>>,
|
||||
cx: &mut DocContext<'tcx>,
|
||||
) -> PathSegment {
|
||||
let item = cx.tcx.associated_item(ty.skip_binder().item_def_id);
|
||||
let generics = cx.tcx.generics_of(ty.skip_binder().item_def_id);
|
||||
let item = cx.tcx.associated_item(ty.skip_binder().def_id);
|
||||
let generics = cx.tcx.generics_of(ty.skip_binder().def_id);
|
||||
PathSegment {
|
||||
name: item.name,
|
||||
args: GenericArgs::AngleBracketed {
|
||||
|
@ -1330,7 +1330,7 @@ fn replace_types<'tcx>(
|
||||
&& let Some(term_ty) = projection_predicate.term.ty()
|
||||
&& let ty::Param(term_param_ty) = term_ty.kind()
|
||||
{
|
||||
let item_def_id = projection_predicate.projection_ty.item_def_id;
|
||||
let item_def_id = projection_predicate.projection_ty.def_id;
|
||||
let assoc_item = cx.tcx.associated_item(item_def_id);
|
||||
let projection = cx.tcx
|
||||
.mk_projection(assoc_item.def_id, cx.tcx.mk_substs_trait(new_ty, []));
|
||||
|
@ -493,7 +493,7 @@ fn has_is_empty_impl(cx: &LateContext<'_>, id: DefId) -> bool {
|
||||
.filter_by_name_unhygienic(is_empty)
|
||||
.any(|item| is_is_empty(cx, item))
|
||||
}),
|
||||
ty::Projection(ref proj) => has_is_empty_impl(cx, proj.item_def_id),
|
||||
ty::Projection(ref proj) => has_is_empty_impl(cx, proj.def_id),
|
||||
ty::Adt(id, _) => has_is_empty_impl(cx, id.did()),
|
||||
ty::Array(..) | ty::Slice(..) | ty::Str => true,
|
||||
_ => false,
|
||||
|
@ -151,7 +151,7 @@ fn iterates_same_ty<'tcx>(cx: &LateContext<'tcx>, iter_ty: Ty<'tcx>, collect_ty:
|
||||
&& let Some(into_iter_item_proj) = make_projection(cx.tcx, into_iter_trait, item, [collect_ty])
|
||||
&& let Ok(into_iter_item_ty) = cx.tcx.try_normalize_erasing_regions(
|
||||
cx.param_env,
|
||||
cx.tcx.mk_projection(into_iter_item_proj.item_def_id, into_iter_item_proj.substs)
|
||||
cx.tcx.mk_projection(into_iter_item_proj.def_id, into_iter_item_proj.substs)
|
||||
)
|
||||
{
|
||||
iter_item_ty == into_iter_item_ty
|
||||
|
@ -685,7 +685,7 @@ fn sig_from_bounds<'tcx>(
|
||||
inputs = Some(i);
|
||||
},
|
||||
PredicateKind::Clause(ty::Clause::Projection(p))
|
||||
if Some(p.projection_ty.item_def_id) == lang_items.fn_once_output()
|
||||
if Some(p.projection_ty.def_id) == lang_items.fn_once_output()
|
||||
&& p.projection_ty.self_ty() == ty =>
|
||||
{
|
||||
if output.is_some() {
|
||||
@ -708,7 +708,7 @@ fn sig_for_projection<'tcx>(cx: &LateContext<'tcx>, ty: ProjectionTy<'tcx>) -> O
|
||||
|
||||
for (pred, _) in cx
|
||||
.tcx
|
||||
.bound_explicit_item_bounds(ty.item_def_id)
|
||||
.bound_explicit_item_bounds(ty.def_id)
|
||||
.subst_iter_copied(cx.tcx, ty.substs)
|
||||
{
|
||||
match pred.kind().skip_binder() {
|
||||
@ -726,7 +726,7 @@ fn sig_for_projection<'tcx>(cx: &LateContext<'tcx>, ty: ProjectionTy<'tcx>) -> O
|
||||
inputs = Some(i);
|
||||
},
|
||||
PredicateKind::Clause(ty::Clause::Projection(p))
|
||||
if Some(p.projection_ty.item_def_id) == lang_items.fn_once_output() =>
|
||||
if Some(p.projection_ty.def_id) == lang_items.fn_once_output() =>
|
||||
{
|
||||
if output.is_some() {
|
||||
// Multiple different fn trait impls. Is this even allowed?
|
||||
@ -1041,7 +1041,7 @@ fn helper<'tcx>(
|
||||
|
||||
Some(ProjectionTy {
|
||||
substs,
|
||||
item_def_id: assoc_item.def_id,
|
||||
def_id: assoc_item.def_id,
|
||||
})
|
||||
}
|
||||
helper(
|
||||
@ -1081,7 +1081,7 @@ fn helper<'tcx>(tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx>, ty: ProjectionTy<'
|
||||
);
|
||||
return None;
|
||||
}
|
||||
match tcx.try_normalize_erasing_regions(param_env, tcx.mk_projection(ty.item_def_id, ty.substs)) {
|
||||
match tcx.try_normalize_erasing_regions(param_env, tcx.mk_projection(ty.def_id, ty.substs)) {
|
||||
Ok(ty) => Some(ty),
|
||||
Err(e) => {
|
||||
debug_assert!(false, "failed to normalize type `{ty}`: {e:#?}");
|
||||
|
Loading…
Reference in New Issue
Block a user