Skip to content

Commit fd7759f

Browse files
committed
AST: Move Requirement::compare() to GenericSignature.cpp
1 parent 8f8b02c commit fd7759f

File tree

3 files changed

+40
-36
lines changed

3 files changed

+40
-36
lines changed

include/swift/AST/Requirement.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ class Requirement
9292
/// superclass requirement, 'T : C' cannot be satisfied.
9393
bool canBeSatisfied() const;
9494

95+
/// Linear order on requirements in a generic signature.
96+
int compare(const Requirement &other) const;
97+
9598
SWIFT_DEBUG_DUMP;
9699
void dump(raw_ostream &out) const;
97100
void print(raw_ostream &os, const PrintOptions &opts) const;

lib/AST/GenericSignature.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,6 +1431,41 @@ bool Requirement::canBeSatisfied() const {
14311431
llvm_unreachable("Bad requirement kind");
14321432
}
14331433

1434+
/// Determine the canonical ordering of requirements.
1435+
static unsigned getRequirementKindOrder(RequirementKind kind) {
1436+
switch (kind) {
1437+
case RequirementKind::Conformance: return 2;
1438+
case RequirementKind::Superclass: return 0;
1439+
case RequirementKind::SameType: return 3;
1440+
case RequirementKind::Layout: return 1;
1441+
}
1442+
llvm_unreachable("unhandled kind");
1443+
}
1444+
1445+
/// Linear order on requirements in a generic signature.
1446+
int Requirement::compare(const Requirement &other) const {
1447+
int compareLHS =
1448+
compareDependentTypes(getFirstType(), other.getFirstType());
1449+
1450+
if (compareLHS != 0)
1451+
return compareLHS;
1452+
1453+
int compareKind = (getRequirementKindOrder(getKind()) -
1454+
getRequirementKindOrder(other.getKind()));
1455+
1456+
if (compareKind != 0)
1457+
return compareKind;
1458+
1459+
// We should only have multiple conformance requirements.
1460+
assert(getKind() == RequirementKind::Conformance);
1461+
1462+
int compareProtos =
1463+
TypeDecl::compare(getProtocolDecl(), other.getProtocolDecl());
1464+
1465+
assert(compareProtos != 0 && "Duplicate conformance requirement");
1466+
return compareProtos;
1467+
}
1468+
14341469
/// Compare two associated types.
14351470
int swift::compareAssociatedTypes(AssociatedTypeDecl *assocType1,
14361471
AssociatedTypeDecl *assocType2) {

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7848,43 +7848,9 @@ static Optional<Requirement> createRequirement(RequirementKind kind,
78487848
}
78497849
}
78507850

7851-
/// Determine the canonical ordering of requirements.
7852-
static unsigned getRequirementKindOrder(RequirementKind kind) {
7853-
switch (kind) {
7854-
case RequirementKind::Conformance: return 2;
7855-
case RequirementKind::Superclass: return 0;
7856-
case RequirementKind::SameType: return 3;
7857-
case RequirementKind::Layout: return 1;
7858-
}
7859-
llvm_unreachable("unhandled kind");
7860-
}
7861-
78627851
static int compareRequirements(const Requirement *lhsPtr,
78637852
const Requirement *rhsPtr) {
7864-
auto &lhs = *lhsPtr;
7865-
auto &rhs = *rhsPtr;
7866-
7867-
int compareLHS =
7868-
compareDependentTypes(lhs.getFirstType(), rhs.getFirstType());
7869-
7870-
if (compareLHS != 0)
7871-
return compareLHS;
7872-
7873-
int compareKind = (getRequirementKindOrder(lhs.getKind()) -
7874-
getRequirementKindOrder(rhs.getKind()));
7875-
7876-
if (compareKind != 0)
7877-
return compareKind;
7878-
7879-
// We should only have multiple conformance requirements.
7880-
assert(lhs.getKind() == RequirementKind::Conformance);
7881-
7882-
int compareProtos =
7883-
TypeDecl::compare(lhs.getProtocolDecl(), rhs.getProtocolDecl());
7884-
7885-
assert(compareProtos != 0 && "Duplicate conformance requirement");
7886-
7887-
return compareProtos;
7853+
return lhsPtr->compare(*rhsPtr);
78887854
}
78897855

78907856
void GenericSignatureBuilder::enumerateRequirements(
@@ -8113,7 +8079,7 @@ static void checkGenericSignature(CanGenericSignature canSig,
81138079
"Concrete subject type should not have any other requirements");
81148080
}
81158081

8116-
assert(compareRequirements(&prevReqt, &reqt) < 0 &&
8082+
assert(prevReqt.compare(reqt) < 0 &&
81178083
"Out-of-order requirements");
81188084
}
81198085
}

0 commit comments

Comments
 (0)