Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ extension FFMSwift2JavaGenerator {
// === All types
// We have to write all types to their corresponding output file that matches the file they were declared in,
// because otherwise SwiftPM plugins will not pick up files apropriately -- we expect 1 output +SwiftJava.swift file for every input.

let filteredTypes: [String: ImportedNominalType]
if let singleType = config.singleType {
filteredTypes = self.analysis.importedTypes.filter { $0.key == singleType }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,21 @@ extension JNISwift2JavaGenerator {
}

package func writeExportedJavaSources(_ printer: inout CodePrinter) throws {
let importedTypes = analysis.importedTypes.sorted(by: { (lhs, rhs) in lhs.key < rhs.key })
let typesToExport: [(key: String, value: ImportedNominalType)]
if let singleType = config.singleType {
typesToExport = analysis.importedTypes
.filter { $0.key == singleType }
.sorted(by: { $0.key < $1.key })
} else {
typesToExport = analysis.importedTypes
.sorted(by: { $0.key < $1.key })
}

var exportedFileNames: OrderedSet<String> = []

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

let filename = "\(self.swiftModuleName).java"
logger.trace("Printing module class: \(filename)")
printModule(&printer)
// Skip the module-level .swift file when generating for a single type
if config.singleType == nil {
let filename = "\(self.swiftModuleName).java"
logger.trace("Printing module class: \(filename)")
printModule(&printer)

if let outputFile = try printer.writeContents(
outputDirectory: javaOutputDirectory,
javaPackagePath: javaPackagePath,
filename: filename,
) {
exportedFileNames.append(outputFile.path(percentEncoded: false))
logger.info("[swift-java] Generated: \(self.swiftModuleName).java (at \(outputFile))")
if let outputFile = try printer.writeContents(
outputDirectory: javaOutputDirectory,
javaPackagePath: javaPackagePath,
filename: filename,
) {
exportedFileNames.append(outputFile.path(percentEncoded: false))
logger.info("[swift-java] Generated: \(self.swiftModuleName).java (at \(outputFile))")
}
}

// Write java sources list file
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,24 +57,35 @@ extension JNISwift2JavaGenerator {
let moduleFilename = "\(moduleFilenameBase).swift"

do {
logger.trace("Printing swift module class: \(moduleFilename)")

try printGlobalSwiftThunkSources(&printer)

if let outputFile = try printer.writeContents(
outputDirectory: self.swiftOutputDirectory,
javaPackagePath: nil,
filename: moduleFilename,
) {
logger.info("Generated: \(moduleFilenameBase.bold).swift (at \(outputFile.absoluteString))")
self.expectedOutputSwiftFileNames.remove(moduleFilename)
// Skip the module-level .swift file when generating for a single type
if config.singleType == nil {
logger.trace("Printing swift module class: \(moduleFilename)")

try printGlobalSwiftThunkSources(&printer)

if let outputFile = try printer.writeContents(
outputDirectory: self.swiftOutputDirectory,
javaPackagePath: nil,
filename: moduleFilename,
) {
logger.info("Generated: \(moduleFilenameBase.bold).swift (at \(outputFile.absoluteString))")
self.expectedOutputSwiftFileNames.remove(moduleFilename)
}
}

// === All types
// We have to write all types to their corresponding output file that matches the file they were declared in,
// because otherwise SwiftPM plugins will not pick up files apropriately -- we expect 1 output +SwiftJava.swift file for every input.

let filteredTypes: [String: ImportedNominalType]
if let singleType = config.singleType {
filteredTypes = self.analysis.importedTypes.filter { $0.key == singleType }
} else {
filteredTypes = self.analysis.importedTypes
}

for group: (key: String, value: [Dictionary<String, ImportedNominalType>.Element]) in Dictionary(
grouping: self.analysis.importedTypes,
grouping: filteredTypes,
by: { $0.value.sourceFilePath },
) {
logger.warning("Writing types in file group: \(group.key): \(group.value.map(\.key))")
Expand Down
Loading