diff --git a/Cargo.lock b/Cargo.lock index e1d2a74f05..0ffc915481 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -482,6 +482,7 @@ dependencies = [ "hir_ty", "itertools", "log", + "once_cell", "profile", "rustc-hash", "smallvec", diff --git a/crates/hir/Cargo.toml b/crates/hir/Cargo.toml index 560b152389..7c148fd403 100644 --- a/crates/hir/Cargo.toml +++ b/crates/hir/Cargo.toml @@ -16,6 +16,7 @@ either = "1.5.3" arrayvec = "0.7" itertools = "0.10.0" smallvec = "1.4.0" +once_cell = "1" stdx = { path = "../stdx", version = "0.0.0" } syntax = { path = "../syntax", version = "0.0.0" } diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index a21a9da21f..8804e63c52 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -73,6 +73,7 @@ use hir_ty::{ }; use itertools::Itertools; use nameres::diagnostics::DefDiagnosticKind; +use once_cell::unsync::Lazy; use rustc_hash::FxHashSet; use stdx::{format_to, impl_from}; use syntax::{ @@ -1044,7 +1045,7 @@ impl Function { } let infer = db.infer(self.id.into()); - let (_, source_map) = db.body_with_source_map(self.id.into()); + let source_map = Lazy::new(|| db.body_with_source_map(self.id.into()).1); for d in &infer.diagnostics { match d { hir_ty::InferenceDiagnostic::NoSuchField { expr } => { @@ -1061,13 +1062,13 @@ impl Function { } for expr in hir_ty::diagnostics::missing_unsafe(db, self.id.into()) { - match source_map.as_ref().expr_syntax(expr) { + match source_map.expr_syntax(expr) { Ok(in_file) => { sink.push(MissingUnsafe { file: in_file.file_id, expr: in_file.value }) } Err(SyntheticSyntax) => { // FIXME: The `expr` was desugared, report or assert that - // this dosen't happen. + // this doesn't happen. } } }