diff options
Diffstat (limited to 'crates/ra_hir_def/src/item_tree.rs')
-rw-r--r-- | crates/ra_hir_def/src/item_tree.rs | 27 |
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 | ||
15 | use ast::{AstNode, AttrsOwner, ModuleItemOwner, NameOwner, StructKind, TypeAscriptionOwner}; | 15 | use ast::{AstNode, AttrsOwner, NameOwner, StructKind, TypeAscriptionOwner}; |
16 | use either::Either; | 16 | use either::Either; |
17 | use hir_expand::{ | 17 | use 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 | ¯o_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 | } |