Skip to content

Commit 98dbd23

Browse files
committed
[GSB] Add RequirementSource::isProtocolRequirement() to check both protocol-requirement kinds.
It’s too easy to forget to check both ProtocolRequirement and InferredProtocolRequirement, so abstract the check into a method.
1 parent 53b4e70 commit 98dbd23

File tree

3 files changed

+10
-7
lines changed

3 files changed

+10
-7
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,7 @@ class GenericSignatureBuilder::RequirementSource final
869869
"RequirementSource kind/storageKind mismatch");
870870

871871
storage.type = type.getPointer();
872-
if (kind == ProtocolRequirement)
872+
if (isProtocolRequirement())
873873
getTrailingObjects<ProtocolDecl *>()[0] = protocol;
874874
if (hasTrailingWrittenRequirementLoc)
875875
getTrailingObjects<WrittenRequirementLoc>()[0] = writtenReqLoc;
@@ -979,6 +979,11 @@ class GenericSignatureBuilder::RequirementSource final
979979
llvm::function_ref<bool(PotentialArchetype *,
980980
const RequirementSource *)> visitor) const;
981981

982+
/// Whether this source is a requirement in a protocol.
983+
bool isProtocolRequirement() const {
984+
return kind == ProtocolRequirement || kind == InferredProtocolRequirement;
985+
}
986+
982987
/// Whether the requirement is inferred or derived from an inferred
983988
/// requirement.
984989
bool isInferredRequirement() const;

lib/AST/GenericSignature.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -823,8 +823,7 @@ ConformanceAccessPath GenericSignature::getConformanceAccessPath(
823823
buildPath = [&](GenericSignature *sig, const RequirementSource *source,
824824
ProtocolDecl *conformingProto, Type rootType) {
825825
// Each protocol requirement is a step along the path.
826-
if (source->kind == RequirementSource::ProtocolRequirement ||
827-
source->kind == RequirementSource::InferredProtocolRequirement) {
826+
if (source->isProtocolRequirement()) {
828827
// Follow the rest of the path to derive the conformance into which
829828
// this particular protocol requirement step would look.
830829
auto inProtocol = source->getProtocolDecl();

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ ProtocolDecl *RequirementSource::getProtocolDecl() const {
613613
return nullptr;
614614

615615
case StorageKind::StoredType:
616-
if (kind == ProtocolRequirement)
616+
if (isProtocolRequirement())
617617
return getTrailingObjects<ProtocolDecl *>()[0];
618618
return nullptr;
619619

@@ -637,7 +637,7 @@ SourceLoc RequirementSource::getLoc() const {
637637
// for a particular requirement, rather than turning on/off location info.
638638
// Locations that fall into this category should be advisory, emitted via
639639
// notes rather than as the normal location.
640-
if (kind == ProtocolRequirement && parent &&
640+
if (isProtocolRequirement() && parent &&
641641
parent->kind != RequirementSignatureSelf)
642642
return parent->getLoc();
643643

@@ -668,8 +668,7 @@ SourceLoc RequirementSource::getLoc() const {
668668
static unsigned sourcePathLength(const RequirementSource *source) {
669669
unsigned count = 0;
670670
for (; source; source = source->parent) {
671-
if (source->kind == RequirementSource::ProtocolRequirement ||
672-
source->kind == RequirementSource::InferredProtocolRequirement)
671+
if (source->isProtocolRequirement())
673672
++count;
674673
}
675674
return count;

0 commit comments

Comments
 (0)