@@ -121,21 +121,23 @@ 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
+ . chain (
131
+ db. program_clauses_for_env ( environment)
132
+ . iter ( interner)
133
+ . cloned ( ) ,
134
+ )
135
+ . filter ( |c| c. could_match ( interner, goal) )
136
+ . collect ( ) ;
135
137
136
- debug ! ( "vec = {:#?}" , vec ) ;
138
+ debug ! ( "vec = {:#?}" , clauses ) ;
137
139
138
- Ok ( vec )
140
+ Ok ( clauses )
139
141
}
140
142
141
143
/// Returns a set of program clauses that could possibly match
@@ -146,10 +148,10 @@ fn program_clauses_that_could_match<I: Interner>(
146
148
db : & dyn RustIrDatabase < I > ,
147
149
environment : & Environment < I > ,
148
150
goal : & DomainGoal < I > ,
149
- clauses : & mut Vec < ProgramClause < I > > ,
150
- ) -> Result < ( ) , Floundered > {
151
+ ) -> Result < Vec < ProgramClause < I > > , Floundered > {
151
152
let interner = db. interner ( ) ;
152
- let builder = & mut ClauseBuilder :: new ( db, clauses) ;
153
+ let mut clauses: Vec < ProgramClause < I > > = vec ! [ ] ;
154
+ let builder = & mut ClauseBuilder :: new ( db, & mut clauses) ;
153
155
154
156
debug_heading ! ( "program_clauses_that_could_match(goal={:?})" , goal) ;
155
157
@@ -304,7 +306,7 @@ fn program_clauses_that_could_match<I: Interner>(
304
306
DomainGoal :: Compatible ( ( ) ) | DomainGoal :: Reveal ( ( ) ) => ( ) ,
305
307
} ;
306
308
307
- Ok ( ( ) )
309
+ Ok ( clauses )
308
310
}
309
311
310
312
/// Generate program clauses from the associated-type values
0 commit comments