diff options
Diffstat (limited to 'crates/ra_hir/src/from_source.rs')
-rw-r--r-- | crates/ra_hir/src/from_source.rs | 38 |
1 files changed, 7 insertions, 31 deletions
diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index c766c3f0b..eb76aecb1 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs | |||
@@ -2,46 +2,22 @@ | |||
2 | //! file. | 2 | //! file. |
3 | 3 | ||
4 | use hir_def::{nameres::ModuleSource, ModuleId}; | 4 | use hir_def::{nameres::ModuleSource, ModuleId}; |
5 | use hir_expand::name::AsName; | ||
6 | use ra_db::FileId; | 5 | use ra_db::FileId; |
7 | use ra_prof::profile; | 6 | use ra_prof::profile; |
8 | use ra_syntax::ast::{self, AstNode, NameOwner}; | ||
9 | 7 | ||
10 | use crate::{db::DefDatabase, InFile, Module}; | 8 | use crate::{ |
9 | db::{DefDatabase, HirDatabase}, | ||
10 | InFile, Module, | ||
11 | }; | ||
11 | 12 | ||
12 | impl Module { | 13 | impl Module { |
13 | pub fn from_declaration(db: &impl DefDatabase, src: InFile<ast::Module>) -> Option<Self> { | 14 | pub fn from_definition(db: &impl HirDatabase, src: InFile<ModuleSource>) -> Option<Self> { |
14 | let _p = profile("Module::from_declaration"); | ||
15 | let parent_declaration = src.value.syntax().ancestors().skip(1).find_map(ast::Module::cast); | ||
16 | |||
17 | let parent_module = match parent_declaration { | ||
18 | Some(parent_declaration) => { | ||
19 | let src_parent = InFile { file_id: src.file_id, value: parent_declaration }; | ||
20 | Module::from_declaration(db, src_parent) | ||
21 | } | ||
22 | None => { | ||
23 | let source_file = db.parse(src.file_id.original_file(db)).tree(); | ||
24 | let src_parent = | ||
25 | InFile { file_id: src.file_id, value: ModuleSource::SourceFile(source_file) }; | ||
26 | Module::from_definition(db, src_parent) | ||
27 | } | ||
28 | }?; | ||
29 | |||
30 | let child_name = src.value.name()?.as_name(); | ||
31 | let def_map = db.crate_def_map(parent_module.id.krate); | ||
32 | let child_id = def_map[parent_module.id.local_id].children.get(&child_name)?; | ||
33 | Some(parent_module.with_module_id(*child_id)) | ||
34 | } | ||
35 | |||
36 | pub fn from_definition(db: &impl DefDatabase, src: InFile<ModuleSource>) -> Option<Self> { | ||
37 | let _p = profile("Module::from_definition"); | 15 | let _p = profile("Module::from_definition"); |
16 | let mut sb = crate::SourceBinder::new(db); | ||
38 | match src.value { | 17 | match src.value { |
39 | ModuleSource::Module(ref module) => { | 18 | ModuleSource::Module(ref module) => { |
40 | assert!(!module.has_semi()); | 19 | assert!(!module.has_semi()); |
41 | return Module::from_declaration( | 20 | return sb.to_def(InFile { file_id: src.file_id, value: module.clone() }); |
42 | db, | ||
43 | InFile { file_id: src.file_id, value: module.clone() }, | ||
44 | ); | ||
45 | } | 21 | } |
46 | ModuleSource::SourceFile(_) => (), | 22 | ModuleSource::SourceFile(_) => (), |
47 | }; | 23 | }; |