diff options
Diffstat (limited to 'crates/hir_ty/src/lower.rs')
-rw-r--r-- | crates/hir_ty/src/lower.rs | 29 |
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 | ||
28 | use crate::{ | 28 | use 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)) |