Skip to content

Commit b140fb2

Browse files
authored
Merge pull request #251 from rintaro/jextract-importeddecl-apikind
2 parents fce986a + 72bf28f commit b140fb2

9 files changed

+36
-33
lines changed

Sources/JExtractSwift/CDeclLowering/Swift2JavaTranslator+FunctionLowering.swift

Lines changed: 7 additions & 17 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,9 +509,10 @@ 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,
515+
as apiKind: SwiftAPIKind,
526516
stdlibTypes: SwiftStandardLibraryTypes
527517
) -> FunctionDeclSyntax {
528518

@@ -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
self.swiftDecl.signatureString
5461
}
@@ -66,10 +73,6 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
6673
try! loweredSignature.cFunctionDecl(cName: cName)
6774
}
6875

69-
package var kind: SwiftAPIKind {
70-
loweredSignature.apiKind
71-
}
72-
7376
var parentType: SwiftType? {
7477
guard let selfParameter = swiftSignature.selfParameter else {
7578
return nil
@@ -93,7 +96,7 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
9396
/// A display name to use to refer to the Swift declaration with its
9497
/// enclosing type, if there is one.
9598
public var displayName: String {
96-
let prefix = switch self.kind {
99+
let prefix = switch self.apiKind {
97100
case .getter: "getter:"
98101
case .setter: "setter:"
99102
case .function, .initializer: ""
@@ -112,18 +115,20 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
112115
module: String,
113116
swiftDecl: any DeclSyntaxProtocol,
114117
name: String,
118+
apiKind: SwiftAPIKind,
115119
translatedSignature: TranslatedFunctionSignature
116120
) {
117121
self.module = module
118122
self.name = name
119123
self.swiftDecl = swiftDecl
124+
self.apiKind = apiKind
120125
self.translatedSignature = translatedSignature
121126
}
122127

123128
public var description: String {
124129
"""
125130
ImportedFunc {
126-
kind: \(kind)
131+
apiKind: \(apiKind)
127132
module: \(module)
128133
name: \(name)
129134
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)