@@ -16,27 +16,90 @@ import JavaTypes
16
16
import SwiftSyntax
17
17
import SwiftSyntaxBuilder
18
18
19
+ package class FFMSwift2JavaGenerator : Swift2JavaGenerator {
20
+ let log : Logger
21
+ let analysis : AnalysisResult
22
+ let swiftModuleName : String
23
+ let javaPackage : String
24
+ let swiftOutputDirectory : String
25
+ let javaOutputDirectory : String
26
+ let swiftStdlibTypes : SwiftStandardLibraryTypes
27
+ let symbolTable : SwiftSymbolTable
28
+
29
+ var javaPackagePath : String {
30
+ javaPackage. replacingOccurrences ( of: " . " , with: " / " )
31
+ }
32
+
33
+ var thunkNameRegistry : ThunkNameRegistry = ThunkNameRegistry ( )
34
+
35
+ /// Cached Java translation result. 'nil' indicates failed translation.
36
+ var translatedSignatures : [ ImportedFunc : TranslatedFunctionSignature ? ] = [ : ]
37
+
38
+ package init (
39
+ translator: Swift2JavaTranslator ,
40
+ javaPackage: String ,
41
+ swiftOutputDirectory: String ,
42
+ javaOutputDirectory: String
43
+ ) {
44
+ self . log = Logger ( label: " ffm-generator " , logLevel: translator. log. logLevel)
45
+ self . analysis = translator. result
46
+ self . swiftModuleName = translator. swiftModuleName
47
+ self . javaPackage = javaPackage
48
+ self . swiftOutputDirectory = swiftOutputDirectory
49
+ self . javaOutputDirectory = javaOutputDirectory
50
+ self . symbolTable = translator. symbolTable
51
+ self . swiftStdlibTypes = translator. swiftStdlibTypes
52
+ }
53
+
54
+ func generate( ) throws {
55
+ try writeSwiftThunkSources ( )
56
+ print ( " [swift-java] Generated Swift sources (module: ' \( self . swiftModuleName) ') in: \( swiftOutputDirectory) / " )
57
+
58
+ try writeExportedJavaSources ( )
59
+ print ( " [swift-java] Generated Java sources (package: ' \( javaPackage) ') in: \( javaOutputDirectory) / " )
60
+ }
61
+ }
62
+
63
+ // ===== --------------------------------------------------------------------------------------------------------------
64
+ // MARK: Defaults
65
+
66
+ extension FFMSwift2JavaGenerator {
67
+
68
+ /// Default set Java imports for every generated file
69
+ static let defaultJavaImports : Array < String > = [
70
+ " org.swift.swiftkit.* " ,
71
+ " org.swift.swiftkit.SwiftKit " ,
72
+ " org.swift.swiftkit.util.* " ,
73
+
74
+ // Necessary for native calls and type mapping
75
+ " java.lang.foreign.* " ,
76
+ " java.lang.invoke.* " ,
77
+ " java.util.Arrays " ,
78
+ " java.util.stream.Collectors " ,
79
+ " java.util.concurrent.atomic.* " ,
80
+ " java.nio.charset.StandardCharsets " ,
81
+ ]
82
+ }
83
+
19
84
// ==== ---------------------------------------------------------------------------------------------------------------
20
85
// MARK: File writing
21
86
22
- let PATH_SEPARATOR = " / " // TODO: Windows
23
87
24
- extension Swift2JavaTranslator {
25
-
26
- /// Every imported public type becomes a public class in its own file in Java.
27
- public func writeExportedJavaSources( outputDirectory: String ) throws {
88
+ extension FFMSwift2JavaGenerator {
89
+ package func writeExportedJavaSources( ) throws {
28
90
var printer = CodePrinter ( )
29
- try writeExportedJavaSources ( outputDirectory : outputDirectory , printer: & printer)
91
+ try writeExportedJavaSources ( printer: & printer)
30
92
}
31
93
32
- public func writeExportedJavaSources( outputDirectory: String , printer: inout CodePrinter ) throws {
33
- for (_, ty) in importedTypes. sorted ( by: { ( lhs, rhs) in lhs. key < rhs. key } ) {
94
+ /// Every imported public type becomes a public class in its own file in Java.
95
+ package func writeExportedJavaSources( printer: inout CodePrinter ) throws {
96
+ for (_, ty) in analysis. importedTypes. sorted ( by: { ( lhs, rhs) in lhs. key < rhs. key } ) {
34
97
let filename = " \( ty. swiftNominal. name) .java "
35
98
log. info ( " Printing contents: \( filename) " )
36
99
printImportedNominal ( & printer, ty)
37
100
38
101
if let outputFile = try printer. writeContents (
39
- outputDirectory: outputDirectory ,
102
+ outputDirectory: javaOutputDirectory ,
40
103
javaPackagePath: javaPackagePath,
41
104
filename: filename
42
105
) {
@@ -50,7 +113,7 @@ extension Swift2JavaTranslator {
50
113
printModule ( & printer)
51
114
52
115
if let outputFile = try printer. writeContents (
53
- outputDirectory: outputDirectory ,
116
+ outputDirectory: javaOutputDirectory ,
54
117
javaPackagePath: javaPackagePath,
55
118
filename: filename)
56
119
{
@@ -63,26 +126,26 @@ extension Swift2JavaTranslator {
63
126
// ==== ---------------------------------------------------------------------------------------------------------------
64
127
// MARK: Java/text printing
65
128
66
- extension Swift2JavaTranslator {
129
+ extension FFMSwift2JavaGenerator {
67
130
68
131
/// Render the Java file contents for an imported Swift module.
69
132
///
70
133
/// This includes any Swift global functions in that module, and some general type information and helpers.
71
- public func printModule( _ printer: inout CodePrinter ) {
134
+ func printModule( _ printer: inout CodePrinter ) {
72
135
printHeader ( & printer)
73
136
printPackage ( & printer)
74
137
printImports ( & printer)
75
138
76
139
printModuleClass ( & printer) { printer in
77
140
// TODO: print all "static" methods
78
- for decl in importedGlobalFuncs {
141
+ for decl in analysis . importedGlobalFuncs {
79
142
self . log. trace ( " Print imported decl: \( decl) " )
80
143
printFunctionDowncallMethods ( & printer, decl)
81
144
}
82
145
}
83
146
}
84
147
85
- package func printImportedNominal( _ printer: inout CodePrinter , _ decl: ImportedNominalType ) {
148
+ func printImportedNominal( _ printer: inout CodePrinter , _ decl: ImportedNominalType ) {
86
149
printHeader ( & printer)
87
150
printPackage ( & printer)
88
151
printImports ( & printer)
@@ -143,7 +206,7 @@ extension Swift2JavaTranslator {
143
206
}
144
207
}
145
208
146
- public func printHeader( _ printer: inout CodePrinter ) {
209
+ func printHeader( _ printer: inout CodePrinter ) {
147
210
printer. print (
148
211
"""
149
212
// Generated by jextract-swift
@@ -153,7 +216,7 @@ extension Swift2JavaTranslator {
153
216
)
154
217
}
155
218
156
- public func printPackage( _ printer: inout CodePrinter ) {
219
+ func printPackage( _ printer: inout CodePrinter ) {
157
220
printer. print (
158
221
"""
159
222
package \( javaPackage) ;
@@ -162,14 +225,14 @@ extension Swift2JavaTranslator {
162
225
)
163
226
}
164
227
165
- public func printImports( _ printer: inout CodePrinter ) {
166
- for i in Swift2JavaTranslator . defaultJavaImports {
228
+ func printImports( _ printer: inout CodePrinter ) {
229
+ for i in FFMSwift2JavaGenerator . defaultJavaImports {
167
230
printer. print ( " import \( i) ; " )
168
231
}
169
232
printer. print ( " " )
170
233
}
171
234
172
- package func printNominal(
235
+ func printNominal(
173
236
_ printer: inout CodePrinter , _ decl: ImportedNominalType , body: ( inout CodePrinter ) -> Void
174
237
) {
175
238
let parentProtocol : String
@@ -188,7 +251,7 @@ extension Swift2JavaTranslator {
188
251
}
189
252
}
190
253
191
- public func printModuleClass( _ printer: inout CodePrinter , body: ( inout CodePrinter ) -> Void ) {
254
+ func printModuleClass( _ printer: inout CodePrinter , body: ( inout CodePrinter ) -> Void ) {
192
255
printer. printBraceBlock ( " public final class \( swiftModuleName) " ) { printer in
193
256
printPrivateConstructor ( & printer, swiftModuleName)
194
257
@@ -261,7 +324,7 @@ extension Swift2JavaTranslator {
261
324
}
262
325
}
263
326
264
- private func printClassConstants( printer: inout CodePrinter ) {
327
+ func printClassConstants( printer: inout CodePrinter ) {
265
328
printer. print (
266
329
"""
267
330
static final String LIB_NAME = " \( swiftModuleName) " ;
@@ -270,7 +333,7 @@ extension Swift2JavaTranslator {
270
333
)
271
334
}
272
335
273
- private func printPrivateConstructor( _ printer: inout CodePrinter , _ typeName: String ) {
336
+ func printPrivateConstructor( _ printer: inout CodePrinter , _ typeName: String ) {
274
337
printer. print (
275
338
"""
276
339
private \( typeName) () {
@@ -296,7 +359,7 @@ extension Swift2JavaTranslator {
296
359
)
297
360
}
298
361
299
- package func printToStringMethod(
362
+ func printToStringMethod(
300
363
_ printer: inout CodePrinter , _ decl: ImportedNominalType
301
364
) {
302
365
printer. print (
@@ -312,3 +375,4 @@ extension Swift2JavaTranslator {
312
375
""" )
313
376
}
314
377
}
378
+
0 commit comments