@@ -17,6 +17,7 @@ import SwiftSyntax
1717import SwiftSyntaxBuilder
1818import SwiftJavaShared
1919import SwiftJavaConfigurationShared
20+ import OrderedCollections
2021
2122public struct SwiftToJava {
2223 let config : Configuration
@@ -34,6 +35,7 @@ public struct SwiftToJava {
3435
3536 let translator = Swift2JavaTranslator ( config: config)
3637 translator. log. logLevel = config. logLevel ?? . info
38+ let log = translator. log
3739
3840 if config. javaPackage == nil || config. javaPackage!. isEmpty {
3941 translator. log. warning ( " Configured java package is '', consider specifying concrete package for generated sources. " )
@@ -43,28 +45,17 @@ public struct SwiftToJava {
4345 fatalError ( " Missing '--swift-input' directory! " )
4446 }
4547
46- translator . log. info ( " Input swift = \( inputSwift) " )
48+ log. info ( " Input swift = \( inputSwift) " )
4749 let inputPaths = inputSwift. split ( separator: " , " ) . map { URL ( string: String ( $0) ) ! }
48- translator. log. info ( " Input paths = \( inputPaths) " )
49-
50- var allFiles : [ URL ] = [ ]
51- let fileManager = FileManager . default
52- let log = translator. log
50+ log. info ( " Input paths = \( inputPaths) " )
5351
54- for path in inputPaths {
55- log. info ( " Input path: \( path) " )
56- if isDirectory ( url: path) {
57- if let enumerator = fileManager. enumerator ( at: path, includingPropertiesForKeys: nil ) {
58- for case let fileURL as URL in enumerator {
59- allFiles. append ( fileURL)
60- }
61- }
62- } else if path. isFileURL {
63- allFiles. append ( path)
64- }
52+ let allFiles = collectAllFiles ( suffix: " .swift " , in: inputPaths, log: translator. log)
53+ for f in allFiles {
54+ log. warning ( " INPUT FILE: \( f) ->>> " )
6555 }
6656
6757 // Register files to the translator.
58+ let fileManager = FileManager . default
6859 for file in allFiles {
6960 guard canExtract ( from: file) else {
7061 continue
@@ -137,8 +128,82 @@ public struct SwiftToJava {
137128
138129}
139130
140- func isDirectory( url: URL ) -> Bool {
141- var isDirectory : ObjCBool = false
142- _ = FileManager . default. fileExists ( atPath: url. path, isDirectory: & isDirectory)
143- return isDirectory. boolValue
131+ extension URL {
132+ var isDirectory : Bool {
133+ var isDir : ObjCBool = false
134+ _ = FileManager . default. fileExists ( atPath: self . path, isDirectory: & isDir)
135+ return isDir. boolValue
136+ }
137+ }
138+
139+ /// Collect all files with given 'suffix', will explore directories recursively.
140+ public func collectAllFiles( suffix: String , in inputPaths: [ URL ] , log: Logger ) -> OrderedSet < URL > {
141+ guard !inputPaths. isEmpty else {
142+ return [ ]
143+ }
144+
145+ let fileManager = FileManager . default
146+ var allFiles : OrderedSet < URL > = [ ]
147+ allFiles. reserveCapacity ( 32 ) // rough guesstimate
148+
149+ let resourceKeys : [ URLResourceKey ] = [
150+ . isRegularFileKey,
151+ . isDirectoryKey,
152+ . nameKey
153+ ]
154+
155+ for path in inputPaths {
156+ do {
157+ try collectFilesFromPath (
158+ path,
159+ suffix: suffix,
160+ fileManager: fileManager,
161+ resourceKeys: resourceKeys,
162+ into: & allFiles,
163+ log: log
164+ )
165+ } catch {
166+ log. trace ( " Failed to collect paths in: \( path) , skipping. " )
167+ }
168+ }
169+
170+ return allFiles
171+ }
172+
173+ private func collectFilesFromPath(
174+ _ path: URL ,
175+ suffix: String ,
176+ fileManager: FileManager ,
177+ resourceKeys: [ URLResourceKey ] ,
178+ into allFiles: inout OrderedSet < URL > ,
179+ log: Logger
180+ ) throws {
181+ guard fileManager. fileExists ( atPath: path. path) else {
182+ return
183+ }
184+
185+ if path. isDirectory {
186+ let enumerator = fileManager. enumerator (
187+ at: path,
188+ includingPropertiesForKeys: resourceKeys,
189+ options: [ . skipsHiddenFiles] ,
190+ errorHandler: { url, error in
191+ return true
192+ } )
193+ guard let enumerator else {
194+ return
195+ }
196+
197+ for case let fileURL as URL in enumerator {
198+ try ? collectFilesFromPath ( fileURL, suffix: suffix, fileManager: fileManager, resourceKeys: resourceKeys, into: & allFiles, log: log)
199+ }
200+ }
201+
202+ guard path. isFileURL else {
203+ return
204+ }
205+ guard path. lastPathComponent. hasSuffix ( suffix) else {
206+ return
207+ }
208+ allFiles. append ( path)
144209}
0 commit comments