@@ -26,10 +26,10 @@ extension FFMSwift2JavaGenerator {
2626 ) throws -> LoweredFunctionSignature {
2727 let signature = try SwiftFunctionSignature (
2828 decl,
29- enclosingType: try enclosingType. map { try SwiftType ( $0, symbolTable : symbolTable ) } ,
30- symbolTable : symbolTable
29+ enclosingType: try enclosingType. map { try SwiftType ( $0, lookupContext : lookupContext ) } ,
30+ lookupContext : lookupContext
3131 )
32- return try CdeclLowering ( symbolTable: symbolTable) . lowerFunctionSignature ( signature)
32+ return try CdeclLowering ( symbolTable: lookupContext . symbolTable) . lowerFunctionSignature ( signature)
3333 }
3434
3535 /// Lower the given initializer to a C-compatible entrypoint,
@@ -42,11 +42,11 @@ extension FFMSwift2JavaGenerator {
4242 ) throws -> LoweredFunctionSignature {
4343 let signature = try SwiftFunctionSignature (
4444 decl,
45- enclosingType: try enclosingType. map { try SwiftType ( $0, symbolTable : symbolTable ) } ,
46- symbolTable : symbolTable
45+ enclosingType: try enclosingType. map { try SwiftType ( $0, lookupContext : lookupContext ) } ,
46+ lookupContext : lookupContext
4747 )
4848
49- return try CdeclLowering ( symbolTable: symbolTable) . lowerFunctionSignature ( signature)
49+ return try CdeclLowering ( symbolTable: lookupContext . symbolTable) . lowerFunctionSignature ( signature)
5050 }
5151
5252 /// Lower the given variable decl to a C-compatible entrypoint,
@@ -66,10 +66,10 @@ extension FFMSwift2JavaGenerator {
6666 let signature = try SwiftFunctionSignature (
6767 decl,
6868 isSet: isSet,
69- enclosingType: try enclosingType. map { try SwiftType ( $0, symbolTable : symbolTable ) } ,
70- symbolTable : symbolTable
69+ enclosingType: try enclosingType. map { try SwiftType ( $0, lookupContext : lookupContext ) } ,
70+ lookupContext : lookupContext
7171 )
72- return try CdeclLowering ( symbolTable: symbolTable) . lowerFunctionSignature ( signature)
72+ return try CdeclLowering ( symbolTable: lookupContext . symbolTable) . lowerFunctionSignature ( signature)
7373 }
7474}
7575
@@ -98,18 +98,22 @@ struct CdeclLowering {
9898 try lowerParameter (
9999 selfParameter. type,
100100 convention: selfParameter. convention,
101- parameterName: selfParameter. parameterName ?? " self "
101+ parameterName: selfParameter. parameterName ?? " self " ,
102+ genericParameters: signature. genericParameters,
103+ genericRequirements: signature. genericRequirements
102104 )
103105 case nil , . initializer( _) , . staticMethod( _) :
104106 nil
105107 }
106108
107109 // Lower all of the parameters.
108110 let loweredParameters = try signature. parameters. enumerated ( ) . map { ( index, param) in
109- try lowerParameter (
111+ return try lowerParameter (
110112 param. type,
111113 convention: param. convention,
112- parameterName: param. parameterName ?? " _ \( index) "
114+ parameterName: param. parameterName ?? " _ \( index) " ,
115+ genericParameters: signature. genericParameters,
116+ genericRequirements: signature. genericRequirements
113117 )
114118 }
115119
@@ -142,7 +146,9 @@ struct CdeclLowering {
142146 func lowerParameter(
143147 _ type: SwiftType ,
144148 convention: SwiftParameterConvention ,
145- parameterName: String
149+ parameterName: String ,
150+ genericParameters: [ SwiftGenericParameterDeclaration ] ,
151+ genericRequirements: [ SwiftGenericRequirement ]
146152 ) throws -> LoweredParameter {
147153 // If there is a 1:1 mapping between this Swift type and a C type, we just
148154 // return it.
@@ -257,7 +263,7 @@ struct CdeclLowering {
257263 guard let genericArgs = nominal. genericArguments, genericArgs. count == 1 else {
258264 throw LoweringError . unhandledType ( type)
259265 }
260- return try lowerOptionalParameter ( genericArgs [ 0 ] , convention: convention, parameterName: parameterName)
266+ return try lowerOptionalParameter ( genericArgs [ 0 ] , convention: convention, parameterName: parameterName, genericParameters : genericParameters , genericRequirements : genericRequirements )
261267
262268 case . string:
263269 // 'String' is passed in by C string. i.e. 'UnsafePointer<Int8>' ('const uint8_t *')
@@ -300,7 +306,7 @@ struct CdeclLowering {
300306
301307 case . tuple( let tuple) :
302308 if tuple. count == 1 {
303- return try lowerParameter ( tuple [ 0 ] , convention: convention, parameterName: parameterName)
309+ return try lowerParameter ( tuple [ 0 ] , convention: convention, parameterName: parameterName, genericParameters : genericParameters , genericRequirements : genericRequirements )
304310 }
305311 if convention == . inout {
306312 throw LoweringError . inoutNotSupported ( type)
@@ -310,7 +316,7 @@ struct CdeclLowering {
310316 for (idx, element) in tuple. enumerated ( ) {
311317 // FIXME: Use tuple element label.
312318 let cdeclName = " \( parameterName) _ \( idx) "
313- let lowered = try lowerParameter ( element, convention: convention, parameterName: cdeclName)
319+ let lowered = try lowerParameter ( element, convention: convention, parameterName: cdeclName, genericParameters : genericParameters , genericRequirements : genericRequirements )
314320
315321 parameters. append ( contentsOf: lowered. cdeclParameters)
316322 conversions. append ( lowered. conversion)
@@ -330,20 +336,14 @@ struct CdeclLowering {
330336 conversion: conversion
331337 )
332338
333- case . opaque( let proto) , . existential( let proto) :
334- // If the protocol has a known representative implementation, e.g. `String` for `StringProtocol`
335- // Translate it as the concrete type.
336- // NOTE: This is a temporary workaround until we add support for generics.
337- if
338- let knownProtocol = proto. asNominalTypeDeclaration? . knownTypeKind,
339- let concreteTy = knownTypes. representativeType ( of: knownProtocol)
340- {
341- return try lowerParameter ( concreteTy, convention: convention, parameterName: parameterName)
339+ case . opaque, . existential, . genericParameter:
340+ if let concreteTy = type. representativeConcreteTypeIn ( knownTypes: knownTypes, genericParameters: genericParameters, genericRequirements: genericRequirements) {
341+ return try lowerParameter ( concreteTy, convention: convention, parameterName: parameterName, genericParameters: genericParameters, genericRequirements: genericRequirements)
342342 }
343343 throw LoweringError . unhandledType ( type)
344344
345345 case . optional( let wrapped) :
346- return try lowerOptionalParameter ( wrapped, convention: convention, parameterName: parameterName)
346+ return try lowerOptionalParameter ( wrapped, convention: convention, parameterName: parameterName, genericParameters : genericParameters , genericRequirements : genericRequirements )
347347 }
348348 }
349349
@@ -354,7 +354,9 @@ struct CdeclLowering {
354354 func lowerOptionalParameter(
355355 _ wrappedType: SwiftType ,
356356 convention: SwiftParameterConvention ,
357- parameterName: String
357+ parameterName: String ,
358+ genericParameters: [ SwiftGenericParameterDeclaration ] ,
359+ genericRequirements: [ SwiftGenericRequirement ]
358360 ) throws -> LoweredParameter {
359361 // If there is a 1:1 mapping between this Swift type and a C type, lower it to 'UnsafePointer<T>?'
360362 if let _ = try ? CType ( cdeclType: wrappedType) {
@@ -398,18 +400,15 @@ struct CdeclLowering {
398400 conversion: . pointee( . typedPointer( . optionalChain( . placeholder) , swiftType: wrappedType) )
399401 )
400402
401- case . existential( let proto) , . opaque( let proto) :
402- if
403- let knownProtocol = proto. asNominalTypeDeclaration? . knownTypeKind,
404- let concreteTy = knownTypes. representativeType ( of: knownProtocol)
405- {
406- return try lowerOptionalParameter ( concreteTy, convention: convention, parameterName: parameterName)
403+ case . existential, . opaque, . genericParameter:
404+ if let concreteTy = wrappedType. representativeConcreteTypeIn ( knownTypes: knownTypes, genericParameters: genericParameters, genericRequirements: genericRequirements) {
405+ return try lowerOptionalParameter ( concreteTy, convention: convention, parameterName: parameterName, genericParameters: genericParameters, genericRequirements: genericRequirements)
407406 }
408407 throw LoweringError . unhandledType ( . optional( wrappedType) )
409408
410409 case . tuple( let tuple) :
411410 if tuple. count == 1 {
412- return try lowerOptionalParameter ( tuple [ 0 ] , convention: convention, parameterName: parameterName)
411+ return try lowerOptionalParameter ( tuple [ 0 ] , convention: convention, parameterName: parameterName, genericParameters : genericParameters , genericRequirements : genericRequirements )
413412 }
414413 throw LoweringError . unhandledType ( . optional( wrappedType) )
415414
@@ -514,7 +513,7 @@ struct CdeclLowering {
514513 // Custom types are not supported yet.
515514 throw LoweringError . unhandledType ( type)
516515
517- case . function, . metatype, . optional, . tuple, . existential, . opaque:
516+ case . genericParameter , . function, . metatype, . optional, . tuple, . existential, . opaque:
518517 // TODO: Implement
519518 throw LoweringError . unhandledType ( type)
520519 }
@@ -668,7 +667,7 @@ struct CdeclLowering {
668667 conversion: . tupleExplode( conversions, name: outParameterName)
669668 )
670669
671- case . function, . optional, . existential, . opaque:
670+ case . genericParameter , . function, . optional, . existential, . opaque:
672671 throw LoweringError . unhandledType ( type)
673672 }
674673 }
@@ -754,7 +753,9 @@ public struct LoweredFunctionSignature: Equatable {
754753 selfParameter: nil ,
755754 parameters: allLoweredParameters,
756755 result: SwiftResult ( convention: . direct, type: result. cdeclResultType) ,
757- effectSpecifiers: [ ]
756+ effectSpecifiers: [ ] ,
757+ genericParameters: [ ] ,
758+ genericRequirements: [ ]
758759 )
759760 }
760761}
0 commit comments