Skip to content

Commit c45877a

Browse files
committed
discardableresult
1 parent dd0c977 commit c45877a

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

Sources/JavaScriptKit/FundamentalObjects/JSObject.swift

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ public class JSObject: Equatable {
3535
/// - Parameter name: The name of this object's member to access.
3636
/// - Returns: The `name` member method binding this object as `this` context.
3737
@_disfavoredOverload
38-
public subscript(_ name: String) -> ((ConvertibleToJSValue...) -> JSValue)? {
38+
public subscript(_ name: String) -> DiscardableResultClosure? {
3939
guard let function = self[name].function else { return nil }
40-
return { (arguments: ConvertibleToJSValue...) in
40+
return DiscardableResultClosure { arguments in
4141
function(this: self, arguments: arguments)
4242
}
4343
}
@@ -53,17 +53,17 @@ public class JSObject: Equatable {
5353
/// - Parameter name: The name of this object's member to access.
5454
/// - Returns: The `name` member method binding this object as `this` context.
5555
@_disfavoredOverload
56-
public subscript(_ name: JSString) -> ((ConvertibleToJSValue...) -> JSValue)? {
56+
public subscript(_ name: JSString) -> DiscardableResultClosure? {
5757
guard let function = self[name].function else { return nil }
58-
return { (arguments: ConvertibleToJSValue...) in
58+
return DiscardableResultClosure { arguments in
5959
function(this: self, arguments: arguments)
6060
}
6161
}
6262

6363
/// A convenience method of `subscript(_ name: String) -> ((ConvertibleToJSValue...) -> JSValue)?`
6464
/// to access the member through Dynamic Member Lookup.
6565
@_disfavoredOverload
66-
public subscript(dynamicMember name: String) -> ((ConvertibleToJSValue...) -> JSValue)? {
66+
public subscript(dynamicMember name: String) -> DiscardableResultClosure? {
6767
self[name]
6868
}
6969
#endif
@@ -232,6 +232,19 @@ public class JSThrowingObject {
232232
#endif
233233

234234

235+
#if !hasFeature(Embedded)
236+
/// A swift closure wrapper that can be called as function.
237+
/// This prevents the warnings for unused results through `@discardableResult` which means you no longer need `_ =` everywhere.
238+
public struct DiscardableResultClosure {
239+
var closure: ([ConvertibleToJSValue]) -> JSValue
240+
241+
@discardableResult
242+
public func callAsFunction(_ args: ConvertibleToJSValue...) -> JSValue {
243+
return self.closure(args)
244+
}
245+
}
246+
#endif
247+
235248
#if hasFeature(Embedded)
236249
// NOTE: once embedded supports variadic generics, we can remove these overloads
237250
public extension JSObject {

Sources/JavaScriptKit/JSValue.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ public extension JSValue {
104104
#if !hasFeature(Embedded)
105105
/// An unsafe convenience method of `JSObject.subscript(_ name: String) -> ((ConvertibleToJSValue...) -> JSValue)?`
106106
/// - Precondition: `self` must be a JavaScript Object and specified member should be a callable object.
107-
subscript(dynamicMember name: String) -> ((ConvertibleToJSValue...) -> JSValue) {
107+
@_disfavoredOverload
108+
subscript(dynamicMember name: String) -> DiscardableResultClosure {
108109
object![dynamicMember: name]!
109110
}
110111
#endif

0 commit comments

Comments
 (0)