aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/from_source.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/from_source.rs')
-rw-r--r--crates/ra_hir/src/from_source.rs38
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
4use hir_def::{nameres::ModuleSource, ModuleId}; 4use hir_def::{nameres::ModuleSource, ModuleId};
5use hir_expand::name::AsName;
6use ra_db::FileId; 5use ra_db::FileId;
7use ra_prof::profile; 6use ra_prof::profile;
8use ra_syntax::ast::{self, AstNode, NameOwner};
9 7
10use crate::{db::DefDatabase, InFile, Module}; 8use crate::{
9 db::{DefDatabase, HirDatabase},
10 InFile, Module,
11};
11 12
12impl Module { 13impl 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 };