aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/body
diff options
context:
space:
mode:
authorJonas Schievink <[email protected]>2020-06-23 12:46:38 +0100
committerJonas Schievink <[email protected]>2020-06-24 15:53:54 +0100
commit689e147c9dc416027fd36e94673431533df545f9 (patch)
treefe8c4d6937134388bd23416706c08a4de046cf06 /crates/ra_hir_def/src/body
parent5a81427304114d2c6ada9e9258ffe31e715c25bc (diff)
Collect inner items in expression macros
Diffstat (limited to 'crates/ra_hir_def/src/body')
-rw-r--r--crates/ra_hir_def/src/body/lower.rs4
-rw-r--r--crates/ra_hir_def/src/body/scope.rs20
2 files changed, 23 insertions, 1 deletions
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs
index e7cf80676..bbde0b802 100644
--- a/crates/ra_hir_def/src/body/lower.rs
+++ b/crates/ra_hir_def/src/body/lower.rs
@@ -564,12 +564,14 @@ impl ExprCollector<'_> {
564 }); 564 });
565 let tree = &self.item_trees[index].1; 565 let tree = &self.item_trees[index].1;
566 566
567 // FIXME: This probably breaks with `use` items, since they produce multiple item tree nodes
568
567 // Root file (non-macro). 569 // Root file (non-macro).
568 tree.all_inner_items() 570 tree.all_inner_items()
569 .chain(tree.top_level_items().iter().copied()) 571 .chain(tree.top_level_items().iter().copied())
570 .filter_map(|mod_item| mod_item.downcast::<S>()) 572 .filter_map(|mod_item| mod_item.downcast::<S>())
571 .find(|tree_id| tree[*tree_id].ast_id().upcast() == id.value) 573 .find(|tree_id| tree[*tree_id].ast_id().upcast() == id.value)
572 .unwrap() 574 .unwrap_or_else(|| panic!("couldn't find inner item for {:?}", id))
573 } 575 }
574 576
575 fn collect_expr_opt(&mut self, expr: Option<ast::Expr>) -> ExprId { 577 fn collect_expr_opt(&mut self, expr: Option<ast::Expr>) -> ExprId {
diff --git a/crates/ra_hir_def/src/body/scope.rs b/crates/ra_hir_def/src/body/scope.rs
index 0b74199d9..81397b063 100644
--- a/crates/ra_hir_def/src/body/scope.rs
+++ b/crates/ra_hir_def/src/body/scope.rs
@@ -317,6 +317,26 @@ fn foo() {
317 ); 317 );
318 } 318 }
319 319
320 #[test]
321 fn macro_inner_item() {
322 do_check(
323 r"
324 macro_rules! mac {
325 () => {{
326 fn inner() {}
327 inner();
328 }};
329 }
330
331 fn foo() {
332 mac!();
333 <|>
334 }
335 ",
336 &[],
337 );
338 }
339
320 fn do_check_local_name(ra_fixture: &str, expected_offset: u32) { 340 fn do_check_local_name(ra_fixture: &str, expected_offset: u32) {
321 let (db, position) = TestDB::with_position(ra_fixture); 341 let (db, position) = TestDB::with_position(ra_fixture);
322 let file_id = position.file_id; 342 let file_id = position.file_id;