Skip to content

Commit 69c2532

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

File tree

1 file changed

+8
-12
lines changed
  • crates/hir-ty/src/diagnostics

1 file changed

+8
-12
lines changed

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

+8-12
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-
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

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

7274
impl 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

Comments
 (0)