@@ -161,6 +161,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
161
161
Cow :: Owned ( ThinVec :: new ( ) ) ,
162
162
& [ ] ,
163
163
) ,
164
+ false ,
164
165
) ?;
165
166
}
166
167
}
@@ -188,6 +189,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
188
189
Cow :: Owned ( ThinVec :: new ( ) ) ,
189
190
& [ ] ,
190
191
) ,
192
+ false ,
191
193
) ?;
192
194
}
193
195
}
@@ -214,6 +216,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
214
216
Cow :: Owned ( ThinVec :: new ( ) ) ,
215
217
& [ ] ,
216
218
) ,
219
+ true ,
217
220
) ?;
218
221
}
219
222
}
@@ -224,12 +227,13 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
224
227
& mut self ,
225
228
item : & ' c ast:: Item ,
226
229
sub_mod : Module < ' ast > ,
230
+ from_ast : bool ,
227
231
) -> Result < ( ) , ModuleResolutionError > {
228
232
let old_directory = self . directory . clone ( ) ;
229
233
let sub_mod_kind = self . peek_sub_mod ( item, & sub_mod) ?;
230
234
if let Some ( sub_mod_kind) = sub_mod_kind {
231
235
self . insert_sub_mod ( sub_mod_kind. clone ( ) ) ?;
232
- self . visit_sub_mod_inner ( sub_mod, sub_mod_kind) ?;
236
+ self . visit_sub_mod_inner ( sub_mod, sub_mod_kind, from_ast ) ?;
233
237
}
234
238
self . directory = old_directory;
235
239
Ok ( ( ) )
@@ -281,26 +285,27 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
281
285
& mut self ,
282
286
sub_mod : Module < ' ast > ,
283
287
sub_mod_kind : SubModKind < ' c , ' ast > ,
288
+ from_ast : bool ,
284
289
) -> Result < ( ) , ModuleResolutionError > {
285
290
match sub_mod_kind {
286
291
SubModKind :: External ( mod_path, directory_ownership, sub_mod) => {
287
292
let directory = Directory {
288
293
path : mod_path. parent ( ) . unwrap ( ) . to_path_buf ( ) ,
289
294
ownership : directory_ownership,
290
295
} ;
291
- self . visit_sub_mod_after_directory_update ( sub_mod, Some ( directory) )
296
+ self . visit_sub_mod_after_directory_update ( sub_mod, Some ( directory) , false )
292
297
}
293
298
SubModKind :: Internal ( item) => {
294
299
self . push_inline_mod_directory ( item. ident , & item. attrs ) ;
295
- self . visit_sub_mod_after_directory_update ( sub_mod, None )
300
+ self . visit_sub_mod_after_directory_update ( sub_mod, None , from_ast )
296
301
}
297
302
SubModKind :: MultiExternal ( mods) => {
298
303
for ( mod_path, directory_ownership, sub_mod) in mods {
299
304
let directory = Directory {
300
305
path : mod_path. parent ( ) . unwrap ( ) . to_path_buf ( ) ,
301
306
ownership : directory_ownership,
302
307
} ;
303
- self . visit_sub_mod_after_directory_update ( sub_mod, Some ( directory) ) ?;
308
+ self . visit_sub_mod_after_directory_update ( sub_mod, Some ( directory) , false ) ?;
304
309
}
305
310
Ok ( ( ) )
306
311
}
@@ -311,19 +316,23 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
311
316
& mut self ,
312
317
sub_mod : Module < ' ast > ,
313
318
directory : Option < Directory > ,
319
+ from_ast : bool ,
314
320
) -> Result < ( ) , ModuleResolutionError > {
315
321
if let Some ( directory) = directory {
316
322
self . directory = directory;
317
323
}
318
- match ( sub_mod . ast_mod_kind , sub_mod . items ) {
319
- ( Some ( Cow :: Borrowed ( ast:: ModKind :: Loaded ( items, _, _) ) ) , _ ) => {
320
- self . visit_mod_from_ast ( items)
324
+ if from_ast {
325
+ if let Some ( Cow :: Borrowed ( ast:: ModKind :: Loaded ( items, _, _) ) ) = & sub_mod . ast_mod_kind {
326
+ self . visit_mod_from_ast ( items) ? ;
321
327
}
322
- ( Some ( Cow :: Owned ( ast:: ModKind :: Loaded ( items, _, _) ) ) , _) | ( _, Cow :: Owned ( items) ) => {
323
- self . visit_mod_outside_ast ( & items)
328
+ } else {
329
+ if let Some ( Cow :: Owned ( ast:: ModKind :: Loaded ( items, _, _) ) ) = & sub_mod. ast_mod_kind {
330
+ self . visit_mod_outside_ast ( items) ?;
331
+ } else if let Cow :: Owned ( items) = & sub_mod. items {
332
+ self . visit_mod_outside_ast ( items) ?;
324
333
}
325
- ( _, _) => Ok ( ( ) ) ,
326
334
}
335
+ Ok ( ( ) )
327
336
}
328
337
329
338
/// Find a file path in the filesystem which corresponds to the given module.
0 commit comments