Skip to content

Commit 43f2c03

Browse files
committed
AST: Move AvailabilityDomain ordering to Availabilty.cpp.
Availability attribute inferrence is currently the only thing that depends on having a total ordering on AvailabilityDomains.
1 parent 21c4850 commit 43f2c03

File tree

2 files changed

+31
-19
lines changed

2 files changed

+31
-19
lines changed

include/swift/AST/AvailabilityDomain.h

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -196,23 +196,6 @@ class AvailabilityDomain final {
196196
return !(*this == other);
197197
}
198198

199-
/// A total, stable ordering on domains.
200-
bool operator<(const AvailabilityDomain &other) const {
201-
if (getKind() != other.getKind())
202-
return getKind() < other.getKind();
203-
204-
switch (getKind()) {
205-
case Kind::Universal:
206-
case Kind::SwiftLanguage:
207-
case Kind::PackageDescription:
208-
case Kind::Embedded:
209-
// These availability domains are singletons.
210-
return false;
211-
case Kind::Platform:
212-
return getPlatformKind() < other.getPlatformKind();
213-
}
214-
}
215-
216199
void Profile(llvm::FoldingSetNodeID &ID) const {
217200
ID.AddPointer(getOpaqueValue());
218201
}
@@ -249,6 +232,10 @@ struct DenseMapInfo<AvailabilityDomain> {
249232
static inline AvailabilityDomain getTombstoneKey() {
250233
return DenseMapInfo<AvailabilityDomain::Storage>::getTombstoneKey();
251234
}
235+
static inline unsigned getHashValue(AvailabilityDomain domain) {
236+
return DenseMapInfo<AvailabilityDomain::Storage>::getHashValue(
237+
domain.storage);
238+
}
252239
static bool isEqual(const AvailabilityDomain LHS,
253240
const AvailabilityDomain RHS) {
254241
return LHS == RHS;

lib/AST/Availability.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,33 @@ void AvailabilityInference::applyInferredAvailableAttrs(
201201
Decl *ToDecl, ArrayRef<const Decl *> InferredFromDecls) {
202202
auto &Context = ToDecl->getASTContext();
203203

204+
class OrderedAvailabilityDomain {
205+
public:
206+
AvailabilityDomain domain;
207+
208+
OrderedAvailabilityDomain(AvailabilityDomain domain) : domain(domain) {}
209+
210+
bool operator<(const OrderedAvailabilityDomain &other) const {
211+
auto kind = domain.getKind();
212+
auto otherKind = other.domain.getKind();
213+
if (kind != otherKind)
214+
return kind < otherKind;
215+
216+
switch (kind) {
217+
case AvailabilityDomain::Kind::Universal:
218+
case AvailabilityDomain::Kind::SwiftLanguage:
219+
case AvailabilityDomain::Kind::PackageDescription:
220+
case AvailabilityDomain::Kind::Embedded:
221+
return false;
222+
case AvailabilityDomain::Kind::Platform:
223+
return domain.getPlatformKind() < other.domain.getPlatformKind();
224+
}
225+
}
226+
};
227+
204228
// Iterate over the declarations and infer required availability on
205229
// a per-platform basis.
206-
std::map<AvailabilityDomain, InferredAvailability> Inferred;
230+
std::map<OrderedAvailabilityDomain, InferredAvailability> Inferred;
207231
for (const Decl *D : InferredFromDecls) {
208232
llvm::SmallVector<SemanticAvailableAttr, 8> MergedAttrs;
209233

@@ -238,7 +262,8 @@ void AvailabilityInference::applyInferredAvailableAttrs(
238262
// Create an availability attribute for each observed platform and add
239263
// to ToDecl.
240264
for (auto &Pair : Inferred) {
241-
if (auto Attr = createAvailableAttr(Pair.first, Pair.second, Context))
265+
if (auto Attr =
266+
createAvailableAttr(Pair.first.domain, Pair.second, Context))
242267
Attrs.add(Attr);
243268
}
244269
}

0 commit comments

Comments
 (0)