@@ -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,12 +188,12 @@ 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
- let pat = self . lower_pattern ( & cx, arm. pat , db, & body , & mut has_lowering_errors) ;
196
+ let pat = self . lower_pattern ( & cx, arm. pat , db, & mut has_lowering_errors) ;
200
197
let m_arm = pat_analysis:: MatchArm {
201
198
pat : pattern_arena. alloc ( pat) ,
202
199
has_guard : arm. guard . is_some ( ) ,
@@ -244,10 +241,9 @@ impl ExprValidator {
244
241
cx : & MatchCheckCtx < ' p > ,
245
242
pat : PatId ,
246
243
db : & dyn HirDatabase ,
247
- body : & Body ,
248
244
have_errors : & mut bool ,
249
245
) -> DeconstructedPat < ' p > {
250
- let mut patcx = match_check:: PatCtxt :: new ( db, & self . infer , body) ;
246
+ let mut patcx = match_check:: PatCtxt :: new ( db, & self . infer , & self . body ) ;
251
247
let pattern = patcx. lower_pattern ( pat) ;
252
248
let pattern = cx. lower_pat ( & pattern) ;
253
249
if !patcx. errors . is_empty ( ) {
0 commit comments