diff options
author | Jonas Schievink <jonas.schievink@ferrous-systems.com> | 2020-06-23 12:46:38 +0100 |
---|---|---|
committer | Jonas Schievink <jonas.schievink@ferrous-systems.com> | 2020-06-24 15:53:54 +0100 |
commit | 689e147c9dc416027fd36e94673431533df545f9 (patch) | |
tree | fe8c4d6937134388bd23416706c08a4de046cf06 /crates/ra_hir_def/src/body | |
parent | 5a81427304114d2c6ada9e9258ffe31e715c25bc (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.rs | 4 | ||||
-rw-r--r-- | crates/ra_hir_def/src/body/scope.rs | 20 |
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; |