@@ -14,7 +14,7 @@ use std::path::{Path, PathBuf};
14
14
15
15
use syntax:: ast;
16
16
use syntax:: codemap:: { self , FileName } ;
17
- use syntax:: parse:: parser;
17
+ use syntax:: parse:: { parser, DirectoryOwnership } ;
18
18
19
19
use utils:: contains_skip;
20
20
@@ -31,7 +31,7 @@ pub fn list_files<'a>(
31
31
FileName :: Real ( ref path) => path. parent ( ) . unwrap ( ) ,
32
32
_ => Path :: new ( "" ) ,
33
33
} ;
34
- list_submodules ( & krate. module , parent, codemap, & mut result) ?;
34
+ list_submodules ( & krate. module , parent, None , codemap, & mut result) ?;
35
35
}
36
36
result. insert ( root_filename, & krate. module ) ;
37
37
Ok ( result)
@@ -41,6 +41,7 @@ pub fn list_files<'a>(
41
41
fn list_submodules < ' a > (
42
42
module : & ' a ast:: Mod ,
43
43
search_dir : & Path ,
44
+ relative : Option < ast:: Ident > ,
44
45
codemap : & codemap:: CodeMap ,
45
46
result : & mut BTreeMap < FileName , & ' a ast:: Mod > ,
46
47
) -> Result < ( ) , io:: Error > {
@@ -50,15 +51,16 @@ fn list_submodules<'a>(
50
51
if !contains_skip ( & item. attrs ) {
51
52
let is_internal =
52
53
codemap. span_to_filename ( item. span ) == codemap. span_to_filename ( sub_mod. inner ) ;
53
- let dir_path = if is_internal {
54
- search_dir. join ( & item. ident . to_string ( ) )
54
+ let ( dir_path, relative ) = if is_internal {
55
+ ( search_dir. join ( & item. ident . to_string ( ) ) , None )
55
56
} else {
56
- let mod_path = module_file ( item. ident , & item. attrs , search_dir, codemap) ?;
57
+ let ( mod_path, relative) =
58
+ module_file ( item. ident , & item. attrs , search_dir, relative, codemap) ?;
57
59
let dir_path = mod_path. parent ( ) . unwrap ( ) . to_owned ( ) ;
58
60
result. insert ( FileName :: Real ( mod_path) , sub_mod) ;
59
- dir_path
61
+ ( dir_path, relative )
60
62
} ;
61
- list_submodules ( sub_mod, & dir_path, codemap, result) ?;
63
+ list_submodules ( sub_mod, & dir_path, relative , codemap, result) ?;
62
64
}
63
65
}
64
66
}
@@ -70,14 +72,26 @@ fn module_file(
70
72
id : ast:: Ident ,
71
73
attrs : & [ ast:: Attribute ] ,
72
74
dir_path : & Path ,
75
+ relative : Option < ast:: Ident > ,
73
76
codemap : & codemap:: CodeMap ,
74
- ) -> Result < PathBuf , io:: Error > {
77
+ ) -> Result < ( PathBuf , Option < ast :: Ident > ) , io:: Error > {
75
78
if let Some ( path) = parser:: Parser :: submod_path_from_attr ( attrs, dir_path) {
76
- return Ok ( path) ;
79
+ return Ok ( ( path, None ) ) ;
77
80
}
78
81
79
- match parser:: Parser :: default_submod_path ( id, None , dir_path, codemap) . result {
80
- Ok ( parser:: ModulePathSuccess { path, .. } ) => Ok ( path) ,
82
+ match parser:: Parser :: default_submod_path ( id, relative, dir_path, codemap) . result {
83
+ Ok ( parser:: ModulePathSuccess {
84
+ path,
85
+ directory_ownership,
86
+ ..
87
+ } ) => {
88
+ let relative = if let DirectoryOwnership :: Owned { relative } = directory_ownership {
89
+ relative
90
+ } else {
91
+ None
92
+ } ;
93
+ Ok ( ( path, relative) )
94
+ }
81
95
Err ( _) => Err ( io:: Error :: new (
82
96
io:: ErrorKind :: Other ,
83
97
format ! ( "Couldn't find module {}" , id) ,
0 commit comments