@@ -812,13 +812,11 @@ impl Function {
812
812
/// Get this function's return type
813
813
pub fn ret_type ( self , db : & dyn HirDatabase ) -> Type {
814
814
let resolver = self . id . resolver ( db. upcast ( ) ) ;
815
+ let krate = self . id . lookup ( db. upcast ( ) ) . container . module ( db. upcast ( ) ) . krate ( ) ;
815
816
let ret_type = & db. function_data ( self . id ) . ret_type ;
816
817
let ctx = hir_ty:: TyLoweringContext :: new ( db, & resolver) ;
817
- let environment = TraitEnvironment :: lower ( db, & resolver) ;
818
- Type {
819
- krate : self . id . lookup ( db. upcast ( ) ) . container . module ( db. upcast ( ) ) . krate ( ) ,
820
- ty : InEnvironment { value : Ty :: from_hir_ext ( & ctx, ret_type) . 0 , environment } ,
821
- }
818
+ let ty = Ty :: from_hir_ext ( & ctx, ret_type) . 0 ;
819
+ Type :: new_with_resolver_inner ( db, krate, & resolver, ty)
822
820
}
823
821
824
822
pub fn self_param ( self , db : & dyn HirDatabase ) -> Option < SelfParam > {
@@ -830,14 +828,15 @@ impl Function {
830
828
831
829
pub fn assoc_fn_params ( self , db : & dyn HirDatabase ) -> Vec < Param > {
832
830
let resolver = self . id . resolver ( db. upcast ( ) ) ;
831
+ let krate = self . id . lookup ( db. upcast ( ) ) . container . module ( db. upcast ( ) ) . krate ( ) ;
833
832
let ctx = hir_ty:: TyLoweringContext :: new ( db, & resolver) ;
834
833
let environment = TraitEnvironment :: lower ( db, & resolver) ;
835
834
db. function_data ( self . id )
836
835
. params
837
836
. iter ( )
838
837
. map ( |type_ref| {
839
838
let ty = Type {
840
- krate : self . id . lookup ( db . upcast ( ) ) . container . module ( db . upcast ( ) ) . krate ( ) ,
839
+ krate,
841
840
ty : InEnvironment {
842
841
value : Ty :: from_hir_ext ( & ctx, type_ref) . 0 ,
843
842
environment : environment. clone ( ) ,
@@ -1402,12 +1401,9 @@ impl TypeParam {
1402
1401
1403
1402
pub fn ty ( self , db : & dyn HirDatabase ) -> Type {
1404
1403
let resolver = self . id . parent . resolver ( db. upcast ( ) ) ;
1405
- let environment = TraitEnvironment :: lower ( db, & resolver ) ;
1404
+ let krate = self . id . parent . module ( db. upcast ( ) ) . krate ( ) ;
1406
1405
let ty = Ty :: Placeholder ( self . id ) ;
1407
- Type {
1408
- krate : self . id . parent . module ( db. upcast ( ) ) . krate ( ) ,
1409
- ty : InEnvironment { value : ty, environment } ,
1410
- }
1406
+ Type :: new_with_resolver_inner ( db, krate, & resolver, ty)
1411
1407
}
1412
1408
1413
1409
pub fn trait_bounds ( self , db : & dyn HirDatabase ) -> Vec < Trait > {
@@ -1426,14 +1422,11 @@ impl TypeParam {
1426
1422
let params = db. generic_defaults ( self . id . parent ) ;
1427
1423
let local_idx = hir_ty:: param_idx ( db, self . id ) ?;
1428
1424
let resolver = self . id . parent . resolver ( db. upcast ( ) ) ;
1429
- let environment = TraitEnvironment :: lower ( db, & resolver ) ;
1425
+ let krate = self . id . parent . module ( db. upcast ( ) ) . krate ( ) ;
1430
1426
let ty = params. get ( local_idx) ?. clone ( ) ;
1431
1427
let subst = Substs :: type_params ( db, self . id . parent ) ;
1432
1428
let ty = ty. subst ( & subst. prefix ( local_idx) ) ;
1433
- Some ( Type {
1434
- krate : self . id . parent . module ( db. upcast ( ) ) . krate ( ) ,
1435
- ty : InEnvironment { value : ty, environment } ,
1436
- } )
1429
+ Some ( Type :: new_with_resolver_inner ( db, krate, & resolver, ty) )
1437
1430
}
1438
1431
}
1439
1432
@@ -1522,13 +1515,10 @@ impl Impl {
1522
1515
pub fn target_ty ( self , db : & dyn HirDatabase ) -> Type {
1523
1516
let impl_data = db. impl_data ( self . id ) ;
1524
1517
let resolver = self . id . resolver ( db. upcast ( ) ) ;
1518
+ let krate = self . id . lookup ( db. upcast ( ) ) . container . module ( db. upcast ( ) ) . krate ( ) ;
1525
1519
let ctx = hir_ty:: TyLoweringContext :: new ( db, & resolver) ;
1526
- let environment = TraitEnvironment :: lower ( db, & resolver) ;
1527
1520
let ty = Ty :: from_hir ( & ctx, & impl_data. target_type ) ;
1528
- Type {
1529
- krate : self . id . lookup ( db. upcast ( ) ) . container . module ( db. upcast ( ) ) . krate ( ) ,
1530
- ty : InEnvironment { value : ty, environment } ,
1531
- }
1521
+ Type :: new_with_resolver_inner ( db, krate, & resolver, ty)
1532
1522
}
1533
1523
1534
1524
pub fn items ( self , db : & dyn HirDatabase ) -> Vec < AssocItem > {
@@ -1724,13 +1714,11 @@ impl Type {
1724
1714
} ;
1725
1715
1726
1716
match db. trait_solve ( self . krate , goal) ? {
1727
- Solution :: Unique ( SolutionVariables ( subst) ) => subst. value . first ( ) . cloned ( ) ,
1717
+ Solution :: Unique ( SolutionVariables ( subst) ) => {
1718
+ subst. value . first ( ) . map ( |ty| self . derived ( ty. clone ( ) ) )
1719
+ }
1728
1720
Solution :: Ambig ( _) => None ,
1729
1721
}
1730
- . map ( |ty| Type {
1731
- krate : self . krate ,
1732
- ty : InEnvironment { value : ty, environment : Arc :: clone ( & self . ty . environment ) } ,
1733
- } )
1734
1722
}
1735
1723
1736
1724
pub fn is_copy ( & self , db : & dyn HirDatabase ) -> bool {
0 commit comments