8
8
use std:: {
9
9
cell:: { Cell , RefCell , RefMut } ,
10
10
iter,
11
+ ops:: Not as _,
11
12
} ;
12
13
13
14
use base_db:: {
@@ -1679,20 +1680,30 @@ pub(crate) fn trait_environment_query(
1679
1680
TraitEnvironment :: new ( resolver. krate ( ) , None , traits_in_scope. into_boxed_slice ( ) , env)
1680
1681
}
1681
1682
1683
+ #[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
1684
+ pub struct GenericPredicates ( Option < Arc < [ Binders < QuantifiedWhereClause > ] > > ) ;
1685
+
1686
+ impl GenericPredicates {
1687
+ pub fn iter ( & self ) -> impl Iterator < Item = & Binders < QuantifiedWhereClause > > + ' _ + Clone {
1688
+ self . 0 . as_ref ( ) . into_iter ( ) . flat_map ( Arc :: as_ref)
1689
+ }
1690
+ }
1691
+
1682
1692
/// Resolve the where clause(s) of an item with generics.
1683
1693
pub ( crate ) fn generic_predicates_query (
1684
1694
db : & dyn HirDatabase ,
1685
1695
def : GenericDefId ,
1686
- ) -> Arc < [ Binders < QuantifiedWhereClause > ] > {
1696
+ ) -> GenericPredicates {
1687
1697
let resolver = def. resolver ( db. upcast ( ) ) ;
1688
- let ctx = if let GenericDefId :: FunctionId ( _) = def {
1689
- TyLoweringContext :: new ( db, & resolver, def. into ( ) )
1690
- . with_impl_trait_mode ( ImplTraitLoweringMode :: Variable )
1691
- . with_type_param_mode ( ParamLoweringMode :: Variable )
1692
- } else {
1693
- TyLoweringContext :: new ( db, & resolver, def. into ( ) )
1694
- . with_type_param_mode ( ParamLoweringMode :: Variable )
1698
+ let ( impl_trait_lowering, param_lowering) = match def {
1699
+ GenericDefId :: FunctionId ( _) => {
1700
+ ( ImplTraitLoweringMode :: Variable , ParamLoweringMode :: Variable )
1701
+ }
1702
+ _ => ( ImplTraitLoweringMode :: Disallowed , ParamLoweringMode :: Variable ) ,
1695
1703
} ;
1704
+ let ctx = TyLoweringContext :: new ( db, & resolver, def. into ( ) )
1705
+ . with_impl_trait_mode ( impl_trait_lowering)
1706
+ . with_type_param_mode ( param_lowering) ;
1696
1707
let generics = generics ( db. upcast ( ) , def) ;
1697
1708
1698
1709
let mut predicates = resolver
@@ -1712,7 +1723,7 @@ pub(crate) fn generic_predicates_query(
1712
1723
. map ( |p| make_binders ( db, & generics, crate :: wrap_empty_binders ( p) ) ) ,
1713
1724
) ;
1714
1725
}
1715
- predicates. into ( )
1726
+ GenericPredicates ( predicates. is_empty ( ) . not ( ) . then ( || predicates . into ( ) ) )
1716
1727
}
1717
1728
1718
1729
/// Generate implicit `: Sized` predicates for all generics that has no `?Sized` bound.
0 commit comments