@@ -540,22 +540,32 @@ pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, t
540
540
let mut first_arg = true ;
541
541
let mut num_unused = 0 ;
542
542
for inp in sig. inputs . iter ( ) {
543
+ let mut handle_self = |is_ref : bool , is_mut : bool | {
544
+ write ! ( w, "{}this_arg: {}{}" , if !is_ref { "mut " } else { "" } ,
545
+ if is_ref {
546
+ match ( self_ptr, is_mut) {
547
+ ( true , true ) => "*mut " ,
548
+ ( true , false ) => "*const " ,
549
+ ( false , true ) => "&mut " ,
550
+ ( false , false ) => "&" ,
551
+ }
552
+ } else { "" } , this_param) . unwrap ( ) ;
553
+ assert ! ( first_arg) ;
554
+ first_arg = false ;
555
+ } ;
543
556
match inp {
544
557
syn:: FnArg :: Receiver ( recv) => {
545
558
if !recv. attrs . is_empty ( ) { unimplemented ! ( ) ; }
546
- write ! ( w, "{}this_arg: {}{}" , if recv. reference. is_none( ) { "mut " } else { "" } ,
547
- if recv. reference. is_some( ) {
548
- match ( self_ptr, recv. mutability. is_some( ) ) {
549
- ( true , true ) => "*mut " ,
550
- ( true , false ) => "*const " ,
551
- ( false , true ) => "&mut " ,
552
- ( false , false ) => "&" ,
553
- }
554
- } else { "" } , this_param) . unwrap ( ) ;
555
- assert ! ( first_arg) ;
556
- first_arg = false ;
559
+ handle_self ( recv. reference . is_some ( ) , recv. mutability . is_some ( ) ) ;
557
560
} ,
558
561
syn:: FnArg :: Typed ( arg) => {
562
+ if let syn:: Pat :: Ident ( id) = & * arg. pat {
563
+ if format ! ( "{}" , id. ident) == "self" {
564
+ handle_self ( id. by_ref . is_some ( ) , id. mutability . is_some ( ) ) ;
565
+ continue ;
566
+ }
567
+ }
568
+
559
569
if types. skip_arg ( & * arg. ty , generics) { continue ; }
560
570
if !arg. attrs . is_empty ( ) { unimplemented ! ( ) ; }
561
571
// First get the c type so that we can check if it ends up being a reference:
@@ -583,14 +593,19 @@ pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, t
583
593
write ! ( w, ")" ) . unwrap ( ) ;
584
594
match & sig. output {
585
595
syn:: ReturnType :: Type ( _, rtype) => {
586
- write ! ( w, " -> " ) . unwrap ( ) ;
587
- if let Some ( mut remaining_path) = first_seg_self ( & * rtype) {
588
- if remaining_path. next ( ) . is_none ( ) {
589
- write ! ( w, "{}" , this_param) . unwrap ( ) ;
590
- return ;
596
+ let mut ret_ty = Vec :: new ( ) ;
597
+ types. write_c_type ( & mut ret_ty, & * rtype, generics, true ) ;
598
+
599
+ if !ret_ty. is_empty ( ) {
600
+ write ! ( w, " -> " ) . unwrap ( ) ;
601
+ if let Some ( mut remaining_path) = first_seg_self ( & * rtype) {
602
+ if remaining_path. next ( ) . is_none ( ) {
603
+ write ! ( w, "{}" , this_param) . unwrap ( ) ;
604
+ return ;
605
+ }
591
606
}
607
+ w. write_all ( & ret_ty) . unwrap ( ) ;
592
608
}
593
- types. write_c_type ( w, & * rtype, generics, true ) ;
594
609
} ,
595
610
_ => { } ,
596
611
}
@@ -606,6 +621,12 @@ pub fn write_method_var_decl_body<W: std::io::Write>(w: &mut W, sig: &syn::Signa
606
621
match inp {
607
622
syn:: FnArg :: Receiver ( _) => { } ,
608
623
syn:: FnArg :: Typed ( arg) => {
624
+ if let syn:: Pat :: Ident ( id) = & * arg. pat {
625
+ if format ! ( "{}" , id. ident) == "self" {
626
+ continue ;
627
+ }
628
+ }
629
+
609
630
if types. skip_arg ( & * arg. ty , generics) { continue ; }
610
631
if !arg. attrs . is_empty ( ) { unimplemented ! ( ) ; }
611
632
macro_rules! write_new_var {
@@ -666,6 +687,17 @@ pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signatu
666
687
}
667
688
} ,
668
689
syn:: FnArg :: Typed ( arg) => {
690
+ if let syn:: Pat :: Ident ( id) = & * arg. pat {
691
+ if format ! ( "{}" , id. ident) == "self" {
692
+ if to_c {
693
+ if id. by_ref . is_none ( ) && !matches ! ( & * arg. ty, syn:: Type :: Reference ( _) ) { unimplemented ! ( ) ; }
694
+ write ! ( w, "self.this_arg" ) . unwrap ( ) ;
695
+ first_arg = false ;
696
+ }
697
+ continue ;
698
+ }
699
+ }
700
+
669
701
if types. skip_arg ( & * arg. ty , generics) {
670
702
if !to_c {
671
703
if !first_arg {
@@ -748,14 +780,18 @@ pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signatu
748
780
/// Prints concrete generic parameters for a struct/trait/function, including the less-than and
749
781
/// greater-than symbols, if any generic parameters are defined.
750
782
pub fn maybe_write_generics < W : std:: io:: Write > ( w : & mut W , generics : & syn:: Generics , generics_impld : & syn:: PathArguments , types : & TypeResolver , concrete_lifetimes : bool ) {
751
- maybe_write_generics_intern ( w, generics, generics_impld, types, concrete_lifetimes, false ) ;
783
+ maybe_write_generics_intern ( w, generics, Some ( generics_impld) , types, concrete_lifetimes, false ) ;
752
784
}
753
785
754
786
pub fn maybe_write_non_lifetime_generics < W : std:: io:: Write > ( w : & mut W , generics : & syn:: Generics , generics_impld : & syn:: PathArguments , types : & TypeResolver ) {
755
- maybe_write_generics_intern ( w, generics, generics_impld, types, false , true ) ;
787
+ maybe_write_generics_intern ( w, generics, Some ( generics_impld) , types, false , true ) ;
756
788
}
757
789
758
- fn maybe_write_generics_intern < W : std:: io:: Write > ( w : & mut W , generics : & syn:: Generics , generics_impld : & syn:: PathArguments , types : & TypeResolver , concrete_lifetimes : bool , dummy_lifetimes : bool ) {
790
+ pub fn maybe_write_type_non_lifetime_generics < W : std:: io:: Write > ( w : & mut W , generics : & syn:: Generics , types : & TypeResolver ) {
791
+ maybe_write_generics_intern ( w, generics, None , types, false , true ) ;
792
+ }
793
+
794
+ fn maybe_write_generics_intern < W : std:: io:: Write > ( w : & mut W , generics : & syn:: Generics , generics_impld : Option < & syn:: PathArguments > , types : & TypeResolver , concrete_lifetimes : bool , dummy_lifetimes : bool ) {
759
795
let mut gen_types = GenericTypes :: new ( None ) ;
760
796
assert ! ( gen_types. learn_generics( generics, types) ) ;
761
797
if generics. params . is_empty ( ) { return ; }
@@ -784,25 +820,28 @@ fn maybe_write_generics_intern<W: std::io::Write>(w: &mut W, generics: &syn::Gen
784
820
for ( idx, generic) in generics. params . iter ( ) . enumerate ( ) {
785
821
match generic {
786
822
syn:: GenericParam :: Type ( type_param) => {
787
- write ! ( w , "{}" , if idx != 0 { ", " } else { "" } ) . unwrap ( ) ;
823
+ let mut out = Vec :: new ( ) ;
788
824
let type_ident = & type_param. ident ;
789
825
if types. understood_c_type ( & syn:: parse_quote!( #type_ident) , Some ( & gen_types) ) {
790
- types. write_c_type_in_generic_param ( w , & syn:: parse_quote!( #type_ident) , Some ( & gen_types) , false ) ;
826
+ types. write_c_type_in_generic_param ( & mut out , & syn:: parse_quote!( #type_ident) , Some ( & gen_types) , false ) ;
791
827
} else {
792
- if let syn:: PathArguments :: AngleBracketed ( args) = generics_impld {
828
+ if let Some ( syn:: PathArguments :: AngleBracketed ( args) ) = generics_impld {
793
829
if let syn:: GenericArgument :: Type ( ty) = & args. args [ idx] {
794
- types. write_c_type_in_generic_param ( w , & ty, Some ( & gen_types) , false ) ;
830
+ types. write_c_type_in_generic_param ( & mut out , & ty, Some ( & gen_types) , false ) ;
795
831
}
796
832
}
797
833
}
834
+ if !out. is_empty ( ) {
835
+ write ! ( w, "{}, " , String :: from_utf8( out) . unwrap( ) ) . unwrap ( ) ;
836
+ }
798
837
} ,
799
838
syn:: GenericParam :: Lifetime ( lt) => {
800
839
if dummy_lifetimes {
801
- write ! ( w, "'_" ) . unwrap ( ) ;
840
+ write ! ( w, "'_, " ) . unwrap ( ) ;
802
841
} else if concrete_lifetimes {
803
- write ! ( w, "'static" ) . unwrap ( ) ;
842
+ write ! ( w, "'static, " ) . unwrap ( ) ;
804
843
} else {
805
- write ! ( w, "{} '{}" , if idx != 0 { ", " } else { "" } , lt. lifetime. ident) . unwrap ( ) ;
844
+ write ! ( w, "'{}, " , lt. lifetime. ident) . unwrap ( ) ;
806
845
}
807
846
} ,
808
847
_ => unimplemented ! ( ) ,
0 commit comments