Skip to content

Commit b2c01f4

Browse files
committed
Implement ancestors_with_macros in a better way
1 parent c80dc0a commit b2c01f4

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

crates/ra_hir/src/source_binder.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ fn def_with_body_from_child_node(
7676
db: &impl HirDatabase,
7777
child: InFile<&SyntaxNode>,
7878
) -> Option<DefWithBody> {
79-
ancestors_with_macros(db, child).find_map(|node| {
79+
child.cloned().ancestors_with_macros(db).find_map(|node| {
8080
let n = &node.value;
8181
match_ast! {
8282
match n {
@@ -89,17 +89,6 @@ fn def_with_body_from_child_node(
8989
})
9090
}
9191

92-
fn ancestors_with_macros<'a>(
93-
db: &'a (impl HirDatabase),
94-
node: InFile<&SyntaxNode>,
95-
) -> impl Iterator<Item = InFile<SyntaxNode>> + 'a {
96-
let file = node.with_value(()); // keep just the file id for borrow checker purposes
97-
let parent_node = node.file_id.call_node(db);
98-
let parent_ancestors: Box<dyn Iterator<Item = InFile<SyntaxNode>>> =
99-
Box::new(parent_node.into_iter().flat_map(move |n| ancestors_with_macros(db, n.as_ref())));
100-
node.value.ancestors().map(move |n| file.with_value(n)).chain(parent_ancestors)
101-
}
102-
10392
/// `SourceAnalyzer` is a convenience wrapper which exposes HIR API in terms of
10493
/// original source files. It should not be used inside the HIR itself.
10594
#[derive(Debug)]

crates/ra_hir_expand/src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,3 +301,24 @@ impl<T> InFile<T> {
301301
db.parse_or_expand(self.file_id).expect("source created from invalid file")
302302
}
303303
}
304+
305+
impl<T: Clone> InFile<&T> {
306+
pub fn cloned(&self) -> InFile<T> {
307+
self.with_value(self.value.clone())
308+
}
309+
}
310+
311+
impl InFile<SyntaxNode> {
312+
pub fn ancestors_with_macros<'a>(
313+
self,
314+
db: &'a impl crate::db::AstDatabase,
315+
) -> impl Iterator<Item = InFile<SyntaxNode>> + 'a {
316+
std::iter::successors(Some(self), move |node| match node.value.parent() {
317+
Some(parent) => Some(node.with_value(parent)),
318+
None => {
319+
let parent_node = node.file_id.call_node(db)?;
320+
Some(parent_node)
321+
}
322+
})
323+
}
324+
}

0 commit comments

Comments
 (0)