diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 281e6c65dc..27ba42ce1a 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -143,6 +143,10 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> { self.imp.parse(file_id) } + pub fn parse_or_expand(&self, file_id: HirFileId) -> Option { + self.imp.parse_or_expand(file_id) + } + pub fn expand(&self, macro_call: &ast::MacroCall) -> Option { self.imp.expand(macro_call) } @@ -416,6 +420,12 @@ impl<'db> SemanticsImpl<'db> { tree } + fn parse_or_expand(&self, file_id: HirFileId) -> Option { + let node = self.db.parse_or_expand(file_id)?; + self.cache(node.clone(), file_id); + Some(node) + } + fn expand(&self, macro_call: &ast::MacroCall) -> Option { let sa = self.analyze(macro_call.syntax()); let file_id = sa.expand(self.db, InFile::new(sa.file_id, macro_call))?; diff --git a/crates/ide_db/src/items_locator.rs b/crates/ide_db/src/items_locator.rs index 33bb14adde..788cfdc039 100644 --- a/crates/ide_db/src/items_locator.rs +++ b/crates/ide_db/src/items_locator.rs @@ -4,7 +4,6 @@ //! are located in different caches, with different APIs. use either::Either; use hir::{ - db::AstDatabase, import_map::{self, ImportKind}, AsAssocItem, Crate, ItemInNs, Semantics, }; @@ -136,7 +135,7 @@ fn get_name_definition( let _p = profile::span("get_name_definition"); let file_id = import_candidate.file_id; - let candidate_node = import_candidate.ptr.to_node(&sema.db.parse_or_expand(file_id)?); + let candidate_node = import_candidate.ptr.to_node(&sema.parse_or_expand(file_id)?); let candidate_name_node = if candidate_node.kind() != NAME { candidate_node.children().find(|it| it.kind() == NAME)? } else {