@@ -10,13 +10,13 @@ use std::sync::Arc;
10
10
11
11
use hir_def:: {
12
12
builtin_type:: BuiltinType ,
13
- generics:: { WherePredicate , WherePredicateTarget , TypeParamProvenance } ,
13
+ generics:: { TypeParamProvenance , WherePredicate , WherePredicateTarget } ,
14
14
path:: { GenericArg , Path , PathSegment , PathSegments } ,
15
15
resolver:: { HasResolver , Resolver , TypeNs } ,
16
16
type_ref:: { TypeBound , TypeRef } ,
17
17
AdtId , ConstId , EnumId , EnumVariantId , FunctionId , GenericDefId , HasModule , ImplId ,
18
- LocalStructFieldId , Lookup , StaticId , StructId , TraitId , TypeAliasId , UnionId , VariantId ,
19
- TypeParamId
18
+ LocalStructFieldId , Lookup , StaticId , StructId , TraitId , TypeAliasId , TypeParamId , UnionId ,
19
+ VariantId ,
20
20
} ;
21
21
use ra_arena:: map:: ArenaMap ;
22
22
use ra_db:: CrateId ;
@@ -148,7 +148,9 @@ impl Ty {
148
148
let generics = generics ( ctx. db , def) ;
149
149
let param = generics
150
150
. iter ( )
151
- . filter ( |( _, data) | data. provenance == TypeParamProvenance :: ArgumentImplTrait )
151
+ . filter ( |( _, data) | {
152
+ data. provenance == TypeParamProvenance :: ArgumentImplTrait
153
+ } )
152
154
. nth ( idx as usize )
153
155
. map_or ( Ty :: Unknown , |( id, _) | Ty :: Param ( id) ) ;
154
156
param
@@ -338,19 +340,12 @@ impl Ty {
338
340
return Ty :: Unknown ;
339
341
} ;
340
342
param_id
341
- } ,
343
+ }
342
344
_ => return Ty :: Unknown , // Error: Ambiguous associated type
343
345
} ;
344
346
let predicates = ctx. db . generic_predicates_for_param ( param_id) ;
345
- let traits_from_env = predicates. iter ( ) . filter_map ( |pred| match pred {
346
- GenericPredicate :: Implemented ( tr) => {
347
- if let Ty :: Param ( id) = tr. self_ty ( ) {
348
- if * id == param_id {
349
- return Some ( tr. trait_ ) ;
350
- }
351
- }
352
- None
353
- }
347
+ let traits_from_env = predicates. iter ( ) . filter_map ( |pred| match & pred. value {
348
+ GenericPredicate :: Implemented ( tr) => Some ( tr. trait_ ) ,
354
349
_ => None ,
355
350
} ) ;
356
351
let traits = traits_from_env. flat_map ( |t| all_super_traits ( ctx. db , t) ) ;
@@ -620,8 +615,8 @@ pub(crate) fn field_types_query(
620
615
} ;
621
616
let generics = generics ( db, def) ;
622
617
let mut res = ArenaMap :: default ( ) ;
623
- let ctx = TyLoweringContext :: new ( db , & resolver )
624
- . with_type_param_mode ( TypeParamLoweringMode :: Variable ) ;
618
+ let ctx =
619
+ TyLoweringContext :: new ( db , & resolver ) . with_type_param_mode ( TypeParamLoweringMode :: Variable ) ;
625
620
for ( field_id, field_data) in var_data. fields ( ) . iter ( ) {
626
621
res. insert ( field_id, Binders :: new ( generics. len ( ) , Ty :: from_hir ( & ctx, & field_data. type_ref ) ) )
627
622
}
@@ -639,36 +634,39 @@ pub(crate) fn field_types_query(
639
634
pub ( crate ) fn generic_predicates_for_param_query (
640
635
db : & impl HirDatabase ,
641
636
param_id : TypeParamId ,
642
- ) -> Arc < [ GenericPredicate ] > {
637
+ ) -> Arc < [ Binders < GenericPredicate > ] > {
643
638
let resolver = param_id. parent . resolver ( db) ;
644
- let ctx = TyLoweringContext :: new ( db, & resolver) ;
645
- // let generics = generics(db, def);
639
+ let ctx =
640
+ TyLoweringContext :: new ( db, & resolver) . with_type_param_mode ( TypeParamLoweringMode :: Variable ) ;
641
+ let generics = generics ( db, param_id. parent ) ;
646
642
resolver
647
643
. where_predicates_in_scope ( )
648
644
// we have to filter out all other predicates *first*, before attempting to lower them
649
645
. filter ( |pred| match & pred. target {
650
646
WherePredicateTarget :: TypeRef ( type_ref) => {
651
647
Ty :: from_hir_only_param ( & ctx, type_ref) == Some ( param_id)
652
648
}
653
- WherePredicateTarget :: TypeParam ( local_id) => {
654
- * local_id == param_id. local_id
655
- }
649
+ WherePredicateTarget :: TypeParam ( local_id) => * local_id == param_id. local_id ,
650
+ } )
651
+ . flat_map ( |pred| {
652
+ GenericPredicate :: from_where_predicate ( & ctx, pred)
653
+ . map ( |p| Binders :: new ( generics. len ( ) , p) )
656
654
} )
657
- . flat_map ( |pred| GenericPredicate :: from_where_predicate ( & ctx, pred) )
658
655
. collect ( )
659
656
}
660
657
661
658
pub ( crate ) fn generic_predicates_for_param_recover (
662
659
_db : & impl HirDatabase ,
663
660
_cycle : & [ String ] ,
664
661
_param_id : & TypeParamId ,
665
- ) -> Arc < [ GenericPredicate ] > {
662
+ ) -> Arc < [ Binders < GenericPredicate > ] > {
666
663
Arc :: new ( [ ] )
667
664
}
668
665
669
666
impl TraitEnvironment {
670
667
pub fn lower ( db : & impl HirDatabase , resolver : & Resolver ) -> Arc < TraitEnvironment > {
671
- let ctx = TyLoweringContext :: new ( db, & resolver) ;
668
+ let ctx = TyLoweringContext :: new ( db, & resolver)
669
+ . with_type_param_mode ( TypeParamLoweringMode :: Placeholder ) ;
672
670
let predicates = resolver
673
671
. where_predicates_in_scope ( )
674
672
. flat_map ( |pred| GenericPredicate :: from_where_predicate ( & ctx, pred) )
@@ -682,12 +680,17 @@ impl TraitEnvironment {
682
680
pub ( crate ) fn generic_predicates_query (
683
681
db : & impl HirDatabase ,
684
682
def : GenericDefId ,
685
- ) -> Arc < [ GenericPredicate ] > {
683
+ ) -> Arc < [ Binders < GenericPredicate > ] > {
686
684
let resolver = def. resolver ( db) ;
687
- let ctx = TyLoweringContext :: new ( db, & resolver) ;
685
+ let ctx =
686
+ TyLoweringContext :: new ( db, & resolver) . with_type_param_mode ( TypeParamLoweringMode :: Variable ) ;
687
+ let generics = generics ( db, def) ;
688
688
resolver
689
689
. where_predicates_in_scope ( )
690
- . flat_map ( |pred| GenericPredicate :: from_where_predicate ( & ctx, pred) )
690
+ . flat_map ( |pred| {
691
+ GenericPredicate :: from_where_predicate ( & ctx, pred)
692
+ . map ( |p| Binders :: new ( generics. len ( ) , p) )
693
+ } )
691
694
. collect ( )
692
695
}
693
696
@@ -915,12 +918,18 @@ pub(crate) fn impl_self_ty_recover(
915
918
Binders :: new ( generics. len ( ) , Ty :: Unknown )
916
919
}
917
920
918
- pub ( crate ) fn impl_trait_query ( db : & impl HirDatabase , impl_id : ImplId ) -> Option < Binders < TraitRef > > {
921
+ pub ( crate ) fn impl_trait_query (
922
+ db : & impl HirDatabase ,
923
+ impl_id : ImplId ,
924
+ ) -> Option < Binders < TraitRef > > {
919
925
let impl_data = db. impl_data ( impl_id) ;
920
926
let resolver = impl_id. resolver ( db) ;
921
- let ctx = TyLoweringContext :: new ( db , & resolver )
922
- . with_type_param_mode ( TypeParamLoweringMode :: Variable ) ;
927
+ let ctx =
928
+ TyLoweringContext :: new ( db , & resolver ) . with_type_param_mode ( TypeParamLoweringMode :: Variable ) ;
923
929
let self_ty = db. impl_self_ty ( impl_id) ;
924
930
let target_trait = impl_data. target_trait . as_ref ( ) ?;
925
- Some ( Binders :: new ( self_ty. num_binders , TraitRef :: from_hir ( & ctx, target_trait, Some ( self_ty. value . clone ( ) ) ) ?) )
931
+ Some ( Binders :: new (
932
+ self_ty. num_binders ,
933
+ TraitRef :: from_hir ( & ctx, target_trait, Some ( self_ty. value . clone ( ) ) ) ?,
934
+ ) )
926
935
}
0 commit comments