Skip to content

Commit 69c2532

Browse files
rosefromthedeadVeykril
authored andcommitted
internal: reduce body lookups in expr diagnostics
1 parent 60982dc commit 69c2532

1 file changed

Lines changed: 8 additions & 12 deletions

File tree

  • crates/hir-ty/src/diagnostics

‎crates/hir-ty/src/diagnostics/expr.rs‎

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
letmut validator = ExprValidator::new(owner, infer);
60+
let body = db.body(owner);
61+
letmut validator = ExprValidator{ owner, body, infer,diagnostics:Vec::new()};
6162
validator.validate_body(db);
6263
validator.diagnostics
6364
}
6465
}
6566

6667
structExprValidator{
6768
owner:DefWithBodyId,
69+
body:Arc<Body>,
6870
infer:Arc<InferenceResult>,
6971
pub(super)diagnostics:Vec<BodyValidationDiagnostic>,
7072
}
7173

7274
implExprValidator{
73-
fnnew(owner:DefWithBodyId,infer:Arc<InferenceResult>) -> ExprValidator{
74-
ExprValidator{ owner, infer,diagnostics:Vec::new()}
75-
}
76-
7775
fnvalidate_body(&mutself,db:&dynHirDatabase){
78-
let body = db.body(self.owner);
7976
letmut 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
ifmatches!(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:&dynHirDatabase,
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:&dynHirDatabase,
247-
body:&Body,
248244
have_errors:&mutbool,
249245
) -> DeconstructedPat<'p>{
250-
letmut patcx = match_check::PatCtxt::new(db,&self.infer, body);
246+
letmut 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

Comments
 (0)