@@ -57,26 +57,25 @@ impl BodyValidationDiagnostic {
57
57
let _p =
58
58
tracing:: span!( tracing:: Level :: INFO , "BodyValidationDiagnostic::collect" ) . entered ( ) ;
59
59
let infer = db. infer ( owner) ;
60
- let mut validator = ExprValidator :: new ( owner, infer) ;
60
+ let body = db. body ( owner) ;
61
+ let mut validator = ExprValidator { owner, body, infer, diagnostics : Vec :: new ( ) } ;
61
62
validator. validate_body ( db) ;
62
63
validator. diagnostics
63
64
}
64
65
}
65
66
66
67
struct ExprValidator {
67
68
owner : DefWithBodyId ,
69
+ body : Arc < Body > ,
68
70
infer : Arc < InferenceResult > ,
69
71
pub ( super ) diagnostics : Vec < BodyValidationDiagnostic > ,
70
72
}
71
73
72
74
impl ExprValidator {
73
- fn new ( owner : DefWithBodyId , infer : Arc < InferenceResult > ) -> ExprValidator {
74
- ExprValidator { owner, infer, diagnostics : Vec :: new ( ) }
75
- }
76
-
77
75
fn validate_body ( & mut self , db : & dyn HirDatabase ) {
78
- let body = db. body ( self . owner ) ;
79
76
let mut filter_map_next_checker = None ;
77
+ // we'll pass &mut self while iterating over body.exprs, so they need to be disjoint
78
+ let body = Arc :: clone ( & self . body ) ;
80
79
81
80
if matches ! ( self . owner, DefWithBodyId :: FunctionId ( _) ) {
82
81
self . check_for_trailing_return ( body. body_expr , & body) ;
@@ -162,8 +161,6 @@ impl ExprValidator {
162
161
arms : & [ MatchArm ] ,
163
162
db : & dyn HirDatabase ,
164
163
) {
165
- let body = db. body ( self . owner ) ;
166
-
167
164
let scrut_ty = & self . infer [ scrutinee_expr] ;
168
165
if scrut_ty. is_unknown ( ) {
169
166
return ;
@@ -191,13 +188,13 @@ impl ExprValidator {
191
188
. as_reference ( )
192
189
. map ( |( match_expr_ty, ..) | match_expr_ty == pat_ty)
193
190
. unwrap_or ( false ) )
194
- && types_of_subpatterns_do_match ( arm. pat , & body, & self . infer )
191
+ && types_of_subpatterns_do_match ( arm. pat , & self . body , & self . infer )
195
192
{
196
193
// If we had a NotUsefulMatchArm diagnostic, we could
197
194
// check the usefulness of each pattern as we added it
198
195
// to the matrix here.
199
196
let m_arm = pat_analysis:: MatchArm {
200
- pat : self . lower_pattern ( & cx, arm. pat , db, & body , & mut has_lowering_errors) ,
197
+ pat : self . lower_pattern ( & cx, arm. pat , db, & mut has_lowering_errors) ,
201
198
has_guard : arm. guard . is_some ( ) ,
202
199
arm_data : ( ) ,
203
200
} ;
@@ -243,10 +240,9 @@ impl ExprValidator {
243
240
cx : & MatchCheckCtx < ' p > ,
244
241
pat : PatId ,
245
242
db : & dyn HirDatabase ,
246
- body : & Body ,
247
243
have_errors : & mut bool ,
248
244
) -> & ' p DeconstructedPat < ' p > {
249
- let mut patcx = match_check:: PatCtxt :: new ( db, & self . infer , body) ;
245
+ let mut patcx = match_check:: PatCtxt :: new ( db, & self . infer , & self . body ) ;
250
246
let pattern = patcx. lower_pattern ( pat) ;
251
247
let pattern = cx. pattern_arena . alloc ( cx. lower_pat ( & pattern) ) ;
252
248
if !patcx. errors . is_empty ( ) {
0 commit comments