Skip to content

Commit b007800

Browse files
authored
Merge pull request swiftlang#36170 from slavapestov/requirement-get-protocol-decl
AST: Factor out a new Requirement::getProtocolDecl() utility method
2 parents 7feafbd + 53e06d6 commit b007800

24 files changed

+74
-107
lines changed

include/swift/AST/Requirement.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ class Requirement
7474
llvm_unreachable("Unhandled RequirementKind in switch.");
7575
}
7676

77+
ProtocolDecl *getProtocolDecl() const;
78+
7779
SWIFT_DEBUG_DUMP;
7880
void dump(raw_ostream &out) const;
7981
void print(raw_ostream &os, const PrintOptions &opts) const;

include/swift/IRGen/Linking.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -565,8 +565,7 @@ class LinkEntity {
565565
for (const auto &reqt : proto->getRequirementSignature()) {
566566
if (reqt.getKind() == RequirementKind::Conformance &&
567567
reqt.getFirstType()->getCanonicalType() == associatedType &&
568-
reqt.getSecondType()->castTo<ProtocolType>()->getDecl() ==
569-
requirement) {
568+
reqt.getProtocolDecl() == requirement) {
570569
return index;
571570
}
572571
++index;
@@ -590,7 +589,7 @@ class LinkEntity {
590589
auto &reqt = proto->getRequirementSignature()[index];
591590
assert(reqt.getKind() == RequirementKind::Conformance);
592591
return { reqt.getFirstType()->getCanonicalType(),
593-
reqt.getSecondType()->castTo<ProtocolType>()->getDecl() };
592+
reqt.getProtocolDecl() };
594593
}
595594

596595
static std::pair<CanType, ProtocolDecl*>

include/swift/SIL/SILWitnessVisitor.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ template <class T> class SILWitnessVisitor : public ASTVisitor<T> {
6464
case RequirementKind::Conformance: {
6565
auto type = reqt.getFirstType()->getCanonicalType();
6666
assert(type->isTypeParameter());
67-
auto requirement =
68-
cast<ProtocolType>(reqt.getSecondType()->getCanonicalType())
69-
->getDecl();
67+
auto requirement = reqt.getProtocolDecl();
7068

7169
// ObjC protocols do not have witnesses.
7270
if (!Lowering::TypeConverter::protocolRequiresWitnessTable(requirement))

lib/AST/ASTContext.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -709,8 +709,7 @@ FuncDecl *ASTContext::getPlusFunctionOnRangeReplaceableCollection() const {
709709
continue;
710710
for (auto Req: FD->getGenericRequirements()) {
711711
if (Req.getKind() == RequirementKind::Conformance &&
712-
Req.getSecondType()->getNominalOrBoundGenericNominal() ==
713-
getRangeReplaceableCollectionDecl()) {
712+
Req.getProtocolDecl() == getRangeReplaceableCollectionDecl()) {
714713
getImpl().PlusFunctionOnRangeReplaceableCollection = FD;
715714
}
716715
}

lib/AST/ASTMangler.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1592,8 +1592,7 @@ static bool containsRetroactiveConformance(
15921592
for (auto requirement : rootConformance->getConditionalRequirements()) {
15931593
if (requirement.getKind() != RequirementKind::Conformance)
15941594
continue;
1595-
ProtocolDecl *proto =
1596-
requirement.getSecondType()->castTo<ProtocolType>()->getDecl();
1595+
ProtocolDecl *proto = requirement.getProtocolDecl();
15971596
auto conformance = subMap.lookupConformance(
15981597
requirement.getFirstType()->getCanonicalType(), proto);
15991598
if (conformance.isInvalid()) {
@@ -2619,8 +2618,7 @@ void ASTMangler::appendRequirement(const Requirement &reqt) {
26192618
case RequirementKind::Layout: {
26202619
} break;
26212620
case RequirementKind::Conformance: {
2622-
Type SecondTy = reqt.getSecondType();
2623-
appendProtocolName(SecondTy->castTo<ProtocolType>()->getDecl());
2621+
appendProtocolName(reqt.getProtocolDecl());
26242622
} break;
26252623
case RequirementKind::Superclass:
26262624
case RequirementKind::SameType: {
@@ -3073,7 +3071,7 @@ static unsigned conformanceRequirementIndex(
30733071
continue;
30743072

30753073
if (req.getFirstType()->isEqual(entry.first) &&
3076-
req.getSecondType()->castTo<ProtocolType>()->getDecl() == entry.second)
3074+
req.getProtocolDecl() == entry.second)
30773075
return result;
30783076

30793077
++result;
@@ -3201,8 +3199,7 @@ void ASTMangler::appendConcreteProtocolConformance(
32013199
if (type->hasArchetype())
32023200
type = type->mapTypeOutOfContext();
32033201
CanType canType = type->getCanonicalType(CurGenericSignature);
3204-
auto proto =
3205-
conditionalReq.getSecondType()->castTo<ProtocolType>()->getDecl();
3202+
auto proto = conditionalReq.getProtocolDecl();
32063203

32073204
ProtocolConformanceRef conformance;
32083205

lib/AST/ASTPrinter.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2533,8 +2533,7 @@ static bool usesFeatureRethrowsProtocol(
25332533
->getGenericSignatureOfContext()) {
25342534
for (const auto &req : genericSig->getRequirements()) {
25352535
if (req.getKind() == RequirementKind::Conformance &&
2536-
usesFeatureRethrowsProtocol(
2537-
req.getSecondType()->getAs<ProtocolType>()->getDecl(), checked))
2536+
usesFeatureRethrowsProtocol(req.getProtocolDecl(), checked))
25382537
return true;
25392538
}
25402539
}

lib/AST/ASTVerifier.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2752,8 +2752,7 @@ class Verifier : public ASTWalker {
27522752
abort();
27532753
}
27542754

2755-
auto reqProto =
2756-
req.getSecondType()->castTo<ProtocolType>()->getDecl();
2755+
auto reqProto = req.getProtocolDecl();
27572756
if (reqProto != conformances[idx].getRequirement()) {
27582757
Out << "error: wrong protocol in signature conformances: have "
27592758
<< conformances[idx].getRequirement()->getName().str()

lib/AST/GenericSignature.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -308,9 +308,8 @@ CanGenericSignature::getCanonical(TypeArrayView<GenericTypeParamType> params,
308308
assert(reqt.getKind() == RequirementKind::Conformance &&
309309
"Only conformance requirements can have multiples");
310310

311-
auto prevProto =
312-
prevReqt.getSecondType()->castTo<ProtocolType>()->getDecl();
313-
auto proto = reqt.getSecondType()->castTo<ProtocolType>()->getDecl();
311+
auto prevProto = prevReqt.getProtocolDecl();
312+
auto proto = reqt.getProtocolDecl();
314313
assert(TypeDecl::compare(prevProto, proto) < 0 &&
315314
"Out-of-order conformance requirements");
316315
}
@@ -545,8 +544,7 @@ bool GenericSignatureImpl::isRequirementSatisfied(
545544

546545
switch (requirement.getKind()) {
547546
case RequirementKind::Conformance: {
548-
auto protocolType = requirement.getSecondType()->castTo<ProtocolType>();
549-
auto protocol = protocolType->getDecl();
547+
auto *protocol = requirement.getProtocolDecl();
550548

551549
if (canFirstType->isTypeParameter())
552550
return requiresProtocol(canFirstType, protocol);
@@ -746,8 +744,7 @@ static bool hasConformanceInSignature(ArrayRef<Requirement> requirements,
746744
for (const auto &req: requirements) {
747745
if (req.getKind() == RequirementKind::Conformance &&
748746
req.getFirstType()->isEqual(subjectType) &&
749-
req.getSecondType()->castTo<ProtocolType>()->getDecl()
750-
== proto) {
747+
req.getProtocolDecl() == proto) {
751748
return true;
752749
}
753750
}
@@ -1007,7 +1004,6 @@ bool Requirement::isCanonical() const {
10071004
return true;
10081005
}
10091006

1010-
10111007
/// Get the canonical form of this requirement.
10121008
Requirement Requirement::getCanonical() const {
10131009
Type firstType = getFirstType();
@@ -1029,3 +1025,8 @@ Requirement Requirement::getCanonical() const {
10291025
}
10301026
llvm_unreachable("Unhandled RequirementKind in switch");
10311027
}
1028+
1029+
ProtocolDecl *Requirement::getProtocolDecl() const {
1030+
assert(getKind() == RequirementKind::Conformance);
1031+
return getSecondType()->castTo<ProtocolType>()->getDecl();
1032+
}

lib/AST/NameLookup.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2700,8 +2700,7 @@ swift::getDirectlyInheritedNominalTypeDecls(
27002700
if (!req.getFirstType()->isEqual(protoSelfTy))
27012701
continue;
27022702

2703-
result.emplace_back(req.getSecondType()->castTo<ProtocolType>()->getDecl(),
2704-
loc);
2703+
result.emplace_back(req.getProtocolDecl(), loc);
27052704
}
27062705
return result;
27072706
}

lib/AST/ProtocolConformance.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -572,8 +572,7 @@ void NormalProtocolConformance::setSignatureConformances(
572572
"Should have interface types here");
573573
assert(idx < conformances.size());
574574
assert(conformances[idx].isInvalid() ||
575-
conformances[idx].getRequirement() ==
576-
req.getSecondType()->castTo<ProtocolType>()->getDecl());
575+
conformances[idx].getRequirement() == req.getProtocolDecl());
577576
++idx;
578577
}
579578
}
@@ -772,7 +771,7 @@ NormalProtocolConformance::getAssociatedConformance(Type assocType,
772771
if (reqt.getKind() == RequirementKind::Conformance) {
773772
// Is this the conformance we're looking for?
774773
if (reqt.getFirstType()->isEqual(assocType) &&
775-
reqt.getSecondType()->castTo<ProtocolType>()->getDecl() == protocol)
774+
reqt.getProtocolDecl() == protocol)
776775
return getSignatureConformances()[conformanceIndex];
777776

778777
++conformanceIndex;
@@ -840,7 +839,7 @@ void NormalProtocolConformance::finishSignatureConformances() {
840839
auto *depMemTy = origTy->castTo<DependentMemberType>();
841840
substTy = recursivelySubstituteBaseType(module, this, depMemTy);
842841
}
843-
auto reqProto = req.getSecondType()->castTo<ProtocolType>()->getDecl();
842+
auto reqProto = req.getProtocolDecl();
844843

845844
// Looking up a conformance for a contextual type and mapping the
846845
// conformance context produces a more accurate result than looking

0 commit comments

Comments
 (0)