Skip to content

Commit 07e507f

Browse files
committed
[JExtract] Move 'apiKind' property to 'ImportedFunc'
It was weird "the lowered signature" being the owner of the API kind information, and it was only used for rendering. Move it to `ImportedFunc` and pass it to `LoweredFunctionSignature.cdeclThunk()` API.
1 parent 99fc99c commit 07e507f

9 files changed

+37
-34
lines changed

Sources/JExtractSwift/CDeclLowering/Swift2JavaTranslator+FunctionLowering.swift

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ extension Swift2JavaTranslator {
2929
enclosingType: try enclosingType.map { try SwiftType($0, symbolTable: symbolTable) },
3030
symbolTable: symbolTable
3131
)
32-
return try CdeclLowering(swiftStdlibTypes: swiftStdlibTypes).lowerFunctionSignature(signature, apiKind: .function)
32+
return try CdeclLowering(swiftStdlibTypes: swiftStdlibTypes).lowerFunctionSignature(signature)
3333
}
3434

3535
/// Lower the given initializer to a C-compatible entrypoint,
@@ -46,7 +46,7 @@ extension Swift2JavaTranslator {
4646
symbolTable: symbolTable
4747
)
4848

49-
return try CdeclLowering(swiftStdlibTypes: swiftStdlibTypes).lowerFunctionSignature(signature, apiKind: .initializer)
49+
return try CdeclLowering(swiftStdlibTypes: swiftStdlibTypes).lowerFunctionSignature(signature)
5050
}
5151

5252
/// Lower the given variable decl to a C-compatible entrypoint,
@@ -69,7 +69,7 @@ extension Swift2JavaTranslator {
6969
enclosingType: try enclosingType.map { try SwiftType($0, symbolTable: symbolTable) },
7070
symbolTable: symbolTable
7171
)
72-
return try CdeclLowering(swiftStdlibTypes: swiftStdlibTypes).lowerFunctionSignature(signature, apiKind: isSet ? .setter : .getter)
72+
return try CdeclLowering(swiftStdlibTypes: swiftStdlibTypes).lowerFunctionSignature(signature)
7373
}
7474
}
7575

