@@ -109,12 +109,17 @@ enum SubModKind<'a, 'ast> {
109
109
MultiExternal ( Vec < ( PathBuf , DirectoryOwnership , Module < ' ast > ) > ) ,
110
110
/// `mod foo {}`
111
111
Internal ( & ' a ast:: Item ) ,
112
+ /// Just like External, but sub modules of this modules are not resolved,
113
+ /// and this module is not added to the FileModMap
114
+ SkippedExternal ( PathBuf , DirectoryOwnership , Module < ' ast > ) ,
112
115
}
113
116
114
117
impl < ' a , ' ast > SubModKind < ' a , ' ast > {
115
118
fn attrs ( & self ) -> Vec < ast:: Attribute > {
116
119
match self {
117
- Self :: External ( _, _, module) => module. inner_attr . clone ( ) ,
120
+ Self :: External ( _, _, module) | Self :: SkippedExternal ( _, _, module) => {
121
+ module. inner_attr . clone ( )
122
+ }
118
123
Self :: MultiExternal ( modules) => modules
119
124
. iter ( )
120
125
. map ( |( _, _, module) | module. inner_attr . clone ( ) . into_iter ( ) )
@@ -263,10 +268,8 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
263
268
264
269
let sub_mod_kind = self . peek_sub_mod ( item, & sub_mod) ?;
265
270
if let Some ( sub_mod_kind) = sub_mod_kind {
266
- if matches ! (
267
- sub_mod_kind,
268
- SubModKind :: External ( ..) | SubModKind :: MultiExternal ( _)
269
- ) {
271
+ let is_internal_mod = matches ! ( sub_mod_kind, SubModKind :: Internal ( _) ) ;
272
+ if !is_internal_mod {
270
273
self . update_mod_item_with_submod_attrs ( item, & sub_mod_kind)
271
274
}
272
275
self . insert_sub_mod ( sub_mod_kind. clone ( ) ) ?;
@@ -305,14 +308,12 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
305
308
item : & ' c ast:: Item ,
306
309
sub_mod : & Module < ' ast > ,
307
310
) -> Result < Option < SubModKind < ' c , ' ast > > , ModuleResolutionError > {
308
- if contains_skip ( & item. attrs ) {
309
- return Ok ( None ) ;
310
- }
311
-
312
311
if is_mod_decl ( item) {
313
312
// mod foo;
314
313
// Look for an extern file.
315
314
self . find_external_module ( item. ident , & item. attrs , sub_mod)
315
+ } else if contains_skip ( & item. attrs ) {
316
+ return Ok ( None ) ;
316
317
} else {
317
318
// An internal module (`mod foo { /* ... */ }`);
318
319
Ok ( Some ( SubModKind :: Internal ( item) ) )
@@ -370,6 +371,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
370
371
}
371
372
Ok ( ( ) )
372
373
}
374
+ SubModKind :: SkippedExternal ( ..) => Ok ( ( ) ) ,
373
375
}
374
376
}
375
377
@@ -408,7 +410,18 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
408
410
return Ok ( None ) ;
409
411
}
410
412
return match Parser :: parse_file_as_module ( self . parse_sess , & path, sub_mod. span ) {
411
- Ok ( ( ref attrs, _, _) ) if contains_skip ( attrs) => Ok ( None ) ,
413
+ Ok ( ( attrs, items, span) ) if contains_skip ( & attrs) => {
414
+ Ok ( Some ( SubModKind :: SkippedExternal (
415
+ path,
416
+ DirectoryOwnership :: Owned { relative : None } ,
417
+ Module :: new (
418
+ span,
419
+ Some ( Cow :: Owned ( ast:: ModKind :: Unloaded ) ) ,
420
+ Cow :: Owned ( items) ,
421
+ Cow :: Owned ( attrs) ,
422
+ ) ,
423
+ ) ) )
424
+ }
412
425
Ok ( ( attrs, items, span) ) => Ok ( Some ( SubModKind :: External (
413
426
path,
414
427
DirectoryOwnership :: Owned { relative : None } ,
@@ -457,7 +470,18 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
457
470
}
458
471
}
459
472
match Parser :: parse_file_as_module ( self . parse_sess , & file_path, sub_mod. span ) {
460
- Ok ( ( ref attrs, _, _) ) if contains_skip ( attrs) => Ok ( None ) ,
473
+ Ok ( ( attrs, items, span) ) if contains_skip ( & attrs) => {
474
+ Ok ( Some ( SubModKind :: SkippedExternal (
475
+ file_path,
476
+ dir_ownership,
477
+ Module :: new (
478
+ span,
479
+ Some ( Cow :: Owned ( ast:: ModKind :: Unloaded ) ) ,
480
+ Cow :: Owned ( items) ,
481
+ Cow :: Owned ( attrs) ,
482
+ ) ,
483
+ ) ) )
484
+ }
461
485
Ok ( ( attrs, items, span) ) if outside_mods_empty => {
462
486
Ok ( Some ( SubModKind :: External (
463
487
file_path,
0 commit comments