@@ -176,6 +176,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
176
176
Cow :: Owned ( ThinVec :: new ( ) ) ,
177
177
& [ ] ,
178
178
) ,
179
+ false ,
179
180
) ?;
180
181
}
181
182
}
@@ -202,6 +203,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
202
203
Cow :: Owned ( ThinVec :: new ( ) ) ,
203
204
& [ ] ,
204
205
) ,
206
+ true ,
205
207
) ?;
206
208
}
207
209
}
@@ -212,12 +214,13 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
212
214
& mut self ,
213
215
item : & ' c ast:: Item ,
214
216
sub_mod : Module < ' ast > ,
217
+ from_ast : bool ,
215
218
) -> Result < ( ) , ModuleResolutionError > {
216
219
let old_directory = self . directory . clone ( ) ;
217
220
let sub_mod_kind = self . peek_sub_mod ( item, & sub_mod) ?;
218
221
if let Some ( sub_mod_kind) = sub_mod_kind {
219
222
self . insert_sub_mod ( sub_mod_kind. clone ( ) ) ?;
220
- self . visit_sub_mod_inner ( sub_mod, sub_mod_kind) ?;
223
+ self . visit_sub_mod_inner ( sub_mod, sub_mod_kind, from_ast ) ?;
221
224
}
222
225
self . directory = old_directory;
223
226
Ok ( ( ) )
@@ -269,26 +272,27 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
269
272
& mut self ,
270
273
sub_mod : Module < ' ast > ,
271
274
sub_mod_kind : SubModKind < ' c , ' ast > ,
275
+ from_ast : bool ,
272
276
) -> Result < ( ) , ModuleResolutionError > {
273
277
match sub_mod_kind {
274
278
SubModKind :: External ( mod_path, directory_ownership, sub_mod) => {
275
279
let directory = Directory {
276
280
path : mod_path. parent ( ) . unwrap ( ) . to_path_buf ( ) ,
277
281
ownership : directory_ownership,
278
282
} ;
279
- self . visit_sub_mod_after_directory_update ( sub_mod, Some ( directory) )
283
+ self . visit_sub_mod_after_directory_update ( sub_mod, Some ( directory) , false )
280
284
}
281
285
SubModKind :: Internal ( item) => {
282
286
self . push_inline_mod_directory ( item. ident , & item. attrs ) ;
283
- self . visit_sub_mod_after_directory_update ( sub_mod, None )
287
+ self . visit_sub_mod_after_directory_update ( sub_mod, None , from_ast )
284
288
}
285
289
SubModKind :: MultiExternal ( mods) => {
286
290
for ( mod_path, directory_ownership, sub_mod) in mods {
287
291
let directory = Directory {
288
292
path : mod_path. parent ( ) . unwrap ( ) . to_path_buf ( ) ,
289
293
ownership : directory_ownership,
290
294
} ;
291
- self . visit_sub_mod_after_directory_update ( sub_mod, Some ( directory) ) ?;
295
+ self . visit_sub_mod_after_directory_update ( sub_mod, Some ( directory) , false ) ?;
292
296
}
293
297
Ok ( ( ) )
294
298
}
@@ -299,19 +303,23 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
299
303
& mut self ,
300
304
sub_mod : Module < ' ast > ,
301
305
directory : Option < Directory > ,
306
+ from_ast : bool ,
302
307
) -> Result < ( ) , ModuleResolutionError > {
303
308
if let Some ( directory) = directory {
304
309
self . directory = directory;
305
310
}
306
- match ( sub_mod . ast_mod_kind , sub_mod . items ) {
307
- ( Some ( Cow :: Borrowed ( ast:: ModKind :: Loaded ( items, _, _) ) ) , _ ) => {
308
- self . visit_mod_from_ast ( items)
311
+ if from_ast {
312
+ if let Some ( Cow :: Borrowed ( ast:: ModKind :: Loaded ( items, _, _) ) ) = & sub_mod . ast_mod_kind {
313
+ self . visit_mod_from_ast ( items) ? ;
309
314
}
310
- ( Some ( Cow :: Owned ( ast:: ModKind :: Loaded ( items, _, _) ) ) , _) | ( _, Cow :: Owned ( items) ) => {
311
- self . visit_mod_outside_ast ( & items)
315
+ } else {
316
+ if let Some ( Cow :: Owned ( ast:: ModKind :: Loaded ( items, _, _) ) ) = & sub_mod. ast_mod_kind {
317
+ self . visit_mod_outside_ast ( items) ?;
318
+ } else if let Cow :: Owned ( items) = & sub_mod. items {
319
+ self . visit_mod_outside_ast ( items) ?;
312
320
}
313
- ( _, _) => Ok ( ( ) ) ,
314
321
}
322
+ Ok ( ( ) )
315
323
}
316
324
317
325
/// Find a file path in the filesystem which corresponds to the given module.
0 commit comments