diff options
Diffstat (limited to 'crates/hir_ty/src/lower.rs')
-rw-r--r-- | crates/hir_ty/src/lower.rs | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/crates/hir_ty/src/lower.rs b/crates/hir_ty/src/lower.rs index 5fe5b8ad1..d84ec9b7a 100644 --- a/crates/hir_ty/src/lower.rs +++ b/crates/hir_ty/src/lower.rs | |||
@@ -8,7 +8,7 @@ | |||
8 | use std::{iter, sync::Arc}; | 8 | use std::{iter, sync::Arc}; |
9 | 9 | ||
10 | use base_db::CrateId; | 10 | use base_db::CrateId; |
11 | use chalk_ir::Mutability; | 11 | use chalk_ir::{cast::Cast, Mutability}; |
12 | use hir_def::{ | 12 | use hir_def::{ |
13 | adt::StructKind, | 13 | adt::StructKind, |
14 | builtin_type::BuiltinType, | 14 | builtin_type::BuiltinType, |
@@ -24,10 +24,10 @@ use hir_expand::name::Name; | |||
24 | use la_arena::ArenaMap; | 24 | use la_arena::ArenaMap; |
25 | use smallvec::SmallVec; | 25 | use smallvec::SmallVec; |
26 | use stdx::impl_from; | 26 | use stdx::impl_from; |
27 | use test_utils::mark; | ||
28 | 27 | ||
29 | use crate::{ | 28 | use crate::{ |
30 | db::HirDatabase, | 29 | db::HirDatabase, |
30 | traits::chalk::{Interner, ToChalk}, | ||
31 | utils::{ | 31 | utils::{ |
32 | all_super_trait_refs, associated_type_by_name_including_super_traits, generics, | 32 | all_super_trait_refs, associated_type_by_name_including_super_traits, generics, |
33 | make_mut_slice, variant_data, | 33 | make_mut_slice, variant_data, |
@@ -760,7 +760,7 @@ fn assoc_type_bindings_from_type_bound<'a>( | |||
760 | 760 | ||
761 | impl ReturnTypeImplTrait { | 761 | impl ReturnTypeImplTrait { |
762 | fn from_hir(ctx: &TyLoweringContext, bounds: &[TypeBound]) -> Self { | 762 | fn from_hir(ctx: &TyLoweringContext, bounds: &[TypeBound]) -> Self { |
763 | mark::hit!(lower_rpit); | 763 | cov_mark::hit!(lower_rpit); |
764 | let self_ty = Ty::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, 0)); | 764 | let self_ty = Ty::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, 0)); |
765 | let predicates = ctx.with_shifted_in(DebruijnIndex::ONE, |ctx| { | 765 | let predicates = ctx.with_shifted_in(DebruijnIndex::ONE, |ctx| { |
766 | bounds | 766 | bounds |
@@ -915,10 +915,21 @@ impl TraitEnvironment { | |||
915 | pub fn lower(db: &dyn HirDatabase, resolver: &Resolver) -> Arc<TraitEnvironment> { | 915 | pub fn lower(db: &dyn HirDatabase, resolver: &Resolver) -> Arc<TraitEnvironment> { |
916 | let ctx = TyLoweringContext::new(db, &resolver) | 916 | let ctx = TyLoweringContext::new(db, &resolver) |
917 | .with_type_param_mode(TypeParamLoweringMode::Placeholder); | 917 | .with_type_param_mode(TypeParamLoweringMode::Placeholder); |
918 | let mut predicates = resolver | 918 | let mut traits_in_scope = Vec::new(); |
919 | .where_predicates_in_scope() | 919 | let mut clauses = Vec::new(); |
920 | .flat_map(|pred| GenericPredicate::from_where_predicate(&ctx, pred)) | 920 | for pred in resolver.where_predicates_in_scope() { |
921 | .collect::<Vec<_>>(); | 921 | for pred in GenericPredicate::from_where_predicate(&ctx, pred) { |
922 | if pred.is_error() { | ||
923 | continue; | ||
924 | } | ||
925 | if let GenericPredicate::Implemented(tr) = &pred { | ||
926 | traits_in_scope.push((tr.self_ty().clone(), tr.trait_)); | ||
927 | } | ||
928 | let program_clause: chalk_ir::ProgramClause<Interner> = | ||
929 | pred.clone().to_chalk(db).cast(&Interner); | ||
930 | clauses.push(program_clause.into_from_env_clause(&Interner)); | ||
931 | } | ||
932 | } | ||
922 | 933 | ||
923 | if let Some(def) = resolver.generic_def() { | 934 | if let Some(def) = resolver.generic_def() { |
924 | let container: Option<AssocContainerId> = match def { | 935 | let container: Option<AssocContainerId> = match def { |
@@ -935,16 +946,19 @@ impl TraitEnvironment { | |||
935 | // add `Self: Trait<T1, T2, ...>` to the environment in trait | 946 | // add `Self: Trait<T1, T2, ...>` to the environment in trait |
936 | // function default implementations (and hypothetical code | 947 | // function default implementations (and hypothetical code |
937 | // inside consts or type aliases) | 948 | // inside consts or type aliases) |
938 | test_utils::mark::hit!(trait_self_implements_self); | 949 | cov_mark::hit!(trait_self_implements_self); |
939 | let substs = Substs::type_params(db, trait_id); | 950 | let substs = Substs::type_params(db, trait_id); |
940 | let trait_ref = TraitRef { trait_: trait_id, substs }; | 951 | let trait_ref = TraitRef { trait_: trait_id, substs }; |
941 | let pred = GenericPredicate::Implemented(trait_ref); | 952 | let pred = GenericPredicate::Implemented(trait_ref); |
942 | 953 | let program_clause: chalk_ir::ProgramClause<Interner> = | |
943 | predicates.push(pred); | 954 | pred.clone().to_chalk(db).cast(&Interner); |
955 | clauses.push(program_clause.into_from_env_clause(&Interner)); | ||
944 | } | 956 | } |
945 | } | 957 | } |
946 | 958 | ||
947 | Arc::new(TraitEnvironment { predicates }) | 959 | let env = chalk_ir::Environment::new(&Interner).add_clauses(&Interner, clauses); |
960 | |||
961 | Arc::new(TraitEnvironment { traits_from_clauses: traits_in_scope, env }) | ||
948 | } | 962 | } |
949 | } | 963 | } |
950 | 964 | ||
@@ -1131,8 +1145,8 @@ impl CallableDefId { | |||
1131 | let db = db.upcast(); | 1145 | let db = db.upcast(); |
1132 | match self { | 1146 | match self { |
1133 | CallableDefId::FunctionId(f) => f.lookup(db).module(db), | 1147 | CallableDefId::FunctionId(f) => f.lookup(db).module(db), |
1134 | CallableDefId::StructId(s) => s.lookup(db).container.module(db), | 1148 | CallableDefId::StructId(s) => s.lookup(db).container, |
1135 | CallableDefId::EnumVariantId(e) => e.parent.lookup(db).container.module(db), | 1149 | CallableDefId::EnumVariantId(e) => e.parent.lookup(db).container, |
1136 | } | 1150 | } |
1137 | .krate() | 1151 | .krate() |
1138 | } | 1152 | } |