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.rs29
1 files changed, 16 insertions, 13 deletions
diff --git a/crates/hir_ty/src/lower.rs b/crates/hir_ty/src/lower.rs
index b8b1400eb..e57d5970f 100644
--- a/crates/hir_ty/src/lower.rs
+++ b/crates/hir_ty/src/lower.rs
@@ -27,14 +27,14 @@ use stdx::impl_from;
27 27
28use crate::{ 28use crate::{
29 db::HirDatabase, 29 db::HirDatabase,
30 to_assoc_type_id, 30 to_assoc_type_id, to_placeholder_idx,
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 make_mut_slice, variant_data, 34 make_mut_slice, variant_data,
35 }, 35 },
36 AliasTy, Binders, BoundVar, CallableSig, DebruijnIndex, FnPointer, FnSig, GenericPredicate, 36 AliasTy, Binders, BoundVar, CallableSig, DebruijnIndex, FnPointer, FnSig, GenericPredicate,
37 OpaqueTy, OpaqueTyId, PolyFnSig, ProjectionPredicate, ProjectionTy, ReturnTypeImplTrait, 37 ImplTraitId, OpaqueTy, PolyFnSig, ProjectionPredicate, ProjectionTy, ReturnTypeImplTrait,
38 ReturnTypeImplTraits, Substs, TraitEnvironment, TraitRef, Ty, TyKind, TypeWalk, 38 ReturnTypeImplTraits, Substs, TraitEnvironment, TraitRef, Ty, TyKind, TypeWalk,
39}; 39};
40 40
@@ -228,14 +228,12 @@ impl Ty {
228 Some(GenericDefId::FunctionId(f)) => f, 228 Some(GenericDefId::FunctionId(f)) => f,
229 _ => panic!("opaque impl trait lowering in non-function"), 229 _ => panic!("opaque impl trait lowering in non-function"),
230 }; 230 };
231 let impl_trait_id = OpaqueTyId::ReturnTypeImplTrait(func, idx); 231 let impl_trait_id = ImplTraitId::ReturnTypeImplTrait(func, idx);
232 let opaque_ty_id = ctx.db.intern_impl_trait_id(impl_trait_id).into();
232 let generics = generics(ctx.db.upcast(), func.into()); 233 let generics = generics(ctx.db.upcast(), func.into());
233 let parameters = Substs::bound_vars(&generics, ctx.in_binders); 234 let parameters = Substs::bound_vars(&generics, ctx.in_binders);
234 TyKind::Alias(AliasTy::Opaque(OpaqueTy { 235 TyKind::Alias(AliasTy::Opaque(OpaqueTy { opaque_ty_id, parameters }))
235 opaque_ty_id: impl_trait_id, 236 .intern(&Interner)
236 parameters,
237 }))
238 .intern(&Interner)
239 } 237 }
240 ImplTraitLoweringMode::Param => { 238 ImplTraitLoweringMode::Param => {
241 let idx = ctx.impl_trait_counter.get(); 239 let idx = ctx.impl_trait_counter.get();
@@ -249,7 +247,9 @@ impl Ty {
249 data.provenance == TypeParamProvenance::ArgumentImplTrait 247 data.provenance == TypeParamProvenance::ArgumentImplTrait
250 }) 248 })
251 .nth(idx as usize) 249 .nth(idx as usize)
252 .map_or(TyKind::Unknown, |(id, _)| TyKind::Placeholder(id)); 250 .map_or(TyKind::Unknown, |(id, _)| {
251 TyKind::Placeholder(to_placeholder_idx(ctx.db, id))
252 });
253 param.intern(&Interner) 253 param.intern(&Interner)
254 } else { 254 } else {
255 TyKind::Unknown.intern(&Interner) 255 TyKind::Unknown.intern(&Interner)
@@ -384,7 +384,9 @@ impl Ty {
384 ctx.resolver.generic_def().expect("generics in scope"), 384 ctx.resolver.generic_def().expect("generics in scope"),
385 ); 385 );
386 match ctx.type_param_mode { 386 match ctx.type_param_mode {
387 TypeParamLoweringMode::Placeholder => TyKind::Placeholder(param_id), 387 TypeParamLoweringMode::Placeholder => {
388 TyKind::Placeholder(to_placeholder_idx(ctx.db, param_id))
389 }
388 TypeParamLoweringMode::Variable => { 390 TypeParamLoweringMode::Variable => {
389 let idx = generics.param_idx(param_id).expect("matching generics"); 391 let idx = generics.param_idx(param_id).expect("matching generics");
390 TyKind::BoundVar(BoundVar::new(ctx.in_binders, idx)) 392 TyKind::BoundVar(BoundVar::new(ctx.in_binders, idx))
@@ -396,7 +398,7 @@ impl Ty {
396 let generics = generics(ctx.db.upcast(), impl_id.into()); 398 let generics = generics(ctx.db.upcast(), impl_id.into());
397 let substs = match ctx.type_param_mode { 399 let substs = match ctx.type_param_mode {
398 TypeParamLoweringMode::Placeholder => { 400 TypeParamLoweringMode::Placeholder => {
399 Substs::type_params_for_generics(&generics) 401 Substs::type_params_for_generics(ctx.db, &generics)
400 } 402 }
401 TypeParamLoweringMode::Variable => { 403 TypeParamLoweringMode::Variable => {
402 Substs::bound_vars(&generics, ctx.in_binders) 404 Substs::bound_vars(&generics, ctx.in_binders)
@@ -408,7 +410,7 @@ impl Ty {
408 let generics = generics(ctx.db.upcast(), adt.into()); 410 let generics = generics(ctx.db.upcast(), adt.into());
409 let substs = match ctx.type_param_mode { 411 let substs = match ctx.type_param_mode {
410 TypeParamLoweringMode::Placeholder => { 412 TypeParamLoweringMode::Placeholder => {
411 Substs::type_params_for_generics(&generics) 413 Substs::type_params_for_generics(ctx.db, &generics)
412 } 414 }
413 TypeParamLoweringMode::Variable => { 415 TypeParamLoweringMode::Variable => {
414 Substs::bound_vars(&generics, ctx.in_binders) 416 Substs::bound_vars(&generics, ctx.in_binders)
@@ -689,8 +691,9 @@ impl GenericPredicate {
689 let generics = generics(ctx.db.upcast(), generic_def); 691 let generics = generics(ctx.db.upcast(), generic_def);
690 let param_id = 692 let param_id =
691 hir_def::TypeParamId { parent: generic_def, local_id: *param_id }; 693 hir_def::TypeParamId { parent: generic_def, local_id: *param_id };
694 let placeholder = to_placeholder_idx(ctx.db, param_id);
692 match ctx.type_param_mode { 695 match ctx.type_param_mode {
693 TypeParamLoweringMode::Placeholder => TyKind::Placeholder(param_id), 696 TypeParamLoweringMode::Placeholder => TyKind::Placeholder(placeholder),
694 TypeParamLoweringMode::Variable => { 697 TypeParamLoweringMode::Variable => {
695 let idx = generics.param_idx(param_id).expect("matching generics"); 698 let idx = generics.param_idx(param_id).expect("matching generics");
696 TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, idx)) 699 TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, idx))