1- use hir:: { db:: HirDatabase , HasSource , HasVisibility , PathResolution } ;
1+ use hir:: { db:: HirDatabase , HasSource , HasVisibility , ModuleDef , PathResolution , ScopeDef } ;
22use ide_db:: base_db:: FileId ;
33use syntax:: {
44 ast:: { self , HasVisibility as _} ,
@@ -18,7 +18,7 @@ use crate::{utils::vis_offset, AssistContext, AssistId, AssistKind, Assists};
1818// fn frobnicate() {}
1919// }
2020// fn main() {
21- // m::frobnicate$0() {}
21+ // m::frobnicate$0();
2222// }
2323// ```
2424// ->
@@ -27,7 +27,7 @@ use crate::{utils::vis_offset, AssistContext, AssistId, AssistKind, Assists};
2727// $0pub(crate) fn frobnicate() {}
2828// }
2929// fn main() {
30- // m::frobnicate() {}
30+ // m::frobnicate();
3131// }
3232// ```
3333pub ( crate ) fn fix_visibility ( acc : & mut Assists , ctx : & AssistContext < ' _ > ) -> Option < ( ) > {
@@ -37,11 +37,15 @@ pub(crate) fn fix_visibility(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
3737
3838fn add_vis_to_referenced_module_def ( acc : & mut Assists , ctx : & AssistContext < ' _ > ) -> Option < ( ) > {
3939 let path: ast:: Path = ctx. find_node_at_offset ( ) ?;
40- let path_res = ctx. sema . resolve_path ( & path) ?;
41- let def = match path_res {
42- PathResolution :: Def ( def) => def,
43- _ => return None ,
44- } ;
40+ let qualifier = path. qualifier ( ) ?;
41+ let name_ref = path. segment ( ) ?. name_ref ( ) ?;
42+ let qualifier_res = ctx. sema . resolve_path ( & qualifier) ?;
43+ let PathResolution :: Def ( ModuleDef :: Module ( module) ) = qualifier_res else { return None ; } ;
44+ let ( _, def) = module
45+ . scope ( ctx. db ( ) , None )
46+ . into_iter ( )
47+ . find ( |( name, _) | name. to_smol_str ( ) == name_ref. text ( ) . as_str ( ) ) ?;
48+ let ScopeDef :: ModuleDef ( def) = def else { return None ; } ;
4549
4650 let current_module = ctx. sema . scope ( path. syntax ( ) ) ?. module ( ) ;
4751 let target_module = def. module ( ctx. db ( ) ) ?;
0 commit comments