Skip to content

Commit 53f69d4

Browse files
committed
BridgeJS: Test different approach for cross-plugin file discovery
1 parent 9589496 commit 53f69d4

File tree

3 files changed

+11
-107
lines changed

3 files changed

+11
-107
lines changed

Plugins/BridgeJS/Sources/BridgeJSBuildPlugin/BridgeJSBuildPlugin.swift

Lines changed: 9 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,14 @@ struct BridgeJSBuildPlugin: BuildToolPlugin {
3232
inputFiles.append(configFile)
3333
}
3434

35-
let additionalDirs = resolveAdditionalSourceDirs(targetDirectory: target.directoryURL)
36-
for dir in additionalDirs {
37-
inputFiles.append(contentsOf: recursivelyCollectSwiftFiles(from: dir))
35+
// Include Swift files generated by other plugins applied to this
36+
// target (available in tools-version 6.0+). This lets BridgeJS
37+
// process @JS annotations in files produced by earlier plugins
38+
// without requiring any extra configuration.
39+
let pluginGeneratedSwiftFiles = target.pluginGeneratedSources.filter {
40+
$0.pathExtension == "swift"
3841
}
42+
inputFiles.append(contentsOf: pluginGeneratedSwiftFiles)
3943

4044
let inputTSFile = target.directoryURL.appending(path: "bridge-js.d.ts")
4145
let tsconfigPath = context.package.directoryURL.appending(path: "tsconfig.json")
@@ -59,7 +63,8 @@ struct BridgeJSBuildPlugin: BuildToolPlugin {
5963
])
6064
}
6165

62-
arguments.append(contentsOf: inputSwiftFiles.map(\.path))
66+
let allSwiftFiles = inputSwiftFiles + pluginGeneratedSwiftFiles
67+
arguments.append(contentsOf: allSwiftFiles.map(\.path))
6368

6469
return .buildCommand(
6570
displayName: "Generate BridgeJS code",
@@ -70,56 +75,4 @@ struct BridgeJSBuildPlugin: BuildToolPlugin {
7075
)
7176
}
7277
}
73-
74-
private struct PluginConfig: Decodable {
75-
var additionalSourceDirs: [String]?
76-
}
77-
78-
private func resolveAdditionalSourceDirs(targetDirectory: URL) -> [URL] {
79-
let configFiles = [
80-
targetDirectory.appending(path: "bridge-js.config.json"),
81-
targetDirectory.appending(path: "bridge-js.config.local.json"),
82-
]
83-
var dirs: [String] = []
84-
for file in configFiles {
85-
guard FileManager.default.fileExists(atPath: file.path),
86-
let data = try? Data(contentsOf: file),
87-
let config = try? JSONDecoder().decode(PluginConfig.self, from: data),
88-
let additional = config.additionalSourceDirs
89-
else { continue }
90-
dirs.append(contentsOf: additional)
91-
}
92-
return dirs.compactMap { dir in
93-
let resolved = targetDirectory.appending(path: dir).standardized
94-
var isDirectory: ObjCBool = false
95-
guard FileManager.default.fileExists(atPath: resolved.path, isDirectory: &isDirectory),
96-
isDirectory.boolValue
97-
else {
98-
return nil
99-
}
100-
return resolved
101-
}
102-
}
103-
104-
private func recursivelyCollectSwiftFiles(from directory: URL) -> [URL] {
105-
var swiftFiles: [URL] = []
106-
guard
107-
let enumerator = FileManager.default.enumerator(
108-
at: directory,
109-
includingPropertiesForKeys: [.isRegularFileKey],
110-
options: [.skipsHiddenFiles]
111-
)
112-
else {
113-
return []
114-
}
115-
for case let fileURL as URL in enumerator {
116-
if fileURL.pathExtension == "swift" {
117-
let resourceValues = try? fileURL.resourceValues(forKeys: [.isRegularFileKey])
118-
if resourceValues?.isRegularFile == true {
119-
swiftFiles.append(fileURL)
120-
}
121-
}
122-
}
123-
return swiftFiles.sorted { $0.path < $1.path }
124-
}
12578
#endif

Plugins/BridgeJS/Sources/BridgeJSCore/Misc.swift

