Skip to content

Commit 32e7af7

Browse files
authored
jextract/jni: Make single-type mode available (#686)
1 parent 51ed738 commit 32e7af7

3 files changed

Lines changed: 47 additions & 24 deletions

File tree

Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+SwiftThunkPrinting.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ extension FFMSwift2JavaGenerator {
7171
// === All types
7272
// We have to write all types to their corresponding output file that matches the file they were declared in,
7373
// because otherwise SwiftPM plugins will not pick up files apropriately -- we expect 1 output +SwiftJava.swift file for every input.
74+
7475
let filteredTypes: [String: ImportedNominalType]
7576
if let singleType = config.singleType {
7677
filteredTypes = self.analysis.importedTypes.filter { $0.key == singleType }

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,21 @@ extension JNISwift2JavaGenerator {
4242
}
4343

4444
package func writeExportedJavaSources(_ printer: inout CodePrinter) throws {
45-
let importedTypes = analysis.importedTypes.sorted(by: { (lhs, rhs) in lhs.key < rhs.key })
45+
let typesToExport: [(key: String, value: ImportedNominalType)]
46+
if let singleType = config.singleType {
47+
typesToExport = analysis.importedTypes
48+
.filter { $0.key == singleType }
49+
.sorted(by: { $0.key < $1.key })
50+
} else {
51+
typesToExport = analysis.importedTypes
52+
.sorted(by: { $0.key < $1.key })
53+
}
4654

4755
var exportedFileNames: OrderedSet<String> = []
4856

4957
// Each parent type goes into its own file
5058
// any nested types are printed inside the body as `static class`
51-
for (_, ty) in importedTypes.filter({ _, type in type.parent == nil }) {
59+
for (_, ty) in typesToExport.filter({ _, type in type.parent == nil }) {
5260
let filename = "\(ty.effectiveJavaSimpleName).java"
5361
logger.debug("Printing contents: \(filename)")
5462
printImportedNominal(&printer, ty)
@@ -63,17 +71,20 @@ extension JNISwift2JavaGenerator {
6371
}
6472
}
6573

66-
let filename = "\(self.swiftModuleName).java"
67-
logger.trace("Printing module class: \(filename)")
68-
printModule(&printer)
74+
// Skip the module-level .swift file when generating for a single type
75+
if config.singleType == nil {
76+
let filename = "\(self.swiftModuleName).java"
77+
logger.trace("Printing module class: \(filename)")
78+
printModule(&printer)
6979

70-
if let outputFile = try printer.writeContents(
71-
outputDirectory: javaOutputDirectory,
72-
javaPackagePath: javaPackagePath,
73-
filename: filename,
74-
) {
75-
exportedFileNames.append(outputFile.path(percentEncoded: false))
76-
logger.info("[swift-java] Generated: \(self.swiftModuleName).java (at \(outputFile))")
80+
if let outputFile = try printer.writeContents(
81+
outputDirectory: javaOutputDirectory,
82+
javaPackagePath: javaPackagePath,
83+
filename: filename,
84+
) {
85+
exportedFileNames.append(outputFile.path(percentEncoded: false))
86+
logger.info("[swift-java] Generated: \(self.swiftModuleName).java (at \(outputFile))")
87+
}
7788
}
7889

7990
// Write java sources list file

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,24 +57,35 @@ extension JNISwift2JavaGenerator {
5757
let moduleFilename = "\(moduleFilenameBase).swift"
5858

5959
do {
60-
logger.trace("Printing swift module class: \(moduleFilename)")
61-
62-
try printGlobalSwiftThunkSources(&printer)
63-
64-
if let outputFile = try printer.writeContents(
65-
outputDirectory: self.swiftOutputDirectory,
66-
javaPackagePath: nil,
67-
filename: moduleFilename,
68-
) {
69-
logger.info("Generated: \(moduleFilenameBase.bold).swift (at \(outputFile.absoluteString))")
70-
self.expectedOutputSwiftFileNames.remove(moduleFilename)
60+
// Skip the module-level .swift file when generating for a single type
61+
if config.singleType == nil {
62+
logger.trace("Printing swift module class: \(moduleFilename)")
63+
64+
try printGlobalSwiftThunkSources(&printer)
65+
66+
if let outputFile = try printer.writeContents(
67+
outputDirectory: self.swiftOutputDirectory,
68+
javaPackagePath: nil,
69+
filename: moduleFilename,
70+
) {
71+
logger.info("Generated: \(moduleFilenameBase.bold).swift (at \(outputFile.absoluteString))")
72+
self.expectedOutputSwiftFileNames.remove(moduleFilename)
73+
}
7174
}
7275

7376
// === All types
7477
// We have to write all types to their corresponding output file that matches the file they were declared in,
7578
// because otherwise SwiftPM plugins will not pick up files apropriately -- we expect 1 output +SwiftJava.swift file for every input.
79+
80+
let filteredTypes: [String: ImportedNominalType]
81+
if let singleType = config.singleType {
82+
filteredTypes = self.analysis.importedTypes.filter { $0.key == singleType }
83+
} else {
84+
filteredTypes = self.analysis.importedTypes
85+
}
86+
7687
for group: (key: String, value: [Dictionary<String, ImportedNominalType>.Element]) in Dictionary(
77-
grouping: self.analysis.importedTypes,
88+
grouping: filteredTypes,
7889
by: { $0.value.sourceFilePath },
7990
) {
8091
logger.warning("Writing types in file group: \(group.key): \(group.value.map(\.key))")

0 commit comments

Comments
 (0)