Skip to content

Commit f97cd46

Browse files
authored
Refactor how we pass swift names into SwiftQualifiedTypeName (#698)
1 parent 5cd3a68 commit f97cd46

13 files changed

Lines changed: 204 additions & 49 deletions

Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -913,10 +913,10 @@ extension FFMSwift2JavaGenerator {
913913
func translate(
914914
swiftType: SwiftType
915915
) throws -> JavaType {
916-
guard let nominalName = swiftType.asNominalTypeDeclaration?.name else {
916+
guard let nominalDecl = swiftType.asNominalTypeDeclaration else {
917917
throw JavaTranslationError.unhandledType(swiftType)
918918
}
919-
return .class(package: nil, name: nominalName)
919+
return .class(package: nil, name: nominalDecl.qualifiedName)
920920
}
921921
}
922922

Sources/JExtractSwiftLib/ImportedDecls.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,17 @@ package final class ImportedNominalType: ImportedDecl {
170170
.nominal(.init(nominalTypeDecl: swiftNominal))
171171
}
172172

173+
/// Structured Java-facing type name — "FishBox" for specialized, "Box" for base
174+
package var effectiveJavaTypeName: SwiftQualifiedTypeName {
175+
if let specializedTypeName {
176+
return SwiftQualifiedTypeName(specializedTypeName)
177+
}
178+
return swiftNominal.qualifiedTypeName
179+
}
180+
173181
/// The effective Java-facing name — "FishBox" for specialized, "Box" for base
174182
var effectiveJavaName: String {
175-
specializedTypeName ?? swiftNominal.qualifiedName
183+
effectiveJavaTypeName.fullName
176184
}
177185

178186
/// The simple Java class name (no qualification) for file naming purposes

Sources/JExtractSwiftLib/JNI/JNICaching.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@
1414

1515
enum JNICaching {
1616
static func cacheName(for type: ImportedNominalType) -> String {
17-
cacheName(for: type.effectiveJavaName)
17+
cacheName(for: type.effectiveJavaTypeName)
1818
}
1919

2020
static func cacheName(for type: SwiftNominalType) -> String {
21-
cacheName(for: type.nominalTypeDecl.qualifiedName)
21+
cacheName(for: type.nominalTypeDecl.qualifiedTypeName)
2222
}
2323

24-
private static func cacheName(for qualifiedName: String) -> String {
25-
"_JNI_\(qualifiedName.replacingOccurrences(of: ".", with: "_"))"
24+
private static func cacheName(for typeName: SwiftQualifiedTypeName) -> String {
25+
"_JNI_\(typeName.fullFlatName)"
2626
}
2727

2828
static func cacheMemberName(for enumCase: ImportedEnumCase) -> String {

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ extension JNISwift2JavaGenerator {
209209
private func printConcreteType(_ printer: inout CodePrinter, _ decl: ImportedNominalType) {
210210
let savedPrintingTypeName = self.currentPrintingTypeName
211211
let savedPrintingType = self.currentPrintingType
212-
self.currentPrintingTypeName = decl.effectiveJavaName
212+
self.currentPrintingTypeName = decl.effectiveJavaTypeName
213213
self.currentPrintingType = decl
214214
defer {
215215
self.currentPrintingTypeName = savedPrintingTypeName
@@ -798,7 +798,7 @@ extension JNISwift2JavaGenerator {
798798
// using the registry?
799799
let effectiveParentName = self.currentPrintingTypeName ?? translatedDecl.parentName
800800
let downcall =
801-
"\(effectiveParentName).\(translatedDecl.nativeFunctionName)(\(arguments.joined(separator: ", ")))"
801+
"\(effectiveParentName.fullName).\(translatedDecl.nativeFunctionName)(\(arguments.joined(separator: ", ")))"
802802

803803
//=== Part 4: Convert the return value.
804804
if translatedFunctionSignature.resultType.javaType.isVoid {

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ extension JNISwift2JavaGenerator {
102102
)
103103

104104
let methodName = "" // TODO: Used for closures, replace with better name?
105-
let parentName = "" // TODO: Used for closures, replace with better name?
105+
let parentName = SwiftQualifiedTypeName("") // TODO: Used for closures, replace with better name?
106106

107107
let translatedValues = try self.translateParameters(
108108
enumCase.parameters.map { ($0.name, $0.type) },
@@ -153,7 +153,7 @@ extension JNISwift2JavaGenerator {
153153
isThrowing: false,
154154
isAsync: false,
155155
nativeFunctionName: "$\(getAsCaseName)",
156-
parentName: enumName,
156+
parentName: SwiftQualifiedTypeName(enumName),
157157
functionTypes: [],
158158
translatedFunctionSignature: TranslatedFunctionSignature(
159159
selfParameter: TranslatedParameter(
@@ -230,12 +230,12 @@ extension JNISwift2JavaGenerator {
230230

231231
// Types with no parent will be outputted inside a "module" class.
232232
// For specialized types, use the Java-facing name as the parent scope
233-
let parentName: String
233+
let parentName: SwiftQualifiedTypeName
234234
if let parentNominal = decl.parentType?.asNominalType?.nominalTypeDecl {
235235
let importedParent = importedTypes.values.first { $0.swiftNominal === parentNominal }
236-
parentName = importedParent?.effectiveJavaName ?? parentNominal.qualifiedName
236+
parentName = importedParent?.effectiveJavaTypeName ?? parentNominal.qualifiedTypeName
237237
} else {
238-
parentName = swiftModuleName
238+
parentName = SwiftQualifiedTypeName(swiftModuleName)
239239
}
240240

241241
// Name.
@@ -300,7 +300,7 @@ extension JNISwift2JavaGenerator {
300300
func translateFunctionType(
301301
name: String,
302302
swiftType: SwiftFunctionType,
303-
parentName: String,
303+
parentName: SwiftQualifiedTypeName,
304304
) throws -> TranslatedFunctionType {
305305
var translatedParams: [TranslatedParameter] = []
306306

@@ -332,7 +332,7 @@ extension JNISwift2JavaGenerator {
332332
func translate(
333333
functionSignature: SwiftFunctionSignature,
334334
methodName: String,
335-
parentName: String,
335+
parentName: SwiftQualifiedTypeName,
336336
) throws -> TranslatedFunctionSignature {
337337
let parameters = try translateParameters(
338338
functionSignature.parameters.map { ($0.parameterName, $0.type) },
@@ -384,7 +384,7 @@ extension JNISwift2JavaGenerator {
384384
func translateParameters(
385385
_ parameters: [(name: String?, type: SwiftType)],
386386
methodName: String,
387-
parentName: String,
387+
parentName: SwiftQualifiedTypeName,
388388
genericParameters: [SwiftGenericParameterDeclaration],
389389
genericRequirements: [SwiftGenericRequirement],
390390
) throws -> [TranslatedParameter] {
@@ -405,7 +405,7 @@ extension JNISwift2JavaGenerator {
405405
func translateSelfParameter(
406406
_ selfParameter: SwiftSelfParameter?,
407407
methodName: String,
408-
parentName: String,
408+
parentName: SwiftQualifiedTypeName,
409409
genericParameters: [SwiftGenericParameterDeclaration],
410410
genericRequirements: [SwiftGenericRequirement],
411411
) throws -> TranslatedParameter? {
@@ -428,7 +428,7 @@ extension JNISwift2JavaGenerator {
428428
func translateSelfTypeParameter(
429429
_ selfParameter: SwiftSelfParameter?,
430430
methodName: String,
431-
parentName: String,
431+
parentName: SwiftQualifiedTypeName,
432432
genericParameters: [SwiftGenericParameterDeclaration],
433433
genericRequirements: [SwiftGenericRequirement],
434434
) throws -> TranslatedParameter? {
@@ -456,7 +456,7 @@ extension JNISwift2JavaGenerator {
456456
swiftType: SwiftType,
457457
parameterName: String,
458458
methodName: String,
459-
parentName: String,
459+
parentName: SwiftQualifiedTypeName,
460460
genericParameters: [SwiftGenericParameterDeclaration],
461461
genericRequirements: [SwiftGenericRequirement],
462462
parameterPosition: Int?,
@@ -577,7 +577,7 @@ extension JNISwift2JavaGenerator {
577577
return TranslatedParameter(
578578
parameter: JavaParameter(
579579
name: parameterName,
580-
type: .class(package: javaPackage, name: "\(parentName).\(methodName).\(parameterName)"),
580+
type: .class(package: javaPackage, name: "\(parentName.fullName).\(methodName).\(parameterName)"),
581581
annotations: parameterAnnotations,
582582
),
583583
conversion: .placeholder,
@@ -640,7 +640,7 @@ extension JNISwift2JavaGenerator {
640640
elements: [SwiftTupleElement],
641641
parameterName: String,
642642
methodName: String,
643-
parentName: String,
643+
parentName: SwiftQualifiedTypeName,
644644
genericParameters: [SwiftGenericParameterDeclaration],
645645
genericRequirements: [SwiftGenericRequirement],
646646
parameterPosition: Int?,
@@ -1668,7 +1668,7 @@ extension JNISwift2JavaGenerator {
16681668
let nativeFunctionName: String
16691669

16701670
/// The name of the Java parent scope this function is declared in
1671-
let parentName: String
1671+
let parentName: SwiftQualifiedTypeName
16721672

16731673
/// Functional interfaces required for the Java method.
16741674
let functionTypes: [TranslatedFunctionType]

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+NativeTranslation.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ extension JNISwift2JavaGenerator {
3131
functionSignature: SwiftFunctionSignature,
3232
translatedFunctionSignature: TranslatedFunctionSignature,
3333
methodName: String,
34-
parentName: String
34+
parentName: SwiftQualifiedTypeName
3535
) throws -> NativeFunctionSignature {
3636
let parameters = try zip(translatedFunctionSignature.parameters, functionSignature.parameters).map {
3737
translatedParameter,
@@ -93,7 +93,7 @@ extension JNISwift2JavaGenerator {
9393
type: SwiftType,
9494
parameterName: String,
9595
methodName: String,
96-
parentName: String,
96+
parentName: SwiftQualifiedTypeName,
9797
genericParameters: [SwiftGenericParameterDeclaration],
9898
genericRequirements: [SwiftGenericRequirement]
9999
) throws -> NativeParameter {
@@ -343,7 +343,7 @@ extension JNISwift2JavaGenerator {
343343
elements: [SwiftTupleElement],
344344
parameterName: String,
345345
methodName: String,
346-
parentName: String,
346+
parentName: SwiftQualifiedTypeName,
347347
genericParameters: [SwiftGenericParameterDeclaration],
348348
genericRequirements: [SwiftGenericRequirement]
349349
) throws -> NativeParameter {
@@ -376,7 +376,7 @@ extension JNISwift2JavaGenerator {
376376
protocolType: SwiftType,
377377
methodName: String,
378378
parameterName: String,
379-
parentName: String?
379+
parentName: SwiftQualifiedTypeName?
380380
) throws -> NativeParameter {
381381
switch protocolType {
382382
case .nominal(let nominalType):
@@ -411,7 +411,7 @@ extension JNISwift2JavaGenerator {
411411
protocolTypes: [SwiftNominalType],
412412
methodName: String,
413413
parameterName: String,
414-
parentName: String?
414+
parentName: SwiftQualifiedTypeName?
415415
) throws -> NativeParameter {
416416
// We allow Java implementations if we are able to generate the needed
417417
// Swift wrappers for all the protocol types.

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ extension JNISwift2JavaGenerator {
322322
private func printConcreteTypeThunks(_ printer: inout CodePrinter, _ type: ImportedNominalType) {
323323
let savedPrintingTypeName = self.currentPrintingTypeName
324324
let savedPrintingType = self.currentPrintingType
325-
self.currentPrintingTypeName = type.effectiveJavaName
325+
self.currentPrintingTypeName = type.effectiveJavaTypeName
326326
self.currentPrintingType = type
327327
defer {
328328
self.currentPrintingTypeName = savedPrintingTypeName
@@ -558,7 +558,7 @@ extension JNISwift2JavaGenerator {
558558
let swiftClassName = JNISwift2JavaGenerator.protocolParameterWrapperClassName(
559559
methodName: decl.name,
560560
parameterName: parameterName,
561-
parentName: decl.parentType?.asNominalType?.nominalTypeDecl.qualifiedName ?? swiftModuleName,
561+
parentName: decl.parentType?.asNominalType?.nominalTypeDecl.qualifiedTypeName ?? SwiftQualifiedTypeName(swiftModuleName),
562562
)
563563
let implementingProtocols = protocolWrappers.map(\.wrapperName).joined(separator: ", ")
564564

@@ -791,7 +791,7 @@ extension JNISwift2JavaGenerator {
791791
private func printCDecl(
792792
_ printer: inout CodePrinter,
793793
javaMethodName: String,
794-
parentName: String,
794+
parentName: SwiftQualifiedTypeName,
795795
parameters: [JavaParameter],
796796
resultType: JavaType,
797797
_ body: (inout CodePrinter) -> Void,
@@ -803,7 +803,7 @@ extension JNISwift2JavaGenerator {
803803
let cName =
804804
"Java_"
805805
+ self.javaPackage.replacingOccurrences(of: ".", with: "_")
806-
+ "_\(parentName.replacingOccurrences(of: ".", with: "$").escapedJNIIdentifier)_"
806+
+ "_\(parentName.jniEscapedName.escapedJNIIdentifier)_"
807807
+ javaMethodName.escapedJNIIdentifier
808808
+ "__"
809809
+ jniSignature.escapedJNIIdentifier
@@ -860,7 +860,7 @@ extension JNISwift2JavaGenerator {
860860
printCDecl(
861861
&printer,
862862
javaMethodName: "$typeMetadataAddressDowncall",
863-
parentName: type.effectiveJavaName,
863+
parentName: type.effectiveJavaTypeName,
864864
parameters: [],
865865
resultType: .long,
866866
) { printer in
@@ -896,7 +896,7 @@ extension JNISwift2JavaGenerator {
896896
printCDecl(
897897
&printer,
898898
javaMethodName: "$toByteArray",
899-
parentName: type.effectiveJavaName,
899+
parentName: type.effectiveJavaTypeName,
900900
parameters: [
901901
selfPointerParam
902902
],
@@ -917,7 +917,7 @@ extension JNISwift2JavaGenerator {
917917
printCDecl(
918918
&printer,
919919
javaMethodName: "$toByteArrayIndirectCopy",
920-
parentName: type.effectiveJavaName,
920+
parentName: type.effectiveJavaTypeName,
921921
parameters: [
922922
selfPointerParam
923923
],
@@ -1081,11 +1081,11 @@ extension JNISwift2JavaGenerator {
10811081
static func protocolParameterWrapperClassName(
10821082
methodName: String,
10831083
parameterName: String,
1084-
parentName: String?,
1084+
parentName: SwiftQualifiedTypeName?,
10851085
) -> String {
10861086
let parent =
10871087
if let parentName {
1088-
"\(parentName)_"
1088+
"\(parentName.fullFlatName)_"
10891089
} else {
10901090
""
10911091
}
@@ -1095,7 +1095,7 @@ extension JNISwift2JavaGenerator {
10951095

10961096
extension SwiftNominalTypeDeclaration {
10971097
private var safeProtocolName: String {
1098-
self.qualifiedName.replacingOccurrences(of: ".", with: "_")
1098+
self.flatName
10991099
}
11001100

11011101
/// The name of the corresponding `@JavaInterface` of this type.

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ package class JNISwift2JavaGenerator: Swift2JavaGenerator {
5555
/// The Java-facing name of the type currently being printed.
5656
/// Used to override cached parentName in translations (needed for specializations
5757
/// where the same ImportedFunc is shared between base and specialized types)
58-
var currentPrintingTypeName: String?
58+
var currentPrintingTypeName: SwiftQualifiedTypeName?
5959

6060
/// The type currently being printed (Java class or Swift thunks).
6161
/// Used to determine specialization context for correct code generation

Sources/JExtractSwiftLib/SwiftKit+Printing.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ extension SwiftKitPrinting {
5252

5353
extension SwiftKitPrinting.Names {
5454
static func getType(module: String, nominal: ImportedNominalType) -> String {
55-
"swiftjava_getType_\(module)_\(nominal.swiftNominal.qualifiedName)"
55+
"swiftjava_getType_\(module)_\(nominal.swiftNominal.qualifiedTypeName.fullFlatName)"
5656
}
5757

5858
}

Sources/JExtractSwiftLib/SwiftTypes/SwiftNominalTypeDeclaration.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,14 +147,25 @@ package class SwiftNominalTypeDeclaration: SwiftTypeDeclaration {
147147
return SwiftKnownTypeDeclKind(rawValue: "\(moduleName).\(name)")
148148
}
149149

150-
package var qualifiedName: String {
150+
/// Structured qualified type name built from the parent chain
151+
package var qualifiedTypeName: SwiftQualifiedTypeName {
151152
if let parent = self.parent {
152-
return parent.qualifiedName + "." + name
153+
return SwiftQualifiedTypeName(parent.qualifiedTypeName.components + [name])
153154
} else {
154-
return name
155+
return SwiftQualifiedTypeName(name)
155156
}
156157
}
157158

159+
package var qualifiedName: String {
160+
qualifiedTypeName.fullName
161+
}
162+
163+
/// Like `qualifiedName` but with dots replaced by underscores, suitable for
164+
/// use in C symbol names and Java identifiers
165+
package var flatName: String {
166+
qualifiedTypeName.fullFlatName
167+
}
168+
158169
var isReferenceType: Bool {
159170
switch kind {
160171
case .actor, .class:

0 commit comments

Comments
 (0)