Skip to content

Commit 9135044

Browse files
Merge pull request #281 from ole/embedded-function-call-overloads
Support JS function calls with up to 7 arguments in Embedded Swift
2 parents 9447d52 + dccced1 commit 9135044

File tree

3 files changed

+315
-14
lines changed

3 files changed

+315
-14
lines changed

Diff for: Sources/JavaScriptKit/FundamentalObjects/JSFunction.swift

+169-9
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,14 @@ public class JSFunction: JSObject {
164164
}
165165

166166
#if hasFeature(Embedded)
167-
// NOTE: once embedded supports variadic generics, we can remove these overloads
167+
// Overloads of `callAsFunction(ConvertibleToJSValue...) -> JSValue`
168+
// for 0 through 7 arguments for Embedded Swift.
169+
//
170+
// These are required because the `ConvertibleToJSValue...` version is not
171+
// available in Embedded Swift due to lack of support for existentials.
172+
//
173+
// Once Embedded Swift supports parameter packs/variadic generics, we can
174+
// replace all variants with a single method each that takes a generic pack.
168175
public extension JSFunction {
169176

170177
@discardableResult
@@ -178,15 +185,74 @@ public extension JSFunction {
178185
}
179186

180187
@discardableResult
181-
func callAsFunction(this: JSObject, _ arg0: some ConvertibleToJSValue, _ arg1: some ConvertibleToJSValue) -> JSValue {
188+
func callAsFunction(
189+
this: JSObject,
190+
_ arg0: some ConvertibleToJSValue,
191+
_ arg1: some ConvertibleToJSValue
192+
) -> JSValue {
182193
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue], this: this).jsValue
183194
}
184195

185196
@discardableResult
186-
func callAsFunction(this: JSObject, _ arg0: some ConvertibleToJSValue, _ arg1: some ConvertibleToJSValue, _ arg2: some ConvertibleToJSValue) -> JSValue {
197+
func callAsFunction(
198+
this: JSObject,
199+
_ arg0: some ConvertibleToJSValue,
200+
_ arg1: some ConvertibleToJSValue,
201+
_ arg2: some ConvertibleToJSValue
202+
) -> JSValue {
187203
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue], this: this).jsValue
188204
}
189205

206+
@discardableResult
207+
func callAsFunction(
208+
this: JSObject,
209+
_ arg0: some ConvertibleToJSValue,
210+
_ arg1: some ConvertibleToJSValue,
211+
_ arg2: some ConvertibleToJSValue,
212+
_ arg3: some ConvertibleToJSValue
213+
) -> JSValue {
214+
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue], this: this).jsValue
215+
}
216+
217+
@discardableResult
218+
func callAsFunction(
219+
this: JSObject,
220+
_ arg0: some ConvertibleToJSValue,
221+
_ arg1: some ConvertibleToJSValue,
222+
_ arg2: some ConvertibleToJSValue,
223+
_ arg3: some ConvertibleToJSValue,
224+
_ arg4: some ConvertibleToJSValue
225+
) -> JSValue {
226+
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue, arg4.jsValue], this: this).jsValue
227+
}
228+
229+
@discardableResult
230+
func callAsFunction(
231+
this: JSObject,
232+
_ arg0: some ConvertibleToJSValue,
233+
_ arg1: some ConvertibleToJSValue,
234+
_ arg2: some ConvertibleToJSValue,
235+
_ arg3: some ConvertibleToJSValue,
236+
_ arg4: some ConvertibleToJSValue,
237+
_ arg5: some ConvertibleToJSValue
238+
) -> JSValue {
239+
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue, arg4.jsValue, arg5.jsValue], this: this).jsValue
240+
}
241+
242+
@discardableResult
243+
func callAsFunction(
244+
this: JSObject,
245+
_ arg0: some ConvertibleToJSValue,
246+
_ arg1: some ConvertibleToJSValue,
247+
_ arg2: some ConvertibleToJSValue,
248+
_ arg3: some ConvertibleToJSValue,
249+
_ arg4: some ConvertibleToJSValue,
250+
_ arg5: some ConvertibleToJSValue,
251+
_ arg6: some ConvertibleToJSValue
252+
) -> JSValue {
253+
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue, arg4.jsValue, arg5.jsValue, arg6.jsValue], this: this).jsValue
254+
}
255+
190256
@discardableResult
191257
func callAsFunction(this: JSObject, arguments: [JSValue]) -> JSValue {
192258
invokeNonThrowingJSFunction(arguments: arguments, this: this).jsValue
@@ -203,15 +269,68 @@ public extension JSFunction {
203269
}
204270

205271
@discardableResult
206-
func callAsFunction(_ arg0: some ConvertibleToJSValue, _ arg1: some ConvertibleToJSValue) -> JSValue {
272+
func callAsFunction(
273+
_ arg0: some ConvertibleToJSValue,
274+
_ arg1: some ConvertibleToJSValue
275+
) -> JSValue {
207276
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue]).jsValue
208277
}
209278

