88use std:: {
99 cell:: { Cell , RefCell , RefMut } ,
1010 iter,
11+ ops:: Not as _,
1112} ;
1213
1314use base_db:: {
@@ -1679,20 +1680,30 @@ pub(crate) fn trait_environment_query(
16791680 TraitEnvironment :: new ( resolver. krate ( ) , None , traits_in_scope. into_boxed_slice ( ) , env)
16801681}
16811682
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+
16821692/// Resolve the where clause(s) of an item with generics.
16831693pub ( crate ) fn generic_predicates_query (
16841694 db : & dyn HirDatabase ,
16851695 def : GenericDefId ,
1686- ) -> Arc < [ Binders < QuantifiedWhereClause > ] > {
1696+ ) -> GenericPredicates {
16871697 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 ) ,
16951703 } ;
1704+ let ctx = TyLoweringContext :: new ( db, & resolver, def. into ( ) )
1705+ . with_impl_trait_mode ( impl_trait_lowering)
1706+ . with_type_param_mode ( param_lowering) ;
16961707 let generics = generics ( db. upcast ( ) , def) ;
16971708
16981709 let mut predicates = resolver
@@ -1712,7 +1723,7 @@ pub(crate) fn generic_predicates_query(
17121723 . map ( |p| make_binders ( db, & generics, crate :: wrap_empty_binders ( p) ) ) ,
17131724 ) ;
17141725 }
1715- predicates. into ( )
1726+ GenericPredicates ( predicates. is_empty ( ) . not ( ) . then ( || predicates . into ( ) ) )
17161727}
17171728
17181729/// Generate implicit `: Sized` predicates for all generics that has no `?Sized` bound.
0 commit comments