@@ -38,10 +38,12 @@ pub fn make_virtual_callback(
38
38
class_name : & Ident ,
39
39
signature_info : & SignatureInfo ,
40
40
before_kind : BeforeKind ,
41
+ interface_trait : Option < & venial:: TypeExpr > ,
41
42
) -> TokenStream {
42
43
let method_name = & signature_info. method_name ;
43
44
44
- let wrapped_method = make_forwarding_closure ( class_name, signature_info, before_kind) ;
45
+ let wrapped_method =
46
+ make_forwarding_closure ( class_name, signature_info, before_kind, interface_trait) ;
45
47
let sig_tuple = signature_info. tuple_type ( ) ;
46
48
47
49
let call_ctx = make_call_context (
@@ -75,6 +77,7 @@ pub fn make_virtual_callback(
75
77
pub fn make_method_registration (
76
78
class_name : & Ident ,
77
79
func_definition : FuncDefinition ,
80
+ interface_trait : Option < & venial:: TypeExpr > ,
78
81
) -> ParseResult < TokenStream > {
79
82
let signature_info = & func_definition. signature_info ;
80
83
let sig_tuple = signature_info. tuple_type ( ) ;
@@ -85,8 +88,12 @@ pub fn make_method_registration(
85
88
Err ( msg) => return bail_fn ( msg, & signature_info. method_name ) ,
86
89
} ;
87
90
88
- let forwarding_closure =
89
- make_forwarding_closure ( class_name, signature_info, BeforeKind :: Without ) ;
91
+ let forwarding_closure = make_forwarding_closure (
92
+ class_name,
93
+ signature_info,
94
+ BeforeKind :: Without ,
95
+ interface_trait,
96
+ ) ;
90
97
91
98
// String literals
92
99
let method_name = & signature_info. method_name ;
@@ -209,6 +216,7 @@ fn make_forwarding_closure(
209
216
class_name : & Ident ,
210
217
signature_info : & SignatureInfo ,
211
218
before_kind : BeforeKind ,
219
+ interface_trait : Option < & venial:: TypeExpr > ,
212
220
) -> TokenStream {
213
221
let method_name = & signature_info. method_name ;
214
222
let params = & signature_info. param_idents ;
@@ -238,7 +246,16 @@ fn make_forwarding_closure(
238
246
let method_call = if matches ! ( before_kind, BeforeKind :: OnlyBefore ) {
239
247
TokenStream :: new ( )
240
248
} else {
241
- quote ! { instance. #method_name( #( #params) , * ) }
249
+ match interface_trait {
250
+ Some ( interface_trait) => {
251
+ let instance_ref = match signature_info. receiver_type {
252
+ ReceiverType :: Mut => quote ! { & mut instance } ,
253
+ _ => quote ! { & instance } ,
254
+ } ;
255
+ quote ! { <#class_name as #interface_trait>:: #method_name( #instance_ref, #( #params) , * ) }
256
+ }
257
+ None => quote ! { instance. #method_name( #( #params) , * ) } ,
258
+ }
242
259
} ;
243
260
244
261
quote ! {
0 commit comments