@@ -12,34 +12,29 @@ use crate::{
12
12
} ;
13
13
use proc_macro2:: TokenStream ;
14
14
use quote:: quote;
15
- use syn:: { Ident , Result , ReturnType } ;
15
+ use syn:: Result ;
16
16
17
17
pub fn generate_rust_invokables (
18
18
invokables : & Vec < ParsedQInvokable > ,
19
19
qobject_idents : & QObjectName ,
20
20
) -> Result < GeneratedRustQObjectBlocks > {
21
21
let mut generated = GeneratedRustQObjectBlocks :: default ( ) ;
22
22
let cpp_class_name_rust = & qobject_idents. cpp_class . rust ;
23
- let rust_struct_name_rust = & qobject_idents. rust_struct . rust ;
24
23
25
24
for invokable in invokables {
26
25
let idents = QInvokableName :: from ( invokable) ;
27
26
let wrapper_ident_cpp = idents. wrapper . cpp . to_string ( ) ;
28
- let wrapper_ident_rust = & idents. wrapper . rust ;
29
27
let invokable_ident_rust = & idents. name . rust ;
30
28
29
+ // TODO: once we aren't using qobject::T in the extern "RustQt"
30
+ // we can just pass through the original ExternFn block and add the attribute?
31
31
let cpp_struct = if invokable. mutable {
32
- quote ! { Pin <& mut #cpp_class_name_rust> }
32
+ quote ! { Pin <& mut #cpp_class_name_rust> }
33
33
} else {
34
34
quote ! { & #cpp_class_name_rust }
35
35
} ;
36
- let rust_struct = if invokable. mutable {
37
- quote ! { & mut #rust_struct_name_rust }
38
- } else {
39
- quote ! { & #rust_struct_name_rust }
40
- } ;
41
36
let parameter_signatures = if invokable. parameters . is_empty ( ) {
42
- quote ! { self : #rust_struct , cpp : # cpp_struct }
37
+ quote ! { self : #cpp_struct }
43
38
} else {
44
39
let parameters = invokable
45
40
. parameters
@@ -50,46 +45,29 @@ pub fn generate_rust_invokables(
50
45
quote ! { #ident: #ty }
51
46
} )
52
47
. collect :: < Vec < TokenStream > > ( ) ;
53
- quote ! { self : #rust_struct , cpp : # cpp_struct, #( #parameters) , * }
48
+ quote ! { self : #cpp_struct, #( #parameters) , * }
54
49
} ;
55
50
let return_type = & invokable. method . sig . output ;
56
- let has_return = if matches ! ( invokable. method. sig. output, ReturnType :: Default ) {
57
- quote ! { }
58
- } else {
59
- quote ! { return }
60
- } ;
61
51
62
52
let mut unsafe_block = None ;
63
53
let mut unsafe_call = Some ( quote ! { unsafe } ) ;
64
54
if invokable. safe {
65
55
std:: mem:: swap ( & mut unsafe_call, & mut unsafe_block) ;
66
56
}
67
57
68
- let parameter_names = invokable
69
- . parameters
70
- . iter ( )
71
- . map ( |parameter| parameter. ident . clone ( ) )
72
- . collect :: < Vec < Ident > > ( ) ;
73
-
74
58
let fragment = RustFragmentPair {
75
59
cxx_bridge : vec ! [ quote! {
76
- // TODO: is an unsafe block valid?
60
+ // Note: extern "Rust" block does not need to be unsafe
77
61
extern "Rust" {
62
+ // Note that we are exposing a Rust method on the C++ type to C++
63
+ //
64
+ // CXX ends up generating the source, then we generate the matching header.
65
+ #[ doc( hidden) ]
78
66
#[ cxx_name = #wrapper_ident_cpp]
79
- #unsafe_call fn #wrapper_ident_rust ( #parameter_signatures) #return_type;
67
+ #unsafe_call fn #invokable_ident_rust ( #parameter_signatures) #return_type;
80
68
}
81
69
} ] ,
82
- implementation : vec ! [
83
- // TODO: not all methods have a wrapper
84
- quote! {
85
- impl #rust_struct_name_rust {
86
- #[ doc( hidden) ]
87
- pub #unsafe_call fn #wrapper_ident_rust( #parameter_signatures) #return_type {
88
- #has_return cpp. #invokable_ident_rust( #( #parameter_names) , * ) ;
89
- }
90
- }
91
- } ,
92
- ] ,
70
+ implementation : vec ! [ ] ,
93
71
} ;
94
72
95
73
generated
@@ -164,26 +142,16 @@ mod tests {
164
142
let generated = generate_rust_invokables ( & invokables, & qobject_idents) . unwrap ( ) ;
165
143
166
144
assert_eq ! ( generated. cxx_mod_contents. len( ) , 4 ) ;
167
- assert_eq ! ( generated. cxx_qt_mod_contents. len( ) , 4 ) ;
145
+ assert_eq ! ( generated. cxx_qt_mod_contents. len( ) , 0 ) ;
168
146
169
147
// void_invokable
170
148
assert_tokens_eq (
171
149
& generated. cxx_mod_contents [ 0 ] ,
172
150
quote ! {
173
151
extern "Rust" {
174
- #[ cxx_name = "voidInvokableWrapper" ]
175
- fn void_invokable_wrapper( self : & MyObjectRust , cpp: & MyObject ) ;
176
- }
177
- } ,
178
- ) ;
179
- assert_tokens_eq (
180
- & generated. cxx_qt_mod_contents [ 0 ] ,
181
- quote ! {
182
- impl MyObjectRust {
183
152
#[ doc( hidden) ]
184
- pub fn void_invokable_wrapper( self : & MyObjectRust , cpp: & MyObject ) {
185
- cpp. void_invokable( ) ;
186
- }
153
+ #[ cxx_name = "voidInvokableWrapper" ]
154
+ fn void_invokable( self : & MyObject ) ;
187
155
}
188
156
} ,
189
157
) ;
@@ -193,19 +161,9 @@ mod tests {
193
161
& generated. cxx_mod_contents [ 1 ] ,
194
162
quote ! {
195
163
extern "Rust" {
196
- #[ cxx_name = "trivialInvokableWrapper" ]
197
- fn trivial_invokable_wrapper( self : & MyObjectRust , cpp: & MyObject , param: i32 ) -> i32 ;
198
- }
199
- } ,
200
- ) ;
201
- assert_tokens_eq (
202
- & generated. cxx_qt_mod_contents [ 1 ] ,
203
- quote ! {
204
- impl MyObjectRust {
205
164
#[ doc( hidden) ]
206
- pub fn trivial_invokable_wrapper( self : & MyObjectRust , cpp: & MyObject , param: i32 ) -> i32 {
207
- return cpp. trivial_invokable( param) ;
208
- }
165
+ #[ cxx_name = "trivialInvokableWrapper" ]
166
+ fn trivial_invokable( self : & MyObject , param: i32 ) -> i32 ;
209
167
}
210
168
} ,
211
169
) ;
@@ -215,19 +173,9 @@ mod tests {
215
173
& generated. cxx_mod_contents [ 2 ] ,
216
174
quote ! {
217
175
extern "Rust" {
218
- #[ cxx_name = "opaqueInvokableWrapper" ]
219
- fn opaque_invokable_wrapper( self : & mut MyObjectRust , cpp: Pin <& mut MyObject >, param: & QColor ) -> UniquePtr <QColor >;
220
- }
221
- } ,
222
- ) ;
223
- assert_tokens_eq (
224
- & generated. cxx_qt_mod_contents [ 2 ] ,
225
- quote ! {
226
- impl MyObjectRust {
227
176
#[ doc( hidden) ]
228
- pub fn opaque_invokable_wrapper( self : & mut MyObjectRust , cpp: Pin <& mut MyObject >, param: & QColor ) -> UniquePtr <QColor > {
229
- return cpp. opaque_invokable( param) ;
230
- }
177
+ #[ cxx_name = "opaqueInvokableWrapper" ]
178
+ fn opaque_invokable( self : Pin <& mut MyObject >, param: & QColor ) -> UniquePtr <QColor >;
231
179
}
232
180
} ,
233
181
) ;
@@ -237,19 +185,9 @@ mod tests {
237
185
& generated. cxx_mod_contents [ 3 ] ,
238
186
quote ! {
239
187
extern "Rust" {
240
- #[ cxx_name = "unsafeInvokableWrapper" ]
241
- unsafe fn unsafe_invokable_wrapper( self : & MyObjectRust , cpp: & MyObject , param: * mut T ) -> * mut T ;
242
- }
243
- } ,
244
- ) ;
245
- assert_tokens_eq (
246
- & generated. cxx_qt_mod_contents [ 3 ] ,
247
- quote ! {
248
- impl MyObjectRust {
249
188
#[ doc( hidden) ]
250
- pub unsafe fn unsafe_invokable_wrapper( self : & MyObjectRust , cpp: & MyObject , param: * mut T ) -> * mut T {
251
- return cpp. unsafe_invokable( param) ;
252
- }
189
+ #[ cxx_name = "unsafeInvokableWrapper" ]
190
+ unsafe fn unsafe_invokable( self : & MyObject , param: * mut T ) -> * mut T ;
253
191
}
254
192
} ,
255
193
) ;
0 commit comments