diff options
author | Aleksey Kladov <[email protected]> | 2019-03-26 10:09:39 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-03-26 10:20:54 +0000 |
commit | 5270bca5f72fa65f0515be776e06d3d6a4d1efca (patch) | |
tree | fa1b8b8ac66713ba29b676e1c2fdd4c4357f24ff /crates/ra_hir/src/nameres/raw.rs | |
parent | dc94f3612583c5e960b334761ad0c18d328840ea (diff) |
store macro def inside macro id
This solves the problem of "macro expansion can't call into name
resolution, because name resolution calls back into macro expansion"
Because we store macro def as a part of call id, macro expansion just
knows the def!
Diffstat (limited to 'crates/ra_hir/src/nameres/raw.rs')
-rw-r--r-- | crates/ra_hir/src/nameres/raw.rs | 30 |
1 files changed, 6 insertions, 24 deletions
diff --git a/crates/ra_hir/src/nameres/raw.rs b/crates/ra_hir/src/nameres/raw.rs index f8ba398ec..7a516e556 100644 --- a/crates/ra_hir/src/nameres/raw.rs +++ b/crates/ra_hir/src/nameres/raw.rs | |||
@@ -4,7 +4,6 @@ use std::{ | |||
4 | }; | 4 | }; |
5 | 5 | ||
6 | use test_utils::tested_by; | 6 | use test_utils::tested_by; |
7 | use ra_db::FileId; | ||
8 | use ra_arena::{Arena, impl_arena_id, RawId, map::ArenaMap}; | 7 | use ra_arena::{Arena, impl_arena_id, RawId, map::ArenaMap}; |
9 | use ra_syntax::{ | 8 | use ra_syntax::{ |
10 | AstNode, SourceFile, AstPtr, TreeArc, | 9 | AstNode, SourceFile, AstPtr, TreeArc, |
@@ -47,20 +46,20 @@ impl ImportSourceMap { | |||
47 | } | 46 | } |
48 | 47 | ||
49 | impl RawItems { | 48 | impl RawItems { |
50 | pub(crate) fn raw_items_query(db: &impl DefDatabase, file_id: FileId) -> Arc<RawItems> { | 49 | pub(crate) fn raw_items_query(db: &impl DefDatabase, file_id: HirFileId) -> Arc<RawItems> { |
51 | db.raw_items_with_source_map(file_id).0 | 50 | db.raw_items_with_source_map(file_id).0 |
52 | } | 51 | } |
53 | 52 | ||
54 | pub(crate) fn raw_items_with_source_map_query( | 53 | pub(crate) fn raw_items_with_source_map_query( |
55 | db: &impl DefDatabase, | 54 | db: &impl DefDatabase, |
56 | file_id: FileId, | 55 | file_id: HirFileId, |
57 | ) -> (Arc<RawItems>, Arc<ImportSourceMap>) { | 56 | ) -> (Arc<RawItems>, Arc<ImportSourceMap>) { |
58 | let mut collector = RawItemsCollector { | 57 | let mut collector = RawItemsCollector { |
59 | raw_items: RawItems::default(), | 58 | raw_items: RawItems::default(), |
60 | source_file_items: db.file_items(file_id.into()), | 59 | source_file_items: db.file_items(file_id.into()), |
61 | source_map: ImportSourceMap::default(), | 60 | source_map: ImportSourceMap::default(), |
62 | }; | 61 | }; |
63 | let source_file = db.parse(file_id); | 62 | let source_file = db.hir_parse(file_id); |
64 | collector.process_module(None, &*source_file); | 63 | collector.process_module(None, &*source_file); |
65 | (Arc::new(collector.raw_items), Arc::new(collector.source_map)) | 64 | (Arc::new(collector.raw_items), Arc::new(collector.source_map)) |
66 | } | 65 | } |
@@ -68,19 +67,6 @@ impl RawItems { | |||
68 | pub(crate) fn items(&self) -> &[RawItem] { | 67 | pub(crate) fn items(&self) -> &[RawItem] { |
69 | &self.items | 68 | &self.items |
70 | } | 69 | } |
71 | |||
72 | // We can't use queries during name resolution for fear of cycles, so this | ||
73 | // is a query-less variant of the above function. | ||
74 | pub(crate) fn from_source_file(source_file: &SourceFile, file_id: HirFileId) -> RawItems { | ||
75 | let source_file_items = SourceFileItems::from_source_file(source_file, file_id); | ||
76 | let mut collector = RawItemsCollector { | ||
77 | raw_items: RawItems::default(), | ||
78 | source_file_items: Arc::new(source_file_items), | ||
79 | source_map: ImportSourceMap::default(), | ||
80 | }; | ||
81 | collector.process_module(None, &*source_file); | ||
82 | collector.raw_items | ||
83 | } | ||
84 | } | 70 | } |
85 | 71 | ||
86 | impl Index<Module> for RawItems { | 72 | impl Index<Module> for RawItems { |
@@ -173,7 +159,6 @@ pub(crate) struct MacroData { | |||
173 | pub(crate) source_item_id: SourceFileItemId, | 159 | pub(crate) source_item_id: SourceFileItemId, |
174 | pub(crate) path: Path, | 160 | pub(crate) path: Path, |
175 | pub(crate) name: Option<Name>, | 161 | pub(crate) name: Option<Name>, |
176 | pub(crate) arg: tt::Subtree, | ||
177 | pub(crate) export: bool, | 162 | pub(crate) export: bool, |
178 | } | 163 | } |
179 | 164 | ||
@@ -291,18 +276,15 @@ impl RawItemsCollector { | |||
291 | } | 276 | } |
292 | 277 | ||
293 | fn add_macro(&mut self, current_module: Option<Module>, m: &ast::MacroCall) { | 278 | fn add_macro(&mut self, current_module: Option<Module>, m: &ast::MacroCall) { |
294 | let (path, arg) = match ( | 279 | let path = match m.path().and_then(Path::from_ast) { |
295 | m.path().and_then(Path::from_ast), | 280 | Some(it) => it, |
296 | m.token_tree().and_then(mbe::ast_to_token_tree), | ||
297 | ) { | ||
298 | (Some(path), Some((token_tree, _token_map))) => (path, token_tree), | ||
299 | _ => return, | 281 | _ => return, |
300 | }; | 282 | }; |
301 | 283 | ||
302 | let name = m.name().map(|it| it.as_name()); | 284 | let name = m.name().map(|it| it.as_name()); |
303 | let source_item_id = self.source_file_items.id_of_unchecked(m.syntax()); | 285 | let source_item_id = self.source_file_items.id_of_unchecked(m.syntax()); |
304 | let export = m.has_atom_attr("macro_export"); | 286 | let export = m.has_atom_attr("macro_export"); |
305 | let m = self.raw_items.macros.alloc(MacroData { source_item_id, path, arg, name, export }); | 287 | let m = self.raw_items.macros.alloc(MacroData { source_item_id, path, name, export }); |
306 | self.push_item(current_module, RawItem::Macro(m)); | 288 | self.push_item(current_module, RawItem::Macro(m)); |
307 | } | 289 | } |
308 | 290 | ||