Skip to content

Commit d8e0106

Browse files
committed
[JExtract] Integrate SwiftLexicalLookup
1 parent 4495da6 commit d8e0106

18 files changed

+289
-94
lines changed

Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ let package = Package(
422422
name: "JExtractSwiftLib",
423423
dependencies: [
424424
.product(name: "SwiftBasicFormat", package: "swift-syntax"),
425+
.product(name: "SwiftLexicalLookup", package: "swift-syntax"),
425426
.product(name: "SwiftSyntax", package: "swift-syntax"),
426427
.product(name: "SwiftSyntaxBuilder", package: "swift-syntax"),
427428
.product(name: "ArgumentParser", package: "swift-argument-parser"),

Sources/JExtractSwiftLib/FFM/CDeclLowering/CRepresentation.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ extension CType {
6868
case .optional(let wrapped) where wrapped.isPointer:
6969
try self.init(cdeclType: wrapped)
7070

71-
case .metatype, .optional, .tuple, .opaque, .existential:
71+
case .genericParameter, .metatype, .optional, .tuple, .opaque, .existential:
7272
throw CDeclToCLoweringError.invalidCDeclType(cdeclType)
7373
}
7474
}
@@ -98,7 +98,7 @@ extension CFunction {
9898

9999
enum CDeclToCLoweringError: Error {
100100
case invalidCDeclType(SwiftType)
101-
case invalidNominalType(SwiftNominalTypeDeclaration)
101+
case invalidNominalType(SwiftTypeDeclaration)
102102
case invalidFunctionConvention(SwiftFunctionType)
103103
}
104104

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

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

@@ -344,6 +344,9 @@ struct CdeclLowering {
344344

345345
case .optional(let wrapped):
346346
return try lowerOptionalParameter(wrapped, convention: convention, parameterName: parameterName)
347+
348+
case .genericParameter:
349+
throw LoweringError.unhandledType(type)
347350
}
348351
}
349352

@@ -413,7 +416,7 @@ struct CdeclLowering {
413416
}
414417
throw LoweringError.unhandledType(.optional(wrappedType))
415418

416-
case .function, .metatype, .optional:
419+
case .function, .metatype, .optional, .genericParameter:
417420
throw LoweringError.unhandledType(.optional(wrappedType))
418421
}
419422
}
@@ -514,7 +517,7 @@ struct CdeclLowering {
514517
// Custom types are not supported yet.
515518
throw LoweringError.unhandledType(type)
516519

517-
case .function, .metatype, .optional, .tuple, .existential, .opaque:
520+
case .genericParameter, .function, .metatype, .optional, .tuple, .existential, .opaque:
518521
// TODO: Implement
519522
throw LoweringError.unhandledType(type)
520523
}
@@ -668,7 +671,7 @@ struct CdeclLowering {
668671
conversion: .tupleExplode(conversions, name: outParameterName)
669672
)
670673

