aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/lower.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_ty/src/lower.rs')
-rw-r--r--crates/ra_hir_ty/src/lower.rs98
1 files changed, 80 insertions, 18 deletions
diff --git a/crates/ra_hir_ty/src/lower.rs b/crates/ra_hir_ty/src/lower.rs
index 87c984e3f..3d2421223 100644
--- a/crates/ra_hir_ty/src/lower.rs
+++ b/crates/ra_hir_ty/src/lower.rs
@@ -35,6 +35,14 @@ use crate::{
35pub struct TyLoweringContext<'a, DB: HirDatabase> { 35pub struct TyLoweringContext<'a, DB: HirDatabase> {
36 pub db: &'a DB, 36 pub db: &'a DB,
37 pub resolver: &'a Resolver, 37 pub resolver: &'a Resolver,
38 pub impl_trait_mode: ImplTraitLoweringMode,
39}
40
41#[derive(Clone, Debug)]
42pub enum ImplTraitLoweringMode {
43 Opaque,
44 Placeholder,
45 Disallowed,
38} 46}
39 47
40impl Ty { 48impl Ty {
@@ -484,7 +492,11 @@ pub(crate) fn field_types_query(
484 VariantId::EnumVariantId(it) => it.parent.resolver(db), 492 VariantId::EnumVariantId(it) => it.parent.resolver(db),
485 }; 493 };
486 let mut res = ArenaMap::default(); 494 let mut res = ArenaMap::default();
487 let ctx = TyLoweringContext { db, resolver: &resolver }; 495 let ctx = TyLoweringContext {
496 db,
497 resolver: &resolver,
498 impl_trait_mode: ImplTraitLoweringMode::Disallowed,
499 };
488 for (field_id, field_data) in var_data.fields().iter() { 500 for (field_id, field_data) in var_data.fields().iter() {
489 res.insert(field_id, Ty::from_hir(&ctx, &field_data.type_ref)) 501 res.insert(field_id, Ty::from_hir(&ctx, &field_data.type_ref))
490 } 502 }
@@ -505,7 +517,11 @@ pub(crate) fn generic_predicates_for_param_query(
505 param_idx: u32, 517 param_idx: u32,
506) -> Arc<[GenericPredicate]> { 518) -> Arc<[GenericPredicate]> {
507 let resolver = def.resolver(db); 519 let resolver = def.resolver(db);
508 let ctx = TyLoweringContext { db, resolver: &resolver }; 520 let ctx = TyLoweringContext {
521 db,
522 resolver: &resolver,
523 impl_trait_mode: ImplTraitLoweringMode::Disallowed,
524 };
509 resolver 525 resolver
510 .where_predicates_in_scope() 526 .where_predicates_in_scope()
511 // we have to filter out all other predicates *first*, before attempting to lower them 527 // we have to filter out all other predicates *first*, before attempting to lower them
@@ -524,11 +540,12 @@ pub(crate) fn generic_predicates_for_param_recover(
524} 540}
525 541
526impl TraitEnvironment { 542impl TraitEnvironment {
527 pub fn lower(ctx: &TyLoweringContext<'_, impl HirDatabase>) -> Arc<TraitEnvironment> { 543 pub fn lower(db: &impl HirDatabase, resolver: &Resolver) -> Arc<TraitEnvironment> {
528 let predicates = ctx 544 let ctx =
529 .resolver 545 TyLoweringContext { db, resolver, impl_trait_mode: ImplTraitLoweringMode::Disallowed };
546 let predicates = resolver
530 .where_predicates_in_scope() 547 .where_predicates_in_scope()
531 .flat_map(|pred| GenericPredicate::from_where_predicate(ctx, pred)) 548 .flat_map(|pred| GenericPredicate::from_where_predicate(&ctx, pred))
532 .collect::<Vec<_>>(); 549 .collect::<Vec<_>>();
533 550
534 Arc::new(TraitEnvironment { predicates }) 551 Arc::new(TraitEnvironment { predicates })
@@ -541,7 +558,11 @@ pub(crate) fn generic_predicates_query(
541 def: GenericDefId, 558 def: GenericDefId,
542) -> Arc<[GenericPredicate]> { 559) -> Arc<[GenericPredicate]> {
543 let resolver = def.resolver(db); 560 let resolver = def.resolver(db);
544 let ctx = TyLoweringContext { db, resolver: &resolver }; 561 let ctx = TyLoweringContext {
562 db,
563 resolver: &resolver,
564 impl_trait_mode: ImplTraitLoweringMode::Disallowed,
565 };
545 resolver 566 resolver
546 .where_predicates_in_scope() 567 .where_predicates_in_scope()
547 .flat_map(|pred| GenericPredicate::from_where_predicate(&ctx, pred)) 568 .flat_map(|pred| GenericPredicate::from_where_predicate(&ctx, pred))
@@ -551,7 +572,11 @@ pub(crate) fn generic_predicates_query(
551/// Resolve the default type params from generics 572/// Resolve the default type params from generics
552pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDefId) -> Substs { 573pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDefId) -> Substs {
553 let resolver = def.resolver(db); 574 let resolver = def.resolver(db);
554 let ctx = TyLoweringContext { db, resolver: &resolver }; 575 let ctx = TyLoweringContext {
576 db,
577 resolver: &resolver,
578 impl_trait_mode: ImplTraitLoweringMode::Disallowed,
579 };
555 let generic_params = generics(db, def.into()); 580 let generic_params = generics(db, def.into());
556 581
557 let defaults = generic_params 582 let defaults = generic_params
@@ -565,9 +590,18 @@ pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDefId) -
565fn fn_sig_for_fn(db: &impl HirDatabase, def: FunctionId) -> FnSig { 590fn fn_sig_for_fn(db: &impl HirDatabase, def: FunctionId) -> FnSig {
566 let data = db.function_data(def); 591 let data = db.function_data(def);
567 let resolver = def.resolver(db); 592 let resolver = def.resolver(db);
568 let ctx = TyLoweringContext { db, resolver: &resolver }; 593 let ctx_params = TyLoweringContext {
569 let params = data.params.iter().map(|tr| Ty::from_hir(&ctx, tr)).collect::<Vec<_>>(); 594 db,
570 let ret = Ty::from_hir(&ctx, &data.ret_type); 595 resolver: &resolver,
596 impl_trait_mode: ImplTraitLoweringMode::Placeholder,
597 };
598 let params = data.params.iter().map(|tr| Ty::from_hir(&ctx_params, tr)).collect::<Vec<_>>();
599 let ctx_ret = TyLoweringContext {
600 db,
601 resolver: &resolver,
602 impl_trait_mode: ImplTraitLoweringMode::Opaque,
603 };
604 let ret = Ty::from_hir(&ctx_ret, &data.ret_type);
571 FnSig::from_params_and_return(params, ret) 605 FnSig::from_params_and_return(params, ret)
572} 606}
573 607
@@ -583,7 +617,11 @@ fn type_for_fn(db: &impl HirDatabase, def: FunctionId) -> Ty {
583fn type_for_const(db: &impl HirDatabase, def: ConstId) -> Ty { 617fn type_for_const(db: &impl HirDatabase, def: ConstId) -> Ty {
584 let data = db.const_data(def); 618 let data = db.const_data(def);
585 let resolver = def.resolver(db); 619 let resolver = def.resolver(db);
586 let ctx = TyLoweringContext { db, resolver: &resolver }; 620 let ctx = TyLoweringContext {
621 db,
622 resolver: &resolver,
623 impl_trait_mode: ImplTraitLoweringMode::Disallowed,
624 };
587 625
588 Ty::from_hir(&ctx, &data.type_ref) 626 Ty::from_hir(&ctx, &data.type_ref)
589} 627}
@@ -592,7 +630,11 @@ fn type_for_const(db: &impl HirDatabase, def: ConstId) -> Ty {
592fn type_for_static(db: &impl HirDatabase, def: StaticId) -> Ty { 630fn type_for_static(db: &impl HirDatabase, def: StaticId) -> Ty {
593 let data = db.static_data(def); 631 let data = db.static_data(def);
594 let resolver = def.resolver(db); 632 let resolver = def.resolver(db);
595 let ctx = TyLoweringContext { db, resolver: &resolver }; 633 let ctx = TyLoweringContext {
634 db,
635 resolver: &resolver,
636 impl_trait_mode: ImplTraitLoweringMode::Disallowed,
637 };
596 638
597 Ty::from_hir(&ctx, &data.type_ref) 639 Ty::from_hir(&ctx, &data.type_ref)
598} 640}
@@ -612,7 +654,11 @@ fn fn_sig_for_struct_constructor(db: &impl HirDatabase, def: StructId) -> FnSig
612 let struct_data = db.struct_data(def.into()); 654 let struct_data = db.struct_data(def.into());
613 let fields = struct_data.variant_data.fields(); 655 let fields = struct_data.variant_data.fields();
614 let resolver = def.resolver(db); 656 let resolver = def.resolver(db);
615 let ctx = TyLoweringContext { db, resolver: &resolver }; 657 let ctx = TyLoweringContext {
658 db,
659 resolver: &resolver,
660 impl_trait_mode: ImplTraitLoweringMode::Disallowed,
661 };
616 let params = 662 let params =
617 fields.iter().map(|(_, field)| Ty::from_hir(&ctx, &field.type_ref)).collect::<Vec<_>>(); 663 fields.iter().map(|(_, field)| Ty::from_hir(&ctx, &field.type_ref)).collect::<Vec<_>>();
618 let ret = type_for_adt(db, def.into()); 664 let ret = type_for_adt(db, def.into());
@@ -635,7 +681,11 @@ fn fn_sig_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariantId
635 let var_data = &enum_data.variants[def.local_id]; 681 let var_data = &enum_data.variants[def.local_id];
636 let fields = var_data.variant_data.fields(); 682 let fields = var_data.variant_data.fields();
637 let resolver = def.parent.resolver(db); 683 let resolver = def.parent.resolver(db);
638 let ctx = TyLoweringContext { db, resolver: &resolver }; 684 let ctx = TyLoweringContext {
685 db,
686 resolver: &resolver,
687 impl_trait_mode: ImplTraitLoweringMode::Disallowed,
688 };
639 let params = 689 let params =
640 fields.iter().map(|(_, field)| Ty::from_hir(&ctx, &field.type_ref)).collect::<Vec<_>>(); 690 fields.iter().map(|(_, field)| Ty::from_hir(&ctx, &field.type_ref)).collect::<Vec<_>>();
641 let generics = generics(db, def.parent.into()); 691 let generics = generics(db, def.parent.into());
@@ -664,7 +714,11 @@ fn type_for_adt(db: &impl HirDatabase, adt: AdtId) -> Ty {
664fn type_for_type_alias(db: &impl HirDatabase, t: TypeAliasId) -> Ty { 714fn type_for_type_alias(db: &impl HirDatabase, t: TypeAliasId) -> Ty {
665 let generics = generics(db, t.into()); 715 let generics = generics(db, t.into());
666 let resolver = t.resolver(db); 716 let resolver = t.resolver(db);
667 let ctx = TyLoweringContext { db, resolver: &resolver }; 717 let ctx = TyLoweringContext {
718 db,
719 resolver: &resolver,
720 impl_trait_mode: ImplTraitLoweringMode::Disallowed,
721 };
668 let type_ref = &db.type_alias_data(t).type_ref; 722 let type_ref = &db.type_alias_data(t).type_ref;
669 let substs = Substs::identity(&generics); 723 let substs = Substs::identity(&generics);
670 let inner = Ty::from_hir(&ctx, type_ref.as_ref().unwrap_or(&TypeRef::Error)); 724 let inner = Ty::from_hir(&ctx, type_ref.as_ref().unwrap_or(&TypeRef::Error));
@@ -747,7 +801,11 @@ pub(crate) fn value_ty_query(db: &impl HirDatabase, def: ValueTyDefId) -> Ty {
747pub(crate) fn impl_self_ty_query(db: &impl HirDatabase, impl_id: ImplId) -> Ty { 801pub(crate) fn impl_self_ty_query(db: &impl HirDatabase, impl_id: ImplId) -> Ty {
748 let impl_data = db.impl_data(impl_id); 802 let impl_data = db.impl_data(impl_id);
749 let resolver = impl_id.resolver(db); 803 let resolver = impl_id.resolver(db);
750 let ctx = TyLoweringContext { db, resolver: &resolver }; 804 let ctx = TyLoweringContext {
805 db,
806 resolver: &resolver,
807 impl_trait_mode: ImplTraitLoweringMode::Disallowed,
808 };
751 Ty::from_hir(&ctx, &impl_data.target_type) 809 Ty::from_hir(&ctx, &impl_data.target_type)
752} 810}
753 811
@@ -762,7 +820,11 @@ pub(crate) fn impl_self_ty_recover(
762pub(crate) fn impl_trait_query(db: &impl HirDatabase, impl_id: ImplId) -> Option<TraitRef> { 820pub(crate) fn impl_trait_query(db: &impl HirDatabase, impl_id: ImplId) -> Option<TraitRef> {
763 let impl_data = db.impl_data(impl_id); 821 let impl_data = db.impl_data(impl_id);
764 let resolver = impl_id.resolver(db); 822 let resolver = impl_id.resolver(db);
765 let ctx = TyLoweringContext { db, resolver: &resolver }; 823 let ctx = TyLoweringContext {
824 db,
825 resolver: &resolver,
826 impl_trait_mode: ImplTraitLoweringMode::Disallowed,
827 };
766 let self_ty = db.impl_self_ty(impl_id); 828 let self_ty = db.impl_self_ty(impl_id);
767 let target_trait = impl_data.target_trait.as_ref()?; 829 let target_trait = impl_data.target_trait.as_ref()?;
768 TraitRef::from_hir(&ctx, target_trait, Some(self_ty.clone())) 830 TraitRef::from_hir(&ctx, target_trait, Some(self_ty.clone()))