diff options
Diffstat (limited to 'crates/hir_ty/src/lower.rs')
-rw-r--r-- | crates/hir_ty/src/lower.rs | 135 |
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 { | |||
1055 | fn type_for_fn(db: &dyn HirDatabase, def: FunctionId) -> Binders<Ty> { | 1055 | fn 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 | ||
1084 | fn fn_sig_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> PolyFnSig { | 1084 | fn 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 | ||
1136 | fn type_for_adt(db: &dyn HirDatabase, adt: AdtId) -> Binders<Ty> { | 1136 | fn 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 | ||
1143 | fn type_for_type_alias(db: &dyn HirDatabase, t: TypeAliasId) -> Binders<Ty> { | 1143 | fn 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. |
1210 | pub(crate) fn ty_query(db: &dyn HirDatabase, def: TyDefId) -> Binders<Ty> { | 1210 | pub(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 | ||
1218 | pub(crate) fn ty_recover(db: &dyn HirDatabase, _cycle: &[String], def: &TyDefId) -> Binders<Ty> { | 1218 | pub(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 | ||
1227 | pub(crate) fn value_ty_query(db: &dyn HirDatabase, def: ValueTyDefId) -> Binders<Ty> { | 1229 | pub(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 | ||
1247 | pub(crate) fn const_param_ty_query(db: &dyn HirDatabase, def: ConstParamId) -> Ty { | 1249 | pub(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 | ||
1265 | pub(crate) fn impl_trait_query(db: &dyn HirDatabase, impl_id: ImplId) -> Option<Binders<TraitRef>> { | 1267 | pub(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 | ||
1275 | pub(crate) fn return_type_impl_traits( | 1277 | pub(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 | |||
1305 | fn make_binders<T>(generics: &Generics, value: T) -> Binders<T> { | ||
1306 | crate::make_only_type_binders(generics.len(), value) | ||
1307 | } | ||