File tree Expand file tree Collapse file tree 8 files changed +50
-19
lines changed Expand file tree Collapse file tree 8 files changed +50
-19
lines changed Original file line number Diff line number Diff 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.
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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 {
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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.
Original file line number Diff line number Diff 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 :
Original file line number Diff line number Diff 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 }
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments