Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/semantics.rs')
| -rw-r--r-- | crates/hir/src/semantics.rs | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 444fb4ea54..9596e81818 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -2,7 +2,7 @@ mod source_to_def; -use std::{cell::RefCell, fmt}; +use std::{cell::RefCell, fmt, iter}; use base_db::{FileId, FileRange}; use either::Either; @@ -443,8 +443,7 @@ impl<'db> SemanticsImpl<'db> { fn expand(&self, macro_call: &ast::MacroCall) -> Option<SyntaxNode> { let sa = self.analyze_no_infer(macro_call.syntax()); let file_id = sa.expand(self.db, InFile::new(sa.file_id, macro_call))?; - let node = self.db.parse_or_expand(file_id)?; - self.cache(node.clone(), file_id); + let node = self.parse_or_expand(file_id)?; Some(node) } @@ -452,8 +451,7 @@ impl<'db> SemanticsImpl<'db> { let src = self.find_file(item.syntax()).with_value(item.clone()); let macro_call_id = self.with_ctx(|ctx| ctx.item_to_macro_call(src))?; let file_id = macro_call_id.as_file(); - let node = self.db.parse_or_expand(file_id)?; - self.cache(node.clone(), file_id); + let node = self.parse_or_expand(file_id)?; Some(node) } @@ -750,10 +748,9 @@ impl<'db> SemanticsImpl<'db> { } fn diagnostics_display_range(&self, src: InFile<SyntaxNodePtr>) -> FileRange { - let root = self.db.parse_or_expand(src.file_id).unwrap(); - let node = src.value.to_node(&root); - self.cache(root, src.file_id); - src.with_value(&node).original_file_range(self.db.upcast()) + let root = self.parse_or_expand(src.file_id).unwrap(); + let node = src.map(|it| it.to_node(&root)); + node.as_ref().original_file_range(self.db.upcast()) } fn token_ancestors_with_macros( @@ -768,7 +765,17 @@ impl<'db> SemanticsImpl<'db> { node: SyntaxNode, ) -> impl Iterator<Item = SyntaxNode> + Clone + '_ { let node = self.find_file(&node); - node.ancestors_with_macros(self.db.upcast()).map(|it| it.value) + let db = self.db.upcast(); + iter::successors(Some(node.cloned()), move |&InFile { file_id, ref value }| { + match value.parent() { + Some(parent) => Some(InFile::new(file_id, parent)), + None => { + self.cache(value.clone(), file_id); + file_id.call_node(db) + } + } + }) + .map(|it| it.value) } fn ancestors_at_offset_with_macros( |