Skip to content

Commit 91f12b1

Browse files
committed
refactor FFM generation into protocol backed implementation
1 parent fbebbe4 commit 91f12b1

9 files changed

+117
-51
lines changed

.editorconfig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
root = true
2+
3+
[*]
4+
indent_style = space
5+
indent_size = 2
6+
insert_final_newline = true
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
struct AnalysisResult {
2+
let importedTypes: [String: ImportedNominalType]
3+
let importedGlobalFuncs: [ImportedFunc]
4+
}

Sources/JExtractSwiftLib/CodePrinter.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
import Foundation
1616

17+
let PATH_SEPARATOR = "/" // TODO: Windows
18+
1719
public struct CodePrinter {
1820
var contents: String = ""
1921

Sources/JExtractSwiftLib/Swift2JavaTranslator+JavaBindingsPrinting.swift renamed to Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaBindingsPrinting.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414

1515
import JavaTypes
1616

17-
extension Swift2JavaTranslator {
18-
public func printFunctionDowncallMethods(
17+
extension FFMSwift2JavaGenerator {
18+
func printFunctionDowncallMethods(
1919
_ printer: inout CodePrinter,
2020
_ decl: ImportedFunc
2121
) {
@@ -33,7 +33,7 @@ extension Swift2JavaTranslator {
3333
}
3434

3535
/// Print FFM Java binding descriptors for the imported Swift API.
36-
package func printJavaBindingDescriptorClass(
36+
func printJavaBindingDescriptorClass(
3737
_ printer: inout CodePrinter,
3838
_ decl: ImportedFunc
3939
) {
@@ -211,7 +211,7 @@ extension Swift2JavaTranslator {
211211
let memoryLayout = renderMemoryLayoutValue(for: outParameter.type)
212212

213213
let arena = if let className = outParameter.type.className,
214-
self.importedTypes[className] != nil {
214+
analysis.importedTypes[className] != nil {
215215
// Use passed-in 'SwiftArena' for 'SwiftValue'.
216216
"swiftArena$"
217217
} else {

Sources/JExtractSwiftLib/Swift2JavaTranslator+Printing.swift renamed to Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator.swift

Lines changed: 78 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,81 @@ import JavaTypes
1616
import SwiftSyntax
1717
import SwiftSyntaxBuilder
1818

19+
class FFMSwift2JavaGenerator: Swift2JavaGenerator {
20+
private let log = Logger(label: "ffm-generator", logLevel: .info)
21+
22+
let analysis: AnalysisResult
23+
let swiftModuleName: String
24+
let javaPackage: String
25+
let swiftOutputDirectory: String
26+
let javaOutputDirectory: String
27+
let swiftStdlibTypes: SwiftStandardLibraryTypes
28+
29+
var javaPackagePath: String {
30+
javaPackage.replacingOccurrences(of: ".", with: "/")
31+
}
32+
33+
var thunkNameRegistry: ThunkNameRegistry = ThunkNameRegistry()
34+
35+
init(
36+
analysis: AnalysisResult,
37+
swiftModuleName: String,
38+
javaPackage: String,
39+
swiftOutputDirectory: String,
40+
javaOutputDirectory: String
41+
) {
42+
self.analysis = analysis
43+
self.swiftModuleName = swiftModuleName
44+
self.javaPackage = javaPackage
45+
self.swiftOutputDirectory = swiftOutputDirectory
46+
self.javaOutputDirectory = javaOutputDirectory
47+
48+
var parsedSwiftModule = SwiftParsedModuleSymbolTable(moduleName: "Swift")
49+
self.swiftStdlibTypes = SwiftStandardLibraryTypes(into: &parsedSwiftModule)
50+
}
51+
52+
func generate() throws {
53+
try writeExportedJavaSources()
54+
}
55+
}
56+
57+
// ===== --------------------------------------------------------------------------------------------------------------
58+
// MARK: Defaults
59+
60+
extension FFMSwift2JavaGenerator {
61+
62+
/// Default set Java imports for every generated file
63+
static let defaultJavaImports: Array<String> = [
64+
"org.swift.swiftkit.*",
65+
"org.swift.swiftkit.SwiftKit",
66+
"org.swift.swiftkit.util.*",
67+
68+
// Necessary for native calls and type mapping
69+
"java.lang.foreign.*",
70+
"java.lang.invoke.*",
71+
"java.util.Arrays",
72+
"java.util.stream.Collectors",
73+
"java.util.concurrent.atomic.*",
74+
"java.nio.charset.StandardCharsets",
75+
]
76+
}
77+
1978
// ==== ---------------------------------------------------------------------------------------------------------------
2079
// MARK: File writing
2180

22-
let PATH_SEPARATOR = "/" // TODO: Windows
2381

24-
extension Swift2JavaTranslator {
82+
extension FFMSwift2JavaGenerator {
2583

2684
/// Every imported public type becomes a public class in its own file in Java.
27-
public func writeExportedJavaSources(outputDirectory: String) throws {
85+
func writeExportedJavaSources() throws {
2886
var printer = CodePrinter()
29-
try writeExportedJavaSources(outputDirectory: outputDirectory, printer: &printer)
30-
}
31-
32-
public func writeExportedJavaSources(outputDirectory: String, printer: inout CodePrinter) throws {
33-
for (_, ty) in importedTypes.sorted(by: { (lhs, rhs) in lhs.key < rhs.key }) {
87+
for (_, ty) in analysis.importedTypes.sorted(by: { (lhs, rhs) in lhs.key < rhs.key }) {
3488
let filename = "\(ty.swiftNominal.name).java"
3589
log.info("Printing contents: \(filename)")
3690
printImportedNominal(&printer, ty)
3791

3892
if let outputFile = try printer.writeContents(
39-
outputDirectory: outputDirectory,
93+
outputDirectory: javaOutputDirectory,
4094
javaPackagePath: javaPackagePath,
4195
filename: filename
4296
) {
@@ -50,7 +104,7 @@ extension Swift2JavaTranslator {
50104
printModule(&printer)
51105

52106
if let outputFile = try printer.writeContents(
53-
outputDirectory: outputDirectory,
107+
outputDirectory: javaOutputDirectory,
54108
javaPackagePath: javaPackagePath,
55109
filename: filename)
56110
{
@@ -63,26 +117,26 @@ extension Swift2JavaTranslator {
63117
// ==== ---------------------------------------------------------------------------------------------------------------
64118
// MARK: Java/text printing
65119

66-
extension Swift2JavaTranslator {
120+
extension FFMSwift2JavaGenerator {
67121

68122
/// Render the Java file contents for an imported Swift module.
69123
///
70124
/// This includes any Swift global functions in that module, and some general type information and helpers.
71-
public func printModule(_ printer: inout CodePrinter) {
125+
func printModule(_ printer: inout CodePrinter) {
72126
printHeader(&printer)
73127
printPackage(&printer)
74128
printImports(&printer)
75129

76130
printModuleClass(&printer) { printer in
77131
// TODO: print all "static" methods
78-
for decl in importedGlobalFuncs {
132+
for decl in analysis.importedGlobalFuncs {
79133
self.log.trace("Print imported decl: \(decl)")
80134
printFunctionDowncallMethods(&printer, decl)
81135
}
82136
}
83137
}
84138

85-
package func printImportedNominal(_ printer: inout CodePrinter, _ decl: ImportedNominalType) {
139+
func printImportedNominal(_ printer: inout CodePrinter, _ decl: ImportedNominalType) {
86140
printHeader(&printer)
87141
printPackage(&printer)
88142
printImports(&printer)
@@ -143,7 +197,7 @@ extension Swift2JavaTranslator {
143197
}
144198
}
145199

146-
public func printHeader(_ printer: inout CodePrinter) {
200+
func printHeader(_ printer: inout CodePrinter) {
147201
printer.print(
148202
"""
149203
// Generated by jextract-swift
@@ -153,7 +207,7 @@ extension Swift2JavaTranslator {
153207
)
154208
}
155209

156-
public func printPackage(_ printer: inout CodePrinter) {
210+
func printPackage(_ printer: inout CodePrinter) {
157211
printer.print(
158212
"""
159213
package \(javaPackage);
@@ -162,14 +216,14 @@ extension Swift2JavaTranslator {
162216
)
163217
}
164218

165-
public func printImports(_ printer: inout CodePrinter) {
166-
for i in Swift2JavaTranslator.defaultJavaImports {
219+
func printImports(_ printer: inout CodePrinter) {
220+
for i in FFMSwift2JavaGenerator.defaultJavaImports {
167221
printer.print("import \(i);")
168222
}
169223
printer.print("")
170224
}
171225

172-
package func printNominal(
226+
func printNominal(
173227
_ printer: inout CodePrinter, _ decl: ImportedNominalType, body: (inout CodePrinter) -> Void
174228
) {
175229
let parentProtocol: String
@@ -188,7 +242,7 @@ extension Swift2JavaTranslator {
188242
}
189243
}
190244

191-
public func printModuleClass(_ printer: inout CodePrinter, body: (inout CodePrinter) -> Void) {
245+
func printModuleClass(_ printer: inout CodePrinter, body: (inout CodePrinter) -> Void) {
192246
printer.printBraceBlock("public final class \(swiftModuleName)") { printer in
193247
printPrivateConstructor(&printer, swiftModuleName)
194248

@@ -261,7 +315,7 @@ extension Swift2JavaTranslator {
261315
}
262316
}
263317

264-
private func printClassConstants(printer: inout CodePrinter) {
318+
func printClassConstants(printer: inout CodePrinter) {
265319
printer.print(
266320
"""
267321
static final String LIB_NAME = "\(swiftModuleName)";
@@ -270,7 +324,7 @@ extension Swift2JavaTranslator {
270324
)
271325
}
272326

273-
private func printPrivateConstructor(_ printer: inout CodePrinter, _ typeName: String) {
327+
func printPrivateConstructor(_ printer: inout CodePrinter, _ typeName: String) {
274328
printer.print(
275329
"""
276330
private \(typeName)() {
@@ -296,7 +350,7 @@ extension Swift2JavaTranslator {
296350
)
297351
}
298352

299-
package func printToStringMethod(
353+
func printToStringMethod(
300354
_ printer: inout CodePrinter, _ decl: ImportedNominalType
301355
) {
302356
printer.print(
@@ -312,3 +366,4 @@ extension Swift2JavaTranslator {
312366
""")
313367
}
314368
}
369+

Sources/JExtractSwiftLib/Swift2Java.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,19 @@ public struct SwiftToJava {
8989

9090
try translator.analyze()
9191

92+
let generator = FFMSwift2JavaGenerator(
93+
analysis: translator.result,
94+
swiftModuleName: self.swiftModule,
95+
javaPackage: self.packageName,
96+
swiftOutputDirectory: outputDirectorySwift,
97+
javaOutputDirectory: outputDirectoryJava
98+
)
99+
100+
try generator.generate()
101+
102+
103+
print("[swift-java] Generated Java sources (\(packageName)) in: \(outputDirectoryJava)/")
104+
92105
try translator.writeSwiftThunkSources(outputDirectory: outputSwiftDirectory)
93106
print("[swift-java] Generated Swift sources (module: '\(config.swiftModule ?? "")') in: \(outputSwiftDirectory)/")
94107

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
protocol Swift2JavaGenerator {
2+
func generate() throws
3+
}

Sources/JExtractSwiftLib/Swift2JavaTranslator.swift

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ extension Swift2JavaTranslator {
9191
/// a checked truncation operation at the Java/Swift board.
9292
var javaPrimitiveForSwiftInt: JavaType { .long }
9393

94+
var result: AnalysisResult {
95+
AnalysisResult(
96+
importedTypes: self.importedTypes,
97+
importedGlobalFuncs: self.importedGlobalFuncs
98+
)
99+
}
100+
94101
package func add(filePath: String, text: String) {
95102
log.trace("Adding: \(filePath)")
96103
let sourceFileSyntax = Parser.parse(source: text)
@@ -128,30 +135,6 @@ extension Swift2JavaTranslator {
128135
}
129136
}
130137

131-
// ===== --------------------------------------------------------------------------------------------------------------
132-
// MARK: Defaults
133-
134-
extension Swift2JavaTranslator {
135-
/// Default formatting options.
136-
static let defaultFormat = BasicFormat(indentationWidth: .spaces(2))
137-
138-
/// Default set Java imports for every generated file
139-
static let defaultJavaImports: Array<String> = [
140-
"org.swift.swiftkit.*",
141-
"org.swift.swiftkit.SwiftKit",
142-
"org.swift.swiftkit.util.*",
143-
144-
// Necessary for native calls and type mapping
145-
"java.lang.foreign.*",
146-
"java.lang.invoke.*",
147-
"java.util.Arrays",
148-
"java.util.stream.Collectors",
149-
"java.util.concurrent.atomic.*",
150-
"java.nio.charset.StandardCharsets",
151-
]
152-
153-
}
154-
155138
// ==== ----------------------------------------------------------------------------------------------------------------
156139
// MARK: Type translation
157140
extension Swift2JavaTranslator {

0 commit comments

Comments
 (0)