@@ -219,7 +219,7 @@ impl TraitDef {
219219 /// Second return itm is server implementation generics, including where-clauses on Target and Codec.
220220 fn generics (
221221 & self , with_target : bool , with_codec : bool , with_codec_default : bool , with_lifetime : bool ,
222- with_send_sync_static : bool ,
222+ with_send : bool , with_sync : bool , with_static : bool ,
223223 ) -> ( Generics , Generics ) {
224224 let ident = & self . ident ;
225225
@@ -265,10 +265,18 @@ impl TraitDef {
265265 impl_generics. make_where_clause ( ) . predicates . extend ( wc. predicates ) ;
266266 }
267267
268- if with_send_sync_static {
269- let wc: WhereClause =
270- syn:: parse2 ( quote ! { where Target : :: std:: marker:: Send + :: std:: marker:: Sync + ' static } )
271- . unwrap ( ) ;
268+ if with_send {
269+ let wc: WhereClause = syn:: parse2 ( quote ! { where Target : :: std:: marker:: Send } ) . unwrap ( ) ;
270+ impl_generics. make_where_clause ( ) . predicates . extend ( wc. predicates ) ;
271+ }
272+
273+ if with_sync {
274+ let wc: WhereClause = syn:: parse2 ( quote ! { where Target : :: std:: marker:: Sync } ) . unwrap ( ) ;
275+ impl_generics. make_where_clause ( ) . predicates . extend ( wc. predicates ) ;
276+ }
277+
278+ if with_static {
279+ let wc: WhereClause = syn:: parse2 ( quote ! { where Target : ' static } ) . unwrap ( ) ;
272280 impl_generics. make_where_clause ( ) . predicates . extend ( wc. predicates ) ;
273281 }
274282
@@ -289,9 +297,9 @@ impl TraitDef {
289297 pub fn request_enums ( & self ) -> TokenStream {
290298 let Self { vis, ident, .. } = self ;
291299
292- let ( trait_generics, _) = self . generics ( false , false , false , false , false ) ;
293- let ( ty_generics, impl_generics) = self . generics ( false , true , false , false , false ) ;
294- let ( ty_generics_default_codec, _) = self . generics ( false , true , true , false , false ) ;
300+ let ( trait_generics, _) = self . generics ( false , false , false , false , false , false , false ) ;
301+ let ( ty_generics, impl_generics) = self . generics ( false , true , false , false , false , false , false ) ;
302+ let ( ty_generics_default_codec, _) = self . generics ( false , true , true , false , false , false , false ) ;
295303 let ty_generics_where = & ty_generics. where_clause ;
296304 let ( impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics. split_for_impl ( ) ;
297305 let ( req_all, req_value, req_ref, req_ref_mut) = self . request_enum_idents ( ) ;
@@ -342,10 +350,16 @@ impl TraitDef {
342350 }
343351
344352 impl #impl_generics_impl #req_value #impl_generics_ty #impl_generics_where {
345- async fn dispatch<Target >( self , __target: Target , __err_tx: :: remoc:: rtc:: ReplyErrorSender ) where Target : #ident #trait_generics {
353+ fn dispatch<Target >( self , __target: Target , __err_tx: :: remoc:: rtc:: ReplyErrorSender ) ->
354+ :: std:: pin:: Pin <:: std:: boxed:: Box <dyn :: std:: future:: Future <Output = ( ) > + :: std:: marker:: Send >>
355+ where
356+ Target : #ident #trait_generics,
357+ Target : :: std:: marker:: Send + ' static ,
358+ {
359+ use :: remoc:: rtc:: FutureExt ;
346360 match self {
347361 #value_clauses
348- Self :: __Phantom( _) => ( )
362+ Self :: __Phantom( _) => async move { } . boxed ( )
349363 }
350364 }
351365 }
@@ -361,10 +375,16 @@ impl TraitDef {
361375 }
362376
363377 impl #impl_generics_impl #req_ref #impl_generics_ty #impl_generics_where {
364- async fn dispatch<Target >( self , __target: & Target , __err_tx: :: remoc:: rtc:: ReplyErrorSender ) where Target : #ident #trait_generics {
378+ fn dispatch<' target, Target >( self , __target: & ' target Target , __err_tx: :: remoc:: rtc:: ReplyErrorSender ) ->
379+ :: std:: pin:: Pin <:: std:: boxed:: Box <dyn :: std:: future:: Future <Output = ( ) > + :: std:: marker:: Send + ' target>>
380+ where
381+ Target : #ident #trait_generics,
382+ Target : :: std:: marker:: Sync ,
383+ {
384+ use :: remoc:: rtc:: FutureExt ;
365385 match self {
366386 #ref_clauses
367- Self :: __Phantom( _) => ( )
387+ Self :: __Phantom( _) => async move { } . boxed ( )
368388 }
369389 }
370390 }
@@ -380,10 +400,16 @@ impl TraitDef {
380400 }
381401
382402 impl #impl_generics_impl #req_ref_mut #impl_generics_ty #impl_generics_where {
383- async fn dispatch<Target >( self , __target: & mut Target , __err_tx: :: remoc:: rtc:: ReplyErrorSender ) where Target : #ident #trait_generics {
403+ fn dispatch<' target, Target >( self , __target: & ' target mut Target , __err_tx: :: remoc:: rtc:: ReplyErrorSender ) ->
404+ :: std:: pin:: Pin <:: std:: boxed:: Box <dyn :: std:: future:: Future <Output = ( ) > + :: std:: marker:: Send + ' target>>
405+ where
406+ Target : #ident #trait_generics,
407+ Target : :: std:: marker:: Send ,
408+ {
409+ use :: remoc:: rtc:: FutureExt ;
384410 match self {
385411 #ref_mut_clauses
386- Self :: __Phantom( _) => ( )
412+ Self :: __Phantom( _) => async move { } . boxed ( )
387413 }
388414 }
389415 }
@@ -464,8 +490,13 @@ impl TraitDef {
464490 fn server_value ( & self ) -> TokenStream {
465491 let Self { vis, ident, .. } = self ;
466492
467- let ( req_generics, _) = self . generics ( false , true , false , false , false ) ;
468- let ( ty_generics, impl_generics) = self . generics ( true , true , true , false , false ) ;
493+ let need_send = self . is_taking_value ( ) || self . is_taking_ref_mut ( ) ;
494+ let need_sync = self . is_taking_ref ( ) ;
495+ let need_static = self . is_taking_value ( ) ;
496+
497+ let ( req_generics, _) = self . generics ( false , true , false , false , false , false , false ) ;
498+ let ( ty_generics, impl_generics) =
499+ self . generics ( true , true , true , false , need_send, need_sync, need_static) ;
469500 let ty_generics_where = & ty_generics. where_clause ;
470501 let ( impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics. split_for_impl ( ) ;
471502 let ( _req_all, req_value, req_ref, req_ref_mut) = self . request_enum_idents ( ) ;
@@ -575,8 +606,10 @@ impl TraitDef {
575606 fn server_ref ( & self ) -> TokenStream {
576607 let Self { vis, ident, .. } = self ;
577608
578- let ( req_generics, _) = self . generics ( false , true , false , false , false ) ;
579- let ( ty_generics, impl_generics) = self . generics ( true , true , true , true , false ) ;
609+ let need_sync = self . is_taking_ref ( ) ;
610+
611+ let ( req_generics, _) = self . generics ( false , true , false , false , false , false , false ) ;
612+ let ( ty_generics, impl_generics) = self . generics ( true , true , true , true , false , need_sync, false ) ;
580613 let ty_generics_where = & ty_generics. where_clause ;
581614 let ( impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics. split_for_impl ( ) ;
582615 let ( _req_all, req_value, req_ref, req_ref_mut) = self . request_enum_idents ( ) ;
@@ -662,8 +695,11 @@ impl TraitDef {
662695 fn server_ref_mut ( & self ) -> TokenStream {
663696 let Self { vis, ident, .. } = self ;
664697
665- let ( req_generics, _) = self . generics ( false , true , false , false , false ) ;
666- let ( ty_generics, impl_generics) = self . generics ( true , true , true , true , false ) ;
698+ let need_send = self . is_taking_value ( ) || self . is_taking_ref_mut ( ) ;
699+ let need_sync = self . is_taking_ref ( ) ;
700+
701+ let ( req_generics, _) = self . generics ( false , true , false , false , false , false , false ) ;
702+ let ( ty_generics, impl_generics) = self . generics ( true , true , true , true , need_send, need_sync, false ) ;
667703 let ty_generics_where = & ty_generics. where_clause ;
668704 let ( impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics. split_for_impl ( ) ;
669705 let ( _req_all, req_value, req_ref, req_ref_mut) = self . request_enum_idents ( ) ;
@@ -758,8 +794,8 @@ impl TraitDef {
758794 fn server_shared ( & self ) -> TokenStream {
759795 let Self { vis, ident, .. } = self ;
760796
761- let ( req_generics, _) = self . generics ( false , true , false , false , false ) ;
762- let ( ty_generics, impl_generics) = self . generics ( true , true , true , false , true ) ;
797+ let ( req_generics, _) = self . generics ( false , true , false , false , false , false , false ) ;
798+ let ( ty_generics, impl_generics) = self . generics ( true , true , true , false , true , true , true ) ;
763799 let ty_generics_where = & ty_generics. where_clause ;
764800 let ( impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics. split_for_impl ( ) ;
765801 let ( _req_all, req_value, req_ref, req_ref_mut) = self . request_enum_idents ( ) ;
@@ -854,8 +890,8 @@ impl TraitDef {
854890 fn server_shared_mut ( & self ) -> TokenStream {
855891 let Self { vis, ident, .. } = self ;
856892
857- let ( req_generics, _) = self . generics ( false , true , false , false , false ) ;
858- let ( ty_generics, impl_generics) = self . generics ( true , true , true , false , true ) ;
893+ let ( req_generics, _) = self . generics ( false , true , false , false , false , false , false ) ;
894+ let ( ty_generics, impl_generics) = self . generics ( true , true , true , false , true , true , true ) ;
859895 let ty_generics_where = & ty_generics. where_clause ;
860896 let ( impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics. split_for_impl ( ) ;
861897 let ( _req_all, req_value, req_ref, req_ref_mut) = self . request_enum_idents ( ) ;
@@ -961,8 +997,8 @@ impl TraitDef {
961997 fn req_receiver ( & self ) -> TokenStream {
962998 let Self { vis, ident, .. } = self ;
963999
964- let ( req_generics, _) = self . generics ( false , true , false , false , false ) ;
965- let ( ty_generics, impl_generics) = self . generics ( false , true , true , false , false ) ;
1000+ let ( req_generics, _) = self . generics ( false , true , false , false , false , false , false ) ;
1001+ let ( ty_generics, impl_generics) = self . generics ( false , true , true , false , false , false , false ) ;
9661002 let ty_generics_where = & ty_generics. where_clause ;
9671003 let ( impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics. split_for_impl ( ) ;
9681004 let ( req_all, req_value, req_ref, req_ref_mut) = self . request_enum_idents ( ) ;
@@ -1098,12 +1134,12 @@ impl TraitDef {
10981134 let client_ident = self . client_ident ( ) ;
10991135 let client_ident_str = client_ident. to_string ( ) ;
11001136
1101- let ( ty_generics, impl_generics) = self . generics ( false , true , true , false , false ) ;
1137+ let ( ty_generics, impl_generics) = self . generics ( false , true , true , false , false , false , false ) ;
11021138 let ty_generics_where_ty = & ty_generics. where_clause ;
11031139 let ( ty_generics_impl, ty_generics_ty, ty_generics_where) = ty_generics. split_for_impl ( ) ;
11041140 let ( impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics. split_for_impl ( ) ;
11051141
1106- let ( req_generics, _) = self . generics ( false , true , false , false , false ) ;
1142+ let ( req_generics, _) = self . generics ( false , true , false , false , false , false , false ) ;
11071143 let ( _req_all, req_value, req_ref, req_ref_mut) = self . request_enum_idents ( ) ;
11081144
11091145 let impl_generics_where_pred = & impl_generics_where. unwrap ( ) . predicates ;
0 commit comments