aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/lower.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_ty/src/lower.rs')
-rw-r--r--crates/hir_ty/src/lower.rs135
1 files changed, 70 insertions, 65 deletions
diff --git a/crates/hir_ty/src/lower.rs b/crates/hir_ty/src/lower.rs
index e9e4e69ad..48c26f471 100644
--- a/crates/hir_ty/src/lower.rs
+++ b/crates/hir_ty/src/lower.rs
@@ -31,7 +31,7 @@ use crate::{
31 traits::chalk::{Interner, ToChalk}, 31 traits::chalk::{Interner, ToChalk},
32 utils::{ 32 utils::{
33 all_super_trait_refs, associated_type_by_name_including_super_traits, generics, 33 all_super_trait_refs, associated_type_by_name_including_super_traits, generics,
34 variant_data, 34 variant_data, Generics,
35 }, 35 },
36 AliasEq, AliasTy, Binders, BoundVar, CallableSig, DebruijnIndex, DynTy, FnPointer, FnSig, 36 AliasEq, AliasTy, Binders, BoundVar, CallableSig, DebruijnIndex, DynTy, FnPointer, FnSig,
37 ImplTraitId, OpaqueTy, PolyFnSig, ProjectionTy, QuantifiedWhereClause, QuantifiedWhereClauses, 37 ImplTraitId, OpaqueTy, PolyFnSig, ProjectionTy, QuantifiedWhereClause, QuantifiedWhereClauses,
@@ -196,7 +196,7 @@ impl<'a> TyLoweringContext<'a> {
196 bounds.iter().flat_map(|b| ctx.lower_type_bound(b, self_ty.clone(), false)), 196 bounds.iter().flat_map(|b| ctx.lower_type_bound(b, self_ty.clone(), false)),
197 ) 197 )
198 }); 198 });
199 let bounds = Binders::new(1, bounds); 199 let bounds = crate::make_only_type_binders(1, bounds);
200 TyKind::Dyn(DynTy { bounds }).intern(&Interner) 200 TyKind::Dyn(DynTy { bounds }).intern(&Interner)
201 } 201 }
202 TypeRef::ImplTrait(bounds) => { 202 TypeRef::ImplTrait(bounds) => {
@@ -209,9 +209,9 @@ impl<'a> TyLoweringContext<'a> {
209 // this dance is to make sure the data is in the right 209 // this dance is to make sure the data is in the right
210 // place even if we encounter more opaque types while 210 // place even if we encounter more opaque types while
211 // lowering the bounds 211 // lowering the bounds
212 self.opaque_type_data 212 self.opaque_type_data.borrow_mut().push(ReturnTypeImplTrait {
213 .borrow_mut() 213 bounds: crate::make_only_type_binders(1, Vec::new()),
214 .push(ReturnTypeImplTrait { bounds: Binders::new(1, Vec::new()) }); 214 });
215 // We don't want to lower the bounds inside the binders 215 // We don't want to lower the bounds inside the binders
216 // we're currently in, because they don't end up inside 216 // we're currently in, because they don't end up inside
217 // those binders. E.g. when we have `impl Trait<impl 217 // those binders. E.g. when we have `impl Trait<impl
@@ -380,7 +380,7 @@ impl<'a> TyLoweringContext<'a> {
380 TyKind::Error.intern(&Interner) 380 TyKind::Error.intern(&Interner)
381 } else { 381 } else {
382 let dyn_ty = DynTy { 382 let dyn_ty = DynTy {
383 bounds: Binders::new( 383 bounds: crate::make_only_type_binders(
384 1, 384 1,
385 QuantifiedWhereClauses::from_iter( 385 QuantifiedWhereClauses::from_iter(
386 &Interner, 386 &Interner,
@@ -414,7 +414,7 @@ impl<'a> TyLoweringContext<'a> {
414 TypeParamLoweringMode::Placeholder => generics.type_params_subst(self.db), 414 TypeParamLoweringMode::Placeholder => generics.type_params_subst(self.db),
415 TypeParamLoweringMode::Variable => generics.bound_vars_subst(self.in_binders), 415 TypeParamLoweringMode::Variable => generics.bound_vars_subst(self.in_binders),
416 }; 416 };
417 self.db.impl_self_ty(impl_id).subst(&substs) 417 self.db.impl_self_ty(impl_id).substitute(&Interner, &substs)
418 } 418 }
419 TypeNs::AdtSelfType(adt) => { 419 TypeNs::AdtSelfType(adt) => {
420 let generics = generics(self.db.upcast(), adt.into()); 420 let generics = generics(self.db.upcast(), adt.into());
@@ -422,7 +422,7 @@ impl<'a> TyLoweringContext<'a> {
422 TypeParamLoweringMode::Placeholder => generics.type_params_subst(self.db), 422 TypeParamLoweringMode::Placeholder => generics.type_params_subst(self.db),
423 TypeParamLoweringMode::Variable => generics.bound_vars_subst(self.in_binders), 423 TypeParamLoweringMode::Variable => generics.bound_vars_subst(self.in_binders),
424 }; 424 };
425 self.db.ty(adt.into()).subst(&substs) 425 self.db.ty(adt.into()).substitute(&Interner, &substs)
426 } 426 }
427 427
428 TypeNs::AdtId(it) => self.lower_path_inner(resolved_segment, it.into(), infer_args), 428 TypeNs::AdtId(it) => self.lower_path_inner(resolved_segment, it.into(), infer_args),
@@ -477,13 +477,13 @@ impl<'a> TyLoweringContext<'a> {
477 ), 477 ),
478 ); 478 );
479 let s = generics.type_params_subst(self.db); 479 let s = generics.type_params_subst(self.db);
480 t.substitution.clone().subst_bound_vars(&s) 480 s.apply(t.substitution.clone(), &Interner)
481 } 481 }
482 TypeParamLoweringMode::Variable => t.substitution.clone(), 482 TypeParamLoweringMode::Variable => t.substitution.clone(),
483 }; 483 };
484 // We need to shift in the bound vars, since 484 // We need to shift in the bound vars, since
485 // associated_type_shorthand_candidates does not do that 485 // associated_type_shorthand_candidates does not do that
486 let substs = substs.shift_bound_vars(self.in_binders); 486 let substs = substs.shifted_in_from(self.in_binders);
487 // FIXME handle type parameters on the segment 487 // FIXME handle type parameters on the segment
488 return Some( 488 return Some(
489 TyKind::Alias(AliasTy::Projection(ProjectionTy { 489 TyKind::Alias(AliasTy::Projection(ProjectionTy {
@@ -516,7 +516,7 @@ impl<'a> TyLoweringContext<'a> {
516 TyDefId::TypeAliasId(it) => Some(it.into()), 516 TyDefId::TypeAliasId(it) => Some(it.into()),
517 }; 517 };
518 let substs = self.substs_from_path_segment(segment, generic_def, infer_args, None); 518 let substs = self.substs_from_path_segment(segment, generic_def, infer_args, None);
519 self.db.ty(typeable).subst(&substs) 519 self.db.ty(typeable).substitute(&Interner, &substs)
520 } 520 }
521 521
522 /// Collect generic arguments from a path into a `Substs`. See also 522 /// Collect generic arguments from a path into a `Substs`. See also
@@ -620,7 +620,7 @@ impl<'a> TyLoweringContext<'a> {
620 for default_ty in defaults.iter().skip(substs.len()) { 620 for default_ty in defaults.iter().skip(substs.len()) {
621 // each default can depend on the previous parameters 621 // each default can depend on the previous parameters
622 let substs_so_far = Substitution::from_iter(&Interner, substs.clone()); 622 let substs_so_far = Substitution::from_iter(&Interner, substs.clone());
623 substs.push(default_ty.clone().subst(&substs_so_far)); 623 substs.push(default_ty.clone().substitute(&Interner, &substs_so_far));
624 } 624 }
625 } 625 }
626 } 626 }
@@ -787,7 +787,7 @@ impl<'a> TyLoweringContext<'a> {
787 let predicates = self.with_shifted_in(DebruijnIndex::ONE, |ctx| { 787 let predicates = self.with_shifted_in(DebruijnIndex::ONE, |ctx| {
788 bounds.iter().flat_map(|b| ctx.lower_type_bound(b, self_ty.clone(), false)).collect() 788 bounds.iter().flat_map(|b| ctx.lower_type_bound(b, self_ty.clone(), false)).collect()
789 }); 789 });
790 ReturnTypeImplTrait { bounds: Binders::new(1, predicates) } 790 ReturnTypeImplTrait { bounds: crate::make_only_type_binders(1, predicates) }
791 } 791 }
792} 792}
793 793
@@ -831,17 +831,20 @@ pub fn associated_type_shorthand_candidates<R>(
831 }; 831 };
832 832
833 match res { 833 match res {
834 // FIXME: how to correctly handle higher-ranked bounds here? 834 TypeNs::SelfType(impl_id) => search(
835 TypeNs::SelfType(impl_id) => { 835 // we're _in_ the impl -- the binders get added back later. Correct,
836 search(db.impl_trait(impl_id)?.value.shift_bound_vars_out(DebruijnIndex::ONE)) 836 // but it would be nice to make this more explicit
837 } 837 db.impl_trait(impl_id)?.into_value_and_skipped_binders().0,
838 ),
838 TypeNs::GenericParam(param_id) => { 839 TypeNs::GenericParam(param_id) => {
839 let predicates = db.generic_predicates_for_param(param_id); 840 let predicates = db.generic_predicates_for_param(param_id);
840 let res = predicates.iter().find_map(|pred| match &pred.value.value { 841 let res = predicates.iter().find_map(|pred| match pred.skip_binders().skip_binders() {
841 // FIXME: how to correctly handle higher-ranked bounds here? 842 // FIXME: how to correctly handle higher-ranked bounds here?
842 WhereClause::Implemented(tr) => { 843 WhereClause::Implemented(tr) => search(
843 search(tr.clone().shift_bound_vars_out(DebruijnIndex::ONE)) 844 tr.clone()
844 } 845 .shifted_out_to(DebruijnIndex::ONE)
846 .expect("FIXME unexpected higher-ranked trait bound"),
847 ),
845 _ => None, 848 _ => None,
846 }); 849 });
847 if let res @ Some(_) = res { 850 if let res @ Some(_) = res {
@@ -881,7 +884,7 @@ pub(crate) fn field_types_query(
881 let ctx = 884 let ctx =
882 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); 885 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable);
883 for (field_id, field_data) in var_data.fields().iter() { 886 for (field_id, field_data) in var_data.fields().iter() {
884 res.insert(field_id, Binders::new(generics.len(), ctx.lower_ty(&field_data.type_ref))) 887 res.insert(field_id, make_binders(&generics, ctx.lower_ty(&field_data.type_ref)))
885 } 888 }
886 Arc::new(res) 889 Arc::new(res)
887} 890}
@@ -915,9 +918,7 @@ pub(crate) fn generic_predicates_for_param_query(
915 }, 918 },
916 WherePredicate::Lifetime { .. } => false, 919 WherePredicate::Lifetime { .. } => false,
917 }) 920 })
918 .flat_map(|pred| { 921 .flat_map(|pred| ctx.lower_where_predicate(pred, true).map(|p| make_binders(&generics, p)))
919 ctx.lower_where_predicate(pred, true).map(|p| Binders::new(generics.len(), p))
920 })
921 .collect() 922 .collect()
922} 923}
923 924
@@ -988,9 +989,7 @@ pub(crate) fn generic_predicates_query(
988 let generics = generics(db.upcast(), def); 989 let generics = generics(db.upcast(), def);
989 resolver 990 resolver
990 .where_predicates_in_scope() 991 .where_predicates_in_scope()
991 .flat_map(|pred| { 992 .flat_map(|pred| ctx.lower_where_predicate(pred, false).map(|p| make_binders(&generics, p)))
992 ctx.lower_where_predicate(pred, false).map(|p| Binders::new(generics.len(), p))
993 })
994 .collect() 993 .collect()
995} 994}
996 995
@@ -1012,22 +1011,24 @@ pub(crate) fn generic_defaults_query(
1012 p.default.as_ref().map_or(TyKind::Error.intern(&Interner), |t| ctx.lower_ty(t)); 1011 p.default.as_ref().map_or(TyKind::Error.intern(&Interner), |t| ctx.lower_ty(t));
1013 1012
1014 // Each default can only refer to previous parameters. 1013 // Each default can only refer to previous parameters.
1015 ty.walk_mut_binders( 1014 ty = ty.fold_binders(
1016 &mut |ty, binders| match ty.interned_mut() { 1015 &mut |ty, binders| match ty.kind(&Interner) {
1017 TyKind::BoundVar(BoundVar { debruijn, index }) if *debruijn == binders => { 1016 TyKind::BoundVar(BoundVar { debruijn, index }) if *debruijn == binders => {
1018 if *index >= idx { 1017 if *index >= idx {
1019 // type variable default referring to parameter coming 1018 // type variable default referring to parameter coming
1020 // after it. This is forbidden (FIXME: report 1019 // after it. This is forbidden (FIXME: report
1021 // diagnostic) 1020 // diagnostic)
1022 *ty = TyKind::Error.intern(&Interner); 1021 TyKind::Error.intern(&Interner)
1022 } else {
1023 ty
1023 } 1024 }
1024 } 1025 }
1025 _ => {} 1026 _ => ty,
1026 }, 1027 },
1027 DebruijnIndex::INNERMOST, 1028 DebruijnIndex::INNERMOST,
1028 ); 1029 );
1029 1030
1030 Binders::new(idx, ty) 1031 crate::make_only_type_binders(idx, ty)
1031 }) 1032 })
1032 .collect(); 1033 .collect();
1033 1034
@@ -1040,14 +1041,13 @@ fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig {
1040 let ctx_params = TyLoweringContext::new(db, &resolver) 1041 let ctx_params = TyLoweringContext::new(db, &resolver)
1041 .with_impl_trait_mode(ImplTraitLoweringMode::Variable) 1042 .with_impl_trait_mode(ImplTraitLoweringMode::Variable)
1042 .with_type_param_mode(TypeParamLoweringMode::Variable); 1043 .with_type_param_mode(TypeParamLoweringMode::Variable);
1043 let params = data.params.iter().map(|tr| (&ctx_params).lower_ty(tr)).collect::<Vec<_>>(); 1044 let params = data.params.iter().map(|tr| ctx_params.lower_ty(tr)).collect::<Vec<_>>();
1044 let ctx_ret = TyLoweringContext::new(db, &resolver) 1045 let ctx_ret = TyLoweringContext::new(db, &resolver)
1045 .with_impl_trait_mode(ImplTraitLoweringMode::Opaque) 1046 .with_impl_trait_mode(ImplTraitLoweringMode::Opaque)
1046 .with_type_param_mode(TypeParamLoweringMode::Variable); 1047 .with_type_param_mode(TypeParamLoweringMode::Variable);
1047 let ret = (&ctx_ret).lower_ty(&data.ret_type); 1048 let ret = ctx_ret.lower_ty(&data.ret_type);
1048 let generics = generics(db.upcast(), def.into()); 1049 let generics = generics(db.upcast(), def.into());
1049 let num_binders = generics.len(); 1050 make_binders(&generics, CallableSig::from_params_and_return(params, ret, data.is_varargs()))
1050 Binders::new(num_binders, CallableSig::from_params_and_return(params, ret, data.is_varargs()))
1051} 1051}
1052 1052
1053/// Build the declared type of a function. This should not need to look at the 1053/// Build the declared type of a function. This should not need to look at the
@@ -1055,8 +1055,8 @@ fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig {
1055fn type_for_fn(db: &dyn HirDatabase, def: FunctionId) -> Binders<Ty> { 1055fn type_for_fn(db: &dyn HirDatabase, def: FunctionId) -> Binders<Ty> {
1056 let generics = generics(db.upcast(), def.into()); 1056 let generics = generics(db.upcast(), def.into());
1057 let substs = generics.bound_vars_subst(DebruijnIndex::INNERMOST); 1057 let substs = generics.bound_vars_subst(DebruijnIndex::INNERMOST);
1058 Binders::new( 1058 make_binders(
1059 substs.len(&Interner), 1059 &generics,
1060 TyKind::FnDef(CallableDefId::FunctionId(def).to_chalk(db), substs).intern(&Interner), 1060 TyKind::FnDef(CallableDefId::FunctionId(def).to_chalk(db), substs).intern(&Interner),
1061 ) 1061 )
1062} 1062}
@@ -1069,7 +1069,7 @@ fn type_for_const(db: &dyn HirDatabase, def: ConstId) -> Binders<Ty> {
1069 let ctx = 1069 let ctx =
1070 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); 1070 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable);
1071 1071
1072 Binders::new(generics.len(), ctx.lower_ty(&data.type_ref)) 1072 make_binders(&generics, ctx.lower_ty(&data.type_ref))
1073} 1073}
1074 1074
1075/// Build the declared type of a static. 1075/// Build the declared type of a static.
@@ -1078,7 +1078,7 @@ fn type_for_static(db: &dyn HirDatabase, def: StaticId) -> Binders<Ty> {
1078 let resolver = def.resolver(db.upcast()); 1078 let resolver = def.resolver(db.upcast());
1079 let ctx = TyLoweringContext::new(db, &resolver); 1079 let ctx = TyLoweringContext::new(db, &resolver);
1080 1080
1081 Binders::new(0, ctx.lower_ty(&data.type_ref)) 1081 Binders::empty(&Interner, ctx.lower_ty(&data.type_ref))
1082} 1082}
1083 1083
1084fn fn_sig_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> PolyFnSig { 1084fn fn_sig_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> PolyFnSig {
@@ -1088,8 +1088,8 @@ fn fn_sig_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> PolyFnS
1088 let ctx = 1088 let ctx =
1089 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); 1089 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable);
1090 let params = fields.iter().map(|(_, field)| ctx.lower_ty(&field.type_ref)).collect::<Vec<_>>(); 1090 let params = fields.iter().map(|(_, field)| ctx.lower_ty(&field.type_ref)).collect::<Vec<_>>();
1091 let ret = type_for_adt(db, def.into()); 1091 let (ret, binders) = type_for_adt(db, def.into()).into_value_and_skipped_binders();
1092 Binders::new(ret.num_binders, CallableSig::from_params_and_return(params, ret.value, false)) 1092 Binders::new(binders, CallableSig::from_params_and_return(params, ret, false))
1093} 1093}
1094 1094
1095/// Build the type of a tuple struct constructor. 1095/// Build the type of a tuple struct constructor.
@@ -1100,8 +1100,8 @@ fn type_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> Binders<T
1100 } 1100 }
1101 let generics = generics(db.upcast(), def.into()); 1101 let generics = generics(db.upcast(), def.into());
1102 let substs = generics.bound_vars_subst(DebruijnIndex::INNERMOST); 1102 let substs = generics.bound_vars_subst(DebruijnIndex::INNERMOST);
1103 Binders::new( 1103 make_binders(
1104 substs.len(&Interner), 1104 &generics,
1105 TyKind::FnDef(CallableDefId::StructId(def).to_chalk(db), substs).intern(&Interner), 1105 TyKind::FnDef(CallableDefId::StructId(def).to_chalk(db), substs).intern(&Interner),
1106 ) 1106 )
1107} 1107}
@@ -1114,8 +1114,8 @@ fn fn_sig_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId)
1114 let ctx = 1114 let ctx =
1115 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); 1115 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable);
1116 let params = fields.iter().map(|(_, field)| ctx.lower_ty(&field.type_ref)).collect::<Vec<_>>(); 1116 let params = fields.iter().map(|(_, field)| ctx.lower_ty(&field.type_ref)).collect::<Vec<_>>();
1117 let ret = type_for_adt(db, def.parent.into()); 1117 let (ret, binders) = type_for_adt(db, def.parent.into()).into_value_and_skipped_binders();
1118 Binders::new(ret.num_binders, CallableSig::from_params_and_return(params, ret.value, false)) 1118 Binders::new(binders, CallableSig::from_params_and_return(params, ret, false))
1119} 1119}
1120 1120
1121/// Build the type of a tuple enum variant constructor. 1121/// Build the type of a tuple enum variant constructor.
@@ -1127,17 +1127,17 @@ fn type_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId) -
1127 } 1127 }
1128 let generics = generics(db.upcast(), def.parent.into()); 1128 let generics = generics(db.upcast(), def.parent.into());
1129 let substs = generics.bound_vars_subst(DebruijnIndex::INNERMOST); 1129 let substs = generics.bound_vars_subst(DebruijnIndex::INNERMOST);
1130 Binders::new( 1130 make_binders(
1131 substs.len(&Interner), 1131 &generics,
1132 TyKind::FnDef(CallableDefId::EnumVariantId(def).to_chalk(db), substs).intern(&Interner), 1132 TyKind::FnDef(CallableDefId::EnumVariantId(def).to_chalk(db), substs).intern(&Interner),
1133 ) 1133 )
1134} 1134}
1135 1135
1136fn type_for_adt(db: &dyn HirDatabase, adt: AdtId) -> Binders<Ty> { 1136fn type_for_adt(db: &dyn HirDatabase, adt: AdtId) -> Binders<Ty> {
1137 let generics = generics(db.upcast(), adt.into());
1137 let b = TyBuilder::adt(db, adt); 1138 let b = TyBuilder::adt(db, adt);
1138 let num_binders = b.remaining();
1139 let ty = b.fill_with_bound_vars(DebruijnIndex::INNERMOST, 0).build(); 1139 let ty = b.fill_with_bound_vars(DebruijnIndex::INNERMOST, 0).build();
1140 Binders::new(num_binders, ty) 1140 make_binders(&generics, ty)
1141} 1141}
1142 1142
1143fn type_for_type_alias(db: &dyn HirDatabase, t: TypeAliasId) -> Binders<Ty> { 1143fn type_for_type_alias(db: &dyn HirDatabase, t: TypeAliasId) -> Binders<Ty> {
@@ -1146,11 +1146,11 @@ fn type_for_type_alias(db: &dyn HirDatabase, t: TypeAliasId) -> Binders<Ty> {
1146 let ctx = 1146 let ctx =
1147 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); 1147 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable);
1148 if db.type_alias_data(t).is_extern { 1148 if db.type_alias_data(t).is_extern {
1149 Binders::new(0, TyKind::Foreign(crate::to_foreign_def_id(t)).intern(&Interner)) 1149 Binders::empty(&Interner, TyKind::Foreign(crate::to_foreign_def_id(t)).intern(&Interner))
1150 } else { 1150 } else {
1151 let type_ref = &db.type_alias_data(t).type_ref; 1151 let type_ref = &db.type_alias_data(t).type_ref;
1152 let inner = ctx.lower_ty(type_ref.as_deref().unwrap_or(&TypeRef::Error)); 1152 let inner = ctx.lower_ty(type_ref.as_deref().unwrap_or(&TypeRef::Error));
1153 Binders::new(generics.len(), inner) 1153 make_binders(&generics, inner)
1154 } 1154 }
1155} 1155}
1156 1156
@@ -1209,19 +1209,21 @@ impl_from!(FunctionId, StructId, UnionId, EnumVariantId, ConstId, StaticId for V
1209/// namespace. 1209/// namespace.
1210pub(crate) fn ty_query(db: &dyn HirDatabase, def: TyDefId) -> Binders<Ty> { 1210pub(crate) fn ty_query(db: &dyn HirDatabase, def: TyDefId) -> Binders<Ty> {
1211 match def { 1211 match def {
1212 TyDefId::BuiltinType(it) => Binders::new(0, TyBuilder::builtin(it)), 1212 TyDefId::BuiltinType(it) => Binders::empty(&Interner, TyBuilder::builtin(it)),
1213 TyDefId::AdtId(it) => type_for_adt(db, it), 1213 TyDefId::AdtId(it) => type_for_adt(db, it),
1214 TyDefId::TypeAliasId(it) => type_for_type_alias(db, it), 1214 TyDefId::TypeAliasId(it) => type_for_type_alias(db, it),
1215 } 1215 }
1216} 1216}
1217 1217
1218pub(crate) fn ty_recover(db: &dyn HirDatabase, _cycle: &[String], def: &TyDefId) -> Binders<Ty> { 1218pub(crate) fn ty_recover(db: &dyn HirDatabase, _cycle: &[String], def: &TyDefId) -> Binders<Ty> {
1219 let num_binders = match *def { 1219 let generics = match *def {
1220 TyDefId::BuiltinType(_) => 0, 1220 TyDefId::BuiltinType(_) => {
1221 TyDefId::AdtId(it) => generics(db.upcast(), it.into()).len(), 1221 return Binders::empty(&Interner, TyKind::Error.intern(&Interner))
1222 TyDefId::TypeAliasId(it) => generics(db.upcast(), it.into()).len(), 1222 }
1223 TyDefId::AdtId(it) => generics(db.upcast(), it.into()),
1224 TyDefId::TypeAliasId(it) => generics(db.upcast(), it.into()),
1223 }; 1225 };
1224 Binders::new(num_binders, TyKind::Error.intern(&Interner)) 1226 make_binders(&generics, TyKind::Error.intern(&Interner))
1225} 1227}
1226 1228
1227pub(crate) fn value_ty_query(db: &dyn HirDatabase, def: ValueTyDefId) -> Binders<Ty> { 1229pub(crate) fn value_ty_query(db: &dyn HirDatabase, def: ValueTyDefId) -> Binders<Ty> {
@@ -1241,7 +1243,7 @@ pub(crate) fn impl_self_ty_query(db: &dyn HirDatabase, impl_id: ImplId) -> Binde
1241 let generics = generics(db.upcast(), impl_id.into()); 1243 let generics = generics(db.upcast(), impl_id.into());
1242 let ctx = 1244 let ctx =
1243 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); 1245 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable);
1244 Binders::new(generics.len(), ctx.lower_ty(&impl_data.self_ty)) 1246 make_binders(&generics, ctx.lower_ty(&impl_data.self_ty))
1245} 1247}
1246 1248
1247pub(crate) fn const_param_ty_query(db: &dyn HirDatabase, def: ConstParamId) -> Ty { 1249pub(crate) fn const_param_ty_query(db: &dyn HirDatabase, def: ConstParamId) -> Ty {
@@ -1259,7 +1261,7 @@ pub(crate) fn impl_self_ty_recover(
1259 impl_id: &ImplId, 1261 impl_id: &ImplId,
1260) -> Binders<Ty> { 1262) -> Binders<Ty> {
1261 let generics = generics(db.upcast(), (*impl_id).into()); 1263 let generics = generics(db.upcast(), (*impl_id).into());
1262 Binders::new(generics.len(), TyKind::Error.intern(&Interner)) 1264 make_binders(&generics, TyKind::Error.intern(&Interner))
1263} 1265}
1264 1266
1265pub(crate) fn impl_trait_query(db: &dyn HirDatabase, impl_id: ImplId) -> Option<Binders<TraitRef>> { 1267pub(crate) fn impl_trait_query(db: &dyn HirDatabase, impl_id: ImplId) -> Option<Binders<TraitRef>> {
@@ -1267,9 +1269,9 @@ pub(crate) fn impl_trait_query(db: &dyn HirDatabase, impl_id: ImplId) -> Option<
1267 let resolver = impl_id.resolver(db.upcast()); 1269 let resolver = impl_id.resolver(db.upcast());
1268 let ctx = 1270 let ctx =
1269 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); 1271 TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable);
1270 let self_ty = db.impl_self_ty(impl_id); 1272 let (self_ty, binders) = db.impl_self_ty(impl_id).into_value_and_skipped_binders();
1271 let target_trait = impl_data.target_trait.as_ref()?; 1273 let target_trait = impl_data.target_trait.as_ref()?;
1272 Some(Binders::new(self_ty.num_binders, ctx.lower_trait_ref(target_trait, Some(self_ty.value))?)) 1274 Some(Binders::new(binders, ctx.lower_trait_ref(target_trait, Some(self_ty))?))
1273} 1275}
1274 1276
1275pub(crate) fn return_type_impl_traits( 1277pub(crate) fn return_type_impl_traits(
@@ -1284,13 +1286,12 @@ pub(crate) fn return_type_impl_traits(
1284 .with_type_param_mode(TypeParamLoweringMode::Variable); 1286 .with_type_param_mode(TypeParamLoweringMode::Variable);
1285 let _ret = (&ctx_ret).lower_ty(&data.ret_type); 1287 let _ret = (&ctx_ret).lower_ty(&data.ret_type);
1286 let generics = generics(db.upcast(), def.into()); 1288 let generics = generics(db.upcast(), def.into());
1287 let num_binders = generics.len();
1288 let return_type_impl_traits = 1289 let return_type_impl_traits =
1289 ReturnTypeImplTraits { impl_traits: ctx_ret.opaque_type_data.into_inner() }; 1290 ReturnTypeImplTraits { impl_traits: ctx_ret.opaque_type_data.into_inner() };
1290 if return_type_impl_traits.impl_traits.is_empty() { 1291 if return_type_impl_traits.impl_traits.is_empty() {
1291 None 1292 None
1292 } else { 1293 } else {
1293 Some(Arc::new(Binders::new(num_binders, return_type_impl_traits))) 1294 Some(Arc::new(make_binders(&generics, return_type_impl_traits)))
1294 } 1295 }
1295} 1296}
1296 1297
@@ -1300,3 +1301,7 @@ pub(crate) fn lower_to_chalk_mutability(m: hir_def::type_ref::Mutability) -> Mut
1300 hir_def::type_ref::Mutability::Mut => Mutability::Mut, 1301 hir_def::type_ref::Mutability::Mut => Mutability::Mut,
1301 } 1302 }
1302} 1303}
1304
1305fn make_binders<T>(generics: &Generics, value: T) -> Binders<T> {
1306 crate::make_only_type_binders(generics.len(), value)
1307}