@@ -1734,14 +1734,14 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
1734
1734
self . write_c_mangled_container_path_intern( w, Self :: path_to_generic_args( path) , generics,
1735
1735
& format!( "{}" , single_ident_generic_path_to_ident( path) . unwrap( ) ) , is_ref, false , false , false ) ;
1736
1736
} else {
1737
- self . write_template_generics( w, & mut [ $item] . iter( ) . map( |t| * t) , is_ref, true ) ;
1737
+ self . write_template_generics( w, & mut [ $item] . iter( ) . map( |t| * t) , generics , is_ref, true ) ;
1738
1738
}
1739
1739
} else if let syn:: Type :: Tuple ( syn:: TypeTuple { elems, .. } ) = $item {
1740
1740
self . write_c_mangled_container_path_intern( w, elems. iter( ) . collect( ) , generics,
1741
1741
& format!( "{}Tuple" , elems. len( ) ) , is_ref, false , false , false ) ;
1742
1742
} else { unimplemented!( ) ; }
1743
1743
write!( w, ") -> {} =\n \t {}::CResultTempl::<" , mangled_container, Self :: container_templ_path( ) ) . unwrap( ) ;
1744
- self . write_template_generics( w, & mut args. iter( ) . map( |t| * t) , is_ref, true ) ;
1744
+ self . write_template_generics( w, & mut args. iter( ) . map( |t| * t) , generics , is_ref, true ) ;
1745
1745
writeln!( w, ">::{};\n " , $call) . unwrap( ) ;
1746
1746
} }
1747
1747
}
@@ -1770,7 +1770,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
1770
1770
}
1771
1771
}
1772
1772
1773
- fn write_template_generics < ' b , W : std:: io:: Write > ( & self , w : & mut W , args : & mut dyn Iterator < Item =& ' b syn:: Type > , is_ref : bool , in_crate : bool ) {
1773
+ fn write_template_generics < ' b , W : std:: io:: Write > ( & self , w : & mut W , args : & mut dyn Iterator < Item =& ' b syn:: Type > , generics : Option < & GenericTypes > , is_ref : bool , in_crate : bool ) {
1774
1774
for ( idx, t) in args. enumerate ( ) {
1775
1775
if idx != 0 {
1776
1776
write ! ( w, ", " ) . unwrap ( ) ;
@@ -1780,11 +1780,11 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
1780
1780
write ! ( w, "u8" ) . unwrap ( ) ;
1781
1781
} else {
1782
1782
write ! ( w, "{}::C{}TupleTempl<" , Self :: container_templ_path( ) , tup. elems. len( ) ) . unwrap ( ) ;
1783
- self . write_template_generics ( w, & mut tup. elems . iter ( ) , is_ref, in_crate) ;
1783
+ self . write_template_generics ( w, & mut tup. elems . iter ( ) , generics , is_ref, in_crate) ;
1784
1784
write ! ( w, ">" ) . unwrap ( ) ;
1785
1785
}
1786
1786
} else if let syn:: Type :: Path ( p_arg) = t {
1787
- let resolved_generic = self . resolve_path ( & p_arg. path , None ) ;
1787
+ let resolved_generic = self . resolve_path ( & p_arg. path , generics ) ;
1788
1788
if self . is_primitive ( & resolved_generic) {
1789
1789
write ! ( w, "{}" , resolved_generic) . unwrap ( ) ;
1790
1790
} else if let Some ( c_type) = self . c_type_from_path ( & resolved_generic, is_ref, false ) {
@@ -1794,19 +1794,19 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
1794
1794
if let syn:: PathArguments :: AngleBracketed ( args) = & p_arg. path . segments . iter ( ) . next ( ) . unwrap ( ) . arguments {
1795
1795
self . write_template_generics ( w, & mut args. args . iter ( ) . map ( |gen|
1796
1796
if let syn:: GenericArgument :: Type ( t) = gen { t } else { unimplemented ! ( ) } ) ,
1797
- is_ref, in_crate) ;
1797
+ generics , is_ref, in_crate) ;
1798
1798
} else { unimplemented ! ( ) ; }
1799
1799
write ! ( w, ">" ) . unwrap ( ) ;
1800
1800
} else if resolved_generic == "Option" {
1801
1801
if let syn:: PathArguments :: AngleBracketed ( args) = & p_arg. path . segments . iter ( ) . next ( ) . unwrap ( ) . arguments {
1802
1802
self . write_template_generics ( w, & mut args. args . iter ( ) . map ( |gen|
1803
1803
if let syn:: GenericArgument :: Type ( t) = gen { t } else { unimplemented ! ( ) } ) ,
1804
- is_ref, in_crate) ;
1804
+ generics , is_ref, in_crate) ;
1805
1805
} else { unimplemented ! ( ) ; }
1806
1806
} else if in_crate {
1807
1807
write ! ( w, "{}" , c_type) . unwrap ( ) ;
1808
1808
} else {
1809
- self . write_rust_type ( w, None , & t) ;
1809
+ self . write_rust_type ( w, generics , & t) ;
1810
1810
}
1811
1811
} else {
1812
1812
// If we just write out resolved_generic, it may mostly work, however for
@@ -1826,7 +1826,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
1826
1826
}
1827
1827
} else if let syn:: Type :: Reference ( r_arg) = t {
1828
1828
if let syn:: Type :: Path ( p_arg) = & * r_arg. elem {
1829
- let resolved = self . resolve_path ( & p_arg. path , None ) ;
1829
+ let resolved = self . resolve_path ( & p_arg. path , generics ) ;
1830
1830
if self . crate_types . opaques . get ( & resolved) . is_some ( ) {
1831
1831
write ! ( w, "crate::{}" , resolved) . unwrap ( ) ;
1832
1832
} else {
@@ -1836,7 +1836,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
1836
1836
} else { unimplemented ! ( ) ; }
1837
1837
} else if let syn:: Type :: Array ( a_arg) = t {
1838
1838
if let syn:: Type :: Path ( p_arg) = & * a_arg. elem {
1839
- let resolved = self . resolve_path ( & p_arg. path , None ) ;
1839
+ let resolved = self . resolve_path ( & p_arg. path , generics ) ;
1840
1840
assert ! ( self . is_primitive( & resolved) ) ;
1841
1841
if let syn:: Expr :: Lit ( syn:: ExprLit { lit : syn:: Lit :: Int ( len) , .. } ) = & a_arg. len {
1842
1842
write ! ( w, "{}" ,
@@ -1853,12 +1853,12 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
1853
1853
1854
1854
write ! ( & mut created_container, "#[no_mangle]\n pub type {} = " , mangled_container) . unwrap ( ) ;
1855
1855
write ! ( & mut created_container, "{}::C{}Templ<" , Self :: container_templ_path( ) , container_type) . unwrap ( ) ;
1856
- self . write_template_generics ( & mut created_container, & mut args. iter ( ) . map ( |t| * t) , is_ref, true ) ;
1856
+ self . write_template_generics ( & mut created_container, & mut args. iter ( ) . map ( |t| * t) , generics , is_ref, true ) ;
1857
1857
writeln ! ( & mut created_container, ">;" ) . unwrap ( ) ;
1858
1858
1859
1859
write ! ( & mut created_container, "#[no_mangle]\n pub static {}_free: extern \" C\" fn({}) = " , mangled_container, mangled_container) . unwrap ( ) ;
1860
1860
write ! ( & mut created_container, "{}::C{}Templ_free::<" , Self :: container_templ_path( ) , container_type) . unwrap ( ) ;
1861
- self . write_template_generics ( & mut created_container, & mut args. iter ( ) . map ( |t| * t) , is_ref, true ) ;
1861
+ self . write_template_generics ( & mut created_container, & mut args. iter ( ) . map ( |t| * t) , generics , is_ref, true ) ;
1862
1862
writeln ! ( & mut created_container, ">;" ) . unwrap ( ) ;
1863
1863
1864
1864
self . write_template_constructor ( & mut created_container, container_type, & mangled_container, & args, generics, is_ref) ;
0 commit comments