@@ -19,7 +19,8 @@ use ra_syntax::{
1919} ;
2020use rustc_hash:: FxHashMap ;
2121
22- use crate :: { db:: HirDatabase , Local , Module , ModuleSource , SourceAnalyzer , TypeParam } ;
22+ use crate :: { db:: HirDatabase , Local , Module , SourceAnalyzer , TypeParam } ;
23+ use ra_db:: FileId ;
2324
2425pub struct SourceBinder < ' a , DB > {
2526 pub db : & ' a DB ,
@@ -60,6 +61,16 @@ impl<DB: HirDatabase> SourceBinder<'_, DB> {
6061 T :: to_def ( self , src)
6162 }
6263
64+ pub fn to_module_def ( & mut self , file : FileId ) -> Option < Module > {
65+ let _p = profile ( "SourceBinder::to_module_def" ) ;
66+ let ( krate, local_id) = self . db . relevant_crates ( file) . iter ( ) . find_map ( |& crate_id| {
67+ let crate_def_map = self . db . crate_def_map ( crate_id) ;
68+ let local_id = crate_def_map. modules_for_file ( file) . next ( ) ?;
69+ Some ( ( crate_id, local_id) )
70+ } ) ?;
71+ Some ( Module { id : ModuleId { krate, local_id } } )
72+ }
73+
6374 fn to_id < T : ToId > ( & mut self , src : InFile < T > ) -> Option < T :: ID > {
6475 T :: to_id ( self , src)
6576 }
@@ -107,8 +118,7 @@ impl<DB: HirDatabase> SourceBinder<'_, DB> {
107118 return Some ( res) ;
108119 }
109120
110- let module_source = ModuleSource :: from_child_node ( self . db , src) ;
111- let c = crate :: Module :: from_definition ( self . db , src. with_value ( module_source) ) ?;
121+ let c = self . to_module_def ( src. file_id . original_file ( self . db ) ) ?;
112122 Some ( c. id . into ( ) )
113123 }
114124
@@ -248,14 +258,12 @@ impl ToId for ast::MacroCall {
248258 ) -> Option < Self :: ID > {
249259 let kind = MacroDefKind :: Declarative ;
250260
251- let module_src = ModuleSource :: from_child_node ( sb. db , src. as_ref ( ) . map ( |it| it. syntax ( ) ) ) ;
252- let module = crate :: Module :: from_definition ( sb. db , InFile :: new ( src. file_id , module_src) ) ?;
253- let krate = Some ( module. krate ( ) . id ) ;
261+ let krate = sb. to_module_def ( src. file_id . original_file ( sb. db ) ) ?. id . krate ;
254262
255263 let ast_id =
256264 Some ( AstId :: new ( src. file_id , sb. db . ast_id_map ( src. file_id ) . ast_id ( & src. value ) ) ) ;
257265
258- Some ( MacroDefId { krate, ast_id, kind } )
266+ Some ( MacroDefId { krate : Some ( krate ) , ast_id, kind } )
259267 }
260268}
261269
@@ -319,21 +327,22 @@ impl ToDef for ast::Module {
319327 ) -> Option < Module > {
320328 {
321329 let _p = profile ( "ast::Module::to_def" ) ;
322- let parent_declaration =
323- src. value . syntax ( ) . ancestors ( ) . skip ( 1 ) . find_map ( ast:: Module :: cast) ;
330+ let parent_declaration = src
331+ . as_ref ( )
332+ . map ( |it| it. syntax ( ) )
333+ . cloned ( )
334+ . ancestors_with_macros ( sb. db )
335+ . skip ( 1 )
336+ . find_map ( |it| {
337+ let m = ast:: Module :: cast ( it. value . clone ( ) ) ?;
338+ Some ( it. with_value ( m) )
339+ } ) ;
324340
325341 let parent_module = match parent_declaration {
326- Some ( parent_declaration) => {
327- let src_parent = InFile { file_id : src. file_id , value : parent_declaration } ;
328- sb. to_def ( src_parent)
329- }
342+ Some ( parent_declaration) => sb. to_def ( parent_declaration) ,
330343 None => {
331- let source_file = sb. db . parse ( src. file_id . original_file ( sb. db ) ) . tree ( ) ;
332- let src_parent = InFile {
333- file_id : src. file_id ,
334- value : ModuleSource :: SourceFile ( source_file) ,
335- } ;
336- Module :: from_definition ( sb. db , src_parent)
344+ let file_id = src. file_id . original_file ( sb. db ) ;
345+ sb. to_module_def ( file_id)
337346 }
338347 } ?;
339348
0 commit comments