mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Logically compare swift versions as though X == X.0 == X.0.0, etc.
This commit is contained in:
@@ -314,7 +314,11 @@ bool Version::isValidEffectiveLanguageVersion() const {
|
||||
for (auto verStr : getValidEffectiveVersions()) {
|
||||
auto v = parseVersionString(verStr, SourceLoc(), nullptr);
|
||||
assert(v.hasValue());
|
||||
if (v == *this)
|
||||
// In this case, use logical-equality _and_ precision-equality. We do not
|
||||
// want to permit users requesting effective language versions more precise
|
||||
// than our whitelist (eg. we permit 3 but not 3.0 or 3.0.0), since
|
||||
// accepting such an argument promises more than we're able to deliver.
|
||||
if (v == *this && v.getValue().size() == size())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -336,23 +340,27 @@ bool operator>=(const class Version &lhs,
|
||||
if (lhs.empty())
|
||||
return true;
|
||||
|
||||
auto n = std::min(lhs.size(), rhs.size());
|
||||
auto n = std::max(lhs.size(), rhs.size());
|
||||
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
if (lhs[i] < rhs[i])
|
||||
auto lv = i < lhs.size() ? lhs[i] : 0;
|
||||
auto rv = i < rhs.size() ? rhs[i] : 0;
|
||||
if (lv < rv)
|
||||
return false;
|
||||
else if (lhs[i] > rhs[i])
|
||||
else if (lv > rv)
|
||||
return true;
|
||||
}
|
||||
return lhs.size() >= rhs.size();
|
||||
// Equality
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator==(const class Version &lhs,
|
||||
const class Version &rhs) {
|
||||
if (lhs.size() != rhs.size())
|
||||
return false;
|
||||
for (size_t i = 0; i < lhs.size(); ++i) {
|
||||
if (lhs[i] != rhs[i])
|
||||
auto n = std::max(lhs.size(), rhs.size());
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
auto lv = i < lhs.size() ? lhs[i] : 0;
|
||||
auto rv = i < rhs.size() ? rhs[i] : 0;
|
||||
if (lv != rv)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user