@@ -71,22 +71,16 @@ public struct Term: Equatable, Hashable {
71
71
let isPositive : Bool
72
72
switch ( self . isPositive, otherIsPositive) {
73
73
case ( false , false ) :
74
- if case . range( let lhs) = lhs, case . range( let rhs) = rhs {
75
- let lower = min ( lhs. lowerBound, rhs. lowerBound)
76
- let upper = max ( lhs. upperBound, rhs. upperBound)
77
- intersection = . range( lower..< upper)
78
- } else {
79
- intersection = lhs. intersection ( rhs)
80
- }
74
+ intersection = lhs. union ( rhs)
81
75
isPositive = false
82
76
case ( true , true ) :
83
77
intersection = lhs. intersection ( rhs)
84
78
isPositive = true
85
79
case ( true , false ) :
86
- intersection = lhs. intersection ( withInverse : rhs)
80
+ intersection = lhs. difference ( rhs)
87
81
isPositive = true
88
82
case ( false , true ) :
89
- intersection = rhs. intersection ( withInverse : lhs)
83
+ intersection = rhs. difference ( lhs)
90
84
isPositive = true
91
85
}
92
86
@@ -184,20 +178,7 @@ extension VersionSetSpecifier {
184
178
extension Term : CustomStringConvertible {
185
179
public var description : String {
186
180
let pkg = " \( package ) "
187
- var req = " "
188
-
189
- let vs = requirement
190
- switch vs {
191
- case . any:
192
- req = " * "
193
- case . empty:
194
- req = " () "
195
- case . exact( let v) :
196
- req = v. description
197
- case . range( let range) :
198
- req = range. description
199
- }
200
-
181
+ let req = requirement. description
201
182
202
183
if !isPositive {
203
184
return " ¬ \( pkg) \( req) "
@@ -224,7 +205,10 @@ public struct Incompatibility: Equatable, Hashable {
224
205
}
225
206
226
207
init ( _ terms: OrderedSet < Term > , root: PackageReference , cause: Cause ) {
227
- assert ( terms. count > 0 , " An incompatibility must contain at least one term. " )
208
+ if terms. isEmpty {
209
+ self . init ( terms: terms, cause: cause)
210
+ return
211
+ }
228
212
229
213
// Remove the root package from generated incompatibilities, since it will
230
214
// always be selected.
@@ -1000,7 +984,7 @@ public final class PubgrubDependencyResolver {
1000
984
switch assignment. term. requirement {
1001
985
case . exact( let version) :
1002
986
boundVersion = . version( version)
1003
- case . range, . any, . empty:
987
+ case . range, . any, . empty, . ranges :
1004
988
fatalError ( " unexpected requirement value for assignment \( assignment. term) " )
1005
989
}
1006
990
@@ -1197,7 +1181,7 @@ public final class PubgrubDependencyResolver {
1197
1181
/// failed, meaning this incompatibility is either empty or only for the root
1198
1182
/// package.
1199
1183
private func isCompleteFailure( _ incompatibility: Incompatibility ) -> Bool {
1200
- return incompatibility. terms. count == 1 && incompatibility. terms. first? . package == root
1184
+ return incompatibility. terms. isEmpty || ( incompatibility . terms . count == 1 && incompatibility. terms. first? . package == root)
1201
1185
}
1202
1186
1203
1187
struct DependencyIncompatibilityError : Swift . Error {
@@ -1230,7 +1214,7 @@ public final class PubgrubDependencyResolver {
1230
1214
1231
1215
let requirement : VersionSetSpecifier
1232
1216
switch pkgTerm. requirement {
1233
- case . any, . empty, . exact:
1217
+ case . any, . empty, . exact, . ranges :
1234
1218
requirement = pkgTerm. requirement
1235
1219
case . range( let range) :
1236
1220
// FIXME: This isn't really correct. How do we figure out the exact upper bound?
@@ -1353,6 +1337,7 @@ public final class PubgrubDependencyResolver {
1353
1337
// resolution errors properly. We only end up showing the
1354
1338
// the problem with the oldest version.
1355
1339
let nextMajor = Version ( version. major + 1 , 0 , 0 )
1340
+ // terms.append(Term(container.identifier, .exact(version)))
1356
1341
terms. append ( Term ( container. identifier, . range( version..< nextMajor) ) )
1357
1342
terms. append ( Term ( not: dep. identifier, vs) )
1358
1343
return Incompatibility ( terms, root: root!, cause: . dependency( package : container. identifier) )
@@ -1659,6 +1644,9 @@ final class DiagnosticReportBuilder {
1659
1644
} else {
1660
1645
return " \( name) \( range. description) "
1661
1646
}
1647
+
1648
+ case . ranges( let ranges) :
1649
+ return " \( name) \( ranges) "
1662
1650
}
1663
1651
}
1664
1652
@@ -1694,7 +1682,7 @@ extension BoundVersion {
1694
1682
extension VersionSetSpecifier {
1695
1683
fileprivate var isExact : Bool {
1696
1684
switch self {
1697
- case . any, . empty, . range:
1685
+ case . any, . empty, . range, . ranges :
1698
1686
return false
1699
1687
case . exact:
1700
1688
return true
@@ -1721,3 +1709,9 @@ extension PackageRequirement {
1721
1709
}
1722
1710
}
1723
1711
}
1712
+
1713
+ extension Version {
1714
+ func nextPatch( ) -> Version {
1715
+ return Version ( major, minor, patch + 1 )
1716
+ }
1717
+ }
0 commit comments