AST: Add NormalProtocolConformance::AssociatedConformances

This commit is contained in:
Slava Pestov
2023-10-09 14:46:56 -04:00
parent d51442247a
commit c0637b101b
2 changed files with 47 additions and 0 deletions

View File

@@ -569,6 +569,42 @@ NormalProtocolConformance::getAssociatedConformance(Type assocType,
return *result;
}
/// Allocate the backing array if needed, computing its size from the
///protocol's requirement signature.
void NormalProtocolConformance::createAssociatedConformanceArray() {
if (hasComputedAssociatedConformances())
return;
setHasComputedAssociatedConformances();
auto *proto = getProtocol();
unsigned count = 0;
for (auto req : proto->getRequirementSignature().getRequirements()) {
if (req.getKind() == RequirementKind::Conformance)
++count;
}
auto &ctx = proto->getASTContext();
AssociatedConformances =
ctx.Allocate<llvm::Optional<ProtocolConformanceRef>>(count);
}
llvm::Optional<ProtocolConformanceRef>
NormalProtocolConformance::getAssociatedConformance(unsigned index) const {
if (!hasComputedAssociatedConformances())
return llvm::None;
return AssociatedConformances[index];
}
void NormalProtocolConformance::setAssociatedConformance(
unsigned index, ProtocolConformanceRef assocConf) {
createAssociatedConformanceArray();
assert(!AssociatedConformances[index]);
AssociatedConformances[index] = assocConf;
}
/// A stripped-down version of Type::subst that only works on the protocol
/// Self type wrapped in zero or more DependentMemberTypes.