210279
@discardableResult
211-
func callAsFunction(_ arg0: some ConvertibleToJSValue, _ arg1: some ConvertibleToJSValue, _ arg2: some ConvertibleToJSValue) -> JSValue {
280+
func callAsFunction(
281+
_ arg0: some ConvertibleToJSValue,
282+
_ arg1: some ConvertibleToJSValue,
283+
_ arg2: some ConvertibleToJSValue
284+
) -> JSValue {
212285
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue]).jsValue
213286
}
214287

288+
@discardableResult
289+
func callAsFunction(
290+
_ arg0: some ConvertibleToJSValue,
291+
_ arg1: some ConvertibleToJSValue,
292+
_ arg2: some ConvertibleToJSValue,
293+
_ arg3: some ConvertibleToJSValue
294+
) -> JSValue {
295+
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue]).jsValue
296+
}
297+
298+
@discardableResult
299+
func callAsFunction(
300+
_ arg0: some ConvertibleToJSValue,
301+
_ arg1: some ConvertibleToJSValue,
302+
_ arg2: some ConvertibleToJSValue,
303+
_ arg3: some ConvertibleToJSValue,
304+
_ arg4: some ConvertibleToJSValue
305+
) -> JSValue {
306+
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue, arg4.jsValue]).jsValue
307+
}
308+
309+
@discardableResult
310+
func callAsFunction(
311+
_ arg0: some ConvertibleToJSValue,
312+
_ arg1: some ConvertibleToJSValue,
313+
_ arg2: some ConvertibleToJSValue,
314+
_ arg3: some ConvertibleToJSValue,
315+
_ arg4: some ConvertibleToJSValue,
316+
_ arg5: some ConvertibleToJSValue
317+
) -> JSValue {
318+
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue, arg4.jsValue, arg5.jsValue]).jsValue
319+
}
320+
321+
@discardableResult
322+
func callAsFunction(
323+
_ arg0: some ConvertibleToJSValue,
324+
_ arg1: some ConvertibleToJSValue,
325+
_ arg2: some ConvertibleToJSValue,
326+
_ arg3: some ConvertibleToJSValue,
327+
_ arg4: some ConvertibleToJSValue,
328+
_ arg5: some ConvertibleToJSValue,
329+
_ arg6: some ConvertibleToJSValue
330+
) -> JSValue {
331+
invokeNonThrowingJSFunction(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue, arg4.jsValue, arg5.jsValue, arg6.jsValue]).jsValue
332+
}
333+
215334
func new() -> JSObject {
216335
new(arguments: [])
217336
}
@@ -220,19 +339,60 @@ public extension JSFunction {
220339
new(arguments: [arg0.jsValue])
221340
}
222341

223-
func new(_ arg0: some ConvertibleToJSValue, _ arg1: some ConvertibleToJSValue) -> JSObject {
342+
func new(
343+
_ arg0: some ConvertibleToJSValue,
344+
_ arg1: some ConvertibleToJSValue
345+
) -> JSObject {
224346
new(arguments: [arg0.jsValue, arg1.jsValue])
225347
}
226348

227-
func new(_ arg0: some ConvertibleToJSValue, _ arg1: some ConvertibleToJSValue, _ arg2: some ConvertibleToJSValue) -> JSObject {
349+
func new(
350+
_ arg0: some ConvertibleToJSValue,
351+
_ arg1: some ConvertibleToJSValue,
352+
_ arg2: some ConvertibleToJSValue
353+
) -> JSObject {
228354
new(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue])
229355
}
230356

231-
func new(_ arg0: some ConvertibleToJSValue, _ arg1: some ConvertibleToJSValue, _ arg2: some ConvertibleToJSValue, arg3: some ConvertibleToJSValue) -> JSObject {
357+
func new(
358+
_ arg0: some ConvertibleToJSValue,
359+
_ arg1: some ConvertibleToJSValue,
360+
_ arg2: some ConvertibleToJSValue,
361+
_ arg3: some ConvertibleToJSValue
362+
) -> JSObject {
232363
new(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue])
233364
}
234365

235-
func new(_ arg0: some ConvertibleToJSValue, _ arg1: some ConvertibleToJSValue, _ arg2: some ConvertibleToJSValue, _ arg3: some ConvertibleToJSValue, _ arg4: some ConvertibleToJSValue, _ arg5: some ConvertibleToJSValue, _ arg6: some ConvertibleToJSValue) -> JSObject {
366+
func new(
367+
_ arg0: some ConvertibleToJSValue,
368+
_ arg1: some ConvertibleToJSValue,
369+
_ arg2: some ConvertibleToJSValue,
370+
_ arg3: some ConvertibleToJSValue,
371+
_ arg4: some ConvertibleToJSValue
372+
) -> JSObject {
373+
new(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue, arg4.jsValue])
374+
}
375+
376+
func new(
377+
_ arg0: some ConvertibleToJSValue,
378+
_ arg1: some ConvertibleToJSValue,
379+
_ arg2: some ConvertibleToJSValue,
380+
_ arg3: some ConvertibleToJSValue,
381+
_ arg4: some ConvertibleToJSValue,
382+
_ arg5: some ConvertibleToJSValue
383+
) -> JSObject {
384+
new(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue, arg4.jsValue, arg5.jsValue])
385+
}
386+
387+
func new(
388+
_ arg0: some ConvertibleToJSValue,
389+
_ arg1: some ConvertibleToJSValue,
390+
_ arg2: some ConvertibleToJSValue,
391+
_ arg3: some ConvertibleToJSValue,
392+
_ arg4: some ConvertibleToJSValue,
393+
_ arg5: some ConvertibleToJSValue,
394+
_ arg6: some ConvertibleToJSValue
395+
) -> JSObject {
236396
new(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue, arg4.jsValue, arg5.jsValue, arg6.jsValue])
237397
}
238398
}

