@@ -319,8 +319,19 @@ public class ExportSwift {
319319 func render( abiName: String ) -> DeclSyntax {
320320 let body : CodeBlockItemListSyntax
321321 if effects. isAsync {
322+ // Explicit closure type annotation needed when throws is present
323+ // so Swift infers throws(JSException) instead of throws(any Error)
324+ // See: https://github.com/swiftlang/swift/issues/76165
325+ let closureHead : String
326+ if effects. isThrows {
327+ let hasReturn = self . body. contains { $0. description. contains ( " return " ) }
328+ let ret = hasReturn ? " -> JSValue " : " "
329+ closureHead = " () async throws(JSException) \( ret) in "
330+ } else {
331+ closureHead = " "
332+ }
322333 body = """
323- let ret = JSPromise.async {
334+ let ret = JSPromise.async { \( raw : closureHead )
324335 \( CodeBlockItemListSyntax ( self . body) )
325336 }.jsObject
326337 return ret.bridgeJSLowerReturn()
@@ -1166,17 +1177,18 @@ struct ProtocolCodegen {
11661177 var externDecls : [ DeclSyntax ] = [ ]
11671178
11681179 for method in proto. methods {
1169- let builder = ImportTS . CallJSEmission (
1180+ let builder = try ImportTS . CallJSEmission (
11701181 moduleName: moduleName,
11711182 abiName: " _extern_ \( method. name) " ,
1183+ returnType: method. returnType,
11721184 context: . exportSwift
11731185 )
11741186 try builder. lowerParameter ( param: Parameter ( label: nil , name: " jsObject " , type: . jsObject( nil ) ) )
11751187 for param in method. parameters {
11761188 try builder. lowerParameter ( param: param)
11771189 }
1178- try builder. call ( returnType : method . returnType )
1179- try builder. liftReturnValue ( returnType : method . returnType )
1190+ try builder. call ( )
1191+ try builder. liftReturnValue ( )
11801192
11811193 // Build function signature using SwiftSignatureBuilder
11821194 let signature = SwiftSignatureBuilder . buildFunctionSignature (
@@ -1264,14 +1276,15 @@ struct ProtocolCodegen {
12641276 className: protocolName
12651277 )
12661278
1267- let getterBuilder = ImportTS . CallJSEmission (
1279+ let getterBuilder = try ImportTS . CallJSEmission (
12681280 moduleName: moduleName,
12691281 abiName: getterAbiName,
1282+ returnType: property. type,
12701283 context: . exportSwift
12711284 )
12721285 try getterBuilder. lowerParameter ( param: Parameter ( label: nil , name: " jsObject " , type: . jsObject( nil ) ) )
1273- try getterBuilder. call ( returnType : property . type )
1274- try getterBuilder. liftReturnValue ( returnType : property . type )
1286+ try getterBuilder. call ( )
1287+ try getterBuilder. liftReturnValue ( )
12751288
12761289 // Build getter extern declaration using helper function
12771290 let getterExternDeclPrinter = CodeFragmentPrinter ( )
@@ -1296,14 +1309,15 @@ struct ProtocolCodegen {
12961309
12971310 if property. isReadonly { return }
12981311
1299- let setterBuilder = ImportTS . CallJSEmission (
1312+ let setterBuilder = try ImportTS . CallJSEmission (
13001313 moduleName: moduleName,
13011314 abiName: setterAbiName,
1315+ returnType: . void,
13021316 context: . exportSwift
13031317 )
13041318 try setterBuilder. lowerParameter ( param: Parameter ( label: nil , name: " jsObject " , type: . jsObject( nil ) ) )
13051319 try setterBuilder. lowerParameter ( param: Parameter ( label: nil , name: " newValue " , type: property. type) )
1306- try setterBuilder. call ( returnType : . void )
1320+ try setterBuilder. call ( )
13071321
13081322 // Build setter extern declaration using helper function
13091323 let setterExternDeclPrinter = CodeFragmentPrinter ( )
0 commit comments