Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/body/lower.rs')
-rw-r--r--crates/hir-def/src/body/lower.rs23
1 files changed, 14 insertions, 9 deletions
diff --git a/crates/hir-def/src/body/lower.rs b/crates/hir-def/src/body/lower.rs
index 049afa8227..006376e362 100644
--- a/crates/hir-def/src/body/lower.rs
+++ b/crates/hir-def/src/body/lower.rs
@@ -11,6 +11,7 @@ use hir_expand::{
ExpandError, HirFileId, InFile,
};
use la_arena::Arena;
+use once_cell::unsync::OnceCell;
use profile::Count;
use rustc_hash::FxHashMap;
use syntax::{
@@ -41,8 +42,7 @@ use crate::{
pub struct LowerCtx<'a> {
pub db: &'a dyn DefDatabase,
hygiene: Hygiene,
- file_id: Option<HirFileId>,
- source_ast_id_map: Option<Arc<AstIdMap>>,
+ ast_id_map: Option<(HirFileId, OnceCell<Arc<AstIdMap>>)>,
}
impl<'a> LowerCtx<'a> {
@@ -50,13 +50,12 @@ impl<'a> LowerCtx<'a> {
LowerCtx {
db,
hygiene: Hygiene::new(db.upcast(), file_id),
- file_id: Some(file_id),
- source_ast_id_map: Some(db.ast_id_map(file_id)),
+ ast_id_map: Some((file_id, OnceCell::new())),
}
}
pub fn with_hygiene(db: &'a dyn DefDatabase, hygiene: &Hygiene) -> Self {
- LowerCtx { db, hygiene: hygiene.clone(), file_id: None, source_ast_id_map: None }
+ LowerCtx { db, hygiene: hygiene.clone(), ast_id_map: None }
}
pub(crate) fn hygiene(&self) -> &Hygiene {
@@ -64,15 +63,21 @@ impl<'a> LowerCtx<'a> {
}
pub(crate) fn file_id(&self) -> HirFileId {
- self.file_id.unwrap()
+ self.ast_id_map.as_ref().unwrap().0
}
pub(crate) fn lower_path(&self, ast: ast::Path) -> Option<Path> {
Path::from_src(ast, self)
}
- pub(crate) fn ast_id<N: AstNode>(&self, item: &N) -> Option<FileAstId<N>> {
- self.source_ast_id_map.as_ref().map(|ast_id_map| ast_id_map.ast_id(item))
+ pub(crate) fn ast_id<N: AstNode>(
+ &self,
+ db: &dyn DefDatabase,
+ item: &N,
+ ) -> Option<FileAstId<N>> {
+ let (file_id, ast_id_map) = self.ast_id_map.as_ref()?;
+ let ast_id_map = ast_id_map.get_or_init(|| db.ast_id_map(*file_id));
+ Some(ast_id_map.ast_id(item))
}
}
@@ -675,7 +680,7 @@ impl ExprCollector<'_> {
}
fn collect_block(&mut self, block: ast::BlockExpr) -> ExprId {
- let ast_id = self.expander.ast_id(&block);
+ let ast_id = self.expander.ast_id(self.db, &block);
let block_loc =
BlockLoc { ast_id, module: self.expander.def_map.module_id(self.expander.module) };
let block_id = self.db.intern_block(block_loc);