@@ -68,70 +68,19 @@ public struct ImportTS {
6868 }
6969
7070 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() " )
12881 )
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) )
13584 }
13685
13786 func call( returnType: BridgeType ) {
@@ -146,44 +95,20 @@ public struct ImportTS {
14695 }
14796
14897 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
178102 }
103+ body. append ( " return \( raw: returnType. swiftType) .bridgeJSLiftReturn(ret) " )
179104 }
180105
181106 func assignThis( returnType: BridgeType ) {
182107 guard case . jsObject = returnType else {
183108 preconditionFailure ( " assignThis can only be called with a jsObject return type " )
184109 }
185110 abiReturnType = . i32
186- body. append ( " self.this = JSObject(id: UInt32(bitPattern: ret)) " )
111+ body. append ( " self.jsObject = JSObject(id: UInt32(bitPattern: ret)) " )
187112 }
188113
189114 func renderImportDecl( ) -> DeclSyntax {
@@ -410,25 +335,22 @@ public struct ImportTS {
410335 let classDecl = try StructDeclSyntax (
411336 leadingTrivia: Self . renderDocumentation ( documentation: type. documentation) ,
412337 name: . identifier( name) ,
338+ inheritanceClause: InheritanceClauseSyntax (
339+ inheritedTypesBuilder: {
340+ InheritedTypeSyntax ( type: TypeSyntax ( " _JSBridgedClass " ) )
341+ }
342+ ) ,
413343 memberBlockBuilder: {
414344 DeclSyntax (
415345 """
416- let this : JSObject
346+ let jsObject : JSObject
417347 """
418348 ) . with ( \. trailingTrivia, . newlines( 2 ) )
419349
420350 DeclSyntax (
421351 """
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
432354 }
433355 """
434356 ) . with ( \. trailingTrivia, . newlines( 2 ) )
@@ -483,3 +405,61 @@ public struct ImportTS {
483405 )
484406 }
485407}
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