aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_expand
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-12-06 20:46:18 +0000
committerFlorian Diebold <[email protected]>2019-12-06 20:53:31 +0000
commitb2c01f446edcbc12b5dd870064cbfc6c1a47eb8b (patch)
treed21f398d8a0ef3898fda2ce044f0c3c402032cb8 /crates/ra_hir_expand
parentc80dc0ad3aee717f9d15c11d300d0eb1c10f1cc8 (diff)
Implement ancestors_with_macros in a better way
Diffstat (limited to 'crates/ra_hir_expand')
-rw-r--r--crates/ra_hir_expand/src/lib.rs21
1 files changed, 21 insertions, 0 deletions
diff --git a/crates/ra_hir_expand/src/lib.rs b/crates/ra_hir_expand/src/lib.rs
index 0c1dc87e6..0a5da7e54 100644
--- a/crates/ra_hir_expand/src/lib.rs
+++ b/crates/ra_hir_expand/src/lib.rs
@@ -301,3 +301,24 @@ impl<T> InFile<T> {
301 db.parse_or_expand(self.file_id).expect("source created from invalid file") 301 db.parse_or_expand(self.file_id).expect("source created from invalid file")
302 } 302 }
303} 303}
304
305impl<T: Clone> InFile<&T> {
306 pub fn cloned(&self) -> InFile<T> {
307 self.with_value(self.value.clone())
308 }
309}
310
311impl 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}