@@ -57,26 +57,25 @@ impl BodyValidationDiagnostic {
5757 let _p =
5858 tracing:: span!( tracing:: Level :: INFO , "BodyValidationDiagnostic::collect" ) . entered ( ) ;
5959 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 ( ) } ;
6162 validator. validate_body ( db) ;
6263 validator. diagnostics
6364 }
6465}
6566
6667struct ExprValidator {
6768 owner : DefWithBodyId ,
69+ body : Arc < Body > ,
6870 infer : Arc < InferenceResult > ,
6971 pub ( super ) diagnostics : Vec < BodyValidationDiagnostic > ,
7072}
7173
7274impl ExprValidator {
73- fn new ( owner : DefWithBodyId , infer : Arc < InferenceResult > ) -> ExprValidator {
74- ExprValidator { owner, infer, diagnostics : Vec :: new ( ) }
75- }
76-
7775 fn validate_body ( & mut self , db : & dyn HirDatabase ) {
78- let body = db. body ( self . owner ) ;
7976 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 ) ;
8079
8180 if matches ! ( self . owner, DefWithBodyId :: FunctionId ( _) ) {
8281 self . check_for_trailing_return ( body. body_expr , & body) ;
@@ -162,8 +161,6 @@ impl ExprValidator {
162161 arms : & [ MatchArm ] ,
163162 db : & dyn HirDatabase ,
164163 ) {
165- let body = db. body ( self . owner ) ;
166-
167164 let scrut_ty = & self . infer [ scrutinee_expr] ;
168165 if scrut_ty. is_unknown ( ) {
169166 return ;
@@ -191,12 +188,12 @@ impl ExprValidator {
191188 . as_reference ( )
192189 . map ( |( match_expr_ty, ..) | match_expr_ty == pat_ty)
193190 . 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 )
195192 {
196193 // If we had a NotUsefulMatchArm diagnostic, we could
197194 // check the usefulness of each pattern as we added it
198195 // 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) ;
200197 let m_arm = pat_analysis:: MatchArm {
201198 pat : pattern_arena. alloc ( pat) ,
202199 has_guard : arm. guard . is_some ( ) ,
@@ -244,10 +241,9 @@ impl ExprValidator {
244241 cx : & MatchCheckCtx < ' p > ,
245242 pat : PatId ,
246243 db : & dyn HirDatabase ,
247- body : & Body ,
248244 have_errors : & mut bool ,
249245 ) -> 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 ) ;
251247 let pattern = patcx. lower_pattern ( pat) ;
252248 let pattern = cx. lower_pat ( & pattern) ;
253249 if !patcx. errors . is_empty ( ) {
0 commit comments