diff --git a/Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift b/Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift index 7311b24b..4c91ebd7 100644 --- a/Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift +++ b/Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift @@ -319,8 +319,19 @@ public class ExportSwift { func render(abiName: String) -> DeclSyntax { let body: CodeBlockItemListSyntax if effects.isAsync { + // Explicit closure type annotation needed when throws is present + // so Swift infers throws(JSException) instead of throws(any Error) + // See: https://github.com/swiftlang/swift/issues/76165 + let closureHead: String + if effects.isThrows { + let hasReturn = self.body.contains { $0.description.contains("return ") } + let ret = hasReturn ? " -> JSValue" : "" + closureHead = " () async throws(JSException)\(ret) in" + } else { + closureHead = "" + } body = """ - let ret = JSPromise.async { + let ret = JSPromise.async {\(raw: closureHead) \(CodeBlockItemListSyntax(self.body)) }.jsObject return ret.bridgeJSLowerReturn()