@@ -14,9 +14,9 @@ use hir_def::{
14
14
path:: { GenericArg , Path , PathSegment , PathSegments } ,
15
15
resolver:: { HasResolver , Resolver , TypeNs } ,
16
16
type_ref:: { TypeBound , TypeRef } ,
17
- AdtId , ConstId , EnumId , EnumVariantId , FunctionId , GenericDefId , HasModule , ImplId ,
18
- LocalStructFieldId , Lookup , StaticId , StructId , TraitId , TypeAliasId , TypeParamId , UnionId ,
19
- VariantId ,
17
+ AdtId , AssocContainerId , ConstId , EnumId , EnumVariantId , FunctionId , GenericDefId , HasModule ,
18
+ ImplId , LocalStructFieldId , Lookup , StaticId , StructId , TraitId , TypeAliasId , TypeParamId ,
19
+ UnionId , VariantId ,
20
20
} ;
21
21
use ra_arena:: map:: ArenaMap ;
22
22
use ra_db:: CrateId ;
@@ -672,11 +672,35 @@ impl TraitEnvironment {
672
672
pub fn lower ( db : & impl HirDatabase , resolver : & Resolver ) -> Arc < TraitEnvironment > {
673
673
let ctx = TyLoweringContext :: new ( db, & resolver)
674
674
. with_type_param_mode ( TypeParamLoweringMode :: Placeholder ) ;
675
- let predicates = resolver
675
+ let mut predicates = resolver
676
676
. where_predicates_in_scope ( )
677
677
. flat_map ( |pred| GenericPredicate :: from_where_predicate ( & ctx, pred) )
678
678
. collect :: < Vec < _ > > ( ) ;
679
679
680
+ if let Some ( def) = resolver. generic_def ( ) {
681
+ let container: Option < AssocContainerId > = match def {
682
+ // FIXME: is there a function for this?
683
+ GenericDefId :: FunctionId ( f) => Some ( f. lookup ( db) . container ) ,
684
+ GenericDefId :: AdtId ( _) => None ,
685
+ GenericDefId :: TraitId ( _) => None ,
686
+ GenericDefId :: TypeAliasId ( t) => Some ( t. lookup ( db) . container ) ,
687
+ GenericDefId :: ImplId ( _) => None ,
688
+ GenericDefId :: EnumVariantId ( _) => None ,
689
+ GenericDefId :: ConstId ( c) => Some ( c. lookup ( db) . container ) ,
690
+ } ;
691
+ if let Some ( AssocContainerId :: TraitId ( trait_id) ) = container {
692
+ // add `Self: Trait<T1, T2, ...>` to the environment in trait
693
+ // function default implementations (and hypothetical code
694
+ // inside consts or type aliases)
695
+ test_utils:: tested_by!( trait_self_implements_self) ;
696
+ let substs = Substs :: type_params ( db, trait_id) ;
697
+ let trait_ref = TraitRef { trait_ : trait_id, substs } ;
698
+ let pred = GenericPredicate :: Implemented ( trait_ref) ;
699
+
700
+ predicates. push ( pred) ;
701
+ }
702
+ }
703
+
680
704
Arc :: new ( TraitEnvironment { predicates } )
681
705
}
682
706
}
0 commit comments