diff options
Diffstat (limited to 'crates/hir_ty/src/lower.rs')
-rw-r--r-- | crates/hir_ty/src/lower.rs | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/crates/hir_ty/src/lower.rs b/crates/hir_ty/src/lower.rs index fd451a823..f60cec649 100644 --- a/crates/hir_ty/src/lower.rs +++ b/crates/hir_ty/src/lower.rs | |||
@@ -33,9 +33,10 @@ use crate::{ | |||
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 | variant_data, | 34 | variant_data, |
35 | }, | 35 | }, |
36 | AliasEq, AliasTy, Binders, BoundVar, CallableSig, DebruijnIndex, FnPointer, FnSig, ImplTraitId, | 36 | AliasEq, AliasTy, Binders, BoundVar, CallableSig, DebruijnIndex, DynTy, FnPointer, FnSig, |
37 | OpaqueTy, PolyFnSig, ProjectionTy, ReturnTypeImplTrait, ReturnTypeImplTraits, Substitution, | 37 | ImplTraitId, OpaqueTy, PolyFnSig, ProjectionTy, QuantifiedWhereClause, QuantifiedWhereClauses, |
38 | TraitEnvironment, TraitRef, Ty, TyKind, TypeWalk, WhereClause, | 38 | ReturnTypeImplTrait, ReturnTypeImplTraits, Substitution, TraitEnvironment, TraitRef, Ty, |
39 | TyKind, TypeWalk, WhereClause, | ||
39 | }; | 40 | }; |
40 | 41 | ||
41 | #[derive(Debug)] | 42 | #[derive(Debug)] |
@@ -188,13 +189,14 @@ impl<'a> TyLoweringContext<'a> { | |||
188 | TypeRef::DynTrait(bounds) => { | 189 | TypeRef::DynTrait(bounds) => { |
189 | let self_ty = | 190 | let self_ty = |
190 | TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, 0)).intern(&Interner); | 191 | TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, 0)).intern(&Interner); |
191 | let predicates = self.with_shifted_in(DebruijnIndex::ONE, |ctx| { | 192 | let bounds = self.with_shifted_in(DebruijnIndex::ONE, |ctx| { |
192 | bounds | 193 | QuantifiedWhereClauses::from_iter( |
193 | .iter() | 194 | &Interner, |
194 | .flat_map(|b| ctx.lower_type_bound(b, self_ty.clone(), false)) | 195 | bounds.iter().flat_map(|b| ctx.lower_type_bound(b, self_ty.clone(), false)), |
195 | .collect() | 196 | ) |
196 | }); | 197 | }); |
197 | TyKind::Dyn(predicates).intern(&Interner) | 198 | let bounds = Binders::new(1, bounds); |
199 | TyKind::Dyn(DynTy { bounds }).intern(&Interner) | ||
198 | } | 200 | } |
199 | TypeRef::ImplTrait(bounds) => { | 201 | TypeRef::ImplTrait(bounds) => { |
200 | match self.impl_trait_mode { | 202 | match self.impl_trait_mode { |
@@ -376,7 +378,16 @@ impl<'a> TyLoweringContext<'a> { | |||
376 | // FIXME report error (ambiguous associated type) | 378 | // FIXME report error (ambiguous associated type) |
377 | TyKind::Unknown.intern(&Interner) | 379 | TyKind::Unknown.intern(&Interner) |
378 | } else { | 380 | } else { |
379 | TyKind::Dyn(Arc::new([WhereClause::Implemented(trait_ref)])).intern(&Interner) | 381 | let dyn_ty = DynTy { |
382 | bounds: Binders::new( | ||
383 | 1, | ||
384 | QuantifiedWhereClauses::from_iter( | ||
385 | &Interner, | ||
386 | Some(Binders::wrap_empty(WhereClause::Implemented(trait_ref))), | ||
387 | ), | ||
388 | ), | ||
389 | }; | ||
390 | TyKind::Dyn(dyn_ty).intern(&Interner) | ||
380 | }; | 391 | }; |
381 | return (ty, None); | 392 | return (ty, None); |
382 | } | 393 | } |
@@ -670,7 +681,7 @@ impl<'a> TyLoweringContext<'a> { | |||
670 | &'a self, | 681 | &'a self, |
671 | where_predicate: &'a WherePredicate, | 682 | where_predicate: &'a WherePredicate, |
672 | ignore_bindings: bool, | 683 | ignore_bindings: bool, |
673 | ) -> impl Iterator<Item = WhereClause> + 'a { | 684 | ) -> impl Iterator<Item = QuantifiedWhereClause> + 'a { |
674 | match where_predicate { | 685 | match where_predicate { |
675 | WherePredicate::ForLifetime { target, bound, .. } | 686 | WherePredicate::ForLifetime { target, bound, .. } |
676 | | WherePredicate::TypeBound { target, bound } => { | 687 | | WherePredicate::TypeBound { target, bound } => { |
@@ -705,12 +716,12 @@ impl<'a> TyLoweringContext<'a> { | |||
705 | bound: &'a TypeBound, | 716 | bound: &'a TypeBound, |
706 | self_ty: Ty, | 717 | self_ty: Ty, |
707 | ignore_bindings: bool, | 718 | ignore_bindings: bool, |
708 | ) -> impl Iterator<Item = WhereClause> + 'a { | 719 | ) -> impl Iterator<Item = QuantifiedWhereClause> + 'a { |
709 | let mut bindings = None; | 720 | let mut bindings = None; |
710 | let trait_ref = match bound { | 721 | let trait_ref = match bound { |
711 | TypeBound::Path(path) => { | 722 | TypeBound::Path(path) => { |
712 | bindings = self.lower_trait_ref_from_path(path, Some(self_ty)); | 723 | bindings = self.lower_trait_ref_from_path(path, Some(self_ty)); |
713 | bindings.clone().map(WhereClause::Implemented) | 724 | bindings.clone().map(WhereClause::Implemented).map(|b| Binders::wrap_empty(b)) |
714 | } | 725 | } |
715 | TypeBound::Lifetime(_) => None, | 726 | TypeBound::Lifetime(_) => None, |
716 | TypeBound::Error => None, | 727 | TypeBound::Error => None, |
@@ -727,7 +738,7 @@ impl<'a> TyLoweringContext<'a> { | |||
727 | &'a self, | 738 | &'a self, |
728 | bound: &'a TypeBound, | 739 | bound: &'a TypeBound, |
729 | trait_ref: TraitRef, | 740 | trait_ref: TraitRef, |
730 | ) -> impl Iterator<Item = WhereClause> + 'a { | 741 | ) -> impl Iterator<Item = QuantifiedWhereClause> + 'a { |
731 | let last_segment = match bound { | 742 | let last_segment = match bound { |
732 | TypeBound::Path(path) => path.segments().last(), | 743 | TypeBound::Path(path) => path.segments().last(), |
733 | TypeBound::Error | TypeBound::Lifetime(_) => None, | 744 | TypeBound::Error | TypeBound::Lifetime(_) => None, |
@@ -743,7 +754,7 @@ impl<'a> TyLoweringContext<'a> { | |||
743 | &binding.name, | 754 | &binding.name, |
744 | ); | 755 | ); |
745 | let (super_trait_ref, associated_ty) = match found { | 756 | let (super_trait_ref, associated_ty) = match found { |
746 | None => return SmallVec::<[WhereClause; 1]>::new(), | 757 | None => return SmallVec::<[QuantifiedWhereClause; 1]>::new(), |
747 | Some(t) => t, | 758 | Some(t) => t, |
748 | }; | 759 | }; |
749 | let projection_ty = ProjectionTy { | 760 | let projection_ty = ProjectionTy { |
@@ -757,7 +768,7 @@ impl<'a> TyLoweringContext<'a> { | |||
757 | let ty = self.lower_ty(type_ref); | 768 | let ty = self.lower_ty(type_ref); |
758 | let alias_eq = | 769 | let alias_eq = |
759 | AliasEq { alias: AliasTy::Projection(projection_ty.clone()), ty }; | 770 | AliasEq { alias: AliasTy::Projection(projection_ty.clone()), ty }; |
760 | preds.push(WhereClause::AliasEq(alias_eq)); | 771 | preds.push(Binders::wrap_empty(WhereClause::AliasEq(alias_eq))); |
761 | } | 772 | } |
762 | for bound in &binding.bounds { | 773 | for bound in &binding.bounds { |
763 | preds.extend(self.lower_type_bound( | 774 | preds.extend(self.lower_type_bound( |
@@ -814,7 +825,7 @@ pub fn associated_type_shorthand_candidates<R>( | |||
814 | let predicates = db.generic_predicates_for_param(param_id); | 825 | let predicates = db.generic_predicates_for_param(param_id); |
815 | let mut traits_: Vec<_> = predicates | 826 | let mut traits_: Vec<_> = predicates |
816 | .iter() | 827 | .iter() |
817 | .filter_map(|pred| match &pred.value { | 828 | .filter_map(|pred| match &pred.value.value { |
818 | WhereClause::Implemented(tr) => Some(tr.clone()), | 829 | WhereClause::Implemented(tr) => Some(tr.clone()), |
819 | _ => None, | 830 | _ => None, |
820 | }) | 831 | }) |
@@ -887,7 +898,7 @@ pub(crate) fn field_types_query( | |||
887 | pub(crate) fn generic_predicates_for_param_query( | 898 | pub(crate) fn generic_predicates_for_param_query( |
888 | db: &dyn HirDatabase, | 899 | db: &dyn HirDatabase, |
889 | param_id: TypeParamId, | 900 | param_id: TypeParamId, |
890 | ) -> Arc<[Binders<WhereClause>]> { | 901 | ) -> Arc<[Binders<QuantifiedWhereClause>]> { |
891 | let resolver = param_id.parent.resolver(db.upcast()); | 902 | let resolver = param_id.parent.resolver(db.upcast()); |
892 | let ctx = | 903 | let ctx = |
893 | TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); | 904 | TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); |
@@ -915,7 +926,7 @@ pub(crate) fn generic_predicates_for_param_recover( | |||
915 | _db: &dyn HirDatabase, | 926 | _db: &dyn HirDatabase, |
916 | _cycle: &[String], | 927 | _cycle: &[String], |
917 | _param_id: &TypeParamId, | 928 | _param_id: &TypeParamId, |
918 | ) -> Arc<[Binders<WhereClause>]> { | 929 | ) -> Arc<[Binders<QuantifiedWhereClause>]> { |
919 | Arc::new([]) | 930 | Arc::new([]) |
920 | } | 931 | } |
921 | 932 | ||
@@ -930,7 +941,7 @@ pub(crate) fn trait_environment_query( | |||
930 | let mut clauses = Vec::new(); | 941 | let mut clauses = Vec::new(); |
931 | for pred in resolver.where_predicates_in_scope() { | 942 | for pred in resolver.where_predicates_in_scope() { |
932 | for pred in ctx.lower_where_predicate(pred, false) { | 943 | for pred in ctx.lower_where_predicate(pred, false) { |
933 | if let WhereClause::Implemented(tr) = &pred { | 944 | if let WhereClause::Implemented(tr) = &pred.skip_binders() { |
934 | traits_in_scope.push((tr.self_type_parameter().clone(), tr.hir_trait_id())); | 945 | traits_in_scope.push((tr.self_type_parameter().clone(), tr.hir_trait_id())); |
935 | } | 946 | } |
936 | let program_clause: chalk_ir::ProgramClause<Interner> = | 947 | let program_clause: chalk_ir::ProgramClause<Interner> = |
@@ -970,7 +981,7 @@ pub(crate) fn trait_environment_query( | |||
970 | pub(crate) fn generic_predicates_query( | 981 | pub(crate) fn generic_predicates_query( |
971 | db: &dyn HirDatabase, | 982 | db: &dyn HirDatabase, |
972 | def: GenericDefId, | 983 | def: GenericDefId, |
973 | ) -> Arc<[Binders<WhereClause>]> { | 984 | ) -> Arc<[Binders<QuantifiedWhereClause>]> { |
974 | let resolver = def.resolver(db.upcast()); | 985 | let resolver = def.resolver(db.upcast()); |
975 | let ctx = | 986 | let ctx = |
976 | TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); | 987 | TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); |