@@ -17,50 +17,31 @@ import Foundation
1717import SwiftSyntax
1818import SwiftSyntaxBuilder
1919import JavaKitShared
20+ import JavaKitConfigurationShared // TODO: this should become SwiftJavaConfigurationShared
2021
21- /// Command-line utility, similar to `jextract` to export Swift types to Java.
22- public struct SwiftToJava : ParsableCommand {
23- public init ( ) { }
22+ public struct SwiftToJava {
2423
25- public static var _commandName : String {
26- " jextract-swift "
27- }
28-
29- @Option ( help: " The package the generated Java code should be emitted into. " )
30- var packageName : String
31-
32- @Option (
33- name: . shortAndLong,
34- help: " The directory in which to output the generated Swift files and manifest. " )
35- var outputDirectoryJava : String = " .build/jextract-swift/generated "
36-
37- @Option ( help: " Swift output directory " )
38- var outputDirectorySwift : String
39-
40- @Option (
41- name: . long,
42- help: " Name of the Swift module to import (and the swift interface files belong to) " )
43- var swiftModule : String
44-
45- @Option ( name: . shortAndLong, help: " Configure the level of lots that should be printed " )
46- var logLevel : Logger . Level = . info
47-
48- @Argument ( help: " The Swift files or directories to recursively export to Java. " )
49- var input : [ String ]
50-
51- public func run( ) throws {
52- let inputPaths = self . input. dropFirst ( ) . map { URL ( string: $0) ! }
24+ public func run( config: Configuration ) throws {
25+ guard let swiftModule = config. swiftModule else {
26+ fatalError ( " Missing '--swift-module' name. " )
27+ }
5328
5429 let translator = Swift2JavaTranslator (
55- javaPackage: packageName ,
30+ javaPackage: config . javaPackage ?? " " , // no package is ok, we'd generate all into top level
5631 swiftModuleName: swiftModule
5732 )
58- translator. log. logLevel = logLevel
33+ translator. log. logLevel = config. logLevel ?? . info
34+
35+ if config. javaPackage == nil || config. javaPackage!. isEmpty {
36+ translator. log. warning ( " Configured java package is '', consider specifying concrete package for generated sources. " )
37+ }
38+
39+ let inputPaths = ( config. inputSwiftDirectory ?? " " ) . split ( separator: " , " ) . dropFirst ( ) . map { URL ( string: String ( $0) ) ! }
5940
6041 var allFiles : [ URL ] = [ ]
6142 let fileManager = FileManager . default
6243 let log = translator. log
63-
44+
6445 for path in inputPaths {
6546 log. debug ( " Input path: \( path) " )
6647 if isDirectory ( url: path) {
@@ -88,10 +69,17 @@ public struct SwiftToJava: ParsableCommand {
8869 translator. add ( filePath: file. path, text: text)
8970 }
9071
72+ guard let outputSwiftDirectory = config. outputSwiftDirectory else {
73+ fatalError ( " Missing --output-swift directory! " )
74+ }
75+ guard let outputJavaDirectory = config. outputJavaDirectory else {
76+ fatalError ( " Missing --output-java directory! " )
77+ }
78+
9179 try translator. analyze ( )
92- try translator. writeSwiftThunkSources ( outputDirectory: outputDirectorySwift )
93- try translator. writeExportedJavaSources ( outputDirectory: outputDirectoryJava )
94- print ( " [swift-java] Generated Java sources ( \( packageName ) ) in: \( outputDirectoryJava ) / " )
80+ try translator. writeSwiftThunkSources ( outputDirectory: outputSwiftDirectory )
81+ try translator. writeExportedJavaSources ( outputDirectory: outputJavaDirectory )
82+ print ( " [swift-java] Generated Java sources ( \( config . javaPackage ?? " " ) ) in: \( outputJavaDirectory ) / " )
9583 print ( " [swift-java] Imported Swift module ' \( swiftModule) ': " + " done. " . green)
9684 }
9785
@@ -102,16 +90,6 @@ public struct SwiftToJava: ParsableCommand {
10290
10391}
10492
105- extension Logger . Level : ExpressibleByArgument {
106- public var defaultValueDescription : String {
107- " log level "
108- }
109- public private( set) static var allValueStrings : [ String ] =
110- [ " trace " , " debug " , " info " , " notice " , " warning " , " error " , " critical " ]
111-
112- public private( set) static var defaultCompletionKind : CompletionKind = . default
113- }
114-
11593func isDirectory( url: URL ) -> Bool {
11694 var isDirectory : ObjCBool = false
11795 _ = FileManager . default. fileExists ( atPath: url. path, isDirectory: & isDirectory)
0 commit comments