Skip to content

Commit cd87411

Browse files
committed
[JExtract] Move 'apiKind' property to 'ImportedDecl'
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 cd87411

9 files changed

+31
-26
lines changed

Sources/JExtractSwift/CDeclLowering/Swift2JavaTranslator+FunctionLowering.swift

Lines changed: 8 additions & 11 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
@@ -487,8 +485,6 @@ extension LoweredResult {
487485
public struct LoweredFunctionSignature: Equatable {
488486
var original: SwiftFunctionSignature
489487

490-
var apiKind: SwiftAPIKind
491-
492488
var selfParameter: LoweredParameter?
493489
var parameters: [LoweredParameter]
494490
var result: LoweredResult
@@ -520,10 +516,11 @@ public struct LoweredFunctionSignature: Equatable {
520516
extension LoweredFunctionSignature {
521517
/// Produce the `@_cdecl` thunk for this lowered function signature that will
522518
/// call into the original function.
523-
public func cdeclThunk(
519+
package func cdeclThunk(
524520
cName: String,
525521
swiftAPIName: String,
526-
stdlibTypes: SwiftStandardLibraryTypes
522+
as apiKind: SwiftAPIKind,
523+
stdlibTypes: SwiftStandardLibraryTypes,
527524
) -> FunctionDeclSyntax {
528525

529526
let cdeclParams = allLoweredParameters.map(\.description).joined(separator: ", ")
@@ -563,7 +560,7 @@ extension LoweredFunctionSignature {
563560

564561
// Build callee expression.
565562
let callee: ExprSyntax = if let selfExpr {
566-
if case .initializer = self.apiKind {
563+
if case .initializer = apiKind {
567564
// Don't bother to create explicit ${Self}.init expression.
568565
selfExpr
569566
} else {

Sources/JExtractSwift/ImportedDecls.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
4949

5050
var translatedSignature: TranslatedFunctionSignature
5151

52+
package var apiKind: SwiftAPIKind
53+
5254
public var signatureString: String {
5355
// FIXME: Remove comments and normalize trivia.
5456
self.swiftDecl.signatureString
@@ -67,10 +69,6 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
6769
try! loweredSignature.cFunctionDecl(cName: cName)
6870
}
6971

70-
package var kind: SwiftAPIKind {
71-
loweredSignature.apiKind
72-
}
73-
7472
var parentType: SwiftType? {
7573
guard let selfParameter = swiftSignature.selfParameter else {
7674
return nil
@@ -94,7 +92,7 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
9492
/// A display name to use to refer to the Swift declaration with its
9593
/// enclosing type, if there is one.
9694
public var displayName: String {
97-
let prefix = switch self.kind {
95+
let prefix = switch self.apiKind {
9896
case .getter: "getter:"
9997
case .setter: "setter:"
10098
case .function, .initializer: ""
@@ -113,18 +111,20 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
113111
module: String,
114112
swiftDecl: any DeclSyntaxProtocol,
115113
name: String,
114+
apiKind: SwiftAPIKind,
116115
translatedSignature: TranslatedFunctionSignature
117116
) {
118117
self.module = module
119118
self.name = name
120119
self.swiftDecl = swiftDecl
120+
self.apiKind = apiKind
121121
self.translatedSignature = translatedSignature
122122
}
123123

124124
public var description: String {
125125
"""
126126
ImportedFunc {
127-
kind: \(kind)
127+
apiKind: \(apiKind)
128128
module: \(module)
129129
name: \(name)
130130
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)