aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir')
-rw-r--r--crates/ra_hir/src/db.rs10
-rw-r--r--crates/ra_hir/src/ids.rs52
-rw-r--r--crates/ra_hir/src/krate.rs3
-rw-r--r--crates/ra_hir/src/lib.rs16
-rw-r--r--crates/ra_hir/src/mock.rs2
-rw-r--r--crates/ra_hir/src/module.rs40
-rw-r--r--crates/ra_hir/src/module/imp.rs6
-rw-r--r--crates/ra_hir/src/module/nameres.rs31
-rw-r--r--crates/ra_hir/src/query_definitions.rs46
-rw-r--r--crates/ra_hir/src/source_binder.rs20
10 files changed, 131 insertions, 95 deletions
diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs
index ba0423d64..c0b56f30a 100644
--- a/crates/ra_hir/src/db.rs
+++ b/crates/ra_hir/src/db.rs
@@ -4,7 +4,7 @@ use ra_syntax::{SyntaxNode, SourceFileNode};
4use ra_db::{SourceRootId, LocationIntener, SyntaxDatabase, Cancelable}; 4use ra_db::{SourceRootId, LocationIntener, SyntaxDatabase, Cancelable};
5 5
6use crate::{ 6use crate::{
7 DefLoc, DefId, Name, MFileId, 7 DefLoc, DefId, Name, HirFileId,
8 SourceFileItems, SourceItemId, 8 SourceFileItems, SourceItemId,
9 query_definitions, 9 query_definitions,
10 FnScopes, 10 FnScopes,
@@ -21,9 +21,9 @@ 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 { 24 fn hir_source_file(file_id: HirFileId) -> SourceFileNode {
25 type MSourceFileQuery; 25 type HirSourceFileQuery;
26 use fn crate::query_definitions::m_source_file; 26 use fn HirFileId::source_file_query;
27 } 27 }
28 fn expand_macro_invocation(invoc: MacroCallId) -> Option<Arc<MacroExpansion>> { 28 fn expand_macro_invocation(invoc: MacroCallId) -> Option<Arc<MacroExpansion>> {
29 type ExpandMacroCallQuery; 29 type ExpandMacroCallQuery;
@@ -60,7 +60,7 @@ pub trait HirDatabase: SyntaxDatabase
60 use fn crate::ty::type_for_field; 60 use fn crate::ty::type_for_field;
61 } 61 }
62 62
63 fn file_items(mfile_id: MFileId) -> Arc<SourceFileItems> { 63 fn file_items(file_id: HirFileId) -> Arc<SourceFileItems> {
64 type SourceFileItemsQuery; 64 type SourceFileItemsQuery;
65 use fn query_definitions::file_items; 65 use fn query_definitions::file_items;
66 } 66 }
diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs
index 881303861..3eba35a24 100644
--- a/crates/ra_hir/src/ids.rs
+++ b/crates/ra_hir/src/ids.rs
@@ -1,4 +1,6 @@
1use crate::{FileId, MacroCallId}; 1use crate::{FileId, MacroCallId, HirDatabase};
2
3use ra_syntax::SourceFileNode;
2 4
3/// hir makes a heavy use of ids: integer (u32) handlers to various things. You 5/// hir makes a heavy use of ids: integer (u32) handlers to various things. You
4/// can think of id as a pointer (but without a lifetime) or a file descriptor 6/// can think of id as a pointer (but without a lifetime) or a file descriptor
@@ -20,13 +22,53 @@ use crate::{FileId, MacroCallId};
20/// (because everything bottoms out at the real `FileId`) and small 22/// (because everything bottoms out at the real `FileId`) and small
21/// (`MacroCallId` uses location interner). 23/// (`MacroCallId` uses location interner).
22#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 24#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23pub enum MFileId { 25pub struct HirFileId(HirFileIdRepr);
26
27impl HirFileId {
28 pub(crate) fn original_file_id(self, db: &impl HirDatabase) -> FileId {
29 match self.0 {
30 HirFileIdRepr::File(file_id) => file_id,
31 HirFileIdRepr::Macro(macro_call_id) => {
32 let loc = macro_call_id.loc(db);
33 loc.source_item_id.file_id.original_file_id(db)
34 }
35 }
36 }
37
38 pub(crate) fn as_original_file(self) -> FileId {
39 match self.0 {
40 HirFileIdRepr::File(file_id) => file_id,
41 HirFileIdRepr::Macro(_r) => panic!("macro generated file: {:?}", self),
42 }
43 }
44 pub(crate) fn source_file_query(db: &impl HirDatabase, file_id: HirFileId) -> SourceFileNode {
45 match file_id.0 {
46 HirFileIdRepr::File(file_id) => db.source_file(file_id),
47 HirFileIdRepr::Macro(m) => {
48 if let Some(exp) = db.expand_macro_invocation(m) {
49 return exp.file();
50 }
51 // returning an empty string looks fishy...
52 SourceFileNode::parse("")
53 }
54 }
55 }
56}
57
58#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
59enum HirFileIdRepr {
24 File(FileId), 60 File(FileId),
25 Macro(MacroCallId), 61 Macro(MacroCallId),
26} 62}
27 63
28impl From<FileId> for MFileId { 64impl From<FileId> for HirFileId {
29 fn from(file_id: FileId) -> MFileId { 65 fn from(file_id: FileId) -> HirFileId {
30 MFileId::File(file_id) 66 HirFileId(HirFileIdRepr::File(file_id))
67 }
68}
69
70impl From<MacroCallId> for HirFileId {
71 fn from(macro_call_id: MacroCallId) -> HirFileId {
72 HirFileId(HirFileIdRepr::Macro(macro_call_id))
31 } 73 }
32} 74}
diff --git a/crates/ra_hir/src/krate.rs b/crates/ra_hir/src/krate.rs
index 89b1e639e..4d4f59949 100644
--- a/crates/ra_hir/src/krate.rs
+++ b/crates/ra_hir/src/krate.rs
@@ -1,6 +1,6 @@
1pub use ra_db::CrateId; 1pub use ra_db::CrateId;
2 2
3use crate::{HirDatabase, Module, Cancelable, Name, AsName}; 3use crate::{HirDatabase, Module, Cancelable, Name, AsName, HirFileId};
4 4
5/// hir::Crate describes a single crate. It's the main inteface with which 5/// hir::Crate describes a single crate. It's the main inteface with which
6/// crate's dependencies interact. Mostly, it should be just a proxy for the 6/// crate's dependencies interact. Mostly, it should be just a proxy for the
@@ -35,6 +35,7 @@ impl Crate {
35 let crate_graph = db.crate_graph(); 35 let crate_graph = db.crate_graph();
36 let file_id = crate_graph.crate_root(self.crate_id); 36 let file_id = crate_graph.crate_root(self.crate_id);
37 let source_root_id = db.file_source_root(file_id); 37 let source_root_id = db.file_source_root(file_id);
38 let file_id = HirFileId::from(file_id);
38 let module_tree = db.module_tree(source_root_id)?; 39 let module_tree = db.module_tree(source_root_id)?;
39 // FIXME: teach module tree about crate roots instead of guessing 40 // FIXME: teach module tree about crate roots instead of guessing
40 let (module_id, _) = ctry!(module_tree 41 let (module_id, _) = ctry!(module_tree
diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs
index 8d3a026d5..c1386601d 100644
--- a/crates/ra_hir/src/lib.rs
+++ b/crates/ra_hir/src/lib.rs
@@ -47,7 +47,7 @@ pub use self::{
47 path::{Path, PathKind}, 47 path::{Path, PathKind},
48 name::Name, 48 name::Name,
49 krate::Crate, 49 krate::Crate,
50 ids::MFileId, 50 ids::HirFileId,
51 macros::{MacroDef, MacroInput, MacroExpansion, MacroCallId, MacroCallLoc}, 51 macros::{MacroDef, MacroInput, MacroExpansion, MacroCallId, MacroCallLoc},
52 module::{Module, ModuleId, Problem, nameres::{ItemMap, PerNs, Namespace}, ModuleScope, Resolution}, 52 module::{Module, ModuleId, Problem, nameres::{ItemMap, PerNs, Namespace}, ModuleScope, Resolution},
53 function::{Function, FnScopes}, 53 function::{Function, FnScopes},
@@ -158,7 +158,7 @@ pub(crate) type SourceFileItemId = Id<SyntaxNode>;
158 158
159#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 159#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
160pub struct SourceItemId { 160pub struct SourceItemId {
161 mfile_id: MFileId, 161 file_id: HirFileId,
162 /// None for the whole file. 162 /// None for the whole file.
163 item_id: Option<SourceFileItemId>, 163 item_id: Option<SourceFileItemId>,
164} 164}
@@ -166,14 +166,14 @@ pub struct SourceItemId {
166/// Maps item's `SyntaxNode`s to `SourceFileItemId` and back. 166/// Maps item's `SyntaxNode`s to `SourceFileItemId` and back.
167#[derive(Debug, PartialEq, Eq)] 167#[derive(Debug, PartialEq, Eq)]
168pub struct SourceFileItems { 168pub struct SourceFileItems {
169 mfile_id: MFileId, 169 file_id: HirFileId,
170 arena: Arena<SyntaxNode>, 170 arena: Arena<SyntaxNode>,
171} 171}
172 172
173impl SourceFileItems { 173impl SourceFileItems {
174 fn new(mfile_id: MFileId, source_file: SourceFile) -> SourceFileItems { 174 fn new(file_id: HirFileId, source_file: SourceFile) -> SourceFileItems {
175 let mut res = SourceFileItems { 175 let mut res = SourceFileItems {
176 mfile_id, 176 file_id,
177 arena: Arena::default(), 177 arena: Arena::default(),
178 }; 178 };
179 res.init(source_file); 179 res.init(source_file);
@@ -193,11 +193,11 @@ impl SourceFileItems {
193 fn alloc(&mut self, item: SyntaxNode) -> SourceFileItemId { 193 fn alloc(&mut self, item: SyntaxNode) -> SourceFileItemId {
194 self.arena.alloc(item) 194 self.arena.alloc(item)
195 } 195 }
196 pub fn id_of(&self, mfile_id: MFileId, item: SyntaxNodeRef) -> SourceFileItemId { 196 pub fn id_of(&self, file_id: HirFileId, item: SyntaxNodeRef) -> SourceFileItemId {
197 assert_eq!( 197 assert_eq!(
198 self.mfile_id, mfile_id, 198 self.file_id, file_id,
199 "SourceFileItems: wrong file, expected {:?}, got {:?}", 199 "SourceFileItems: wrong file, expected {:?}, got {:?}",
200 self.mfile_id, mfile_id 200 self.file_id, file_id
201 ); 201 );
202 self.id_of_unchecked(item) 202 self.id_of_unchecked(item)
203 } 203 }
diff --git a/crates/ra_hir/src/mock.rs b/crates/ra_hir/src/mock.rs
index 19bc426f6..89b18194a 100644
--- a/crates/ra_hir/src/mock.rs
+++ b/crates/ra_hir/src/mock.rs
@@ -189,7 +189,7 @@ salsa::database_storage! {
189 fn file_lines() for ra_db::FileLinesQuery; 189 fn file_lines() for ra_db::FileLinesQuery;
190 } 190 }
191 impl db::HirDatabase { 191 impl db::HirDatabase {
192 fn m_source_file() for db::MSourceFileQuery; 192 fn hir_source_file() for db::HirSourceFileQuery;
193 fn expand_macro_invocation() for db::ExpandMacroCallQuery; 193 fn expand_macro_invocation() for db::ExpandMacroCallQuery;
194 fn module_tree() for db::ModuleTreeQuery; 194 fn module_tree() for db::ModuleTreeQuery;
195 fn fn_scopes() for db::FnScopesQuery; 195 fn fn_scopes() for db::FnScopesQuery;
diff --git a/crates/ra_hir/src/module.rs b/crates/ra_hir/src/module.rs
index dde036f2c..26171d27c 100644
--- a/crates/ra_hir/src/module.rs
+++ b/crates/ra_hir/src/module.rs
@@ -15,7 +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 HirFileId,
19 arena::{Arena, Id}, 19 arena::{Arena, Id},
20}; 20};
21 21
@@ -49,13 +49,17 @@ impl Module {
49 /// Returns `None` for the root module 49 /// Returns `None` for the root module
50 pub fn parent_link_source(&self, db: &impl HirDatabase) -> Option<(FileId, ast::ModuleNode)> { 50 pub fn parent_link_source(&self, db: &impl HirDatabase) -> Option<(FileId, ast::ModuleNode)> {
51 let link = self.module_id.parent_link(&self.tree)?; 51 let link = self.module_id.parent_link(&self.tree)?;
52 let file_id = link.owner(&self.tree).source(&self.tree).file_id(); 52 let file_id = link
53 .owner(&self.tree)
54 .source(&self.tree)
55 .file_id()
56 .as_original_file();
53 let src = link.bind_source(&self.tree, db); 57 let src = link.bind_source(&self.tree, db);
54 Some((file_id, src)) 58 Some((file_id, src))
55 } 59 }
56 60
57 pub fn source(&self) -> ModuleSource { 61 pub fn file_id(&self) -> FileId {
58 self.module_id.source(&self.tree) 62 self.source().file_id().as_original_file()
59 } 63 }
60 64
61 /// Parent module. Returns `None` if this is a root module. 65 /// Parent module. Returns `None` if this is a root module.
@@ -70,7 +74,7 @@ impl Module {
70 /// Returns the crate this module is part of. 74 /// Returns the crate this module is part of.
71 pub fn krate(&self, db: &impl HirDatabase) -> Option<Crate> { 75 pub fn krate(&self, db: &impl HirDatabase) -> Option<Crate> {
72 let root_id = self.module_id.crate_root(&self.tree); 76 let root_id = self.module_id.crate_root(&self.tree);
73 let file_id = root_id.source(&self.tree).file_id(); 77 let file_id = root_id.source(&self.tree).file_id().as_original_file();
74 let crate_graph = db.crate_graph(); 78 let crate_graph = db.crate_graph();
75 let crate_id = crate_graph.crate_id_for_crate_root(file_id)?; 79 let crate_id = crate_graph.crate_id_for_crate_root(file_id)?;
76 Some(Crate::new(crate_id)) 80 Some(Crate::new(crate_id))
@@ -163,6 +167,10 @@ impl Module {
163 pub fn problems(&self, db: &impl HirDatabase) -> Vec<(SyntaxNode, Problem)> { 167 pub fn problems(&self, db: &impl HirDatabase) -> Vec<(SyntaxNode, Problem)> {
164 self.module_id.problems(&self.tree, db) 168 self.module_id.problems(&self.tree, db)
165 } 169 }
170
171 pub(crate) fn source(&self) -> ModuleSource {
172 self.module_id.source(&self.tree)
173 }
166} 174}
167 175
168/// Physically, rust source is organized as a set of files, but logically it is 176/// Physically, rust source is organized as a set of files, but logically it is
@@ -292,34 +300,28 @@ pub struct ModuleData {
292 300
293impl ModuleSource { 301impl ModuleSource {
294 // precondition: item_id **must** point to module 302 // precondition: item_id **must** point to module
295 fn new(file_id: FileId, item_id: Option<SourceFileItemId>) -> ModuleSource { 303 fn new(file_id: HirFileId, item_id: Option<SourceFileItemId>) -> ModuleSource {
296 let source_item_id = SourceItemId { 304 let source_item_id = SourceItemId { file_id, item_id };
297 mfile_id: file_id.into(),
298 item_id,
299 };
300 ModuleSource(source_item_id) 305 ModuleSource(source_item_id)
301 } 306 }
302 307
303 pub(crate) fn new_file(file_id: FileId) -> ModuleSource { 308 pub(crate) fn new_file(file_id: HirFileId) -> ModuleSource {
304 ModuleSource::new(file_id, None) 309 ModuleSource::new(file_id, None)
305 } 310 }
306 311
307 pub(crate) fn new_inline( 312 pub(crate) fn new_inline(
308 db: &impl HirDatabase, 313 db: &impl HirDatabase,
309 file_id: FileId, 314 file_id: HirFileId,
310 m: ast::Module, 315 m: ast::Module,
311 ) -> ModuleSource { 316 ) -> ModuleSource {
312 assert!(!m.has_semi()); 317 assert!(!m.has_semi());
313 let file_items = db.file_items(file_id.into()); 318 let file_items = db.file_items(file_id);
314 let item_id = file_items.id_of(file_id.into(), m.syntax()); 319 let item_id = file_items.id_of(file_id, m.syntax());
315 ModuleSource::new(file_id, Some(item_id)) 320 ModuleSource::new(file_id, Some(item_id))
316 } 321 }
317 322
318 pub fn file_id(self) -> FileId { 323 pub(crate) fn file_id(self) -> HirFileId {
319 match self.0.mfile_id { 324 self.0.file_id
320 MFileId::File(file_id) => file_id,
321 MFileId::Macro(_) => unreachable!(),
322 }
323 } 325 }
324 326
325 pub(crate) fn resolve(self, db: &impl HirDatabase) -> ModuleSourceNode { 327 pub(crate) fn resolve(self, db: &impl HirDatabase) -> ModuleSourceNode {
diff --git a/crates/ra_hir/src/module/imp.rs b/crates/ra_hir/src/module/imp.rs
index eded85a63..d1498a646 100644
--- a/crates/ra_hir/src/module/imp.rs
+++ b/crates/ra_hir/src/module/imp.rs
@@ -64,7 +64,7 @@ fn create_module_tree<'a>(
64 64
65 let source_root = db.source_root(source_root); 65 let source_root = db.source_root(source_root);
66 for &file_id in source_root.files.values() { 66 for &file_id in source_root.files.values() {
67 let source = ModuleSource::new_file(file_id); 67 let source = ModuleSource::new_file(file_id.into());
68 if visited.contains(&source) { 68 if visited.contains(&source) {
69 continue; // TODO: use explicit crate_roots here 69 continue; // TODO: use explicit crate_roots here
70 } 70 }
@@ -123,7 +123,7 @@ fn build_subtree(
123 visited, 123 visited,
124 roots, 124 roots,
125 Some(link), 125 Some(link),
126 ModuleSource::new_file(file_id), 126 ModuleSource::new_file(file_id.into()),
127 ), 127 ),
128 }) 128 })
129 .collect::<Cancelable<Vec<_>>>()?; 129 .collect::<Cancelable<Vec<_>>>()?;
@@ -155,7 +155,7 @@ fn resolve_submodule(
155 name: &Name, 155 name: &Name,
156) -> (Vec<FileId>, Option<Problem>) { 156) -> (Vec<FileId>, Option<Problem>) {
157 // FIXME: handle submodules of inline modules properly 157 // FIXME: handle submodules of inline modules properly
158 let file_id = source.file_id(); 158 let file_id = source.file_id().original_file_id(db);
159 let source_root_id = db.file_source_root(file_id); 159 let source_root_id = db.file_source_root(file_id);
160 let path = db.file_relative_path(file_id); 160 let path = db.file_relative_path(file_id);
161 let root = RelativePathBuf::default(); 161 let root = RelativePathBuf::default();
diff --git a/crates/ra_hir/src/module/nameres.rs b/crates/ra_hir/src/module/nameres.rs
index 27a76a293..cc60ba077 100644
--- a/crates/ra_hir/src/module/nameres.rs
+++ b/crates/ra_hir/src/module/nameres.rs
@@ -25,7 +25,7 @@ use ra_syntax::{
25use ra_db::SourceRootId; 25use ra_db::SourceRootId;
26 26
27use crate::{ 27use crate::{
28 Cancelable, MFileId, FileId, 28 Cancelable, HirFileId, FileId,
29 DefId, DefLoc, DefKind, 29 DefId, DefLoc, DefKind,
30 SourceItemId, SourceFileItemId, SourceFileItems, 30 SourceItemId, SourceFileItemId, SourceFileItems,
31 Path, PathKind, 31 Path, PathKind,
@@ -95,9 +95,11 @@ pub struct NamedImport {
95} 95}
96 96
97impl NamedImport { 97impl NamedImport {
98 // FIXME: this is only here for one use-case in completion. Seems like a
99 // pretty gross special case.
98 pub fn range(&self, db: &impl HirDatabase, file_id: FileId) -> TextRange { 100 pub fn range(&self, db: &impl HirDatabase, file_id: FileId) -> TextRange {
99 let source_item_id = SourceItemId { 101 let source_item_id = SourceItemId {
100 mfile_id: file_id.into(), 102 file_id: file_id.into(),
101 item_id: Some(self.file_item_id), 103 item_id: Some(self.file_item_id),
102 }; 104 };
103 let syntax = db.file_item(source_item_id); 105 let syntax = db.file_item(source_item_id);
@@ -211,25 +213,25 @@ impl<T> PerNs<T> {
211impl InputModuleItems { 213impl InputModuleItems {
212 pub(crate) fn add_item( 214 pub(crate) fn add_item(
213 &mut self, 215 &mut self,
214 mfile_id: MFileId, 216 file_id: HirFileId,
215 file_items: &SourceFileItems, 217 file_items: &SourceFileItems,
216 item: ast::ModuleItem, 218 item: ast::ModuleItem,
217 ) -> Option<()> { 219 ) -> Option<()> {
218 match item { 220 match item {
219 ast::ModuleItem::StructDef(it) => { 221 ast::ModuleItem::StructDef(it) => {
220 self.items.push(ModuleItem::new(mfile_id, file_items, it)?) 222 self.items.push(ModuleItem::new(file_id, file_items, it)?)
221 } 223 }
222 ast::ModuleItem::EnumDef(it) => { 224 ast::ModuleItem::EnumDef(it) => {
223 self.items.push(ModuleItem::new(mfile_id, file_items, it)?) 225 self.items.push(ModuleItem::new(file_id, file_items, it)?)
224 } 226 }
225 ast::ModuleItem::FnDef(it) => { 227 ast::ModuleItem::FnDef(it) => {
226 self.items.push(ModuleItem::new(mfile_id, file_items, it)?) 228 self.items.push(ModuleItem::new(file_id, file_items, it)?)
227 } 229 }
228 ast::ModuleItem::TraitDef(it) => { 230 ast::ModuleItem::TraitDef(it) => {
229 self.items.push(ModuleItem::new(mfile_id, file_items, it)?) 231 self.items.push(ModuleItem::new(file_id, file_items, it)?)
230 } 232 }
231 ast::ModuleItem::TypeDef(it) => { 233 ast::ModuleItem::TypeDef(it) => {
232 self.items.push(ModuleItem::new(mfile_id, file_items, it)?) 234 self.items.push(ModuleItem::new(file_id, file_items, it)?)
233 } 235 }
234 ast::ModuleItem::ImplItem(_) => { 236 ast::ModuleItem::ImplItem(_) => {
235 // impls don't define items 237 // impls don't define items
@@ -239,13 +241,13 @@ impl InputModuleItems {
239 // TODO 241 // TODO
240 } 242 }
241 ast::ModuleItem::ConstDef(it) => { 243 ast::ModuleItem::ConstDef(it) => {
242 self.items.push(ModuleItem::new(mfile_id, file_items, it)?) 244 self.items.push(ModuleItem::new(file_id, file_items, it)?)
243 } 245 }
244 ast::ModuleItem::StaticDef(it) => { 246 ast::ModuleItem::StaticDef(it) => {
245 self.items.push(ModuleItem::new(mfile_id, file_items, it)?) 247 self.items.push(ModuleItem::new(file_id, file_items, it)?)
246 } 248 }
247 ast::ModuleItem::Module(it) => { 249 ast::ModuleItem::Module(it) => {
248 self.items.push(ModuleItem::new(mfile_id, file_items, it)?) 250 self.items.push(ModuleItem::new(file_id, file_items, it)?)
249 } 251 }
250 } 252 }
251 Some(()) 253 Some(())
@@ -269,7 +271,7 @@ impl InputModuleItems {
269 271
270impl ModuleItem { 272impl ModuleItem {
271 fn new<'a>( 273 fn new<'a>(
272 mfile_id: MFileId, 274 file_id: HirFileId,
273 file_items: &SourceFileItems, 275 file_items: &SourceFileItems,
274 item: impl ast::NameOwner<'a>, 276 item: impl ast::NameOwner<'a>,
275 ) -> Option<ModuleItem> { 277 ) -> Option<ModuleItem> {
@@ -277,7 +279,7 @@ impl ModuleItem {
277 let kind = item.syntax().kind(); 279 let kind = item.syntax().kind();
278 let vis = Vis::Other; 280 let vis = Vis::Other;
279 let item_id = Some(file_items.id_of_unchecked(item.syntax())); 281 let item_id = Some(file_items.id_of_unchecked(item.syntax()));
280 let id = SourceItemId { mfile_id, item_id }; 282 let id = SourceItemId { file_id, item_id };
281 let res = ModuleItem { 283 let res = ModuleItem {
282 id, 284 id,
283 name, 285 name,
@@ -339,7 +341,8 @@ where
339 let root_id = module_id.crate_root(&self.module_tree); 341 let root_id = module_id.crate_root(&self.module_tree);
340 let file_id = root_id.source(&self.module_tree).file_id(); 342 let file_id = root_id.source(&self.module_tree).file_id();
341 let crate_graph = self.db.crate_graph(); 343 let crate_graph = self.db.crate_graph();
342 if let Some(crate_id) = crate_graph.crate_id_for_crate_root(file_id) { 344 if let Some(crate_id) = crate_graph.crate_id_for_crate_root(file_id.as_original_file())
345 {
343 let krate = Crate::new(crate_id); 346 let krate = Crate::new(crate_id);
344 for dep in krate.dependencies(self.db) { 347 for dep in krate.dependencies(self.db) {
345 if let Some(module) = dep.krate.root_module(self.db)? { 348 if let Some(module) = dep.krate.root_module(self.db)? {
diff --git a/crates/ra_hir/src/query_definitions.rs b/crates/ra_hir/src/query_definitions.rs
index 3b73208e6..bc1f91938 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, SourceFileNode, 8 AstNode, SyntaxNode,
9 ast::{self, NameOwner, ModuleItemOwner} 9 ast::{self, NameOwner, ModuleItemOwner}
10}; 10};
11use ra_db::{SourceRootId, FileId, Cancelable,}; 11use ra_db::{SourceRootId, Cancelable,};
12 12
13use crate::{ 13use crate::{
14 SourceFileItems, SourceItemId, DefKind, Function, DefId, Name, AsName, MFileId, 14 SourceFileItems, SourceItemId, DefKind, Function, DefId, Name, AsName, HirFileId,
15 macros::MacroCallLoc, 15 macros::MacroCallLoc,
16 db::HirDatabase, 16 db::HirDatabase,
17 function::FnScopes, 17 function::FnScopes,
@@ -48,29 +48,17 @@ pub(super) fn enum_data(db: &impl HirDatabase, def_id: DefId) -> Cancelable<Arc<
48 Ok(Arc::new(EnumData::new(enum_def.borrowed()))) 48 Ok(Arc::new(EnumData::new(enum_def.borrowed())))
49} 49}
50 50
51pub(super) fn m_source_file(db: &impl HirDatabase, mfile_id: MFileId) -> SourceFileNode { 51pub(super) fn file_items(db: &impl HirDatabase, file_id: HirFileId) -> Arc<SourceFileItems> {
52 match mfile_id { 52 let source_file = db.hir_source_file(file_id);
53 MFileId::File(file_id) => db.source_file(file_id),
54 MFileId::Macro(m) => {
55 if let Some(exp) = db.expand_macro_invocation(m) {
56 return exp.file();
57 }
58 SourceFileNode::parse("")
59 }
60 }
61}
62
63pub(super) fn file_items(db: &impl HirDatabase, mfile_id: MFileId) -> Arc<SourceFileItems> {
64 let source_file = db.m_source_file(mfile_id);
65 let source_file = source_file.borrowed(); 53 let source_file = source_file.borrowed();
66 let res = SourceFileItems::new(mfile_id, source_file); 54 let res = SourceFileItems::new(file_id, source_file);
67 Arc::new(res) 55 Arc::new(res)
68} 56}
69 57
70pub(super) fn file_item(db: &impl HirDatabase, source_item_id: SourceItemId) -> SyntaxNode { 58pub(super) fn file_item(db: &impl HirDatabase, source_item_id: SourceItemId) -> SyntaxNode {
71 match source_item_id.item_id { 59 match source_item_id.item_id {
72 Some(id) => db.file_items(source_item_id.mfile_id)[id].clone(), 60 Some(id) => db.file_items(source_item_id.file_id)[id].clone(),
73 None => db.m_source_file(source_item_id.mfile_id).syntax().owned(), 61 None => db.hir_source_file(source_item_id.file_id).syntax().owned(),
74 } 62 }
75} 63}
76 64
@@ -92,7 +80,7 @@ pub(crate) fn submodules(
92 80
93 fn collect_submodules<'a>( 81 fn collect_submodules<'a>(
94 db: &impl HirDatabase, 82 db: &impl HirDatabase,
95 file_id: FileId, 83 file_id: HirFileId,
96 root: impl ast::ModuleItemOwner<'a>, 84 root: impl ast::ModuleItemOwner<'a>,
97 ) -> Vec<Submodule> { 85 ) -> Vec<Submodule> {
98 modules(root) 86 modules(root)
@@ -129,13 +117,13 @@ pub(super) fn input_module_items(
129) -> Cancelable<Arc<InputModuleItems>> { 117) -> Cancelable<Arc<InputModuleItems>> {
130 let module_tree = db.module_tree(source_root_id)?; 118 let module_tree = db.module_tree(source_root_id)?;
131 let source = module_id.source(&module_tree); 119 let source = module_id.source(&module_tree);
132 let mfile_id = source.file_id().into(); 120 let file_id = source.file_id();
133 let file_items = db.file_items(mfile_id); 121 let file_items = db.file_items(file_id);
134 let fill = |acc: &mut InputModuleItems, items: &mut Iterator<Item = ast::ItemOrMacro>| { 122 let fill = |acc: &mut InputModuleItems, items: &mut Iterator<Item = ast::ItemOrMacro>| {
135 for item in items { 123 for item in items {
136 match item { 124 match item {
137 ast::ItemOrMacro::Item(it) => { 125 ast::ItemOrMacro::Item(it) => {
138 acc.add_item(mfile_id, &file_items, it); 126 acc.add_item(file_id, &file_items, it);
139 } 127 }
140 ast::ItemOrMacro::Macro(macro_call) => { 128 ast::ItemOrMacro::Macro(macro_call) => {
141 let item_id = file_items.id_of_unchecked(macro_call.syntax()); 129 let item_id = file_items.id_of_unchecked(macro_call.syntax());
@@ -143,16 +131,16 @@ pub(super) fn input_module_items(
143 source_root_id, 131 source_root_id,
144 module_id, 132 module_id,
145 source_item_id: SourceItemId { 133 source_item_id: SourceItemId {
146 mfile_id, 134 file_id,
147 item_id: Some(item_id), 135 item_id: Some(item_id),
148 }, 136 },
149 }; 137 };
150 let id = loc.id(db); 138 let id = loc.id(db);
151 let mfile_id = MFileId::Macro(id); 139 let file_id = HirFileId::from(id);
152 let file_items = db.file_items(mfile_id); 140 let file_items = db.file_items(file_id);
153 //FIXME: expand recursively 141 //FIXME: expand recursively
154 for item in db.m_source_file(mfile_id).borrowed().items() { 142 for item in db.hir_source_file(file_id).borrowed().items() {
155 acc.add_item(mfile_id, &file_items, item); 143 acc.add_item(file_id, &file_items, item);
156 } 144 }
157 } 145 }
158 } 146 }
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs
index 4a99dff84..24490d119 100644
--- a/crates/ra_hir/src/source_binder.rs
+++ b/crates/ra_hir/src/source_binder.rs
@@ -20,7 +20,7 @@ use crate::{
20 20
21/// Locates the module by `FileId`. Picks topmost module in the file. 21/// Locates the module by `FileId`. Picks topmost module in the file.
22pub fn module_from_file_id(db: &impl HirDatabase, file_id: FileId) -> Cancelable<Option<Module>> { 22pub fn module_from_file_id(db: &impl HirDatabase, file_id: FileId) -> Cancelable<Option<Module>> {
23 let module_source = ModuleSource::new_file(file_id); 23 let module_source = ModuleSource::new_file(file_id.into());
24 module_from_source(db, module_source) 24 module_from_source(db, module_source)
25} 25}
26 26
@@ -50,8 +50,8 @@ pub fn module_from_position(
50) -> Cancelable<Option<Module>> { 50) -> Cancelable<Option<Module>> {
51 let file = db.source_file(position.file_id); 51 let file = db.source_file(position.file_id);
52 let module_source = match find_node_at_offset::<ast::Module>(file.syntax(), position.offset) { 52 let module_source = match find_node_at_offset::<ast::Module>(file.syntax(), position.offset) {
53 Some(m) if !m.has_semi() => ModuleSource::new_inline(db, position.file_id, m), 53 Some(m) if !m.has_semi() => ModuleSource::new_inline(db, position.file_id.into(), m),
54 _ => ModuleSource::new_file(position.file_id), 54 _ => ModuleSource::new_file(position.file_id.into()),
55 }; 55 };
56 module_from_source(db, module_source) 56 module_from_source(db, module_source)
57} 57}
@@ -67,9 +67,9 @@ pub fn module_from_child_node(
67 .filter_map(ast::Module::cast) 67 .filter_map(ast::Module::cast)
68 .find(|it| !it.has_semi()) 68 .find(|it| !it.has_semi())
69 { 69 {
70 ModuleSource::new_inline(db, file_id, m) 70 ModuleSource::new_inline(db, file_id.into(), m)
71 } else { 71 } else {
72 ModuleSource::new_file(file_id) 72 ModuleSource::new_file(file_id.into())
73 }; 73 };
74 module_from_source(db, module_source) 74 module_from_source(db, module_source)
75} 75}
@@ -78,7 +78,7 @@ fn module_from_source(
78 db: &impl HirDatabase, 78 db: &impl HirDatabase,
79 module_source: ModuleSource, 79 module_source: ModuleSource,
80) -> Cancelable<Option<Module>> { 80) -> Cancelable<Option<Module>> {
81 let source_root_id = db.file_source_root(module_source.file_id()); 81 let source_root_id = db.file_source_root(module_source.file_id().as_original_file());
82 let module_tree = db.module_tree(source_root_id)?; 82 let module_tree = db.module_tree(source_root_id)?;
83 let m = module_tree 83 let m = module_tree
84 .modules_with_sources() 84 .modules_with_sources()
@@ -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 mfile_id = module.source().file_id().into(); 105 let file_id = module.source().file_id();
106 let file_items = db.file_items(mfile_id); 106 let file_items = db.file_items(file_id);
107 let item_id = file_items.id_of(mfile_id, fn_def.syntax()); 107 let item_id = file_items.id_of(file_id, fn_def.syntax());
108 let source_item_id = SourceItemId { 108 let source_item_id = SourceItemId {
109 mfile_id, 109 file_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 {