@@ -68,70 +68,19 @@ public struct ImportTS {
68
68
}
69
69
70
70
func lowerParameter( param: Parameter ) throws {
71
- switch param. type {
72
- case . bool:
73
- abiParameterForwardings. append (
74
- LabeledExprSyntax (
75
- label: param. label,
76
- expression: ExprSyntax ( " \( raw: param. name) .bridgeJSLowerParameter() " )
77
- )
78
- )
79
- abiParameterSignatures. append ( ( param. name, . i32) )
80
- case . int:
81
- abiParameterForwardings. append (
82
- LabeledExprSyntax (
83
- label: param. label,
84
- expression: ExprSyntax ( " \( raw: param. name) " )
85
- )
86
- )
87
- abiParameterSignatures. append ( ( param. name, . i32) )
88
- case . float:
89
- abiParameterForwardings. append (
90
- LabeledExprSyntax (
91
- label: param. label,
92
- expression: ExprSyntax ( " \( raw: param. name) " )
93
- )
94
- )
95
- abiParameterSignatures. append ( ( param. name, . f32) )
96
- case . double:
97
- abiParameterForwardings. append (
98
- LabeledExprSyntax (
99
- label: param. label,
100
- expression: ExprSyntax ( " \( raw: param. name) " )
101
- )
102
- )
103
- abiParameterSignatures. append ( ( param. name, . f64) )
104
- case . string:
105
- abiParameterForwardings. append (
106
- LabeledExprSyntax (
107
- label: param. label,
108
- expression: ExprSyntax ( " \( raw: param. name) .bridgeJSLowerParameter() " )
109
- )
110
- )
111
- abiParameterSignatures. append ( ( param. name, . i32) )
112
- case . caseEnum, . rawValueEnum, . associatedValueEnum, . namespaceEnum:
113
- throw BridgeJSCoreError ( " Enum types are not yet supported in TypeScript imports " )
114
- case . jsObject( _? ) :
115
- abiParameterSignatures. append ( ( param. name, . i32) )
116
- abiParameterForwardings. append (
117
- LabeledExprSyntax (
118
- label: param. label,
119
- expression: ExprSyntax ( " \( raw: param. name) .this.bridgeJSLowerParameter() " )
120
- )
121
- )
122
- case . jsObject( nil ) :
123
- abiParameterForwardings. append (
124
- LabeledExprSyntax (
125
- label: param. label,
126
- expression: ExprSyntax ( " \( raw: param. name) .bridgeJSLowerParameter() " )
127
- )
71
+ let loweringInfo = try param. type. loweringParameterInfo ( )
72
+ assert (
73
+ loweringInfo. loweredParameters. count == 1 ,
74
+ " For now, we require a single parameter to be lowered to a single Wasm core type "
75
+ )
76
+ let ( _, type) = loweringInfo. loweredParameters [ 0 ]
77
+ abiParameterForwardings. append (
78
+ LabeledExprSyntax (
79
+ label: param. label,
80
+ expression: ExprSyntax ( " \( raw: param. name) .bridgeJSLowerParameter() " )
128
81
)
129
- abiParameterSignatures. append ( ( param. name, . i32) )
130
- case . swiftHeapObject( _) :
131
- throw BridgeJSCoreError ( " swiftHeapObject is not supported in imported signatures " )
132
- case . void:
133
- break
134
- }
82
+ )
83
+ abiParameterSignatures. append ( ( param. name, type) )
135
84
}
136
85
137
86
func call( returnType: BridgeType ) {
@@ -146,44 +95,20 @@ public struct ImportTS {
146
95
}
147
96
148
97
func liftReturnValue( returnType: BridgeType ) throws {
149
- switch returnType {
150
- case . bool:
151
- abiReturnType = . i32
152
- body. append ( " return \( raw: returnType. swiftType) .bridgeJSLiftReturn(ret) " )
153
- case . int:
154
- abiReturnType = . i32
155
- body. append ( " return \( raw: returnType. swiftType) (ret) " )
156
- case . float:
157
- abiReturnType = . f32
158
- body. append ( " return \( raw: returnType. swiftType) (ret) " )
159
- case . double:
160
- abiReturnType = . f64
161
- body. append ( " return \( raw: returnType. swiftType) (ret) " )
162
- case . string:
163
- abiReturnType = . i32
164
- body. append ( " return \( raw: returnType. swiftType) .bridgeJSLiftReturn(ret) " )
165
- case . caseEnum, . rawValueEnum, . associatedValueEnum, . namespaceEnum:
166
- throw BridgeJSCoreError ( " Enum types are not yet supported in TypeScript imports " )
167
- case . jsObject( let name) :
168
- abiReturnType = . i32
169
- if let name = name {
170
- body. append ( " return \( raw: name) (takingThis: ret) " )
171
- } else {
172
- body. append ( " return JSObject.bridgeJSLiftReturn(ret) " )
173
- }
174
- case . swiftHeapObject( _) :
175
- throw BridgeJSCoreError ( " swiftHeapObject is not supported in imported signatures " )
176
- case . void:
177
- break
98
+ let liftingInfo = try returnType. liftingReturnInfo ( )
99
+ abiReturnType = liftingInfo. valueToLift
100
+ if returnType == . void {
101
+ return
178
102
}
103
+ body. append ( " return \( raw: returnType. swiftType) .bridgeJSLiftReturn(ret) " )
179
104
}
180
105
181
106
func assignThis( returnType: BridgeType ) {
182
107
guard case . jsObject = returnType else {
183
108
preconditionFailure ( " assignThis can only be called with a jsObject return type " )
184
109
}
185
110
abiReturnType = . i32
186
- body. append ( " self.this = JSObject(id: UInt32(bitPattern: ret)) " )
111
+ body. append ( " self.jsObject = JSObject(id: UInt32(bitPattern: ret)) " )
187
112
}
188
113
189
114
func renderImportDecl( ) -> DeclSyntax {
@@ -410,25 +335,22 @@ public struct ImportTS {
410
335
let classDecl = try StructDeclSyntax (
411
336
leadingTrivia: Self . renderDocumentation ( documentation: type. documentation) ,
412
337
name: . identifier( name) ,
338
+ inheritanceClause: InheritanceClauseSyntax (
339
+ inheritedTypesBuilder: {
340
+ InheritedTypeSyntax ( type: TypeSyntax ( " _JSBridgedClass " ) )
341
+ }
342
+ ) ,
413
343
memberBlockBuilder: {
414
344
DeclSyntax (
415
345
"""
416
- let this : JSObject
346
+ let jsObject : JSObject
417
347
"""
418
348
) . with ( \. trailingTrivia, . newlines( 2 ) )
419
349
420
350
DeclSyntax (
421
351
"""
422
- init(this: JSObject) {
423
- self.this = this
424
- }
425
- """
426
- ) . with ( \. trailingTrivia, . newlines( 2 ) )
427
-
428
- DeclSyntax (
429
- """
430
- init(takingThis this: Int32) {
431
- self.this = JSObject(id: UInt32(bitPattern: this))
352
+ init(unsafelyWrapping jsObject: JSObject) {
353
+ self.jsObject = jsObject
432
354
}
433
355
"""
434
356
) . with ( \. trailingTrivia, . newlines( 2 ) )
@@ -483,3 +405,61 @@ public struct ImportTS {
483
405
)
484
406
}
485
407
}
408
+
409
+ extension BridgeType {
410
+ struct LoweringParameterInfo {
411
+ let loweredParameters : [ ( name: String , type: WasmCoreType ) ]
412
+
413
+ static let bool = LoweringParameterInfo ( loweredParameters: [ ( " value " , . i32) ] )
414
+ static let int = LoweringParameterInfo ( loweredParameters: [ ( " value " , . i32) ] )
415
+ static let float = LoweringParameterInfo ( loweredParameters: [ ( " value " , . f32) ] )
416
+ static let double = LoweringParameterInfo ( loweredParameters: [ ( " value " , . f64) ] )
417
+ static let string = LoweringParameterInfo ( loweredParameters: [ ( " value " , . i32) ] )
418
+ static let jsObject = LoweringParameterInfo ( loweredParameters: [ ( " value " , . i32) ] )
419
+ static let void = LoweringParameterInfo ( loweredParameters: [ ] )
420
+ }
421
+
422
+ func loweringParameterInfo( ) throws -> LoweringParameterInfo {
423
+ switch self {
424
+ case . bool: return . bool
425
+ case . int: return . int
426
+ case . float: return . float
427
+ case . double: return . double
428
+ case . string: return . string
429
+ case . jsObject: return . jsObject
430
+ case . void: return . void
431
+ case . swiftHeapObject:
432
+ throw BridgeJSCoreError ( " swiftHeapObject is not supported in imported signatures " )
433
+ case . caseEnum, . rawValueEnum, . associatedValueEnum, . namespaceEnum:
434
+ throw BridgeJSCoreError ( " Enum types are not yet supported in TypeScript imports " )
435
+ }
436
+ }
437
+
438
+ struct LiftingReturnInfo {
439
+ let valueToLift : WasmCoreType ?
440
+
441
+ static let bool = LiftingReturnInfo ( valueToLift: . i32)
442
+ static let int = LiftingReturnInfo ( valueToLift: . i32)
443
+ static let float = LiftingReturnInfo ( valueToLift: . f32)
444
+ static let double = LiftingReturnInfo ( valueToLift: . f64)
445
+ static let string = LiftingReturnInfo ( valueToLift: . i32)
446
+ static let jsObject = LiftingReturnInfo ( valueToLift: . i32)
447
+ static let void = LiftingReturnInfo ( valueToLift: nil )
448
+ }
449
+
450
+ func liftingReturnInfo( ) throws -> LiftingReturnInfo {
451
+ switch self {
452
+ case . bool: return . bool
453
+ case . int: return . int
454
+ case . float: return . float
455
+ case . double: return . double
456
+ case . string: return . string
457
+ case . jsObject: return . jsObject
458
+ case . void: return . void
459
+ case . swiftHeapObject:
460
+ throw BridgeJSCoreError ( " swiftHeapObject is not supported in imported signatures " )
461
+ case . caseEnum, . rawValueEnum, . associatedValueEnum, . namespaceEnum:
462
+ throw BridgeJSCoreError ( " Enum types are not yet supported in TypeScript imports " )
463
+ }
464
+ }
465
+ }
0 commit comments