Diff for: Sources/JavaScriptKit/FundamentalObjects/JSObject.swift

+77-2
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,14 @@ public class JSThrowingObject {
298298

299299

300300
#if hasFeature(Embedded)
301-
// NOTE: once embedded supports variadic generics, we can remove these overloads
301+
// Overloads of `JSObject.subscript(_ name: String) -> ((ConvertibleToJSValue...) -> JSValue)?`
302+
// for 0 through 7 arguments for Embedded Swift.
303+
//
304+
// These are required because the `ConvertibleToJSValue...` subscript is not
305+
// available in Embedded Swift due to lack of support for existentials.
306+
//
307+
// NOTE: Once Embedded Swift supports parameter packs/variadic generics, we can
308+
// replace all of these with a single method that takes a generic pack.
302309
public extension JSObject {
303310
@_disfavoredOverload
304311
subscript(dynamicMember name: String) -> (() -> JSValue)? {
@@ -315,10 +322,78 @@ public extension JSObject {
315322
}
316323

317324
@_disfavoredOverload
318-
subscript<A0: ConvertibleToJSValue, A1: ConvertibleToJSValue>(dynamicMember name: String) -> ((A0, A1) -> JSValue)? {
325+
subscript<
326+
A0: ConvertibleToJSValue,
327+
A1: ConvertibleToJSValue
328+
>(dynamicMember name: String) -> ((A0, A1) -> JSValue)? {
319329
self[name].function.map { function in
320330
{ function(this: self, $0, $1) }
321331
}
322332
}
333+
334+
@_disfavoredOverload
335+
subscript<
336+
A0: ConvertibleToJSValue,
337+
A1: ConvertibleToJSValue,
338+
A2: ConvertibleToJSValue
339+
>(dynamicMember name: String) -> ((A0, A1, A2) -> JSValue)? {
340+
self[name].function.map { function in
341+
{ function(this: self, $0, $1, $2) }
342+
}
343+
}
344+
345+
@_disfavoredOverload
346+
subscript<
347+
A0: ConvertibleToJSValue,
348+
A1: ConvertibleToJSValue,
349+
A2: ConvertibleToJSValue,
350+
A3: ConvertibleToJSValue
351+
>(dynamicMember name: String) -> ((A0, A1, A2, A3) -> JSValue)? {
352+
self[name].function.map { function in
353+
{ function(this: self, $0, $1, $2, $3) }
354+
}
355+
}
356+
357+
@_disfavoredOverload
358+
subscript<
359+
A0: ConvertibleToJSValue,
360+
A1: ConvertibleToJSValue,
361+
A2: ConvertibleToJSValue,
362+
A3: ConvertibleToJSValue,
363+
A4: ConvertibleToJSValue
364+
>(dynamicMember name: String) -> ((A0, A1, A2, A3, A4) -> JSValue)? {
365+
self[name].function.map { function in
366+
{ function(this: self, $0, $1, $2, $3, $4) }
367+
}
368+
}
369+
370+
@_disfavoredOverload
371+
subscript<
372+
A0: ConvertibleToJSValue,
373+
A1: ConvertibleToJSValue,
374+
A2: ConvertibleToJSValue,
375+
A3: ConvertibleToJSValue,
376+
A4: ConvertibleToJSValue,
377+
A5: ConvertibleToJSValue
378+
>(dynamicMember name: String) -> ((A0, A1, A2, A3, A4, A5) -> JSValue)? {
379+
self[name].function.map { function in
380+
{ function(this: self, $0, $1, $2, $3, $4, $5) }
381+
}
382+
}
383+
384+
@_disfavoredOverload
385+
subscript<
386+
A0: ConvertibleToJSValue,
387+
A1: ConvertibleToJSValue,
388+
A2: ConvertibleToJSValue,
389+
A3: ConvertibleToJSValue,
390+
A4: ConvertibleToJSValue,
391+
A5: ConvertibleToJSValue,
392+
A6: ConvertibleToJSValue
393+
>(dynamicMember name: String) -> ((A0, A1, A2, A3, A4, A5, A6) -> JSValue)? {
394+
self[name].function.map { function in
395+
{ function(this: self, $0, $1, $2, $3, $4, $5, $6) }
396+
}
397+
}
323398
}
324399
#endif

0 commit comments

Comments
 (0)