Skip to content

Commit 2bcf1f6

Browse files
committed
ImportTS: Promise-returning TS funcs -> async Swift
1 parent 7704862 commit 2bcf1f6

File tree

8 files changed

+38
-19
lines changed

8 files changed

+38
-19
lines changed

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2613,6 +2613,8 @@ struct StackCodegen {
26132613
return "Float.bridgeJSLiftParameter(_swift_js_pop_param_f32())"
26142614
case .double:
26152615
return "Double.bridgeJSLiftParameter(_swift_js_pop_param_f64())"
2616+
case .jsPromise:
2617+
return "JSPromise.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
26162618
case .jsObject:
26172619
return "JSObject.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
26182620
case .swiftHeapObject(let className):
@@ -2713,7 +2715,7 @@ struct StackCodegen {
27132715
return ["_swift_js_push_f32(\(raw: accessor))"]
27142716
case .double:
27152717
return ["_swift_js_push_f64(\(raw: accessor))"]
2716-
case .jsObject:
2718+
case .jsObject, .jsPromise:
27172719
return ["_swift_js_push_int(\(raw: accessor).bridgeJSLowerParameter())"]
27182720
case .swiftHeapObject:
27192721
return ["_swift_js_push_pointer(\(raw: accessor).bridgeJSLowerReturn())"]
@@ -3346,6 +3348,7 @@ extension BridgeType {
33463348
case .float: return "Float"
33473349
case .double: return "Double"
33483350
case .string: return "String"
3351+
case .jsPromise(let type): return type.swiftType
33493352
case .jsObject(nil): return "JSObject"
33503353
case .jsObject(let name?): return name
33513354
case .swiftHeapObject(let name): return name
@@ -3388,7 +3391,7 @@ extension BridgeType {
33883391
case .float: return .float
33893392
case .double: return .double
33903393
case .string: return .string
3391-
case .jsObject: return .jsObject
3394+
case .jsObject, .jsPromise: return .jsObject
33923395
case .swiftHeapObject: return .swiftHeapObject
33933396
case .swiftProtocol: return .jsObject
33943397
case .void: return .void
@@ -3435,7 +3438,7 @@ extension BridgeType {
34353438
case .float: return .float
34363439
case .double: return .double
34373440
case .string: return .string
3438-
case .jsObject: return .jsObject
3441+
case .jsObject, .jsPromise: return .jsObject
34393442
case .swiftHeapObject: return .swiftHeapObject
34403443
case .swiftProtocol: return .jsObject
34413444
case .void: return .void

Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,13 @@ public struct ImportTS {
157157
}
158158

159159
func renderThunkDecl(name: String, parameters: [Parameter], returnType: BridgeType) -> DeclSyntax {
160+
let isAsync: Bool
161+
if case .jsPromise = returnType {
162+
print(returnType)
163+
isAsync = true
164+
} else {
165+
isAsync = false
166+
}
160167
return DeclSyntax(
161168
FunctionDeclSyntax(
162169
name: .identifier(name.backtickIfNeeded()),
@@ -171,7 +178,7 @@ public struct ImportTS {
171178
)
172179
}
173180
}),
174-
effectSpecifiers: ImportTS.buildFunctionEffect(throws: true, async: false),
181+
effectSpecifiers: ImportTS.buildFunctionEffect(throws: true, async: isAsync),
175182
returnClause: ReturnClauseSyntax(
176183
arrow: .arrowToken(),
177184
type: IdentifierTypeSyntax(name: .identifier(returnType.swiftType))
@@ -436,7 +443,7 @@ extension BridgeType {
436443
case .float: return .float
437444
case .double: return .double
438445
case .string: return .string
439-
case .jsObject: return .jsObject
446+
case .jsObject, .jsPromise: return .jsObject
440447
case .void: return .void
441448
case .closure:
442449
throw BridgeJSCoreError("Closure types are not yet supported in TypeScript imports")
@@ -519,7 +526,7 @@ extension BridgeType {
519526
case .float: return .float
520527
case .double: return .double
521528
case .string: return .string
522-
case .jsObject: return .jsObject
529+
case .jsObject, .jsPromise: return .jsObject
523530
case .void: return .void
524531
case .closure:
525532
throw BridgeJSCoreError("Closure types are not yet supported in TypeScript imports")

Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3147,6 +3147,8 @@ extension BridgeType {
31473147
return "number"
31483148
case .bool:
31493149
return "boolean"
3150+
case .jsPromise(let type):
3151+
return "Promise<\(type.tsType)>"
31503152
case .jsObject(let name):
31513153
return name ?? "any"
31523154
case .swiftHeapObject(let name):

Plugins/BridgeJS/Sources/BridgeJSLink/JSGlueGen.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1294,7 +1294,7 @@ struct IntrinsicJSFragment: Sendable {
12941294
switch type {
12951295
case .int, .float, .double, .bool: return .identity
12961296
case .string: return .stringLowerParameter
1297-
case .jsObject: return .jsObjectLowerParameter
1297+
case .jsObject, .jsPromise: return .jsObjectLowerParameter
12981298
case .swiftHeapObject:
12991299
return .swiftHeapObjectLowerParameter
13001300
case .swiftProtocol: return .jsObjectLowerParameter
@@ -1336,7 +1336,7 @@ struct IntrinsicJSFragment: Sendable {
13361336
case .int, .float, .double: return .identity
13371337
case .bool: return .boolLiftReturn
13381338
case .string: return .stringLiftReturn
1339-
case .jsObject: return .jsObjectLiftReturn
1339+
case .jsObject, .jsPromise: return .jsObjectLiftReturn
13401340
case .swiftHeapObject(let name): return .swiftHeapObjectLiftReturn(name)
13411341
case .swiftProtocol: return .jsObjectLiftReturn
13421342
case .void: return .void
@@ -1379,7 +1379,7 @@ struct IntrinsicJSFragment: Sendable {
13791379
case .int, .float, .double: return .identity
13801380
case .bool: return .boolLiftParameter
13811381
case .string: return .stringLiftParameter
1382-
case .jsObject: return .jsObjectLiftParameter
1382+
case .jsObject, .jsPromise: return .jsObjectLiftParameter
13831383
case .swiftHeapObject(let name):
13841384
switch context {
13851385
case .importTS:
@@ -1467,7 +1467,7 @@ struct IntrinsicJSFragment: Sendable {
14671467
case .int, .float, .double: return .identity
14681468
case .bool: return .boolLowerReturn
14691469
case .string: return .stringLowerReturn
1470-
case .jsObject: return .jsObjectLowerReturn
1470+
case .jsObject, .jsPromise: return .jsObjectLowerReturn
14711471
case .swiftHeapObject(let name):
14721472
switch context {
14731473
case .importTS:
@@ -2241,7 +2241,7 @@ struct IntrinsicJSFragment: Sendable {
22412241
return []
22422242
}
22432243
)
2244-
case .jsObject:
2244+
case .jsObject, .jsPromise:
22452245
return IntrinsicJSFragment(
22462246
parameters: ["value"],
22472247
printCode: { arguments, scope, printer, cleanup in
@@ -2763,7 +2763,7 @@ struct IntrinsicJSFragment: Sendable {
27632763
return [varName]
27642764
}
27652765
)
2766-
case .jsObject:
2766+
case .jsObject, .jsPromise:
27672767
return IntrinsicJSFragment(
27682768
parameters: [],
27692769
printCode: { arguments, scope, printer, cleanup in

Plugins/BridgeJS/Sources/BridgeJSSkeleton/BridgeJSSkeleton.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public enum BridgeType: Codable, Equatable, Hashable, Sendable {
117117
case swiftProtocol(String)
118118
case swiftStruct(String)
119119
indirect case closure(ClosureSignature)
120+
indirect case jsPromise(BridgeType)
120121
}
121122

122123
public enum WasmCoreType: String, Codable, Sendable {
@@ -664,7 +665,7 @@ extension BridgeType {
664665
case .float: return .f32
665666
case .double: return .f64
666667
case .string: return nil
667-
case .jsObject: return .i32
668+
case .jsObject, .jsPromise: return .i32
668669
case .swiftHeapObject:
669670
// UnsafeMutableRawPointer is returned as an i32 pointer
670671
return .pointer
@@ -709,6 +710,9 @@ extension BridgeType {
709710
case .jsObject(let name):
710711
let typeName = name ?? "JSObject"
711712
return "\(typeName.count)\(typeName)C"
713+
case .jsPromise:
714+
let typeName = "JSPromise"
715+
return "\(typeName.count)\(typeName)C"
712716
case .swiftHeapObject(let name):
713717
return "\(name.count)\(name)C"
714718
case .optional(let wrapped):

Plugins/BridgeJS/Sources/TS2Skeleton/JavaScript/src/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export type BridgeType =
55
| { "string": {} }
66
| { "bool": {} }
77
| { "jsObject": { "_0": string } | {} }
8+
| { "jsPromise": { "_0": string } | {} }
89
| { "void": {} }
910

1011
export type Parameter = {

Plugins/BridgeJS/Sources/TS2Skeleton/JavaScript/src/processor.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,8 @@ export class TypeProcessor {
352352
* @private
353353
*/
354354
visitType(type, node) {
355+
const awaitedType = this.checker.getAwaitedType(type);
356+
355357
// Treat A<B> and A<C> as the same type
356358
if (isTypeReference(type)) {
357359
type = type.target;
@@ -379,13 +381,13 @@ export class TypeProcessor {
379381
"object": { "jsObject": {} },
380382
"symbol": { "jsObject": {} },
381383
"never": { "void": {} },
382-
"Promise": {
383-
"jsObject": {
384-
"_0": "JSPromise"
385-
}
386-
},
384+
"Promise": { "jsPromise": {} },
387385
};
388386
const typeString = type.getSymbol()?.name ?? this.checker.typeToString(type);
387+
if (typeString === "Promise" && awaitedType) {
388+
return { "jsPromise": {"_0": convert(awaitedType)} };
389+
}
390+
389391
if (typeMap[typeString]) {
390392
return typeMap[typeString];
391393
}

Plugins/BridgeJS/Tests/BridgeJSToolTests/ImportTSTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Foundation
1111
static func collectInputs() -> [String] {
1212
let fileManager = FileManager.default
1313
let inputs = try! fileManager.contentsOfDirectory(atPath: Self.inputsDirectory.path)
14-
return inputs.filter { $0.hasSuffix(".d.ts") }
14+
return inputs.filter { $0.hasSuffix("Async.d.ts") }
1515
}
1616

1717
@Test(arguments: collectInputs())

0 commit comments

Comments
 (0)