Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 2 additions & 12 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -928,12 +928,7 @@ extension BridgeType {
return LoweringParameterInfo(loweredParameters: [("objectId", .i32)])
}
case .caseEnum:
switch context {
case .importTS:
throw BridgeJSCoreError("Enum types are not yet supported in TypeScript imports")
case .exportSwift:
return LoweringParameterInfo(loweredParameters: [("value", .i32)])
}
return LoweringParameterInfo(loweredParameters: [("value", .i32)])
case .rawValueEnum(_, let rawType):
if rawType == .string {
return .string
Expand Down Expand Up @@ -1011,12 +1006,7 @@ extension BridgeType {
return LiftingReturnInfo(valueToLift: .i32)
}
case .caseEnum:
switch context {
case .importTS:
throw BridgeJSCoreError("Enum types are not yet supported in TypeScript imports")
case .exportSwift:
return LiftingReturnInfo(valueToLift: .i32)
}
return LiftingReturnInfo(valueToLift: .i32)
case .rawValueEnum(_, let rawType):
let wasmType = rawType.wasmCoreType ?? .i32
return LiftingReturnInfo(valueToLift: wasmType)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
@JS enum Signal {
case start
case stop
}

// Case enums (no raw value) bridge as their `Int32` tag as imported-function
// parameters and return values.
@JSClass struct SignalControls {
@JSFunction func send(_ signal: Signal) throws(JSException)
@JSFunction func current() throws(JSException) -> Signal
@JSFunction static func roundTrip(_ signal: Signal) throws(JSException) -> Signal
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
{
"exported" : {
"classes" : [

],
"enums" : [
{
"cases" : [
{
"associatedValues" : [

],
"name" : "start"
},
{
"associatedValues" : [

],
"name" : "stop"
}
],
"emitStyle" : "const",
"name" : "Signal",
"staticMethods" : [

],
"staticProperties" : [

],
"swiftCallName" : "Signal",
"tsFullPath" : "Signal"
}
],
"exposeToGlobal" : false,
"functions" : [

],
"protocols" : [

],
"structs" : [

]
},
"imported" : {
"children" : [
{
"functions" : [

],
"types" : [
{
"accessLevel" : "internal",
"getters" : [

],
"methods" : [
{
"accessLevel" : "internal",
"effects" : {
"isAsync" : false,
"isStatic" : false,
"isThrows" : true
},
"name" : "send",
"parameters" : [
{
"name" : "signal",
"type" : {
"caseEnum" : {
"_0" : "Signal"
}
}
}
],
"returnType" : {
"void" : {

}
}
},
{
"accessLevel" : "internal",
"effects" : {
"isAsync" : false,
"isStatic" : false,
"isThrows" : true
},
"name" : "current",
"parameters" : [

],
"returnType" : {
"caseEnum" : {
"_0" : "Signal"
}
}
}
],
"name" : "SignalControls",
"setters" : [

],
"staticMethods" : [
{
"accessLevel" : "internal",
"effects" : {
"isAsync" : false,
"isStatic" : false,
"isThrows" : true
},
"name" : "roundTrip",
"parameters" : [
{
"name" : "signal",
"type" : {
"caseEnum" : {
"_0" : "Signal"
}
}
}
],
"returnType" : {
"caseEnum" : {
"_0" : "Signal"
}
}
}
]
}
]
}
]
},
"moduleName" : "TestModule",
"usedExternalModules" : [

]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
extension Signal: _BridgedSwiftCaseEnum {
@_spi(BridgeJS) @_transparent public consuming func bridgeJSLowerParameter() -> Int32 {
return bridgeJSRawValue
}
@_spi(BridgeJS) @_transparent public static func bridgeJSLiftReturn(_ value: Int32) -> Signal {
return bridgeJSLiftParameter(value)
}
@_spi(BridgeJS) @_transparent public static func bridgeJSLiftParameter(_ value: Int32) -> Signal {
return Signal(bridgeJSRawValue: value)!
}
@_spi(BridgeJS) @_transparent public consuming func bridgeJSLowerReturn() -> Int32 {
return bridgeJSLowerParameter()
}

@_spi(BridgeJS) @usableFromInline init?(bridgeJSRawValue: Int32) {
switch bridgeJSRawValue {
case 0:
self = .start
case 1:
self = .stop
default:
return nil
}
}

@_spi(BridgeJS) @usableFromInline var bridgeJSRawValue: Int32 {
switch self {
case .start:
return 0
case .stop:
return 1
}
}
}

#if arch(wasm32)
@_extern(wasm, module: "TestModule", name: "bjs_SignalControls_roundTrip_static")
fileprivate func bjs_SignalControls_roundTrip_static_extern(_ signal: Int32) -> Int32
#else
fileprivate func bjs_SignalControls_roundTrip_static_extern(_ signal: Int32) -> Int32 {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func bjs_SignalControls_roundTrip_static(_ signal: Int32) -> Int32 {
return bjs_SignalControls_roundTrip_static_extern(signal)
}

#if arch(wasm32)
@_extern(wasm, module: "TestModule", name: "bjs_SignalControls_send")
fileprivate func bjs_SignalControls_send_extern(_ self: Int32, _ signal: Int32) -> Void
#else
fileprivate func bjs_SignalControls_send_extern(_ self: Int32, _ signal: Int32) -> Void {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func bjs_SignalControls_send(_ self: Int32, _ signal: Int32) -> Void {
return bjs_SignalControls_send_extern(self, signal)
}

#if arch(wasm32)
@_extern(wasm, module: "TestModule", name: "bjs_SignalControls_current")
fileprivate func bjs_SignalControls_current_extern(_ self: Int32) -> Int32
#else
fileprivate func bjs_SignalControls_current_extern(_ self: Int32) -> Int32 {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func bjs_SignalControls_current(_ self: Int32) -> Int32 {
return bjs_SignalControls_current_extern(self)
}

func _$SignalControls_roundTrip(_ signal: Signal) throws(JSException) -> Signal {
let signalValue = signal.bridgeJSLowerParameter()
let ret = bjs_SignalControls_roundTrip_static(signalValue)
if let error = _swift_js_take_exception() {
throw error
}
return Signal.bridgeJSLiftReturn(ret)
}

func _$SignalControls_send(_ self: JSObject, _ signal: Signal) throws(JSException) -> Void {
let selfValue = self.bridgeJSLowerParameter()
let signalValue = signal.bridgeJSLowerParameter()
bjs_SignalControls_send(selfValue, signalValue)
if let error = _swift_js_take_exception() {
throw error
}
}

func _$SignalControls_current(_ self: JSObject) throws(JSException) -> Signal {
let selfValue = self.bridgeJSLowerParameter()
let ret = bjs_SignalControls_current(selfValue)
if let error = _swift_js_take_exception() {
throw error
}
return Signal.bridgeJSLiftReturn(ret)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// NOTICE: This is auto-generated code by BridgeJS from JavaScriptKit,
// DO NOT EDIT.
//
// To update this file, just rebuild your project or run
// `swift package bridge-js`.

export const SignalValues: {
readonly Start: 0;
readonly Stop: 1;
};
export type SignalTag = typeof SignalValues[keyof typeof SignalValues];

export type SignalObject = typeof SignalValues;

export interface SignalControls {
send(signal: SignalTag): void;
current(): SignalTag;
}
export type Exports = {
Signal: SignalObject
}
export type Imports = {
SignalControls: {
roundTrip(signal: SignalTag): SignalTag;
}
}
export function createInstantiator(options: {
imports: Imports;
}, swift: any): Promise<{
addImports: (importObject: WebAssembly.Imports) => void;
setInstance: (instance: WebAssembly.Instance) => void;
createExports: (instance: WebAssembly.Instance) => Exports;
}>;
Loading
Loading