Skip to content

Commit 61995aa

Browse files
committed
Fix typo, properly handle invoking subscripts in cdecl function.
1 parent 2977c8a commit 61995aa

8 files changed

+50
-19
lines changed

Sources/JExtractSwiftLib/FFM/CDeclLowering/FFMSwift2JavaGenerator+FunctionLowering.swift

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -812,11 +812,10 @@ extension LoweredFunctionSignature {
812812

813813
// Build callee expression.
814814
let callee: ExprSyntax = if let selfExpr {
815-
if case .initializer = apiKind {
815+
switch apiKind {
816816
// Don't bother to create explicit ${Self}.init expression.
817-
selfExpr
818-
} else {
819-
ExprSyntax(MemberAccessExprSyntax(base: selfExpr, name: .identifier(swiftAPIName)))
817+
case .initializer, .subscriptGetter, .subscriptSetter: selfExpr
818+
default: ExprSyntax(MemberAccessExprSyntax(base: selfExpr, name: .identifier(swiftAPIName)))
820819
}
821820
} else {
822821
ExprSyntax(DeclReferenceExprSyntax(baseName: .identifier(swiftAPIName)))
@@ -845,6 +844,18 @@ extension LoweredFunctionSignature {
845844
case .enumCase:
846845
// This should not be called, but let's fatalError.
847846
fatalError("Enum cases are not supported with FFM.")
847+
848+
case .subscriptGetter:
849+
let parameters = paramExprs.map { $0.description }.joined(separator: ", ")
850+
resultExpr = "\(callee)[\(raw: parameters)]"
851+
case .subscriptSetter:
852+
assert(paramExprs.count >= 1)
853+
854+
var argumentsWithoutNewValue = paramExprs
855+
let newValueArgument = argumentsWithoutNewValue.removeLast()
856+
857+
let parameters = argumentsWithoutNewValue.map { $0.description }.joined(separator: ", ")
858+
resultExpr = "\(callee)[\(raw: parameters)] = \(newValueArgument)"
848859
}
849860

850861
// Lower the result.

Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ extension FFMSwift2JavaGenerator {
144144

145145
// Name.
146146
let javaName = switch decl.apiKind {
147-
case .getter: decl.javaGetterName
148-
case .setter: decl.javaSetterName
147+
case .getter, .subscriptGetter: decl.javaGetterName
148+
case .setter, .subscriptSetter: decl.javaSetterName
149149
case .function, .initializer, .enumCase: decl.name
150150
}
151151

Sources/JExtractSwiftLib/ImportedDecls.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ package enum SwiftAPIKind {
2323
case getter
2424
case setter
2525
case enumCase
26+
case subscriptGetter
27+
case subscriptSetter
2628
}
2729

2830
/// Describes a Swift nominal type (e.g., a class, struct, enum) that has been
@@ -179,6 +181,8 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
179181
case .setter: "setter:"
180182
case .enumCase: "case:"
181183
case .function, .initializer: ""
184+
case .subscriptGetter: "subscriptGetter:"
185+
case .subscriptSetter: "subscriptSetter:"
182186
}
183187

184188
let context = if let parentType {

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ extension JNISwift2JavaGenerator {
176176

177177
// Name.
178178
let javaName = switch decl.apiKind {
179-
case .getter: decl.javaGetterName
180-
case .setter: decl.javaSetterName
179+
case .getter, .subscriptGetter: decl.javaGetterName
180+
case .setter, .subscriptSetter: decl.javaSetterName
181181
case .function, .initializer, .enumCase: decl.name
182182
}
183183

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,19 @@ extension JNISwift2JavaGenerator {
348348
}
349349

350350
result = "\(callee).\(decl.name) = \(newValueArgument)"
351+
case .subscriptGetter:
352+
let parameters = arguments.joined(separator: ", ")
353+
result = "\(callee)[\(parameters)]"
354+
case .subscriptSetter:
355+
guard let newValueArgument = arguments.last else {
356+
fatalError("Setter did not contain newValue parameter: \(decl)")
357+
}
358+
359+
var argumentsWithoutNewValue = arguments
360+
argumentsWithoutNewValue.removeLast()
361+
362+
let parameters = argumentsWithoutNewValue.joined(separator: ", ")
363+
result = "\(callee)[\(parameters)] = \(newValueArgument)"
351364
}
352365

353366
// Lower the result.

Sources/JExtractSwiftLib/Swift2JavaVisitor.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,19 +287,20 @@ final class Swift2JavaVisitor {
287287

288288
let name = "subscript"
289289
let accessors = accessorBlock.supportedAccessorKinds()
290+
290291
do {
291292
if accessors.contains(.get) {
292293
try importAccessor(
293294
from: DeclSyntax(node),
294295
in: typeContext,
295-
kind: .getter,
296+
kind: .subscriptGetter,
296297
name: name)
297298
}
298299
if accessors.contains(.set) {
299300
try importAccessor(
300301
from: DeclSyntax(node),
301302
in: typeContext,
302-
kind: .setter,
303+
kind: .subscriptSetter,
303304
name: name)
304305
}
305306
} catch {
@@ -325,7 +326,7 @@ final class Swift2JavaVisitor {
325326
case .subscriptDecl(let subscriptNode):
326327
signature = try SwiftFunctionSignature(
327328
subscriptNode,
328-
isSet: kind == .setter,
329+
isSet: kind == .subscriptSetter,
329330
enclosingType: typeContext?.swiftType,
330331
lookupContext: translator.lookupContext)
331332
default:

Sources/JExtractSwiftLib/SwiftTypes/SwiftFunctionSignature.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,11 @@ extension SwiftFunctionSignature {
325325
enclosingType: enclosingType,
326326
isSet: isSet)
327327

328-
let valueType = try SwiftType(subscriptNode.returnClause.type, lookupContext: lookupContext)
329-
328+
let valueType: SwiftType = try SwiftType(subscriptNode.returnClause.type, lookupContext: lookupContext)
329+
var nodeParameters = try subscriptNode.parameterClause.parameters.map { param in
330+
try SwiftParameter(param, lookupContext: lookupContext)
331+
}
332+
330333
var effectSpecifiers: [SwiftEffectSpecifier]? = nil
331334
switch subscriptNode.accessorBlock?.accessors {
332335
case .getter(let getter):
@@ -344,14 +347,13 @@ extension SwiftFunctionSignature {
344347
self.effectSpecifiers = effectSpecifiers ?? []
345348

346349
if isSet {
347-
self.parameters = [
348-
SwiftParameter(convention: .byValue, parameterName: "newValue", type: valueType)
349-
]
350+
nodeParameters.append(SwiftParameter(convention: .byValue, parameterName: "newValue", type: valueType))
350351
self.result = .void
351352
} else {
352-
self.parameters = []
353353
self.result = .init(convention: .direct, type: valueType)
354354
}
355+
356+
self.parameters = nodeParameters
355357
self.genericParameters = []
356358
self.genericRequirements = []
357359
}

Sources/JExtractSwiftLib/ThunkNameRegistry.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ package struct ThunkNameRegistry {
3232

3333
let suffix: String
3434
switch decl.apiKind {
35-
case .getter:
35+
case .getter, .subscriptGetter:
3636
suffix = "$get"
37-
case .setter:
37+
case .setter, .subscriptSetter:
3838
suffix = "$set"
3939
default:
4040
suffix = decl.functionSignature.parameters

0 commit comments

Comments
 (0)