@@ -17,7 +17,7 @@ import SourceControl
17
17
/// PackageContainerProvider implementation used by Workspace to do a dependency pre-calculation using the cached
18
18
/// dependency information (Workspace.DependencyManifests) to check if dependency resolution is required before
19
19
/// performing a full resolution.
20
- struct LocalContainerProvider : PackageContainerProvider {
20
+ struct ResolverPrecomputationProvider : PackageContainerProvider {
21
21
/// The package graph inputs.
22
22
let root : PackageGraphRoot
23
23
@@ -65,6 +65,7 @@ struct LocalContainerProvider: PackageContainerProvider {
65
65
}
66
66
67
67
// Continue searching from the Workspace's root manifests.
68
+ // FIXME: We might want to use a dictionary for faster lookups.
68
69
if let index = dependencyManifests. root. packageRefs. firstIndex ( of: identifier) {
69
70
let container = LocalPackageContainer (
70
71
manifest: dependencyManifests. root. manifests [ index] ,
@@ -83,10 +84,12 @@ struct LocalContainerProvider: PackageContainerProvider {
83
84
84
85
private struct LocalPackageContainer : PackageContainer {
85
86
let manifest : Manifest
87
+ /// The managed dependency if the package is not a root package.
86
88
let dependency : ManagedDependency ?
87
89
let config : SwiftPMConfig
88
90
let currentToolsVersion : ToolsVersion
89
91
92
+ // Gets the package reference from the managed dependency or computes it for root packages.
90
93
var identifier : PackageReference {
91
94
if let identifier = dependency? . packageRef {
92
95
return identifier
@@ -122,14 +125,29 @@ private struct LocalPackageContainer: PackageContainer {
122
125
}
123
126
124
127
func getDependencies( at version: Version ) throws -> [ PackageContainerConstraint ] {
128
+ // Throw an error when the dependency is not at the correct version to fail resolution.
129
+ guard dependency? . checkoutState? . version == version else {
130
+ throw Diagnostics . fatalError
131
+ }
132
+
125
133
return manifest. dependencyConstraints ( config: config)
126
134
}
127
135
128
136
func getDependencies( at revision: String ) throws -> [ PackageContainerConstraint ] {
137
+ // Throw an error when the dependency is not at the correct revision to fail resolution.
138
+ guard dependency? . checkoutState? . revision. identifier == revision else {
139
+ throw Diagnostics . fatalError
140
+ }
141
+
129
142
return manifest. dependencyConstraints ( config: config)
130
143
}
131
144
132
145
func getUnversionedDependencies( ) throws -> [ PackageContainerConstraint ] {
146
+ // Throw an error when the dependency is not unversioned to fail resolution.
147
+ guard dependency? . state. isCheckout != true else {
148
+ throw Diagnostics . fatalError
149
+ }
150
+
133
151
return manifest. dependencyConstraints ( config: config)
134
152
}
135
153
0 commit comments