@@ -267,8 +267,8 @@ macro_rules! walk_supertraits { ($t: expr, $types: expr, ($( $($pat: pat)|* => $
267
267
} } }
268
268
269
269
macro_rules! get_module_type_resolver {
270
- ( $module : expr , $crate_libs : expr, $crate_types: expr) => { {
271
- let module: & str = & $module ;
270
+ ( $type_in_module : expr, $crate_types: expr) => { {
271
+ let module: & str = & $type_in_module ;
272
272
let mut module_iter = module. rsplitn( 2 , "::" ) ;
273
273
module_iter. next( ) . unwrap( ) ;
274
274
let module = module_iter. next( ) . unwrap( ) ;
@@ -304,7 +304,7 @@ fn writeln_trait<'a, 'b, W: std::io::Write>(w: &mut W, t: &'a syn::ItemTrait, ty
304
304
( s, _i, _) => {
305
305
if let Some ( supertrait) = types. crate_types. traits. get( s) {
306
306
supertrait_name = s. to_string( ) ;
307
- supertrait_resolver = get_module_type_resolver!( supertrait_name, types. crate_libs , types . crate_types) ;
307
+ supertrait_resolver = get_module_type_resolver!( supertrait_name, types. crate_types) ;
308
308
gen_types. learn_associated_types( & supertrait, & supertrait_resolver) ;
309
309
break ;
310
310
}
@@ -600,10 +600,10 @@ fn writeln_trait<'a, 'b, W: std::io::Write>(w: &mut W, t: &'a syn::ItemTrait, ty
600
600
} ,
601
601
( s, i, generic_args) => {
602
602
if let Some ( supertrait) = types. crate_types. traits. get( s) {
603
- let resolver = get_module_type_resolver!( s, types. crate_libs , types . crate_types) ;
603
+ let resolver = get_module_type_resolver!( s, types. crate_types) ;
604
604
macro_rules! impl_supertrait {
605
605
( $s: expr, $supertrait: expr, $i: expr, $generic_args: expr) => {
606
- let resolver = get_module_type_resolver!( $s, types. crate_libs , types . crate_types) ;
606
+ let resolver = get_module_type_resolver!( $s, types. crate_types) ;
607
607
608
608
// Blindly assume that the same imports where `supertrait` is defined are also
609
609
// imported here. This will almost certainly break at some point, but it should be
@@ -971,7 +971,7 @@ fn writeln_impl<W: std::io::Write>(w: &mut W, w_uses: &mut HashSet<String, NonRa
971
971
( s, _i, _) => {
972
972
if let Some ( supertrait) = types. crate_types. traits. get( s) {
973
973
supertrait_name = s. to_string( ) ;
974
- supertrait_resolver = get_module_type_resolver!( supertrait_name, types. crate_libs , types . crate_types) ;
974
+ supertrait_resolver = get_module_type_resolver!( supertrait_name, types. crate_types) ;
975
975
gen_types. learn_associated_types( & supertrait, & supertrait_resolver) ;
976
976
break ;
977
977
}
@@ -982,7 +982,7 @@ fn writeln_impl<W: std::io::Write>(w: &mut W, w_uses: &mut HashSet<String, NonRa
982
982
// mappings from a trai defined in a different file, we may mis-resolve or
983
983
// fail to resolve the mapped types. Thus, we have to construct a new
984
984
// resolver for the module that the trait was defined in here first.
985
- let mut trait_resolver = get_module_type_resolver ! ( full_trait_path, types. crate_libs , types . crate_types) ;
985
+ let mut trait_resolver = get_module_type_resolver ! ( full_trait_path, types. crate_types) ;
986
986
gen_types. learn_associated_types ( trait_obj, & trait_resolver) ;
987
987
let mut impl_associated_types = HashMap :: new ( ) ;
988
988
for item in i. items . iter ( ) {
@@ -1115,7 +1115,7 @@ fn writeln_impl<W: std::io::Write>(w: &mut W, w_uses: &mut HashSet<String, NonRa
1115
1115
}
1116
1116
write_impl_fields!( s, supertrait_obj, t, "\t " , types) ;
1117
1117
1118
- let resolver = get_module_type_resolver!( s, types. crate_libs , types . crate_types) ;
1118
+ let resolver = get_module_type_resolver!( s, types. crate_types) ;
1119
1119
walk_supertraits!( supertrait_obj, Some ( & resolver) , (
1120
1120
( s, t, _) => {
1121
1121
if let Some ( supertrait_obj) = types. crate_types. traits. get( s) {
@@ -1254,15 +1254,22 @@ fn writeln_impl<W: std::io::Write>(w: &mut W, w_uses: &mut HashSet<String, NonRa
1254
1254
writeln ! ( w, "extern \" C\" fn {}_{}_cloned(new_obj: &mut crate::{}) {{" , trait_obj. ident, ident, full_trait_path) . unwrap ( ) ;
1255
1255
writeln ! ( w, "\t new_obj.this_arg = {}_clone_void(new_obj.this_arg);" , ident) . unwrap ( ) ;
1256
1256
writeln ! ( w, "\t new_obj.free = Some({}_free_void);" , ident) . unwrap ( ) ;
1257
- walk_supertraits ! ( trait_obj, Some ( & types) , (
1258
- ( s, t, _) => {
1259
- if types. crate_types. traits. get( s) . is_some( ) {
1260
- assert!( !types. is_clonable( s) ) ; // We don't currently support cloning with a clonable supertrait
1261
- writeln!( w, "\t new_obj.{}.this_arg = new_obj.this_arg;" , t) . unwrap( ) ;
1262
- writeln!( w, "\t new_obj.{}.free = None;" , t) . unwrap( ) ;
1257
+
1258
+ fn seek_supertraits < W : std:: io:: Write > ( w : & mut W , pfx : & str , tr : & syn:: ItemTrait , types : & TypeResolver ) {
1259
+ walk_supertraits ! ( tr, Some ( types) , (
1260
+ ( s, t, _) => {
1261
+ if types. crate_types. traits. get( s) . is_some( ) {
1262
+ assert!( !types. is_clonable( s) ) ; // We don't currently support cloning with a clonable supertrait
1263
+ writeln!( w, "\t new_obj.{}{}.this_arg = new_obj.this_arg;" , pfx, t) . unwrap( ) ;
1264
+ writeln!( w, "\t new_obj.{}{}.free = None;" , pfx, t) . unwrap( ) ;
1265
+ let tr = types. crate_types. traits. get( s) . unwrap( ) ;
1266
+ let resolver = get_module_type_resolver!( s, types. crate_types) ;
1267
+ seek_supertraits( w, & format!( "{}." , t) , tr, & resolver) ;
1268
+ }
1263
1269
}
1264
- }
1265
- ) ) ;
1270
+ ) ) ;
1271
+ }
1272
+ seek_supertraits ( w, "" , trait_obj, types) ;
1266
1273
writeln ! ( w, "}}" ) . unwrap ( ) ;
1267
1274
}
1268
1275
write ! ( w, "\n " ) . unwrap ( ) ;
0 commit comments