@@ -121,21 +121,24 @@ pub(crate) fn program_clauses_for_goal<'db, I: Interner>(
121
121
) ;
122
122
let interner = db. interner ( ) ;
123
123
124
- // FIXME: change this to use `.chain().filter()`
125
- let mut vec = vec ! [ ] ;
126
- vec. extend ( db. custom_clauses ( ) ) ;
127
- program_clauses_that_could_match ( db, environment, goal, & mut vec) ?;
128
- vec. retain ( |c| c. could_match ( interner, goal) ) ;
129
- vec. extend (
130
- db. program_clauses_for_env ( environment)
131
- . iter ( interner)
132
- . filter ( |c| ( * c) . could_match ( interner, goal) )
133
- . cloned ( ) ,
134
- ) ;
124
+ let custom_clauses = db. custom_clauses ( ) . into_iter ( ) ;
125
+ let clauses_that_could_match =
126
+ program_clauses_that_could_match ( db, environment, goal) . map ( |cl| cl. into_iter ( ) ) ?;
127
+
128
+ let clauses: Vec < ProgramClause < I > > = custom_clauses
129
+ . chain ( clauses_that_could_match)
130
+ . filter ( |c| c. could_match ( interner, goal) )
131
+ . chain (
132
+ db. program_clauses_for_env ( environment)
133
+ . iter ( interner)
134
+ . filter ( |c| ( * c) . could_match ( interner, goal) )
135
+ . cloned ( ) ,
136
+ )
137
+ . collect ( ) ;
135
138
136
- debug ! ( "vec = {:#?}" , vec ) ;
139
+ debug ! ( "vec = {:#?}" , clauses ) ;
137
140
138
- Ok ( vec )
141
+ Ok ( clauses )
139
142
}
140
143
141
144
/// Returns a set of program clauses that could possibly match
@@ -146,10 +149,10 @@ fn program_clauses_that_could_match<I: Interner>(
146
149
db : & dyn RustIrDatabase < I > ,
147
150
environment : & Environment < I > ,
148
151
goal : & DomainGoal < I > ,
149
- clauses : & mut Vec < ProgramClause < I > > ,
150
- ) -> Result < ( ) , Floundered > {
152
+ ) -> Result < Vec < ProgramClause < I > > , Floundered > {
151
153
let interner = db. interner ( ) ;
152
- let builder = & mut ClauseBuilder :: new ( db, clauses) ;
154
+ let mut clauses: Vec < ProgramClause < I > > = vec ! [ ] ;
155
+ let builder = & mut ClauseBuilder :: new ( db, & mut clauses) ;
153
156
154
157
debug_heading ! ( "program_clauses_that_could_match(goal={:?})" , goal) ;
155
158
@@ -304,7 +307,7 @@ fn program_clauses_that_could_match<I: Interner>(
304
307
DomainGoal :: Compatible ( ( ) ) | DomainGoal :: Reveal ( ( ) ) => ( ) ,
305
308
} ;
306
309
307
- Ok ( ( ) )
310
+ Ok ( clauses )
308
311
}
309
312
310
313
/// Generate program clauses from the associated-type values
0 commit comments