aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres/raw.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-03-26 10:09:39 +0000
committerAleksey Kladov <[email protected]>2019-03-26 10:20:54 +0000
commit5270bca5f72fa65f0515be776e06d3d6a4d1efca (patch)
treefa1b8b8ac66713ba29b676e1c2fdd4c4357f24ff /crates/ra_hir/src/nameres/raw.rs
parentdc94f3612583c5e960b334761ad0c18d328840ea (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.rs30
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
6use test_utils::tested_by; 6use test_utils::tested_by;
7use ra_db::FileId;
8use ra_arena::{Arena, impl_arena_id, RawId, map::ArenaMap}; 7use ra_arena::{Arena, impl_arena_id, RawId, map::ArenaMap};
9use ra_syntax::{ 8use ra_syntax::{
10 AstNode, SourceFile, AstPtr, TreeArc, 9 AstNode, SourceFile, AstPtr, TreeArc,
@@ -47,20 +46,20 @@ impl ImportSourceMap {
47} 46}
48 47
49impl RawItems { 48impl 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
86impl Index<Module> for RawItems { 72impl 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