@@ -28,43 +28,64 @@ public struct SwiftToJava: ParsableCommand {
2828 @Option ( help: " The package the generated Java code should be emitted into. " )
2929 var packageName : String
3030
31- @Option ( name: . shortAndLong, help: " The directory in which to output the generated Swift files and manifest. " )
32- var outputDirectory : String = " .build/jextract-swift/generated "
31+ @Option (
32+ name: . shortAndLong,
33+ help: " The directory in which to output the generated Swift files and manifest. " )
34+ var outputDirectoryJava : String = " .build/jextract-swift/generated "
3335
34- @Option ( name: . long, help: " Name of the Swift module to import (and the swift interface files belong to) " )
36+ @Option ( help: " Swift output directory " )
37+ var outputDirectorySwift : String
38+
39+ @Option (
40+ name: . long,
41+ help: " Name of the Swift module to import (and the swift interface files belong to) " )
3542 var swiftModule : String
3643
3744 // TODO: Once we ship this, make this `.warning` by default
3845 @Option ( name: . shortAndLong, help: " Configure the level of lots that should be printed " )
3946 var logLevel : Logger . Level = . notice
4047
41- @Argument ( help: " The Swift interface files to export to Java. " )
42- var swiftInterfaceFiles : [ String ]
48+ @Argument ( help: " The Swift files or directories to recursively export to Java. " )
49+ var input : [ String ]
4350
4451 public func run( ) throws {
45- let interfaceFiles = self . swiftInterfaceFiles . dropFirst ( )
46- print ( " Interface files: \( interfaceFiles ) " )
52+ let inputPaths = self . input . dropFirst ( ) . map { URL ( string : $0 ) ! }
53+ print ( " Input \( inputPaths ) " )
4754
4855 let translator = Swift2JavaTranslator (
4956 javaPackage: packageName,
5057 swiftModuleName: swiftModule
5158 )
5259 translator. log. logLevel = logLevel
5360
54- var fileNo = 1
55- for interfaceFile in interfaceFiles {
56- print ( " [ \( fileNo) / \( interfaceFiles. count) ] Importing module ' \( swiftModule) ', interface file: \( interfaceFile) " )
57- defer { fileNo += 1 }
61+ var allFiles : [ URL ] = [ ]
62+ let fileManager = FileManager . default
63+
64+ for path in inputPaths {
65+ if isDirectory ( url: path) {
66+ if let enumerator = fileManager. enumerator ( at: path, includingPropertiesForKeys: nil ) {
67+ for case let fileURL as URL in enumerator {
68+ allFiles. append ( fileURL)
69+ }
70+ }
71+ } else if path. isFileURL {
72+ allFiles. append ( path)
73+ }
74+ }
75+
76+ for file in allFiles {
77+ print ( " Importing module ' \( swiftModule) ', interface file: \( file) " )
5878
59- try translator. analyze ( swiftInterfacePath: interfaceFile)
60- try translator. writeImportedTypesTo ( outputDirectory: outputDirectory)
79+ try translator. analyze ( file: file. path)
80+ try translator. writeExportedJavaSources ( outputDirectory: outputDirectoryJava)
81+ try translator. writeSwiftThunkSources ( outputDirectory: outputDirectorySwift)
6182
62- print ( " [ \( fileNo ) / \( interfaceFiles . count ) ] Imported interface file: \( interfaceFile ) " + " done. " . green)
83+ print ( " Imported interface file: \( file ) " + " done. " . green)
6384 }
6485
65- try translator. writeModuleTo ( outputDirectory: outputDirectory )
86+ try translator. writeExportedJavaModule ( outputDirectory: outputDirectoryJava )
6687 print ( " " )
67- print ( " Generated Java sources in package ' \( packageName) ' in: \( outputDirectory ) / " )
88+ print ( " Generated Java sources in package ' \( packageName) ' in: \( outputDirectoryJava ) / " )
6889 print ( " Swift module ' \( swiftModule) ' import: " + " done. " . green)
6990 }
7091
@@ -79,3 +100,9 @@ extension Logger.Level: ExpressibleByArgument {
79100
80101 public private( set) static var defaultCompletionKind : CompletionKind = . default
81102}
103+
104+ func isDirectory( url: URL ) -> Bool {
105+ var isDirectory : ObjCBool = false
106+ FileManager . default. fileExists ( atPath: url. path, isDirectory: & isDirectory)
107+ return isDirectory. boolValue
108+ }
0 commit comments