@@ -68,70 +68,16 @@ 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- )
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() " )
11078 )
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) )
13581 }
13682
13783 func call( returnType: BridgeType ) {
@@ -146,44 +92,20 @@ public struct ImportTS {
14692 }
14793
14894 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
17899 }
100+ body. append ( " return \( raw: returnType. swiftType) .bridgeJSLiftReturn(ret) " )
179101 }
180102
181103 func assignThis( returnType: BridgeType ) {
182104 guard case . jsObject = returnType else {
183105 preconditionFailure ( " assignThis can only be called with a jsObject return type " )
184106 }
185107 abiReturnType = . i32
186- body. append ( " self.this = JSObject(id: UInt32(bitPattern: ret)) " )
108+ body. append ( " self.jsObject = JSObject(id: UInt32(bitPattern: ret)) " )
187109 }
188110
189111 func renderImportDecl( ) -> DeclSyntax {
@@ -410,25 +332,22 @@ public struct ImportTS {
410332 let classDecl = try StructDeclSyntax (
411333 leadingTrivia: Self . renderDocumentation ( documentation: type. documentation) ,
412334 name: . identifier( name) ,
335+ inheritanceClause: InheritanceClauseSyntax (
336+ inheritedTypesBuilder: {
337+ InheritedTypeSyntax ( type: TypeSyntax ( " _JSBridgedClass " ) )
338+ }
339+ ) ,
413340 memberBlockBuilder: {
414341 DeclSyntax (
415342 """
416- let this : JSObject
343+ let jsObject : JSObject
417344 """
418345 ) . with ( \. trailingTrivia, . newlines( 2 ) )
419346
420347 DeclSyntax (
421348 """
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
432351 }
433352 """
434353 ) . with ( \. trailingTrivia, . newlines( 2 ) )
@@ -483,3 +402,61 @@ public struct ImportTS {
483402 )
484403 }
485404}
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