Skip to content

Commit c0637b1

Browse files
committed
AST: Add NormalProtocolConformance::AssociatedConformances
1 parent d514422 commit c0637b1

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

include/swift/AST/ProtocolConformance.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,7 @@ class NormalProtocolConformance : public RootProtocolConformance,
481481
/// Conformances that satisfy each of conformance requirements of the
482482
/// requirement signature of the protocol.
483483
ArrayRef<ProtocolConformanceRef> SignatureConformances;
484+
MutableArrayRef<llvm::Optional<ProtocolConformanceRef>> AssociatedConformances;
484485

485486
/// The lazy member loader provides callbacks for populating imported and
486487
/// deserialized conformances.
@@ -636,6 +637,16 @@ class NormalProtocolConformance : public RootProtocolConformance,
636637
ProtocolConformanceRef
637638
getAssociatedConformance(Type assocType, ProtocolDecl *protocol) const;
638639

640+
/// Allocate the backing array if needed, computing its size from the
641+
///protocol's requirement signature.
642+
void createAssociatedConformanceArray();
643+
644+
llvm::Optional<ProtocolConformanceRef>
645+
getAssociatedConformance(unsigned index) const;
646+
647+
void
648+
setAssociatedConformance(unsigned index, ProtocolConformanceRef assocConf);
649+
639650
/// Retrieve the value witness corresponding to the given requirement.
640651
Witness getWitness(ValueDecl *requirement) const;
641652

lib/AST/ProtocolConformance.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,42 @@ NormalProtocolConformance::getAssociatedConformance(Type assocType,
569569
return *result;
570570
}
571571

572+
/// Allocate the backing array if needed, computing its size from the
573+
///protocol's requirement signature.
574+
void NormalProtocolConformance::createAssociatedConformanceArray() {
575+
if (hasComputedAssociatedConformances())
576+
return;
577+
578+
setHasComputedAssociatedConformances();
579+
580+
auto *proto = getProtocol();
581+
582+
unsigned count = 0;
583+
for (auto req : proto->getRequirementSignature().getRequirements()) {
584+
if (req.getKind() == RequirementKind::Conformance)
585+
++count;
586+
}
587+
588+
auto &ctx = proto->getASTContext();
589+
AssociatedConformances =
590+
ctx.Allocate<llvm::Optional<ProtocolConformanceRef>>(count);
591+
}
592+
593+
llvm::Optional<ProtocolConformanceRef>
594+
NormalProtocolConformance::getAssociatedConformance(unsigned index) const {
595+
if (!hasComputedAssociatedConformances())
596+
return llvm::None;
597+
598+
return AssociatedConformances[index];
599+
}
600+
601+
void NormalProtocolConformance::setAssociatedConformance(
602+
unsigned index, ProtocolConformanceRef assocConf) {
603+
createAssociatedConformanceArray();
604+
605+
assert(!AssociatedConformances[index]);
606+
AssociatedConformances[index] = assocConf;
607+
}
572608

573609
/// A stripped-down version of Type::subst that only works on the protocol
574610
/// Self type wrapped in zero or more DependentMemberTypes.

0 commit comments

Comments
 (0)