aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/lower.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2020-01-31 14:17:48 +0000
committerFlorian Diebold <[email protected]>2020-02-07 17:28:10 +0000
commitdbc14f9d570e5bc1ddae05e9ccd8f163082b3cac (patch)
treeadde2b49413960c2741b18402a6cb5757b346804 /crates/ra_hir_ty/src/lower.rs
parenta9430865b319ab2fc28602fe98df21146e54b7bf (diff)
First stab at desugaring bounds for APIT
Diffstat (limited to 'crates/ra_hir_ty/src/lower.rs')
-rw-r--r--crates/ra_hir_ty/src/lower.rs29
1 files changed, 26 insertions, 3 deletions
diff --git a/crates/ra_hir_ty/src/lower.rs b/crates/ra_hir_ty/src/lower.rs
index 459b96280..f1a11e073 100644
--- a/crates/ra_hir_ty/src/lower.rs
+++ b/crates/ra_hir_ty/src/lower.rs
@@ -10,7 +10,7 @@ use std::sync::Arc;
10 10
11use hir_def::{ 11use hir_def::{
12 builtin_type::BuiltinType, 12 builtin_type::BuiltinType,
13 generics::WherePredicate, 13 generics::{WherePredicateTarget, WherePredicate},
14 path::{GenericArg, Path, PathSegment, PathSegments}, 14 path::{GenericArg, Path, PathSegment, PathSegments},
15 resolver::{HasResolver, Resolver, TypeNs}, 15 resolver::{HasResolver, Resolver, TypeNs},
16 type_ref::{TypeBound, TypeRef}, 16 type_ref::{TypeBound, TypeRef},
@@ -505,7 +505,22 @@ impl GenericPredicate {
505 ctx: &'a TyLoweringContext<'a, impl HirDatabase>, 505 ctx: &'a TyLoweringContext<'a, impl HirDatabase>,
506 where_predicate: &'a WherePredicate, 506 where_predicate: &'a WherePredicate,
507 ) -> impl Iterator<Item = GenericPredicate> + 'a { 507 ) -> impl Iterator<Item = GenericPredicate> + 'a {
508 let self_ty = Ty::from_hir(ctx, &where_predicate.type_ref); 508 let self_ty = match &where_predicate.target {
509 WherePredicateTarget::TypeRef(type_ref) => Ty::from_hir(ctx, type_ref),
510 WherePredicateTarget::TypeParam(param_id) => {
511 let generic_def = ctx.resolver.generic_def().expect("generics in scope");
512 let generics = generics(ctx.db, generic_def);
513 let param_id = hir_def::TypeParamId { parent: generic_def, local_id: *param_id };
514 let idx = generics.param_idx(param_id);
515 match ctx.type_param_mode {
516 TypeParamLoweringMode::Placeholder => {
517 let name = generics.param_name(param_id);
518 Ty::Param { idx, name }
519 },
520 TypeParamLoweringMode::Variable => Ty::Bound(idx),
521 }
522 },
523 };
509 GenericPredicate::from_type_bound(ctx, &where_predicate.bound, self_ty) 524 GenericPredicate::from_type_bound(ctx, &where_predicate.bound, self_ty)
510 } 525 }
511 526
@@ -595,10 +610,18 @@ pub(crate) fn generic_predicates_for_param_query(
595) -> Arc<[GenericPredicate]> { 610) -> Arc<[GenericPredicate]> {
596 let resolver = def.resolver(db); 611 let resolver = def.resolver(db);
597 let ctx = TyLoweringContext::new(db, &resolver); 612 let ctx = TyLoweringContext::new(db, &resolver);
613 let generics = generics(db, def);
598 resolver 614 resolver
599 .where_predicates_in_scope() 615 .where_predicates_in_scope()
600 // we have to filter out all other predicates *first*, before attempting to lower them 616 // we have to filter out all other predicates *first*, before attempting to lower them
601 .filter(|pred| Ty::from_hir_only_param(&ctx, &pred.type_ref) == Some(param_idx)) 617 .filter(|pred| match &pred.target {
618 WherePredicateTarget::TypeRef(type_ref) => Ty::from_hir_only_param(&ctx, type_ref) == Some(param_idx),
619 WherePredicateTarget::TypeParam(local_id) => {
620 let param_id = hir_def::TypeParamId { parent: def, local_id: *local_id };
621 let idx = generics.param_idx(param_id);
622 idx == param_idx
623 }
624 })
602 .flat_map(|pred| GenericPredicate::from_where_predicate(&ctx, pred)) 625 .flat_map(|pred| GenericPredicate::from_where_predicate(&ctx, pred))
603 .collect() 626 .collect()
604} 627}