aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_hir/src/db.rs10
-rw-r--r--crates/ra_hir/src/lib.rs21
-rw-r--r--crates/ra_hir/src/macros.rs4
-rw-r--r--crates/ra_hir/src/module.rs15
-rw-r--r--crates/ra_hir/src/module/nameres.rs6
-rw-r--r--crates/ra_hir/src/query_definitions.rs28
-rw-r--r--crates/ra_hir/src/source_binder.rs8
7 files changed, 62 insertions, 30 deletions
diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs
index 289bec507..1da3fc1c1 100644
--- a/crates/ra_hir/src/db.rs
+++ b/crates/ra_hir/src/db.rs
@@ -1,10 +1,10 @@
1use std::sync::Arc; 1use std::sync::Arc;
2 2
3use ra_syntax::SyntaxNode; 3use ra_syntax::{SyntaxNode, SourceFileNode};
4use ra_db::{SourceRootId, LocationIntener, SyntaxDatabase, FileId, Cancelable}; 4use ra_db::{SourceRootId, LocationIntener, SyntaxDatabase, FileId, Cancelable};
5 5
6use crate::{ 6use crate::{
7 DefLoc, DefId, Name, 7 DefLoc, DefId, Name, MFileId,
8 SourceFileItems, SourceItemId, 8 SourceFileItems, SourceItemId,
9 query_definitions, 9 query_definitions,
10 FnScopes, 10 FnScopes,
@@ -21,6 +21,10 @@ pub trait HirDatabase: SyntaxDatabase
21 + AsRef<LocationIntener<DefLoc, DefId>> 21 + AsRef<LocationIntener<DefLoc, DefId>>
22 + AsRef<LocationIntener<MacroCallLoc, MacroCallId>> 22 + AsRef<LocationIntener<MacroCallLoc, MacroCallId>>
23{ 23{
24 fn m_source_file(mfile_id: MFileId) -> SourceFileNode {
25 type MSourceFileQuery;
26 use fn crate::query_definitions::m_source_file;
27 }
24 fn expand_macro_invocation(invoc: MacroCallId) -> Option<Arc<MacroExpansion>> { 28 fn expand_macro_invocation(invoc: MacroCallId) -> Option<Arc<MacroExpansion>> {
25 type ExpandMacroCallQuery; 29 type ExpandMacroCallQuery;
26 use fn crate::macros::expand_macro_invocation; 30 use fn crate::macros::expand_macro_invocation;
@@ -56,7 +60,7 @@ pub trait HirDatabase: SyntaxDatabase
56 use fn crate::ty::type_for_field; 60 use fn crate::ty::type_for_field;
57 } 61 }
58 62
59 fn file_items(file_id: FileId) -> Arc<SourceFileItems> { 63 fn file_items(mfile_id: MFileId) -> Arc<SourceFileItems> {
60 type SourceFileItemsQuery; 64 type SourceFileItemsQuery;
61 use fn query_definitions::file_items; 65 use fn query_definitions::file_items;
62 } 66 }
diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs
index 4c67921bd..1219b9fba 100644
--- a/crates/ra_hir/src/lib.rs
+++ b/crates/ra_hir/src/lib.rs
@@ -57,11 +57,18 @@ pub use self::function::FnSignatureInfo;
57 57
58/// An `MFileId` is like a `FileId`, but it can also refer to code generated by 58/// An `MFileId` is like a `FileId`, but it can also refer to code generated by
59/// macros. 59/// macros.
60#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
60pub enum MFileId { 61pub enum MFileId {
61 File(FileId), 62 File(FileId),
62 Macro(MacroCallId), 63 Macro(MacroCallId),
63} 64}
64 65
66impl From<FileId> for MFileId {
67 fn from(file_id: FileId) -> MFileId {
68 MFileId::File(file_id)
69 }
70}
71
65/// Def's are a core concept of hir. A `Def` is an Item (function, module, etc) 72/// Def's are a core concept of hir. A `Def` is an Item (function, module, etc)
66/// in a specific module. 73/// in a specific module.
67#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 74#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@@ -163,7 +170,7 @@ pub(crate) type SourceFileItemId = Id<SyntaxNode>;
163 170
164#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 171#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
165pub struct SourceItemId { 172pub struct SourceItemId {
166 file_id: FileId, 173 mfile_id: MFileId,
167 /// None for the whole file. 174 /// None for the whole file.
168 item_id: Option<SourceFileItemId>, 175 item_id: Option<SourceFileItemId>,
169} 176}
@@ -171,14 +178,14 @@ pub struct SourceItemId {
171/// Maps item's `SyntaxNode`s to `SourceFileItemId` and back. 178/// Maps item's `SyntaxNode`s to `SourceFileItemId` and back.
172#[derive(Debug, PartialEq, Eq)] 179#[derive(Debug, PartialEq, Eq)]
173pub struct SourceFileItems { 180pub struct SourceFileItems {
174 file_id: FileId, 181 mfile_id: MFileId,
175 arena: Arena<SyntaxNode>, 182 arena: Arena<SyntaxNode>,
176} 183}
177 184
178impl SourceFileItems { 185impl SourceFileItems {
179 fn new(file_id: FileId, source_file: SourceFile) -> SourceFileItems { 186 fn new(mfile_id: MFileId, source_file: SourceFile) -> SourceFileItems {
180 let mut res = SourceFileItems { 187 let mut res = SourceFileItems {
181 file_id, 188 mfile_id,
182 arena: Arena::default(), 189 arena: Arena::default(),
183 }; 190 };
184 res.init(source_file); 191 res.init(source_file);
@@ -198,11 +205,11 @@ impl SourceFileItems {
198 fn alloc(&mut self, item: SyntaxNode) -> SourceFileItemId { 205 fn alloc(&mut self, item: SyntaxNode) -> SourceFileItemId {
199 self.arena.alloc(item) 206 self.arena.alloc(item)
200 } 207 }
201 pub fn id_of(&self, file_id: FileId, item: SyntaxNodeRef) -> SourceFileItemId { 208 pub fn id_of(&self, mfile_id: MFileId, item: SyntaxNodeRef) -> SourceFileItemId {
202 assert_eq!( 209 assert_eq!(
203 self.file_id, file_id, 210 self.mfile_id, mfile_id,
204 "SourceFileItems: wrong file, expected {:?}, got {:?}", 211 "SourceFileItems: wrong file, expected {:?}, got {:?}",
205 self.file_id, file_id 212 self.mfile_id, mfile_id
206 ); 213 );
207 self.id_of_unchecked(item) 214 self.id_of_unchecked(item)
208 } 215 }
diff --git a/crates/ra_hir/src/macros.rs b/crates/ra_hir/src/macros.rs
index 3eedd9e2d..1f141dbac 100644
--- a/crates/ra_hir/src/macros.rs
+++ b/crates/ra_hir/src/macros.rs
@@ -147,7 +147,9 @@ pub struct MacroExpansion {
147} 147}
148 148
149impl MacroExpansion { 149impl MacroExpansion {
150 pub fn file(&self) -> SourceFileNode { 150 //FIXME: does not really make sense, macro expansion is not neccessary a
151 //whole file.
152 pub(crate) fn file(&self) -> SourceFileNode {
151 SourceFileNode::parse(&self.text) 153 SourceFileNode::parse(&self.text)
152 } 154 }
153 155
diff --git a/crates/ra_hir/src/module.rs b/crates/ra_hir/src/module.rs
index 87e30191f..dde036f2c 100644
--- a/crates/ra_hir/src/module.rs
+++ b/crates/ra_hir/src/module.rs
@@ -15,6 +15,7 @@ use relative_path::RelativePathBuf;
15use crate::{ 15use crate::{
16 Def, DefKind, DefLoc, DefId, 16 Def, DefKind, DefLoc, DefId,
17 Name, Path, PathKind, HirDatabase, SourceItemId, SourceFileItemId, Crate, 17 Name, Path, PathKind, HirDatabase, SourceItemId, SourceFileItemId, Crate,
18 MFileId,
18 arena::{Arena, Id}, 19 arena::{Arena, Id},
19}; 20};
20 21
@@ -292,7 +293,10 @@ pub struct ModuleData {
292impl ModuleSource { 293impl ModuleSource {
293 // precondition: item_id **must** point to module 294 // precondition: item_id **must** point to module
294 fn new(file_id: FileId, item_id: Option<SourceFileItemId>) -> ModuleSource { 295 fn new(file_id: FileId, item_id: Option<SourceFileItemId>) -> ModuleSource {
295 let source_item_id = SourceItemId { file_id, item_id }; 296 let source_item_id = SourceItemId {
297 mfile_id: file_id.into(),
298 item_id,
299 };
296 ModuleSource(source_item_id) 300 ModuleSource(source_item_id)
297 } 301 }
298 302
@@ -306,13 +310,16 @@ impl ModuleSource {
306 m: ast::Module, 310 m: ast::Module,
307 ) -> ModuleSource { 311 ) -> ModuleSource {
308 assert!(!m.has_semi()); 312 assert!(!m.has_semi());
309 let file_items = db.file_items(file_id); 313 let file_items = db.file_items(file_id.into());
310 let item_id = file_items.id_of(file_id, m.syntax()); 314 let item_id = file_items.id_of(file_id.into(), m.syntax());
311 ModuleSource::new(file_id, Some(item_id)) 315 ModuleSource::new(file_id, Some(item_id))
312 } 316 }
313 317
314 pub fn file_id(self) -> FileId { 318 pub fn file_id(self) -> FileId {
315 self.0.file_id 319 match self.0.mfile_id {
320 MFileId::File(file_id) => file_id,
321 MFileId::Macro(_) => unreachable!(),
322 }
316 } 323 }
317 324
318 pub(crate) fn resolve(self, db: &impl HirDatabase) -> ModuleSourceNode { 325 pub(crate) fn resolve(self, db: &impl HirDatabase) -> ModuleSourceNode {
diff --git a/crates/ra_hir/src/module/nameres.rs b/crates/ra_hir/src/module/nameres.rs
index 46b1dc0b1..94ada73d7 100644
--- a/crates/ra_hir/src/module/nameres.rs
+++ b/crates/ra_hir/src/module/nameres.rs
@@ -98,7 +98,7 @@ pub struct NamedImport {
98impl NamedImport { 98impl NamedImport {
99 pub fn range(&self, db: &impl HirDatabase, file_id: FileId) -> TextRange { 99 pub fn range(&self, db: &impl HirDatabase, file_id: FileId) -> TextRange {
100 let source_item_id = SourceItemId { 100 let source_item_id = SourceItemId {
101 file_id, 101 mfile_id: file_id.into(),
102 item_id: Some(self.file_item_id), 102 item_id: Some(self.file_item_id),
103 }; 103 };
104 let syntax = db.file_item(source_item_id); 104 let syntax = db.file_item(source_item_id);
@@ -360,7 +360,7 @@ where
360 source_root_id: self.source_root, 360 source_root_id: self.source_root,
361 module_id, 361 module_id,
362 source_item_id: SourceItemId { 362 source_item_id: SourceItemId {
363 file_id, 363 mfile_id: file_id.into(),
364 item_id: Some(item.id), 364 item_id: Some(item.id),
365 }, 365 },
366 }; 366 };
@@ -376,7 +376,7 @@ where
376 source_root_id: self.source_root, 376 source_root_id: self.source_root,
377 module_id, 377 module_id,
378 source_item_id: SourceItemId { 378 source_item_id: SourceItemId {
379 file_id, 379 mfile_id: file_id.into(),
380 item_id: Some(item.id), 380 item_id: Some(item.id),
381 }, 381 },
382 }; 382 };
diff --git a/crates/ra_hir/src/query_definitions.rs b/crates/ra_hir/src/query_definitions.rs
index f66231222..0c07f1444 100644
--- a/crates/ra_hir/src/query_definitions.rs
+++ b/crates/ra_hir/src/query_definitions.rs
@@ -5,13 +5,13 @@ use std::{
5 5
6use rustc_hash::FxHashMap; 6use rustc_hash::FxHashMap;
7use ra_syntax::{ 7use ra_syntax::{
8 AstNode, SyntaxNode, 8 AstNode, SyntaxNode, SourceFileNode,
9 ast::{self, NameOwner, ModuleItemOwner} 9 ast::{self, NameOwner, ModuleItemOwner}
10}; 10};
11use ra_db::{SourceRootId, FileId, Cancelable,}; 11use ra_db::{SourceRootId, FileId, Cancelable,};
12 12
13use crate::{ 13use crate::{
14 SourceFileItems, SourceItemId, DefKind, Function, DefId, Name, AsName, 14 SourceFileItems, SourceItemId, DefKind, Function, DefId, Name, AsName, MFileId,
15 db::HirDatabase, 15 db::HirDatabase,
16 function::FnScopes, 16 function::FnScopes,
17 module::{ 17 module::{
@@ -47,17 +47,29 @@ pub(super) fn enum_data(db: &impl HirDatabase, def_id: DefId) -> Cancelable<Arc<
47 Ok(Arc::new(EnumData::new(enum_def.borrowed()))) 47 Ok(Arc::new(EnumData::new(enum_def.borrowed())))
48} 48}
49 49
50pub(super) fn file_items(db: &impl HirDatabase, file_id: FileId) -> Arc<SourceFileItems> { 50pub(super) fn m_source_file(db: &impl HirDatabase, mfile_id: MFileId) -> SourceFileNode {
51 let source_file = db.source_file(file_id); 51 match mfile_id {
52 MFileId::File(file_id) => db.source_file(file_id),
53 MFileId::Macro(m) => {
54 if let Some(exp) = db.expand_macro_invocation(m) {
55 return exp.file();
56 }
57 SourceFileNode::parse("")
58 }
59 }
60}
61
62pub(super) fn file_items(db: &impl HirDatabase, mfile_id: MFileId) -> Arc<SourceFileItems> {
63 let source_file = db.m_source_file(mfile_id);
52 let source_file = source_file.borrowed(); 64 let source_file = source_file.borrowed();
53 let res = SourceFileItems::new(file_id, source_file); 65 let res = SourceFileItems::new(mfile_id, source_file);
54 Arc::new(res) 66 Arc::new(res)
55} 67}
56 68
57pub(super) fn file_item(db: &impl HirDatabase, source_item_id: SourceItemId) -> SyntaxNode { 69pub(super) fn file_item(db: &impl HirDatabase, source_item_id: SourceItemId) -> SyntaxNode {
58 match source_item_id.item_id { 70 match source_item_id.item_id {
59 Some(id) => db.file_items(source_item_id.file_id)[id].clone(), 71 Some(id) => db.file_items(source_item_id.mfile_id)[id].clone(),
60 None => db.source_file(source_item_id.file_id).syntax().owned(), 72 None => db.m_source_file(source_item_id.mfile_id).syntax().owned(),
61 } 73 }
62} 74}
63 75
@@ -116,7 +128,7 @@ pub(super) fn input_module_items(
116) -> Cancelable<Arc<InputModuleItems>> { 128) -> Cancelable<Arc<InputModuleItems>> {
117 let module_tree = db.module_tree(source_root)?; 129 let module_tree = db.module_tree(source_root)?;
118 let source = module_id.source(&module_tree); 130 let source = module_id.source(&module_tree);
119 let file_items = db.file_items(source.file_id()); 131 let file_items = db.file_items(source.file_id().into());
120 let res = match source.resolve(db) { 132 let res = match source.resolve(db) {
121 ModuleSourceNode::SourceFile(it) => { 133 ModuleSourceNode::SourceFile(it) => {
122 let items = it.borrowed().items(); 134 let items = it.borrowed().items();
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs
index a0d1daf71..4a99dff84 100644
--- a/crates/ra_hir/src/source_binder.rs
+++ b/crates/ra_hir/src/source_binder.rs
@@ -102,11 +102,11 @@ pub fn function_from_module(
102 module: &Module, 102 module: &Module,
103 fn_def: ast::FnDef, 103 fn_def: ast::FnDef,
104) -> Function { 104) -> Function {
105 let file_id = module.source().file_id(); 105 let mfile_id = module.source().file_id().into();
106 let file_items = db.file_items(file_id); 106 let file_items = db.file_items(mfile_id);
107 let item_id = file_items.id_of(file_id, fn_def.syntax()); 107 let item_id = file_items.id_of(mfile_id, fn_def.syntax());
108 let source_item_id = SourceItemId { 108 let source_item_id = SourceItemId {
109 file_id, 109 mfile_id,
110 item_id: Some(item_id), 110 item_id: Some(item_id),
111 }; 111 };
112 let def_loc = DefLoc { 112 let def_loc = DefLoc {