@@ -18,7 +18,6 @@ use crate::db::SemanticGroup;
18
18
use crate :: expr:: inference:: InferenceId ;
19
19
use crate :: items:: functions:: GenericFunctionId ;
20
20
use crate :: items:: us:: SemanticUseEx ;
21
- use crate :: items:: visibility:: peek_visible_in;
22
21
use crate :: keyword:: SELF_PARAM_KW ;
23
22
use crate :: resolve:: { ResolvedGenericItem , Resolver } ;
24
23
use crate :: types:: TypeHead ;
@@ -124,20 +123,11 @@ fn visible_importables_in_module_ex(
124
123
}
125
124
126
125
let resolver = Resolver :: new ( db, user_module_file_id, InferenceId :: NoContext ) ;
127
- let ignore_visibility = resolver . ignore_visibility_checks ( module_id ) ;
126
+
128
127
// Check if an item in the current module is visible from the user module.
129
128
let is_visible = |item_name : SmolStr | {
130
- if ignore_visibility {
131
- Some ( true )
132
- } else {
133
- let item_info = db. module_item_info_by_name ( module_id, item_name) . ok ( ) ??;
134
- Some ( peek_visible_in (
135
- db. upcast ( ) ,
136
- item_info. visibility ,
137
- module_id,
138
- user_module_file_id. 0 ,
139
- ) )
140
- }
129
+ let item_info = db. module_item_info_by_name ( module_id, item_name) . ok ( ) ??;
130
+ Some ( resolver. is_item_visible ( module_id, & item_info, user_module_file_id. 0 ) )
141
131
} ;
142
132
visited_modules. insert ( module_id) ;
143
133
let mut modules_to_visit = vec ! [ ] ;
@@ -148,7 +138,15 @@ fn visible_importables_in_module_ex(
148
138
}
149
139
let resolved_item = db. use_resolved_item ( use_id) . ok ( ) ?;
150
140
let ( resolved_item, name) = match resolved_item {
151
- ResolvedGenericItem :: Module ( ModuleId :: CrateRoot ( _) ) => continue ,
141
+ ResolvedGenericItem :: Module ( ModuleId :: CrateRoot ( crate_id) ) => {
142
+ result. extend_from_slice (
143
+ & db. visible_importables_in_crate (
144
+ crate_id,
145
+ ModuleFileId ( module_id, FileIndex ( 0 ) ) ,
146
+ ) [ ..] ,
147
+ ) ;
148
+ continue ;
149
+ }
152
150
ResolvedGenericItem :: Module ( inner_module_id @ ModuleId :: Submodule ( module) ) => {
153
151
modules_to_visit. push ( inner_module_id) ;
154
152
@@ -163,7 +161,6 @@ fn visible_importables_in_module_ex(
163
161
ResolvedGenericItem :: GenericFunction ( GenericFunctionId :: Extern ( item_id) ) => {
164
162
( ImportableId :: ExternFunction ( item_id) , item_id. name ( db. upcast ( ) ) )
165
163
}
166
- ResolvedGenericItem :: GenericFunction ( GenericFunctionId :: Impl ( _item_id) ) => continue ,
167
164
ResolvedGenericItem :: GenericType ( GenericTypeId :: Struct ( item_id) ) => {
168
165
( ImportableId :: Struct ( item_id) , item_id. name ( db. upcast ( ) ) )
169
166
}
@@ -188,7 +185,9 @@ fn visible_importables_in_module_ex(
188
185
ResolvedGenericItem :: Impl ( item_id) => {
189
186
( ImportableId :: Impl ( item_id) , item_id. name ( db. upcast ( ) ) )
190
187
}
191
- ResolvedGenericItem :: Variable ( _) | ResolvedGenericItem :: TraitItem ( _) => continue ,
188
+ ResolvedGenericItem :: Variable ( _)
189
+ | ResolvedGenericItem :: TraitItem ( _)
190
+ | ResolvedGenericItem :: GenericFunction ( GenericFunctionId :: Impl ( _) ) => continue ,
192
191
} ;
193
192
194
193
result. push ( ( resolved_item, name. to_string ( ) ) ) ;
@@ -197,6 +196,7 @@ fn visible_importables_in_module_ex(
197
196
if !is_visible ( submodule_id. name ( db. upcast ( ) ) ) ? {
198
197
continue ;
199
198
}
199
+ result. push ( ( ImportableId :: Submodule ( submodule_id) , submodule_id. name ( db) . to_string ( ) ) ) ;
200
200
modules_to_visit. push ( ModuleId :: Submodule ( submodule_id) ) ;
201
201
}
202
202
@@ -281,14 +281,8 @@ pub fn visible_importables_from_module(
281
281
module_file_id : ModuleFileId ,
282
282
) -> Option < Arc < OrderedHashMap < ImportableId , String > > > {
283
283
let module_id = module_file_id. 0 ;
284
- let mut current_top_module = module_id;
285
- while let ModuleId :: Submodule ( submodule_id) = current_top_module {
286
- current_top_module = submodule_id. parent_module ( db. upcast ( ) ) ;
287
- }
288
- let current_crate_id = match current_top_module {
289
- ModuleId :: CrateRoot ( crate_id) => crate_id,
290
- ModuleId :: Submodule ( _) => unreachable ! ( "current module is not a top-level module" ) ,
291
- } ;
284
+
285
+ let current_crate_id = module_id. owning_crate ( db) ;
292
286
let edition = db. crate_config ( current_crate_id) ?. settings . edition ;
293
287
let prelude_submodule_name = edition. prelude_submodule_name ( ) ;
294
288
let core_prelude_submodule = core_submodule ( db, "prelude" ) ;
@@ -300,7 +294,7 @@ pub fn visible_importables_from_module(
300
294
module_visible_importables. extend_from_slice (
301
295
& db. visible_importables_in_module ( prelude_submodule, prelude_submodule_file_id, false ) [ ..] ,
302
296
) ;
303
- // Collect importables from all visible crates, including the current crate.
297
+ // Collect importables from all dependency crates, including the current crate and corelib .
304
298
let settings = db. crate_config ( current_crate_id) . map ( |c| c. settings ) . unwrap_or_default ( ) ;
305
299
for crate_id in chain ! (
306
300
[ current_crate_id] ,
@@ -322,7 +316,7 @@ pub fn visible_importables_from_module(
322
316
. extend_from_slice ( & db. visible_importables_in_module ( module_id, module_file_id, true ) [ ..] ) ;
323
317
324
318
// Deduplicate importables, preferring shorter paths.
325
- // This is the reason for searching in the crates before the current module- to prioritize
319
+ // This is the reason for searching in the crates before the current module - to prioritize
326
320
// shorter, canonical paths prefixed with `crate::` over paths using `super::` or local
327
321
// imports.
328
322
let mut result: OrderedHashMap < ImportableId , String > = OrderedHashMap :: default ( ) ;
0 commit comments