@@ -50,26 +50,25 @@ impl BodyValidationDiagnostic {
50
50
pub fn collect ( db : & dyn HirDatabase , owner : DefWithBodyId ) -> Vec < BodyValidationDiagnostic > {
51
51
let _p = profile:: span ( "BodyValidationDiagnostic::collect" ) ;
52
52
let infer = db. infer ( owner) ;
53
- let mut validator = ExprValidator :: new ( owner, infer) ;
53
+ let body = db. body ( owner) ;
54
+ let mut validator = ExprValidator { owner, body, infer, diagnostics : Vec :: new ( ) } ;
54
55
validator. validate_body ( db) ;
55
56
validator. diagnostics
56
57
}
57
58
}
58
59
59
60
struct ExprValidator {
60
61
owner : DefWithBodyId ,
62
+ body : Arc < Body > ,
61
63
infer : Arc < InferenceResult > ,
62
64
pub ( super ) diagnostics : Vec < BodyValidationDiagnostic > ,
63
65
}
64
66
65
67
impl ExprValidator {
66
- fn new ( owner : DefWithBodyId , infer : Arc < InferenceResult > ) -> ExprValidator {
67
- ExprValidator { owner, infer, diagnostics : Vec :: new ( ) }
68
- }
69
-
70
68
fn validate_body ( & mut self , db : & dyn HirDatabase ) {
71
- let body = db. body ( self . owner ) ;
72
69
let mut filter_map_next_checker = None ;
70
+ // we'll pass &mut self while iterating over body.exprs, so they need to be disjoint
71
+ let body = Arc :: clone ( & self . body ) ;
73
72
74
73
for ( id, expr) in body. exprs . iter ( ) {
75
74
if let Some ( ( variant, missed_fields, true ) ) =
@@ -152,8 +151,6 @@ impl ExprValidator {
152
151
arms : & [ MatchArm ] ,
153
152
db : & dyn HirDatabase ,
154
153
) {
155
- let body = db. body ( self . owner ) ;
156
-
157
154
let scrut_ty = & self . infer [ scrutinee_expr] ;
158
155
if scrut_ty. is_unknown ( ) {
159
156
return ;
@@ -181,13 +178,13 @@ impl ExprValidator {
181
178
. as_reference ( )
182
179
. map ( |( match_expr_ty, ..) | match_expr_ty == pat_ty)
183
180
. unwrap_or ( false ) )
184
- && types_of_subpatterns_do_match ( arm. pat , & body, & self . infer )
181
+ && types_of_subpatterns_do_match ( arm. pat , & self . body , & self . infer )
185
182
{
186
183
// If we had a NotUsefulMatchArm diagnostic, we could
187
184
// check the usefulness of each pattern as we added it
188
185
// to the matrix here.
189
186
let m_arm = match_check:: MatchArm {
190
- pat : self . lower_pattern ( & cx, arm. pat , db, & body , & mut has_lowering_errors) ,
187
+ pat : self . lower_pattern ( & cx, arm. pat , db, & mut has_lowering_errors) ,
191
188
has_guard : arm. guard . is_some ( ) ,
192
189
} ;
193
190
m_arms. push ( m_arm) ;
@@ -224,10 +221,9 @@ impl ExprValidator {
224
221
cx : & MatchCheckCtx < ' _ , ' p > ,
225
222
pat : PatId ,
226
223
db : & dyn HirDatabase ,
227
- body : & Body ,
228
224
have_errors : & mut bool ,
229
225
) -> & ' p DeconstructedPat < ' p > {
230
- let mut patcx = match_check:: PatCtxt :: new ( db, & self . infer , body) ;
226
+ let mut patcx = match_check:: PatCtxt :: new ( db, & self . infer , & self . body ) ;
231
227
let pattern = patcx. lower_pattern ( pat) ;
232
228
let pattern = cx. pattern_arena . alloc ( DeconstructedPat :: from_pat ( cx, & pattern) ) ;
233
229
if !patcx. errors . is_empty ( ) {
0 commit comments