@@ -102,6 +102,7 @@ impl<'a, 'b> Builder<'a, 'b> {
102
102
instructions : & [ InstructionData ] ,
103
103
explicit_arg_names : & Option < Vec < String > > ,
104
104
asyncness : bool ,
105
+ variadic : bool ,
105
106
) -> Result < JsFunction , Error > {
106
107
if self
107
108
. cx
@@ -193,7 +194,17 @@ impl<'a, 'b> Builder<'a, 'b> {
193
194
194
195
let mut code = String :: new ( ) ;
195
196
code. push_str ( "(" ) ;
196
- code. push_str ( & function_args. join ( ", " ) ) ;
197
+ if variadic {
198
+ if let Some ( ( last, non_variadic_args) ) = function_args. split_last ( ) {
199
+ code. push_str ( & non_variadic_args. join ( ", " ) ) ;
200
+ if non_variadic_args. len ( ) > 0 {
201
+ code. push_str ( ", " ) ;
202
+ }
203
+ code. push_str ( ( String :: from ( "..." ) + last) . as_str ( ) )
204
+ }
205
+ } else {
206
+ code. push_str ( & function_args. join ( ", " ) ) ;
207
+ }
197
208
code. push_str ( ") {\n " ) ;
198
209
199
210
let mut call = js. prelude ;
@@ -227,8 +238,9 @@ impl<'a, 'b> Builder<'a, 'b> {
227
238
& adapter. inner_results ,
228
239
& mut might_be_optional_field,
229
240
asyncness,
241
+ variadic,
230
242
) ;
231
- let js_doc = self . js_doc_comments ( & function_args, & arg_tys, & ts_ret_ty) ;
243
+ let js_doc = self . js_doc_comments ( & function_args, & arg_tys, & ts_ret_ty, variadic ) ;
232
244
233
245
Ok ( JsFunction {
234
246
code,
@@ -254,6 +266,7 @@ impl<'a, 'b> Builder<'a, 'b> {
254
266
result_tys : & [ AdapterType ] ,
255
267
might_be_optional_field : & mut bool ,
256
268
asyncness : bool ,
269
+ variadic : bool ,
257
270
) -> ( String , Vec < String > , Option < String > ) {
258
271
// Build up the typescript signature as well
259
272
let mut omittable = true ;
@@ -284,7 +297,19 @@ impl<'a, 'b> Builder<'a, 'b> {
284
297
}
285
298
ts_args. reverse ( ) ;
286
299
ts_arg_tys. reverse ( ) ;
287
- let mut ts = format ! ( "({})" , ts_args. join( ", " ) ) ;
300
+ let mut ts = String :: from ( "(" ) ;
301
+ if variadic {
302
+ if let Some ( ( last, non_variadic_args) ) = ts_args. split_last ( ) {
303
+ ts. push_str ( & non_variadic_args. join ( ", " ) ) ;
304
+ if non_variadic_args. len ( ) > 0 {
305
+ ts. push_str ( ", " ) ;
306
+ }
307
+ ts. push_str ( ( String :: from ( "..." ) + last) . as_str ( ) )
308
+ }
309
+ } else {
310
+ ts. push_str ( & format ! ( "{}" , ts_args. join( ", " ) ) ) ;
311
+ } ;
312
+ ts. push_str ( ")" ) ;
288
313
289
314
// If this function is an optional field's setter, it should have only
290
315
// one arg, and omittable should be `true`.
@@ -318,15 +343,27 @@ impl<'a, 'b> Builder<'a, 'b> {
318
343
arg_names : & [ String ] ,
319
344
arg_tys : & [ & AdapterType ] ,
320
345
ts_ret : & Option < String > ,
346
+ variadic : bool ,
321
347
) -> String {
322
348
let mut ret = String :: new ( ) ;
323
- for ( name, ty) in arg_names. iter ( ) . zip ( arg_tys) {
349
+ let ( variadic_arg, fn_arg_names) = match arg_names. split_last ( ) {
350
+ Some ( ( last, args) ) if variadic => ( Some ( last) , args) ,
351
+ _ => ( None , arg_names) ,
352
+ } ;
353
+ for ( name, ty) in fn_arg_names. iter ( ) . zip ( arg_tys) {
324
354
ret. push_str ( "@param {" ) ;
325
355
adapter2ts ( ty, & mut ret) ;
326
356
ret. push_str ( "} " ) ;
327
357
ret. push_str ( name) ;
328
358
ret. push_str ( "\n " ) ;
329
359
}
360
+ if let ( Some ( name) , Some ( ty) ) = ( variadic_arg, arg_tys. last ( ) ) {
361
+ ret. push_str ( "@param {..." ) ;
362
+ adapter2ts ( ty, & mut ret) ;
363
+ ret. push_str ( "} " ) ;
364
+ ret. push_str ( name) ;
365
+ ret. push_str ( "\n " ) ;
366
+ }
330
367
if let Some ( ts) = ts_ret {
331
368
if ts != "void" {
332
369
ret. push_str ( & format ! ( "@returns {{{}}}" , ts) ) ;
0 commit comments