aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/item_tree.rs
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/item_tree.rs
parent5a81427304114d2c6ada9e9258ffe31e715c25bc (diff)
Collect inner items in expression macros
Diffstat (limited to 'crates/ra_hir_def/src/item_tree.rs')
-rw-r--r--crates/ra_hir_def/src/item_tree.rs27
1 files changed, 15 insertions, 12 deletions
diff --git a/crates/ra_hir_def/src/item_tree.rs b/crates/ra_hir_def/src/item_tree.rs
index efcb5dc60..a1a78fc5c 100644
--- a/crates/ra_hir_def/src/item_tree.rs
+++ b/crates/ra_hir_def/src/item_tree.rs
@@ -12,7 +12,7 @@ use std::{
12 sync::Arc, 12 sync::Arc,
13}; 13};
14 14
15use ast::{AstNode, AttrsOwner, ModuleItemOwner, NameOwner, StructKind, TypeAscriptionOwner}; 15use ast::{AstNode, AttrsOwner, NameOwner, StructKind, TypeAscriptionOwner};
16use either::Either; 16use either::Either;
17use hir_expand::{ 17use hir_expand::{
18 ast_id_map::FileAstId, 18 ast_id_map::FileAstId,
@@ -73,25 +73,28 @@ impl ItemTree {
73 }; 73 };
74 74
75 let hygiene = Hygiene::new(db.upcast(), file_id); 75 let hygiene = Hygiene::new(db.upcast(), file_id);
76 let ctx = lower::Ctx::new(db, hygiene.clone(), file_id);
76 let mut top_attrs = None; 77 let mut top_attrs = None;
77 let (macro_storage, file_storage); 78 let mut item_tree = match_ast! {
78 let item_owner = match_ast! {
79 match syntax { 79 match syntax {
80 ast::MacroItems(items) => {
81 macro_storage = items;
82 &macro_storage as &dyn ModuleItemOwner
83 },
84 ast::SourceFile(file) => { 80 ast::SourceFile(file) => {
85 top_attrs = Some(Attrs::new(&file, &hygiene)); 81 top_attrs = Some(Attrs::new(&file, &hygiene));
86 file_storage = file; 82 ctx.lower_module_items(&file)
87 &file_storage 83 },
84 ast::MacroItems(items) => {
85 ctx.lower_module_items(&items)
86 },
87 // Macros can expand to expressions. We return an empty item tree in this case, but
88 // still need to collect inner items.
89 ast::Expr(e) => {
90 ctx.lower_inner_items(e.syntax())
91 },
92 _ => {
93 panic!("cannot create item tree from {:?}", syntax);
88 }, 94 },
89 _ => return Arc::new(Self::empty(file_id)),
90 } 95 }
91 }; 96 };
92 97
93 let ctx = lower::Ctx::new(db, hygiene, file_id);
94 let mut item_tree = ctx.lower(item_owner);
95 item_tree.top_attrs = top_attrs.unwrap_or_default(); 98 item_tree.top_attrs = top_attrs.unwrap_or_default();
96 Arc::new(item_tree) 99 Arc::new(item_tree)
97 } 100 }