Lines changed: 2 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,6 @@ public struct BridgeJSCoreError: Swift.Error, CustomStringConvertible {
309309

310310
import struct Foundation.URL
311311
import struct Foundation.Data
312-
import struct Foundation.ObjCBool
313312
import class Foundation.FileManager
314313
import class Foundation.JSONDecoder
315314

@@ -329,33 +328,20 @@ public struct BridgeJSConfig: Codable {
329328
/// Default: `false`
330329
public var exposeToGlobal: Bool
331330

332-
/// Additional directories containing Swift source files to scan for
333-
/// `@JS` annotations.
334-
///
335-
/// Paths are resolved relative to the target directory. This is useful
336-
/// when Swift files with `@JS` annotations are generated by another
337-
/// build plugin whose outputs aren't included in `target.sourceFiles`.
338-
///
339-
/// Default: `nil` (no additional directories)
340-
public var additionalSourceDirs: [String]?
341-
342-
public init(tools: [String: String]? = nil, exposeToGlobal: Bool = false, additionalSourceDirs: [String]? = nil) {
331+
public init(tools: [String: String]? = nil, exposeToGlobal: Bool = false) {
343332
self.tools = tools
344333
self.exposeToGlobal = exposeToGlobal
345-
self.additionalSourceDirs = additionalSourceDirs
346334
}
347335

348336
enum CodingKeys: String, CodingKey {
349337
case tools
350338
case exposeToGlobal
351-
case additionalSourceDirs
352339
}
353340

354341
public init(from decoder: Decoder) throws {
355342
let container = try decoder.container(keyedBy: CodingKeys.self)
356343
tools = try container.decodeIfPresent([String: String].self, forKey: .tools)
357344
exposeToGlobal = try container.decodeIfPresent(Bool.self, forKey: .exposeToGlobal) ?? false
358-
additionalSourceDirs = try container.decodeIfPresent([String].self, forKey: .additionalSourceDirs)
359345
}
360346

361347
/// Load the configuration file from the SwiftPM package target directory.
@@ -394,36 +380,11 @@ public struct BridgeJSConfig: Codable {
394380
return try JSONDecoder().decode(BridgeJSConfig.self, from: data)
395381
}
396382

397-
/// Resolve additional source directories relative to a base URL.
398-
///
399-
/// Returns absolute URLs for each configured additional source directory.
400-
/// Directories that don't exist are silently skipped.
401-
public func resolveAdditionalSourceDirs(relativeTo baseURL: URL) -> [URL] {
402-
guard let dirs = additionalSourceDirs else { return [] }
403-
return dirs.compactMap { dir in
404-
let resolved = baseURL.appending(path: dir).standardized
405-
var isDirectory: ObjCBool = false
406-
guard FileManager.default.fileExists(atPath: resolved.path, isDirectory: &isDirectory),
407-
isDirectory.boolValue
408-
else {
409-
return nil
410-
}
411-
return resolved
412-
}
413-
}
414-
415383
/// Merge the current configuration with the overrides.
416384
func merging(overrides: BridgeJSConfig) -> BridgeJSConfig {
417-
let mergedDirs: [String]? = {
418-
let base = self.additionalSourceDirs ?? []
419-
let extra = overrides.additionalSourceDirs ?? []
420-
let combined = base + extra
421-
return combined.isEmpty ? nil : combined
422-
}()
423385
return BridgeJSConfig(
424386
tools: (tools ?? [:]).merging(overrides.tools ?? [:], uniquingKeysWith: { $1 }),
425-
exposeToGlobal: overrides.exposeToGlobal,
426-
additionalSourceDirs: mergedDirs
387+
exposeToGlobal: overrides.exposeToGlobal
427388
)
428389
}
429390
}

Plugins/BridgeJS/Sources/BridgeJSTool/BridgeJSTool.swift

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -147,16 +147,6 @@ import BridgeJSUtilities
147147
return inputSwiftFiles(targetDirectory: targetDirectory, positionalArguments: positionalArguments)
148148
}
149149

150-
let additionalDirs = config.resolveAdditionalSourceDirs(relativeTo: targetDirectory)
151-
for dir in additionalDirs {
152-
let additionalFiles = recursivelyCollectSwiftFiles(from: dir).map(\.path)
153-
.filter { !inputFiles.contains($0) }
154-
if !additionalFiles.isEmpty {
155-
progress.print("Found \(additionalFiles.count) additional Swift files in \(dir.lastPathComponent)")
156-
}
157-
inputFiles.append(contentsOf: additionalFiles)
158-
}
159-
160150
// BridgeJS.Macros.swift contains imported declarations (@JSFunction, @JSClass, etc.) that need
161151
// to be processed by SwiftToSkeleton to populate the imported skeleton. The command plugin
162152
// filters out Generated/ files, so we explicitly add it here after generation.

0 commit comments

Comments
 (0)