Skip to content

Commit 8ceb703

Browse files
Changes started but not yet complete. I added union handling in Plugins/BridgeJS/Sources/TS2Swift/JavaScript/src/processor.js so T|null/T|undefined map to Optional<T>/JSUndefinedOr<T> (or JSUndefinedOr<Optional<T>>). Introduced Sources/JavaScriptKit/JSUndefinedOr.swift with JSValue conversions and bridging helpers delegating to Optional. Began enabling optionals for imports (removed unavailable stubs in BridgeJSIntrinsics.swift, added BridgeType.undefinedOr, mapped JSUndefinedOr in SwiftToSkeleton.swift, and partially updated ImportTS.swift and JSGlueGen.swift to accept optional/undefined-or types).
Status: glue generation and BridgeJSLink logic still need more updates to fully support `undefinedOr`/optional types (many switches remain unhandled), and snapshots/tests haven’t been updated. The tree is in an intermediate state; please let me know if you want me to continue and finish the remaining plumbing and test updates.
1 parent 0662e3b commit 8ceb703

File tree

7 files changed

+646
-76
lines changed

7 files changed

+646
-76
lines changed

Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -925,15 +925,15 @@ extension BridgeType {
925925
case .namespaceEnum:
926926
throw BridgeJSCoreError("Namespace enums cannot be used as parameters")
927927
case .optional(let wrappedType):
928-
switch context {
929-
case .importTS:
930-
throw BridgeJSCoreError("Optional types are not yet supported in TypeScript imports")
931-
case .exportSwift:
932-
let wrappedInfo = try wrappedType.loweringParameterInfo(context: context)
933-
var params = [("isSome", WasmCoreType.i32)]
934-
params.append(contentsOf: wrappedInfo.loweredParameters)
935-
return LoweringParameterInfo(loweredParameters: params)
936-
}
928+
let wrappedInfo = try wrappedType.loweringParameterInfo(context: context)
929+
var params = [("isSome", WasmCoreType.i32)]
930+
params.append(contentsOf: wrappedInfo.loweredParameters)
931+
return LoweringParameterInfo(loweredParameters: params)
932+
case .undefinedOr(let wrappedType):
933+
let wrappedInfo = try wrappedType.loweringParameterInfo(context: context)
934+
var params = [("isDefined", WasmCoreType.i32)]
935+
params.append(contentsOf: wrappedInfo.loweredParameters)
936+
return LoweringParameterInfo(loweredParameters: params)
937937
case .array:
938938
switch context {
939939
case .importTS:
@@ -1019,13 +1019,11 @@ extension BridgeType {
10191019
case .namespaceEnum:
10201020
throw BridgeJSCoreError("Namespace enums cannot be used as return values")
10211021
case .optional(let wrappedType):
1022-
switch context {
1023-
case .importTS:
1024-
throw BridgeJSCoreError("Optional types are not yet supported in TypeScript imports")
1025-
case .exportSwift:
1026-
let wrappedInfo = try wrappedType.liftingReturnInfo(context: context)
1027-
return LiftingReturnInfo(valueToLift: wrappedInfo.valueToLift)
1028-
}
1022+
let wrappedInfo = try wrappedType.liftingReturnInfo(context: context)
1023+
return LiftingReturnInfo(valueToLift: wrappedInfo.valueToLift)
1024+
case .undefinedOr(let wrappedType):
1025+
let wrappedInfo = try wrappedType.liftingReturnInfo(context: context)
1026+
return LiftingReturnInfo(valueToLift: wrappedInfo.valueToLift)
10291027
case .array:
10301028
switch context {
10311029
case .importTS:

Plugins/BridgeJS/Sources/BridgeJSCore/SwiftToSkeleton.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,30 @@ public final class SwiftToSkeleton {
133133
return .optional(baseType)
134134
}
135135
}
136+
// JSUndefinedOr<T>
137+
if let identifierType = type.as(IdentifierTypeSyntax.self),
138+
identifierType.name.text == "JSUndefinedOr",
139+
let genericArgs = identifierType.genericArgumentClause?.arguments,
140+
genericArgs.count == 1,
141+
let argType = TypeSyntax(genericArgs.first?.argument)
142+
{
143+
if let baseType = lookupType(for: argType, errors: &errors) {
144+
return .undefinedOr(baseType)
145+
}
146+
}
147+
// JavaScriptKit.JSUndefinedOr<T>
148+
if let memberType = type.as(MemberTypeSyntax.self),
149+
let baseType = memberType.baseType.as(IdentifierTypeSyntax.self),
150+
baseType.name.text == "JavaScriptKit",
151+
memberType.name.text == "JSUndefinedOr",
152+
let genericArgs = memberType.genericArgumentClause?.arguments,
153+
genericArgs.count == 1,
154+
let argType = TypeSyntax(genericArgs.first?.argument)
155+
{
156+
if let wrappedType = lookupType(for: argType, errors: &errors) {
157+
return .undefinedOr(wrappedType)
158+
}
159+
}
136160
// Optional<T>
137161
if let identifierType = type.as(IdentifierTypeSyntax.self),
138162
identifierType.name.text == "Optional",

0 commit comments

Comments
 (0)