@@ -826,8 +826,8 @@ impl Config {
826826 self . write_includes (
827827 modules. keys ( ) . collect ( ) ,
828828 & mut file,
829- 0 ,
830829 if target_is_env { None } else { Some ( & target) } ,
830+ & file_names,
831831 ) ?;
832832 file. flush ( ) ?;
833833 }
@@ -955,67 +955,58 @@ impl Config {
955955 self . compile_fds ( file_descriptor_set)
956956 }
957957
958- fn write_includes (
958+ pub ( crate ) fn write_includes (
959959 & self ,
960- mut entries : Vec < & Module > ,
961- outfile : & mut fs:: File ,
962- depth : usize ,
960+ mut modules : Vec < & Module > ,
961+ outfile : & mut impl Write ,
963962 basepath : Option < & PathBuf > ,
964- ) -> Result < usize > {
965- let mut written = 0 ;
966- entries. sort ( ) ;
967-
968- while !entries. is_empty ( ) {
969- let modident = entries[ 0 ] . part ( depth) ;
970- let matching: Vec < & Module > = entries
971- . iter ( )
972- . filter ( |& v| v. part ( depth) == modident)
973- . copied ( )
974- . collect ( ) ;
975- {
976- // Will NLL sort this mess out?
977- let _temp = entries
978- . drain ( ..)
979- . filter ( |& v| v. part ( depth) != modident)
980- . collect ( ) ;
981- entries = _temp;
963+ file_names : & HashMap < Module , String > ,
964+ ) -> Result < ( ) > {
965+ modules. sort ( ) ;
966+
967+ let mut stack = Vec :: new ( ) ;
968+
969+ for module in modules {
970+ while !module. starts_with ( & stack) {
971+ stack. pop ( ) ;
972+ self . write_line ( outfile, stack. len ( ) , "}" ) ?;
982973 }
983- self . write_line ( outfile, depth, & format ! ( "pub mod {} {{" , modident) ) ?;
984- let subwritten = self . write_includes (
985- matching
986- . iter ( )
987- . filter ( |v| v. len ( ) > depth + 1 )
988- . copied ( )
989- . collect ( ) ,
990- outfile,
991- depth + 1 ,
992- basepath,
993- ) ?;
994- written += subwritten;
995- if subwritten != matching. len ( ) {
996- let modname = matching[ 0 ] . to_partial_file_name ( ..=depth) ;
997- if basepath. is_some ( ) {
998- self . write_line (
999- outfile,
1000- depth + 1 ,
1001- & format ! ( "include!(\" {}.rs\" );" , modname) ,
1002- ) ?;
1003- } else {
1004- self . write_line (
1005- outfile,
1006- depth + 1 ,
1007- & format ! ( "include!(concat!(env!(\" OUT_DIR\" ), \" /{}.rs\" ));" , modname) ,
1008- ) ?;
1009- }
1010- written += 1 ;
974+ while stack. len ( ) < module. len ( ) {
975+ self . write_line (
976+ outfile,
977+ stack. len ( ) ,
978+ & format ! ( "pub mod {} {{" , module. part( stack. len( ) ) ) ,
979+ ) ?;
980+ stack. push ( module. part ( stack. len ( ) ) . to_owned ( ) ) ;
1011981 }
1012982
983+ let file_name = file_names
984+ . get ( module)
985+ . expect ( "every module should have a filename" ) ;
986+
987+ if basepath. is_some ( ) {
988+ self . write_line (
989+ outfile,
990+ stack. len ( ) ,
991+ & format ! ( "include!(\" {}\" );" , file_name) ,
992+ ) ?;
993+ } else {
994+ self . write_line (
995+ outfile,
996+ stack. len ( ) ,
997+ & format ! ( "include!(concat!(env!(\" OUT_DIR\" ), \" /{}\" ));" , file_name) ,
998+ ) ?;
999+ }
1000+ }
1001+
1002+ for depth in ( 0 ..stack. len ( ) ) . rev ( ) {
10131003 self . write_line ( outfile, depth, "}" ) ?;
10141004 }
1015- Ok ( written)
1005+
1006+ Ok ( ( ) )
10161007 }
10171008
1018- fn write_line ( & self , outfile : & mut fs :: File , depth : usize , line : & str ) -> Result < ( ) > {
1009+ fn write_line ( & self , outfile : & mut impl Write , depth : usize , line : & str ) -> Result < ( ) > {
10191010 outfile. write_all ( format ! ( "{}{}\n " , ( " " ) . to_owned( ) . repeat( depth) , line) . as_bytes ( ) )
10201011 }
10211012
0 commit comments