@@ -82,8 +82,7 @@ struct CdeclLowering {
8282
///
8383
/// Throws an error if this function cannot be lowered for any reason.
8484
func lowerFunctionSignature(
85-
_ signature: SwiftFunctionSignature,
86-
apiKind: SwiftAPIKind
85+
_ signature: SwiftFunctionSignature
8786
) throws -> LoweredFunctionSignature {
8887
// Lower the self parameter.
8988
let loweredSelf: LoweredParameter? = switch signature.selfParameter {
@@ -111,7 +110,6 @@ struct CdeclLowering {
111110

112111
return LoweredFunctionSignature(
113112
original: signature,
114-
apiKind: apiKind,
115113
selfParameter: loweredSelf,
116114
parameters: loweredParameters,
117115
result: loweredResult
@@ -436,13 +434,6 @@ struct CdeclLowering {
436434
}
437435
}
438436

439-
package enum SwiftAPIKind {
440-
case function
441-
case initializer
442-
case getter
443-
case setter
444-
}
445-
446437
/// Represent a Swift parameter in the cdecl thunk.
447438
struct LoweredParameter: Equatable {
448439
/// Lowered parameters in cdecl thunk.
@@ -487,8 +478,6 @@ extension LoweredResult {
487478
public struct LoweredFunctionSignature: Equatable {
488479
var original: SwiftFunctionSignature
489480

490-
var apiKind: SwiftAPIKind
491-
492481
var selfParameter: LoweredParameter?
493482
var parameters: [LoweredParameter]
494483
var result: LoweredResult
@@ -520,10 +509,11 @@ public struct LoweredFunctionSignature: Equatable {
520509
extension LoweredFunctionSignature {
521510
/// Produce the `@_cdecl` thunk for this lowered function signature that will
522511
/// call into the original function.
523-
public func cdeclThunk(
512+
package func cdeclThunk(
524513
cName: String,
525514
swiftAPIName: String,
526-
stdlibTypes: SwiftStandardLibraryTypes
515+
as apiKind: SwiftAPIKind,
516+
stdlibTypes: SwiftStandardLibraryTypes,
527517
) -> FunctionDeclSyntax {
528518

529519
let cdeclParams = allLoweredParameters.map(\.description).joined(separator: ", ")
@@ -563,7 +553,7 @@ extension LoweredFunctionSignature {
563553

564554
// Build callee expression.
565555
let callee: ExprSyntax = if let selfExpr {
566-
if case .initializer = self.apiKind {
556+
if case .initializer = apiKind {
567557
// Don't bother to create explicit ${Self}.init expression.
568558
selfExpr
569559
} else {

Sources/JExtractSwift/ImportedDecls.swift

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ import SwiftSyntax
1717
/// Any imported (Swift) declaration
1818
protocol ImportedDecl: AnyObject {}
1919

20-
public typealias JavaPackage = String
20+
package enum SwiftAPIKind {
21+
case function
22+
case initializer
23+
case getter
24+
case setter
25+
}
2126

2227
/// Describes a Swift nominal type (e.g., a class, struct, enum) that has been
2328
/// imported and is being translated into Java.
@@ -49,6 +54,8 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
4954

5055
var translatedSignature: TranslatedFunctionSignature
5156

57+
package var apiKind: SwiftAPIKind
58+
5259
public var signatureString: String {
5360
// FIXME: Remove comments and normalize trivia.
5461
self.swiftDecl.signatureString
@@ -67,10 +74,6 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
6774
try! loweredSignature.cFunctionDecl(cName: cName)
6875
}
6976

70-
package var kind: SwiftAPIKind {
71-
loweredSignature.apiKind
72-
}
73-
7477
var parentType: SwiftType? {
7578
guard let selfParameter = swiftSignature.selfParameter else {
7679
return nil
@@ -94,7 +97,7 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
9497
/// A display name to use to refer to the Swift declaration with its
9598
/// enclosing type, if there is one.
9699
public var displayName: String {
97-
let prefix = switch self.kind {
100+
let prefix = switch self.apiKind {
98101
case .getter: "getter:"
99102
case .setter: "setter:"
100103
case .function, .initializer: ""
@@ -113,18 +116,20 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
113116
module: String,
114117
swiftDecl: any DeclSyntaxProtocol,
115118
name: String,
119+
apiKind: SwiftAPIKind,
116120
translatedSignature: TranslatedFunctionSignature
117121
) {
118122
self.module = module
119123
self.name = name
120124
self.swiftDecl = swiftDecl
125+
self.apiKind = apiKind
121126
self.translatedSignature = translatedSignature
122127
}
123128

124129
public var description: String {
125130
"""
126131
ImportedFunc {
127-
kind: \(kind)
132+
apiKind: \(apiKind)
128133
module: \(module)
129134
name: \(name)
130135
signature: \(self.swiftDecl.signatureString)

Sources/JExtractSwift/Swift2JavaTranslator+JavaBindingsPrinting.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ extension Swift2JavaTranslator {
122122
public func printJavaBindingWrapperMethod(
123123
_ printer: inout CodePrinter,
124124
_ decl: ImportedFunc) {
125-
let methodName: String = switch decl.kind {
125+
let methodName: String = switch decl.apiKind {
126126
case .getter: "get\(decl.name.toCamelCase)"
127127
case .setter: "set\(decl.name.toCamelCase)"
128128
case .function, .initializer: decl.name

Sources/JExtractSwift/Swift2JavaTranslator+JavaTranslation.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@ import JavaTypes
1616

1717
extension Swift2JavaTranslator {
1818
func translate(
19-
swiftSignature: SwiftFunctionSignature,
20-
as apiKind: SwiftAPIKind
19+
swiftSignature: SwiftFunctionSignature
2120
) throws -> TranslatedFunctionSignature {
2221
let lowering = CdeclLowering(swiftStdlibTypes: self.swiftStdlibTypes)
23-
let loweredSignature = try lowering.lowerFunctionSignature(swiftSignature, apiKind: apiKind)
22+
let loweredSignature = try lowering.lowerFunctionSignature(swiftSignature)
2423

2524
let translation = JavaTranslation(swiftStdlibTypes: self.swiftStdlibTypes)
2625
let translated = try translation.translate(loweredFunctionSignature: loweredSignature)

Sources/JExtractSwift/Swift2JavaVisitor.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ final class Swift2JavaVisitor: SyntaxVisitor {
128128
enclosingType: self.currentSwiftType,
129129
symbolTable: self.translator.symbolTable
130130
)
131-
translatedSignature = try translator.translate(swiftSignature: swiftSignature, as: .function)
131+
translatedSignature = try translator.translate(swiftSignature: swiftSignature)
132132
} catch {
133133
self.log.debug("Failed to translate: '\(node.qualifiedNameForDebug)'; \(error)")
134134
return .skipChildren
@@ -138,6 +138,7 @@ final class Swift2JavaVisitor: SyntaxVisitor {
138138
module: translator.swiftModuleName,
139139
swiftDecl: node,
140140
name: node.name.text,
141+
apiKind: .function,
141142
translatedSignature: translatedSignature
142143
)
143144

@@ -173,7 +174,7 @@ final class Swift2JavaVisitor: SyntaxVisitor {
173174
enclosingType: self.currentSwiftType,
174175
symbolTable: self.translator.symbolTable
175176
)
176-
translatedSignature = try translator.translate(swiftSignature: swiftSignature, as: kind)
177+
translatedSignature = try translator.translate(swiftSignature: swiftSignature)
177178
} catch {
178179
self.log.debug("Failed to translate: \(node.qualifiedNameForDebug); \(error)")
179180
throw error
@@ -183,6 +184,7 @@ final class Swift2JavaVisitor: SyntaxVisitor {
183184
module: translator.swiftModuleName,
184185
swiftDecl: node,
185186
name: varName,
187+
apiKind: kind,
186188
translatedSignature: translatedSignature
187189
)
188190

@@ -227,7 +229,7 @@ final class Swift2JavaVisitor: SyntaxVisitor {
227229
enclosingType: self.currentSwiftType,
228230
symbolTable: self.translator.symbolTable
229231
)
230-
translatedSignature = try translator.translate(swiftSignature: swiftSignature, as: .initializer)
232+
translatedSignature = try translator.translate(swiftSignature: swiftSignature)
231233
} catch {
232234
self.log.debug("Failed to translate: \(node.qualifiedNameForDebug); \(error)")
233235
return .skipChildren
@@ -236,6 +238,7 @@ final class Swift2JavaVisitor: SyntaxVisitor {
236238
module: translator.swiftModuleName,
237239
swiftDecl: node,
238240
name: "init",
241+
apiKind: .initializer,
239242
translatedSignature: translatedSignature
240243
)
241244

Sources/JExtractSwift/SwiftThunkTranslator.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ struct SwiftThunkTranslator {
178178
let thunkFunc = decl.loweredSignature.cdeclThunk(
179179
cName: thunkName,
180180
swiftAPIName: decl.name,
181+
as: decl.apiKind,
181182
stdlibTypes: st.swiftStdlibTypes
182183
)
183184
return [DeclSyntax(thunkFunc)]

Sources/JExtractSwift/ThunkNameRegistry.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ package struct ThunkNameRegistry {
3131
}
3232

3333
let suffix: String
34-
switch decl.kind {
34+
switch decl.apiKind {
3535
case .getter:
3636
suffix = "$get"
3737
case .setter:

Tests/JExtractSwiftTests/Asserts/LoweringAssertions.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,26 +43,30 @@ func assertLoweredFunction(
4343
translator.prepareForTranslation()
4444

4545
let swiftFunctionName: String
46+
let apiKind: SwiftAPIKind
4647
let loweredFunction: LoweredFunctionSignature
4748
if let inputFunction = inputDecl.as(FunctionDeclSyntax.self) {
4849
loweredFunction = try translator.lowerFunctionSignature(
4950
inputFunction,
5051
enclosingType: enclosingType
5152
)
5253
swiftFunctionName = inputFunction.name.text
54+
apiKind = .function
5355
} else if let inputInitializer = inputDecl.as(InitializerDeclSyntax.self) {
5456
loweredFunction = try translator.lowerFunctionSignature(
5557
inputInitializer,
5658
enclosingType: enclosingType
5759
)
5860
swiftFunctionName = "init"
61+
apiKind = .initializer
5962
} else {
6063
fatalError("Unhandling declaration kind for lowering")
6164
}
6265

6366
let loweredCDecl = loweredFunction.cdeclThunk(
6467
cName: "c_\(swiftFunctionName)",
6568
swiftAPIName: swiftFunctionName,
69+
as: apiKind,
6670
stdlibTypes: translator.swiftStdlibTypes
6771
)
6872

@@ -124,6 +128,7 @@ func assertLoweredVariableAccessor(
124128
let loweredCDecl = loweredFunction?.cdeclThunk(
125129
cName: "c_\(swiftVariableName)",
126130
swiftAPIName: swiftVariableName,
131+
as: isSet ? .setter : .getter,
127132
stdlibTypes: translator.swiftStdlibTypes
128133
)
129134

Tests/JExtractSwiftTests/FunctionDescriptorImportTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ extension FunctionDescriptorTests {
271271
let accessorDecl: ImportedFunc? =
272272
st.importedTypes.values.compactMap {
273273
$0.variables.first {
274-
$0.name == identifier && $0.kind == accessorKind
274+
$0.name == identifier && $0.apiKind == accessorKind
275275
}
276276
}.first
277277
guard let accessorDecl else {

0 commit comments

Comments
 (0)