diff options
Diffstat (limited to 'crates/ra_hir_ty/src/lower.rs')
-rw-r--r-- | crates/ra_hir_ty/src/lower.rs | 98 |
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::{ | |||
35 | pub struct TyLoweringContext<'a, DB: HirDatabase> { | 35 | pub 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)] | ||
42 | pub enum ImplTraitLoweringMode { | ||
43 | Opaque, | ||
44 | Placeholder, | ||
45 | Disallowed, | ||
38 | } | 46 | } |
39 | 47 | ||
40 | impl Ty { | 48 | impl 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 | ||
526 | impl TraitEnvironment { | 542 | impl 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 |
552 | pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDefId) -> Substs { | 573 | pub(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) - | |||
565 | fn fn_sig_for_fn(db: &impl HirDatabase, def: FunctionId) -> FnSig { | 590 | fn 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 { | |||
583 | fn type_for_const(db: &impl HirDatabase, def: ConstId) -> Ty { | 617 | fn 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 { | |||
592 | fn type_for_static(db: &impl HirDatabase, def: StaticId) -> Ty { | 630 | fn 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 { | |||
664 | fn type_for_type_alias(db: &impl HirDatabase, t: TypeAliasId) -> Ty { | 714 | fn 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 { | |||
747 | pub(crate) fn impl_self_ty_query(db: &impl HirDatabase, impl_id: ImplId) -> Ty { | 801 | pub(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( | |||
762 | pub(crate) fn impl_trait_query(db: &impl HirDatabase, impl_id: ImplId) -> Option<TraitRef> { | 820 | pub(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())) |