Skip to content
Open
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
52 changes: 27 additions & 25 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1425,7 +1425,7 @@ struct ProtocolCodegen {
for method in proto.methods {
let builder = try ImportTS.CallJSEmission(
moduleName: moduleName,
abiName: "_extern_\(method.name)",
abiName: method.abiName,
effects: method.effects,
returnType: method.returnType,
context: .exportSwift
Expand All @@ -1450,7 +1450,7 @@ struct ProtocolCodegen {
printer: externDeclPrinter,
moduleName: moduleName,
abiName: method.abiName,
functionName: "_extern_\(method.name)",
functionName: method.abiName,
abiParameters: builder.abiParameterSignatures,
returnType: builder.abiReturnType
)
Expand Down Expand Up @@ -1478,32 +1478,34 @@ struct ProtocolCodegen {
externDecls.append(contentsOf: propertyExternDecls)
}

let structDeclPrinter = CodeFragmentPrinter()
structDeclPrinter.write("struct \(wrapperName): \(protocolName), _BridgedSwiftProtocolWrapper {")
structDeclPrinter.indent {
structDeclPrinter.write("let jsObject: JSObject")
structDeclPrinter.nextLine()

for methodDecl in methodDecls {
structDeclPrinter.write(lines: methodDecl.lines)
structDeclPrinter.nextLine()
}

for decl in propertyDecls {
structDeclPrinter.write(lines: decl.lines)
structDeclPrinter.nextLine()
var decls: [DeclSyntax] = []
if !methodDecls.isEmpty || !propertyDecls.isEmpty {
let extensionPrinter = CodeFragmentPrinter()
extensionPrinter.write("extension \(protocolName) where Self: _BridgedSwiftProtocolWrapper {")
extensionPrinter.indent {
var first = true
for decl in methodDecls + propertyDecls {
if !first { extensionPrinter.nextLine() }
first = false
extensionPrinter.write(lines: decl.lines)
}
}
structDeclPrinter.write(
multilineString: """
static func bridgeJSLiftParameter(_ value: Int32) -> Self {
return \(wrapperName)(jsObject: JSObject(id: UInt32(bitPattern: value)))
}
"""
)
extensionPrinter.write("}")
decls.append("\(raw: extensionPrinter.lines.joined(separator: "\n"))")
}
structDeclPrinter.write("}")

return ["\(raw: structDeclPrinter.lines.joined(separator: "\n"))"] + externDecls
decls.append(
"""
struct \(raw: wrapperName): \(raw: protocolName), _BridgedSwiftProtocolWrapper {
let jsObject: JSObject

static func bridgeJSLiftParameter(_ value: Int32) -> Self {
return \(raw: wrapperName)(jsObject: JSObject(id: UInt32(bitPattern: value)))
}
}
"""
)
return decls + externDecls
}

private func renderProtocolProperty(
Expand Down
15 changes: 12 additions & 3 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ExternalModuleIndex.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ public struct ExternalModuleIndex {
public struct ExternalType: Equatable {
public let moduleName: String
public let bridgeType: BridgeType
public var isGenericBridgeableProtocol = false
}

public enum LookupResult: Equatable {
Expand All @@ -31,8 +32,12 @@ public struct ExternalModuleIndex {
guard let exported = skeleton.exported else { continue }
var moduleEntries = entriesByModule[moduleName] ?? [:]

func register(dotPath: String, bridgeType: BridgeType) {
let externalType = ExternalType(moduleName: moduleName, bridgeType: bridgeType)
func register(dotPath: String, bridgeType: BridgeType, isGenericBridgeableProtocol: Bool = false) {
let externalType = ExternalType(
moduleName: moduleName,
bridgeType: bridgeType,
isGenericBridgeableProtocol: isGenericBridgeableProtocol
)
if moduleEntries[dotPath] == nil {
moduleEntries[dotPath] = externalType
entriesByDotPath[dotPath, default: []].append(externalType)
Expand Down Expand Up @@ -61,7 +66,11 @@ public struct ExternalModuleIndex {
register(dotPath: enumDef.swiftCallName, bridgeType: bridgeType)
}
for proto in exported.protocols {
register(dotPath: proto.name, bridgeType: .swiftProtocol(proto.name))
register(
dotPath: proto.name,
bridgeType: .swiftProtocol(proto.name),
isGenericBridgeableProtocol: proto.isGenericBridgeable == true
)
}
for alias in exported.aliases {
register(
Expand Down
18 changes: 12 additions & 6 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,7 @@ public struct ImportTS {
parameters: [Parameter],
returnType: BridgeType,
effects: Effects,
genericParameters: [String] = []
genericParameters: [GenericParameter] = []
) -> DeclSyntax {
let printer = CodeFragmentPrinter()
let signature = SwiftSignatureBuilder.buildFunctionSignature(
Expand All @@ -393,7 +393,13 @@ public struct ImportTS {
let genericClause =
genericParameters.isEmpty
? ""
: "<" + genericParameters.map { "\($0): BridgedSwiftGenericBridgeable" }.joined(separator: ", ")
: "<"
+ genericParameters.map { genericParameter in
let constraints =
["BridgedSwiftGenericBridgeable"]
+ (genericParameter.swiftConstraints ?? genericParameter.constraints)
return "\(genericParameter.name): \(constraints.joined(separator: " & "))"
}.joined(separator: ", ")
+ ">"
printer.write("func \(name.backtickIfNeeded())\(genericClause)\(signature) {")
printer.indent {
Expand Down Expand Up @@ -465,7 +471,7 @@ public struct ImportTS {
parameters: function.parameters,
returnType: function.returnType,
effects: function.effects,
genericParameters: function.genericParameterNames
genericParameters: function.genericParameters ?? []
)
.with(\.leadingTrivia, Self.renderDocumentation(documentation: function.documentation))
]
Expand Down Expand Up @@ -496,7 +502,7 @@ public struct ImportTS {
parameters: [selfParameter] + method.parameters,
returnType: method.returnType,
effects: method.effects,
genericParameters: method.genericParameterNames
genericParameters: method.genericParameters ?? []
)
]
}
Expand All @@ -522,7 +528,7 @@ public struct ImportTS {
parameters: method.parameters,
returnType: method.returnType,
effects: method.effects,
genericParameters: method.genericParameterNames
genericParameters: method.genericParameters ?? []
)
]
}
Expand All @@ -548,7 +554,7 @@ public struct ImportTS {
parameters: constructor.parameters,
returnType: .jsObject(nil),
effects: effects,
genericParameters: constructor.genericParameterNames
genericParameters: constructor.genericParameters ?? []
)
]
}
Expand Down
Loading
Loading