671-
case .function, .optional, .existential, .opaque:
674+
case .genericParameter, .function, .optional, .existential, .opaque:
672675
throw LoweringError.unhandledType(type)
673676
}
674677
}

Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ extension FFMSwift2JavaGenerator {
2424

2525
let translated: TranslatedFunctionDecl?
2626
do {
27-
let translation = JavaTranslation(symbolTable: self.symbolTable)
27+
let translation = JavaTranslation(knownTypes: SwiftKnownTypes(symbolTable: lookupContext.symbolTable))
2828
translated = try translation.translate(decl)
2929
} catch {
3030
self.log.info("Failed to translate: '\(decl.swiftDecl.qualifiedNameForDebug)'; \(error)")
@@ -115,8 +115,8 @@ extension FFMSwift2JavaGenerator {
115115
struct JavaTranslation {
116116
var knownTypes: SwiftKnownTypes
117117

118-
init(symbolTable: SwiftSymbolTable) {
119-
self.knownTypes = SwiftKnownTypes(symbolTable: symbolTable)
118+
init(knownTypes: SwiftKnownTypes) {
119+
self.knownTypes = knownTypes
120120
}
121121

122122
func translate(
@@ -421,6 +421,11 @@ extension FFMSwift2JavaGenerator {
421421

422422
case .optional(let wrapped):
423423
return try translateOptionalParameter(wrappedType: wrapped, convention: convention, parameterName: parameterName, loweredParam: loweredParam, methodName: methodName)
424+
425+
case .genericParameter:
426+
// Otherwise, not supported yet.
427+
throw JavaTranslationError.unhandledType(swiftType)
428+
424429
}
425430
}
426431

@@ -580,7 +585,7 @@ extension FFMSwift2JavaGenerator {
580585
// TODO: Implement.
581586
throw JavaTranslationError.unhandledType(swiftType)
582587

583-
case .optional, .function, .existential, .opaque:
588+
case .genericParameter, .optional, .function, .existential, .opaque:
584589
throw JavaTranslationError.unhandledType(swiftType)
585590
}
586591

Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+SwiftThunkPrinting.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ extension FFMSwift2JavaGenerator {
125125
}
126126

127127
func printSwiftThunkImports(_ printer: inout CodePrinter) {
128-
for module in self.symbolTable.importedModules.keys.sorted() {
128+
for module in self.lookupContext.symbolTable.importedModules.keys.sorted() {
129129
guard module != "Swift" else {
130130
continue
131131
}

Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ package class FFMSwift2JavaGenerator: Swift2JavaGenerator {
2424
let javaPackage: String
2525
let swiftOutputDirectory: String
2626
let javaOutputDirectory: String
27-
let symbolTable: SwiftSymbolTable
27+
let lookupContext: SwiftTypeLookupContext
2828

2929
var javaPackagePath: String {
3030
javaPackage.replacingOccurrences(of: ".", with: "/")
@@ -51,7 +51,7 @@ package class FFMSwift2JavaGenerator: Swift2JavaGenerator {
5151
self.javaPackage = javaPackage
5252
self.swiftOutputDirectory = swiftOutputDirectory
5353
self.javaOutputDirectory = javaOutputDirectory
54-
self.symbolTable = translator.symbolTable
54+
self.lookupContext = translator.lookupContext
5555

5656
// If we are forced to write empty files, construct the expected outputs
5757
if translator.config.writeEmptyFiles ?? false {

Sources/JExtractSwiftLib/ImportedDecls.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ package enum SwiftAPIKind {
2626

2727
/// Describes a Swift nominal type (e.g., a class, struct, enum) that has been
2828
/// imported and is being translated into Java.
29-
package class ImportedNominalType: ImportedDecl {
29+
package class ImportedNominalType: ImportedDecl {
3030
let swiftNominal: SwiftNominalTypeDeclaration
3131

3232
package var initializers: [ImportedFunc] = []

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ extension JNISwift2JavaGenerator {
216216
conversion: .placeholder
217217
)
218218

219-
case .metatype, .optional, .tuple, .existential, .opaque:
219+
case .metatype, .optional, .tuple, .existential, .opaque, .genericParameter:
220220
throw JavaTranslationError.unsupportedSwiftType(swiftType)
221221
}
222222
}

Sources/JExtractSwiftLib/Swift2JavaTranslator.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import SwiftSyntax
2323
public final class Swift2JavaTranslator {
2424
static let SWIFT_INTERFACE_SUFFIX = ".swiftinterface"
2525

26-
package var log = Logger(label: "translator", logLevel: .info)
26+
package var log: Logger
2727

2828
let config: Configuration
2929

@@ -52,14 +52,19 @@ public final class Swift2JavaTranslator {
5252
/// type representation.
5353
package var importedTypes: [String: ImportedNominalType] = [:]
5454

55-
package var symbolTable: SwiftSymbolTable! = nil
55+
var lookupContext: SwiftTypeLookupContext! = nil
56+
57+
var symbolTable: SwiftSymbolTable! {
58+
return lookupContext?.symbolTable
59+
}
5660

5761
public init(
5862
config: Configuration
5963
) {
6064
guard let swiftModule = config.swiftModule else {
6165
fatalError("Missing 'swiftModule' name.") // FIXME: can we make it required in config? but we shared config for many cases
6266
}
67+
self.log = Logger(label: "translator", logLevel: config.logLevel ?? .info)
6368
self.config = config
6469
self.swiftModuleName = swiftModule
6570
}
@@ -116,11 +121,12 @@ extension Swift2JavaTranslator {
116121
package func prepareForTranslation() {
117122
let dependenciesSource = self.buildDependencyClassesSourceFile()
118123

119-
self.symbolTable = SwiftSymbolTable.setup(
124+
let symbolTable = SwiftSymbolTable.setup(
120125
moduleName: self.swiftModuleName,
121126
inputs.map({ $0.syntax }) + [dependenciesSource],
122127
log: self.log
123128
)
129+
self.lookupContext = SwiftTypeLookupContext(symbolTable: symbolTable)
124130
}
125131

126132
/// Check if any of the imported decls uses a nominal declaration that satisfies
@@ -140,6 +146,8 @@ extension Swift2JavaTranslator {
140146
return check(ty)
141147
case .existential(let ty), .opaque(let ty):
142148
return check(ty)
149+
case .genericParameter:
150+
return false
143151
}
144152
}
145153

@@ -206,7 +214,7 @@ extension Swift2JavaTranslator {
206214
func importedNominalType(
207215
_ typeNode: TypeSyntax
208216
) -> ImportedNominalType? {
209-
guard let swiftType = try? SwiftType(typeNode, symbolTable: self.symbolTable) else {
217+
guard let swiftType = try? SwiftType(typeNode, lookupContext: lookupContext) else {
210218
return nil
211219
}
212220
guard let swiftNominalDecl = swiftType.asNominalTypeDeclaration else {

Sources/JExtractSwiftLib/Swift2JavaVisitor.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ final class Swift2JavaVisitor {
104104
signature = try SwiftFunctionSignature(
105105
node,
106106
enclosingType: typeContext?.swiftType,
107-
symbolTable: self.translator.symbolTable
107+
lookupContext: translator.lookupContext
108108
)
109109
} catch {
110110
self.log.debug("Failed to import: '\(node.qualifiedNameForDebug)'; \(error)")
@@ -145,7 +145,7 @@ final class Swift2JavaVisitor {
145145
node,
146146
isSet: kind == .setter,
147147
enclosingType: typeContext?.swiftType,
148-
symbolTable: self.translator.symbolTable
148+
lookupContext: translator.lookupContext
149149
)
150150

151151
let imported = ImportedFunc(
@@ -193,7 +193,7 @@ final class Swift2JavaVisitor {
193193
signature = try SwiftFunctionSignature(
194194
node,
195195
enclosingType: typeContext.swiftType,
196-
symbolTable: self.translator.symbolTable
196+
lookupContext: translator.lookupContext
197197
)
198198
} catch {
199199
self.log.debug("Failed to import: \(node.qualifiedNameForDebug); \(error)")

0 commit comments

Comments
 (0)