@@ -27,8 +27,7 @@ fn default_constructor(
27
27
r#"
28
28
{class_name}::{class_name}(QObject* parent)
29
29
: {base_class}(parent)
30
- , m_rustObj({namespace_internals}::createRs())
31
- {initializers}
30
+ , m_rustObj({namespace_internals}::createRs()){initializers}
32
31
{{
33
32
}}
34
33
"# ,
@@ -62,15 +61,15 @@ fn expand_arguments(arguments: &[Type], cxx_mappings: &ParsedCxxMappings) -> Res
62
61
63
62
pub fn generate (
64
63
qobject : & GeneratedCppQObject ,
65
- constructors : & Vec < Constructor > ,
64
+ constructors : & [ Constructor ] ,
66
65
member_initializers : & [ String ] ,
67
66
cxx_mappings : & ParsedCxxMappings ,
68
67
) -> Result < GeneratedCppQObjectBlocks > {
69
68
let initializers = member_initializers
70
69
. iter ( )
71
- . map ( |initializer| format ! ( ", {initializer}" ) )
70
+ . map ( |initializer| format ! ( "\n , {initializer}" ) )
72
71
. collect :: < Vec < _ > > ( )
73
- . join ( "\n " ) ;
72
+ . join ( "" ) ;
74
73
75
74
if constructors. is_empty ( ) {
76
75
return Ok ( default_constructor ( qobject, initializers) ) ;
@@ -90,15 +89,15 @@ pub fn generate(
90
89
source : formatdoc ! {
91
90
r#"
92
91
{class_name}::{class_name}({argument_list})
93
- : {class_name}({namespace_internals}::routeArguments{index}({move_arguments}))
94
- {{ }}
92
+ : {class_name}({namespace_internals}::routeArguments{index}({move_arguments}))
93
+ {{ }}
95
94
"# ,
96
95
move_arguments = constructor_argument_names. iter( ) . map( |arg| format!( "std::move({arg})" ) ) . collect:: <Vec <_>>( ) . join( ", " ) ,
97
96
} ,
98
97
} ) ;
99
98
100
- let base_args = if let Some ( base_args ) = & constructor. base_arguments {
101
- argument_names ( base_args )
99
+ let base_args = if ! constructor. base_arguments . is_empty ( ) {
100
+ argument_names ( & constructor . base_arguments )
102
101
. into_iter ( )
103
102
. map ( |arg| format ! ( "std::move(args.baseArguments.{arg})" ) )
104
103
. collect :: < Vec < _ > > ( )
@@ -120,16 +119,153 @@ pub fn generate(
120
119
source : formatdoc ! {
121
120
r#"
122
121
{class_name}::{class_name}({namespace_internals}::CxxQtConstructorArguments{index}&& args)
123
- : {base_class}({base_args})
124
- , m_rustObj({namespace_internals}::newRs{index}(std::move(args.newArguments)))
125
- {initializers}
126
- {{
127
- {namespace_internals}::initialize{index}(*this, std::move(args.initializeArguments));
128
- }}
122
+ : {base_class}({base_args})
123
+ , m_rustObj({namespace_internals}::newRs{index}(std::move(args.newArguments))){initializers}
124
+ {{
125
+ {namespace_internals}::initialize{index}(*this, std::move(args.initializeArguments));
126
+ }}
129
127
"# ,
130
128
} ,
131
129
} )
132
130
}
133
131
134
132
Ok ( generated)
135
133
}
134
+
135
+ #[ cfg( test) ]
136
+ mod tests {
137
+ use super :: * ;
138
+
139
+ use std:: assert_eq;
140
+ use syn:: parse_quote;
141
+
142
+ fn qobject_for_testing ( ) -> GeneratedCppQObject {
143
+ GeneratedCppQObject {
144
+ ident : "MyObject" . to_string ( ) ,
145
+ rust_ident : "MyObjectQt" . to_string ( ) ,
146
+ namespace_internals : "rust" . to_string ( ) ,
147
+ base_class : "BaseClass" . to_string ( ) ,
148
+ blocks : GeneratedCppQObjectBlocks :: default ( ) ,
149
+ locking : true ,
150
+ }
151
+ }
152
+
153
+ #[ test]
154
+ fn test_default_constructor ( ) {
155
+ let blocks = generate (
156
+ & qobject_for_testing ( ) ,
157
+ & [ ] ,
158
+ & [ "member1(1)" . to_string ( ) , "member2{ 2 }" . to_string ( ) ] ,
159
+ & ParsedCxxMappings :: default ( ) ,
160
+ )
161
+ . unwrap ( ) ;
162
+
163
+ assert ! ( blocks. members. is_empty( ) ) ;
164
+ assert ! ( blocks. private_methods. is_empty( ) ) ;
165
+ assert ! ( blocks. metaobjects. is_empty( ) ) ;
166
+ assert ! ( blocks. forward_declares. is_empty( ) ) ;
167
+ assert ! ( blocks. deconstructors. is_empty( ) ) ;
168
+ assert_eq ! (
169
+ blocks. methods,
170
+ vec![ CppFragment :: Pair {
171
+ header: "explicit MyObject(QObject* parent = nullptr);" . to_string( ) ,
172
+ source: formatdoc!(
173
+ "
174
+ MyObject::MyObject(QObject* parent)
175
+ : BaseClass(parent)
176
+ , m_rustObj(rust::createRs())
177
+ , member1(1)
178
+ , member2{{ 2 }}
179
+ {{
180
+ }}
181
+ "
182
+ ) ,
183
+ } ]
184
+ ) ;
185
+ }
186
+ #[ test]
187
+ fn test_default_constructor_no_initializers ( ) {
188
+ let blocks = generate (
189
+ & qobject_for_testing ( ) ,
190
+ & [ ] ,
191
+ & [ ] ,
192
+ & ParsedCxxMappings :: default ( ) ,
193
+ )
194
+ . unwrap ( ) ;
195
+
196
+ assert ! ( blocks. members. is_empty( ) ) ;
197
+ assert ! ( blocks. private_methods. is_empty( ) ) ;
198
+ assert ! ( blocks. metaobjects. is_empty( ) ) ;
199
+ assert ! ( blocks. forward_declares. is_empty( ) ) ;
200
+ assert ! ( blocks. deconstructors. is_empty( ) ) ;
201
+ assert_eq ! (
202
+ blocks. methods,
203
+ vec![ CppFragment :: Pair {
204
+ header: "explicit MyObject(QObject* parent = nullptr);" . to_string( ) ,
205
+ source: formatdoc!(
206
+ "
207
+ MyObject::MyObject(QObject* parent)
208
+ : BaseClass(parent)
209
+ , m_rustObj(rust::createRs())
210
+ {{
211
+ }}
212
+ "
213
+ ) ,
214
+ } ]
215
+ ) ;
216
+ }
217
+
218
+ #[ test]
219
+ fn test_single_constructor ( ) {
220
+ let blocks = generate (
221
+ & qobject_for_testing ( ) ,
222
+ & [ Constructor {
223
+ arguments : vec ! [ parse_quote! { i32 } , parse_quote! { * mut QObject } ] ,
224
+ new_arguments : vec ! [ ] ,
225
+ base_arguments : vec ! [ ] ,
226
+ initialize_arguments : vec ! [ ] ,
227
+ // dummy
228
+ imp : parse_quote ! {
229
+ impl X { }
230
+ } ,
231
+ } ] ,
232
+ & [ ] ,
233
+ & ParsedCxxMappings :: default ( ) ,
234
+ )
235
+ . unwrap ( ) ;
236
+
237
+ assert ! ( blocks. members. is_empty( ) ) ;
238
+ assert ! ( blocks. forward_declares. is_empty( ) ) ;
239
+ assert ! ( blocks. deconstructors. is_empty( ) ) ;
240
+ assert ! ( blocks. metaobjects. is_empty( ) ) ;
241
+ assert_eq ! (
242
+ blocks. private_methods,
243
+ vec![ CppFragment :: Pair {
244
+ header: "explicit MyObject(rust::CxxQtConstructorArguments0&& args);" . to_string( ) ,
245
+ source: formatdoc!(
246
+ "
247
+ MyObject::MyObject(rust::CxxQtConstructorArguments0&& args)
248
+ : BaseClass()
249
+ , m_rustObj(rust::newRs0(std::move(args.newArguments)))
250
+ {{
251
+ rust::initialize0(*this, std::move(args.initializeArguments));
252
+ }}
253
+ "
254
+ ) ,
255
+ } ]
256
+ ) ;
257
+ assert_eq ! (
258
+ blocks. methods,
259
+ vec![ CppFragment :: Pair {
260
+ header: "explicit MyObject(::std::int32_t arg0, QObject* arg1);" . to_string( ) ,
261
+ source: formatdoc!(
262
+ "
263
+ MyObject::MyObject(::std::int32_t arg0, QObject* arg1)
264
+ : MyObject(rust::routeArguments0(std::move(arg0), std::move(arg1)))
265
+ {{ }}
266
+ "
267
+ ) ,
268
+ } ]
269
+ ) ;
270
+ }
271
+ }
0 commit comments