Skip to content

Commit cfb04f3

Browse files
committed
Make Resolved* in PackageGraph value types
1 parent 6e94706 commit cfb04f3

13 files changed

+153
-279
lines changed

Sources/Build/BuildDescription/ClangTargetBuildDescription.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import Basics
1414
import PackageLoading
1515
import PackageModel
16-
import class PackageGraph.ResolvedTarget
16+
import struct PackageGraph.ResolvedTarget
1717
import struct SPMBuildCore.BuildParameters
1818
import struct SPMBuildCore.BuildToolPluginInvocationResult
1919
import struct SPMBuildCore.PrebuildCommandResult

Sources/Build/BuildDescription/TargetBuildDescription.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
import Basics
14-
import class PackageGraph.ResolvedTarget
14+
import struct PackageGraph.ResolvedTarget
1515
import struct PackageModel.Resource
1616
import struct SPMBuildCore.BuildToolPluginInvocationResult
1717

Sources/Build/BuildManifest/LLBuildManifestBuilder+Clang.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import struct LLBuildManifest.Node
1414
import struct Basics.AbsolutePath
1515
import struct Basics.InternalError
16-
import class PackageGraph.ResolvedTarget
16+
import struct PackageGraph.ResolvedTarget
1717
import PackageModel
1818

1919
extension LLBuildManifestBuilder {

Sources/Build/BuildManifest/LLBuildManifestBuilder+Swift.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import struct Basics.TSCAbsolutePath
1717
import struct LLBuildManifest.Node
1818
import struct LLBuildManifest.LLBuildManifest
1919
import struct SPMBuildCore.BuildParameters
20-
import class PackageGraph.ResolvedTarget
20+
import struct PackageGraph.ResolvedTarget
2121
import protocol TSCBasic.FileSystem
2222
import enum TSCBasic.ProcessEnv
2323
import func TSCBasic.topologicalSort

Sources/Build/BuildPlan/BuildPlan+Product.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212

1313
import struct Basics.AbsolutePath
1414
import struct Basics.InternalError
15-
import class PackageGraph.ResolvedProduct
16-
import class PackageGraph.ResolvedTarget
15+
import struct PackageGraph.ResolvedProduct
16+
import struct PackageGraph.ResolvedTarget
1717
import class PackageModel.BinaryTarget
1818
import class PackageModel.ClangTarget
1919
import class PackageModel.Target

Sources/Build/BuildPlan/BuildPlan+Test.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import struct Basics.AbsolutePath
1616
import struct LLBuildManifest.TestDiscoveryTool
1717
import struct LLBuildManifest.TestEntryPointTool
1818
import struct PackageGraph.PackageGraph
19-
import class PackageGraph.ResolvedProduct
20-
import class PackageGraph.ResolvedTarget
19+
import struct PackageGraph.ResolvedProduct
20+
import struct PackageGraph.ResolvedTarget
2121
import struct PackageModel.Sources
2222
import class PackageModel.SwiftTarget
2323
import class PackageModel.Target
@@ -84,10 +84,10 @@ extension BuildPlan {
8484
testDiscoverySrc: Sources(paths: discoveryPaths, root: discoveryDerivedDir)
8585
)
8686
let discoveryResolvedTarget = ResolvedTarget(
87-
target: discoveryTarget,
87+
underlying: discoveryTarget,
8888
dependencies: testProduct.targets.map { .target($0, conditions: []) },
8989
defaultLocalization: testProduct.defaultLocalization,
90-
platforms: testProduct.platforms,
90+
supportedPlatforms: testProduct.platforms,
9191
platformVersionProvider: testProduct.platformVersionProvider
9292
)
9393
let discoveryTargetBuildDescription = try SwiftTargetBuildDescription(
@@ -118,10 +118,10 @@ extension BuildPlan {
118118
testEntryPointSources: entryPointSources
119119
)
120120
let entryPointResolvedTarget = ResolvedTarget(
121-
target: entryPointTarget,
121+
underlying: entryPointTarget,
122122
dependencies: testProduct.targets.map { .target($0, conditions: []) } + [.target(discoveryResolvedTarget, conditions: [])],
123123
defaultLocalization: testProduct.defaultLocalization,
124-
platforms: testProduct.platforms,
124+
supportedPlatforms: testProduct.platforms,
125125
platformVersionProvider: testProduct.platformVersionProvider
126126
)
127127
return try SwiftTargetBuildDescription(
@@ -148,10 +148,10 @@ extension BuildPlan {
148148
testEntryPointSources: entryPointResolvedTarget.underlying.sources
149149
)
150150
let entryPointResolvedTarget = ResolvedTarget(
151-
target: entryPointTarget,
151+
underlying: entryPointTarget,
152152
dependencies: entryPointResolvedTarget.dependencies + [.target(discoveryTargets.resolved, conditions: [])],
153153
defaultLocalization: testProduct.defaultLocalization,
154-
platforms: testProduct.platforms,
154+
supportedPlatforms: testProduct.platforms,
155155
platformVersionProvider: testProduct.platformVersionProvider
156156
)
157157
let entryPointTargetBuildDescription = try SwiftTargetBuildDescription(

Sources/PackageGraph/PackageGraph+Loading.swift

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,9 @@ extension PackageGraph {
152152
rootManifests: root.manifests,
153153
unsafeAllowedPackages: unsafeAllowedPackages,
154154
platformRegistry: customPlatformsRegistry ?? .default,
155-
platformVersionProvider: .init(derivedXCTestPlatformProvider: { declared in
156-
if let customXCTestMinimumDeploymentTargets {
157-
return customXCTestMinimumDeploymentTargets[declared]
158-
} else {
159-
return MinimumDeploymentTarget.default.computeXCTestMinimumDeploymentTarget(for: declared)
160-
}
161-
}),
155+
platformVersionProvider: .init(
156+
implementation: .customXCTestMinimumDeploymentTargets(customXCTestMinimumDeploymentTargets)
157+
),
162158
fileSystem: fileSystem,
163159
observabilityScope: observabilityScope
164160
)
@@ -929,12 +925,10 @@ private final class ResolvedTargetBuilder: ResolvedBuilder<ResolvedTarget> {
929925
}
930926

931927
return ResolvedTarget(
932-
storage: .init(
933-
underlying: self.target,
934-
dependencies: dependencies,
935-
defaultLocalization: self.defaultLocalization,
936-
supportedPlatforms: self.platforms
937-
),
928+
underlying: self.target,
929+
dependencies: dependencies,
930+
defaultLocalization: self.defaultLocalization,
931+
supportedPlatforms: self.platforms,
938932
platformVersionProvider: self.platformVersionProvider
939933
)
940934
}

Sources/PackageGraph/Resolution/PlatformVersionProvider.swift

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,65 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
import struct PackageModel.MinimumDeploymentTarget
1314
import struct PackageModel.Platform
1415
import struct PackageModel.PlatformVersion
1516
import struct PackageModel.SupportedPlatform
1617

17-
public struct PlatformVersionProvider {
18-
public init(derivedXCTestPlatformProvider: ((Platform) -> PlatformVersion?)?) {
19-
self.derivedXCTestPlatformProvider = derivedXCTestPlatformProvider
18+
/// Merging two sets of supported platforms, preferring the max constraint
19+
func merge(into partial: inout [SupportedPlatform], platforms: [SupportedPlatform]) {
20+
for platformSupport in platforms {
21+
if let existing = partial.firstIndex(where: { $0.platform == platformSupport.platform }) {
22+
if partial[existing].version < platformSupport.version {
23+
partial.remove(at: existing)
24+
partial.append(platformSupport)
25+
}
26+
} else {
27+
partial.append(platformSupport)
28+
}
29+
}
30+
}
31+
32+
public struct PlatformVersionProvider: Hashable {
33+
public enum Implementation: Hashable {
34+
case mergingFromTargets([ResolvedTarget])
35+
case customXCTestMinimumDeploymentTargets([PackageModel.Platform: PlatformVersion]?)
36+
case empty
37+
}
38+
39+
private let implementation: Implementation
40+
41+
public init(implementation: Implementation) {
42+
self.implementation = implementation
2043
}
2144

22-
let derivedXCTestPlatformProvider: ((_ declared: PackageModel.Platform) -> PlatformVersion?)?
45+
func derivedXCTestPlatformProvider(_ declared: PackageModel.Platform) -> PlatformVersion? {
46+
switch implementation {
47+
case .mergingFromTargets(let targets):
48+
let platforms = targets.reduce(into: [SupportedPlatform]()) { partial, item in
49+
merge(into: &partial, platforms: [item.getDerived(for: declared, usingXCTest: item.type == .test)])
50+
}
51+
return platforms.first!.version
52+
53+
case .customXCTestMinimumDeploymentTargets(let customXCTestMinimumDeploymentTargets):
54+
if let customXCTestMinimumDeploymentTargets {
55+
return customXCTestMinimumDeploymentTargets[declared]
56+
} else {
57+
return MinimumDeploymentTarget.default.computeXCTestMinimumDeploymentTarget(for: declared)
58+
}
59+
60+
case .empty:
61+
return nil
62+
}
63+
}
2364

2465
/// Returns the supported platform instance for the given platform.
2566
func getDerived(declared: [SupportedPlatform], for platform: Platform, usingXCTest: Bool) -> SupportedPlatform {
2667
// derived platform based on known minimum deployment target logic
2768
if let declaredPlatform = declared.first(where: { $0.platform == platform }) {
2869
var version = declaredPlatform.version
2970

30-
if usingXCTest, let xcTestMinimumDeploymentTarget = derivedXCTestPlatformProvider?(platform), version < xcTestMinimumDeploymentTarget {
71+
if usingXCTest, let xcTestMinimumDeploymentTarget = self.derivedXCTestPlatformProvider(platform), version < xcTestMinimumDeploymentTarget {
3172
version = xcTestMinimumDeploymentTarget
3273
}
3374

@@ -43,7 +84,7 @@ public struct PlatformVersionProvider {
4384
)
4485
} else {
4586
let minimumSupportedVersion: PlatformVersion
46-
if usingXCTest, let xcTestMinimumDeploymentTarget = derivedXCTestPlatformProvider?(platform), xcTestMinimumDeploymentTarget > platform.oldestSupportedVersion {
87+
if usingXCTest, let xcTestMinimumDeploymentTarget = self.derivedXCTestPlatformProvider(platform), xcTestMinimumDeploymentTarget > platform.oldestSupportedVersion {
4788
minimumSupportedVersion = xcTestMinimumDeploymentTarget
4889
} else {
4990
minimumSupportedVersion = platform.oldestSupportedVersion

Sources/PackageGraph/Resolution/ResolvedPackage.swift

Lines changed: 25 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -14,75 +14,47 @@ import Basics
1414
import PackageModel
1515

1616
/// A fully resolved package. Contains resolved targets, products and dependencies of the package.
17-
public final class ResolvedPackage {
17+
public struct ResolvedPackage: Hashable {
1818
// The identity of the package.
1919
public var identity: PackageIdentity {
20-
return self.storage.underlying.identity
20+
return self.underlying.identity
2121
}
2222

2323
/// The manifest describing the package.
2424
public var manifest: Manifest {
25-
return self.storage.underlying.manifest
25+
return self.underlying.manifest
2626
}
2727

2828
/// The local path of the package.
2929
public var path: AbsolutePath {
30-
return self.storage.underlying.path
30+
return self.underlying.path
3131
}
3232

33-
/// The underlying package model.
34-
public var underlying: Package {
35-
self.storage.underlying
36-
}
33+
/// The underlying package reference.
34+
public let underlying: Package
3735

3836
/// The targets contained in the package.
39-
public var targets: [ResolvedTarget] {
40-
self.storage.targets
41-
}
37+
public let targets: [ResolvedTarget]
4238

4339
/// The products produced by the package.
44-
public var products: [ResolvedProduct] {
45-
self.storage.products
46-
}
40+
public let products: [ResolvedProduct]
4741

4842
/// The dependencies of the package.
49-
public var dependencies: [ResolvedPackage] {
50-
self.storage.dependencies
51-
}
43+
public let dependencies: [ResolvedPackage]
5244

53-
/// If the given package's source is a registry release, this provides additional metadata and signature information.
54-
public var registryMetadata: RegistryReleaseMetadata? {
55-
self.storage.registryMetadata
56-
}
45+
/// The default localization for resources.
46+
public let defaultLocalization: String?
5747

58-
struct Storage: Hashable {
59-
/// The underlying package reference.
60-
public let underlying: Package
61-
62-
/// The targets contained in the package.
63-
public let targets: [ResolvedTarget]
64-
65-
/// The products produced by the package.
66-
public let products: [ResolvedProduct]
67-
68-
/// The dependencies of the package.
69-
public let dependencies: [ResolvedPackage]
70-
71-
/// The default localization for resources.
72-
public let defaultLocalization: String?
73-
74-
/// The list of platforms that are supported by this target.
75-
public let platforms: [SupportedPlatform]
76-
77-
/// If the given package's source is a registry release, this provides additional metadata and signature information.
78-
public let registryMetadata: RegistryReleaseMetadata?
79-
}
48+
/// The list of platforms that are supported by this target.
49+
public let platforms: [SupportedPlatform]
50+
51+
/// If the given package's source is a registry release, this provides additional metadata and signature information.
52+
public let registryMetadata: RegistryReleaseMetadata?
8053

81-
private let storage: Storage
8254

8355
private let platformVersionProvider: PlatformVersionProvider
8456

85-
public convenience init(
57+
public init(
8658
package: Package,
8759
defaultLocalization: String?,
8860
platforms: [SupportedPlatform],
@@ -92,44 +64,25 @@ public final class ResolvedPackage {
9264
registryMetadata: RegistryReleaseMetadata?,
9365
platformVersionProvider: PlatformVersionProvider
9466
) {
95-
self.init(
96-
storage: .init(
97-
underlying: package,
98-
targets: targets,
99-
products: products,
100-
dependencies: dependencies,
101-
defaultLocalization: defaultLocalization,
102-
platforms: platforms,
103-
registryMetadata: registryMetadata
104-
),
105-
platformVersionProvider: platformVersionProvider
106-
)
107-
}
108-
109-
init(storage: Storage, platformVersionProvider: PlatformVersionProvider) {
110-
self.storage = storage
67+
self.underlying = package
68+
self.targets = targets
69+
self.products = products
70+
self.dependencies = dependencies
71+
self.defaultLocalization = defaultLocalization
72+
self.platforms = platforms
73+
self.registryMetadata = registryMetadata
11174
self.platformVersionProvider = platformVersionProvider
11275
}
11376

11477
public func getDerived(for platform: Platform, usingXCTest: Bool) -> SupportedPlatform {
11578
self.platformVersionProvider.getDerived(
116-
declared: self.storage.platforms,
79+
declared: self.platforms,
11780
for: platform,
11881
usingXCTest: usingXCTest
11982
)
12083
}
12184
}
12285

123-
extension ResolvedPackage: Hashable {
124-
public func hash(into hasher: inout Hasher) {
125-
hasher.combine(self.storage)
126-
}
127-
128-
public static func == (lhs: ResolvedPackage, rhs: ResolvedPackage) -> Bool {
129-
lhs.storage == rhs.storage
130-
}
131-
}
132-
13386
extension ResolvedPackage: CustomStringConvertible {
13487
public var description: String {
13588
return "<ResolvedPackage: \(self.identity)>"

0 commit comments

Comments
 (0)