//===--- SwiftTarget.swift ------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2024 - 2025 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // FIXME: Come up with a design to safely convince the compiler that this is never accessed concurrently. final class SwiftTarget: @unchecked Sendable { let name: String let moduleName: String var buildRule: BuildRule? var emitModuleRule: EmitModuleRule? var dependencies: [SwiftTarget] = [] init(name: String, moduleName: String) { self.name = name self.moduleName = moduleName } } extension SwiftTarget: Hashable { static func == (lhs: SwiftTarget, rhs: SwiftTarget) -> Bool { ObjectIdentifier(lhs) == ObjectIdentifier(rhs) } func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) } } extension SwiftTarget: CustomDebugStringConvertible { var debugDescription: String { name } } extension SwiftTarget { struct Sources: Sendable { var repoSources: [RelativePath] = [] var externalSources: [AbsolutePath] = [] } struct BuildRule: Sendable { var parentPath: RelativePath? var sources: Sources var buildArgs: BuildArgs } struct EmitModuleRule: Sendable { var sources: Sources var buildArgs: BuildArgs } } extension SwiftTarget { var buildArgs: BuildArgs { buildRule?.buildArgs ?? emitModuleRule?.buildArgs ?? .init(for: .swiftc) } } extension RepoBuildDir { func getSwiftTargets(for source: SwiftTargetSource) throws -> [SwiftTarget] { try swiftTargets.getTargets(below: source.path) } }