@@ -68,70 +68,16 @@ 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
- )
71
+ let loweringInfo = try param. type. loweringParameterInfo ( )
72
+ assert ( loweringInfo. loweredParameters. count == 1 , " For now, we require a single parameter to be lowered to a single Wasm core type " )
73
+ let ( _, type) = loweringInfo. loweredParameters [ 0 ]
74
+ abiParameterForwardings. append (
75
+ LabeledExprSyntax (
76
+ label: param. label,
77
+ expression: ExprSyntax ( " \( raw: param. name) .bridgeJSLowerParameter() " )
110
78
)
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
- )
128
- )
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
- }
79
+ )
80
+ abiParameterSignatures. append ( ( param. name, type) )
135
81
}
136
82
137
83
func call( returnType: BridgeType ) {
@@ -146,44 +92,20 @@ public struct ImportTS {
146
92
}
147
93
148
94
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
95
+ let liftingInfo = try returnType. liftingReturnInfo ( )
96
+ abiReturnType = liftingInfo. valueToLift
97
+ if returnType == . void {
98
+ return
178
99
}
100
+ body. append ( " return \( raw: returnType. swiftType) .bridgeJSLiftReturn(ret) " )
179
101
}
180
102
181
103
func assignThis( returnType: BridgeType ) {
182
104
guard case . jsObject = returnType else {
183
105
preconditionFailure ( " assignThis can only be called with a jsObject return type " )
184
106
}
185
107
abiReturnType = . i32
186
- body. append ( " self.this = JSObject(id: UInt32(bitPattern: ret)) " )
108
+ body. append ( " self.jsObject = JSObject(id: UInt32(bitPattern: ret)) " )
187
109
}
188
110
189
111
func renderImportDecl( ) -> DeclSyntax {
@@ -410,25 +332,22 @@ public struct ImportTS {
410
332
let classDecl = try StructDeclSyntax (
411
333
leadingTrivia: Self . renderDocumentation ( documentation: type. documentation) ,
412
334
name: . identifier( name) ,
335
+ inheritanceClause: InheritanceClauseSyntax (
336
+ inheritedTypesBuilder: {
337
+ InheritedTypeSyntax ( type: TypeSyntax ( " _JSBridgedClass " ) )
338
+ }
339
+ ) ,
413
340
memberBlockBuilder: {
414
341
DeclSyntax (
415
342
"""
416
- let this : JSObject
343
+ let jsObject : JSObject
417
344
"""
418
345
) . with ( \. trailingTrivia, . newlines( 2 ) )
419
346
420
347
DeclSyntax (
421
348
"""
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))
349
+ init(unsafelyWrapping jsObject: JSObject) {
350
+ self.jsObject = jsObject
432
351
}
433
352
"""
434
353
) . with ( \. trailingTrivia, . newlines( 2 ) )
@@ -483,3 +402,61 @@ public struct ImportTS {
483
402
)
484
403
}
485
404
}
405
+
406
+ extension BridgeType {
407
+ struct LoweringParameterInfo {
408
+ let loweredParameters : [ ( name: String , type: WasmCoreType ) ]
409
+
410
+ static let bool = LoweringParameterInfo ( loweredParameters: [ ( " value " , . i32) ] )
411
+ static let int = LoweringParameterInfo ( loweredParameters: [ ( " value " , . i32) ] )
412
+ static let float = LoweringParameterInfo ( loweredParameters: [ ( " value " , . f32) ] )
413
+ static let double = LoweringParameterInfo ( loweredParameters: [ ( " value " , . f64) ] )
414
+ static let string = LoweringParameterInfo ( loweredParameters: [ ( " value " , . i32) ] )
415
+ static let jsObject = LoweringParameterInfo ( loweredParameters: [ ( " value " , . i32) ] )
416
+ static let void = LoweringParameterInfo ( loweredParameters: [ ] )
417
+ }
418
+
419
+ func loweringParameterInfo( ) throws -> LoweringParameterInfo {
420
+ switch self {
421
+ case . bool: return . bool
422
+ case . int: return . int
423
+ case . float: return . float
424
+ case . double: return . double
425
+ case . string: return . string
426
+ case . jsObject: return . jsObject
427
+ case . void: return . void
428
+ case . swiftHeapObject:
429
+ throw BridgeJSCoreError ( " swiftHeapObject is not supported in imported signatures " )
430
+ case . caseEnum, . rawValueEnum, . associatedValueEnum, . namespaceEnum:
431
+ throw BridgeJSCoreError ( " Enum types are not yet supported in TypeScript imports " )
432
+ }
433
+ }
434
+
435
+ struct LiftingReturnInfo {
436
+ let valueToLift : WasmCoreType ?
437
+
438
+ static let bool = LiftingReturnInfo ( valueToLift: . i32)
439
+ static let int = LiftingReturnInfo ( valueToLift: . i32)
440
+ static let float = LiftingReturnInfo ( valueToLift: . f32)
441
+ static let double = LiftingReturnInfo ( valueToLift: . f64)
442
+ static let string = LiftingReturnInfo ( valueToLift: . i32)
443
+ static let jsObject = LiftingReturnInfo ( valueToLift: . i32)
444
+ static let void = LiftingReturnInfo ( valueToLift: nil )
445
+ }
446
+
447
+ func liftingReturnInfo( ) throws -> LiftingReturnInfo {
448
+ switch self {
449
+ case . bool: return . bool
450
+ case . int: return . int
451
+ case . float: return . float
452
+ case . double: return . double
453
+ case . string: return . string
454
+ case . jsObject: return . jsObject
455
+ case . void: return . void
456
+ case . swiftHeapObject:
457
+ throw BridgeJSCoreError ( " swiftHeapObject is not supported in imported signatures " )
458
+ case . caseEnum, . rawValueEnum, . associatedValueEnum, . namespaceEnum:
459
+ throw BridgeJSCoreError ( " Enum types are not yet supported in TypeScript imports " )
460
+ }
461
+ }
462
+ }
0 commit comments