@@ -886,6 +886,36 @@ llvm::Error ModuleFile::readGenericRequirementsChecked(
886886 return llvm::Error::success ();
887887}
888888
889+ void ModuleFile::readAssociatedTypes (
890+ SmallVectorImpl<AssociatedTypeDecl *> &assocTypes,
891+ llvm::BitstreamCursor &Cursor) {
892+ using namespace decls_block ;
893+
894+ BCOffsetRAII lastRecordOffset (Cursor);
895+ SmallVector<uint64_t , 8 > scratch;
896+ StringRef blobData;
897+
898+ while (true ) {
899+ lastRecordOffset.reset ();
900+
901+ llvm::BitstreamEntry entry =
902+ fatalIfUnexpected (Cursor.advance (AF_DontPopBlockAtEnd));
903+ if (entry.Kind != llvm::BitstreamEntry::Record)
904+ break ;
905+
906+ scratch.clear ();
907+ unsigned recordID = fatalIfUnexpected (
908+ Cursor.readRecord (entry.ID , scratch, &blobData));
909+ if (recordID != ASSOCIATED_TYPE)
910+ break ;
911+
912+ DeclID declID;
913+ AssociatedTypeLayout::readRecord (scratch, declID);
914+
915+ assocTypes.push_back (cast<AssociatedTypeDecl>(getDecl (declID)));
916+ }
917+ }
918+
889919// / Advances past any records that might be part of a requirement signature.
890920static llvm::Error skipGenericRequirements (llvm::BitstreamCursor &Cursor) {
891921 using namespace decls_block ;
@@ -919,6 +949,38 @@ static llvm::Error skipGenericRequirements(llvm::BitstreamCursor &Cursor) {
919949 return llvm::Error::success ();
920950}
921951
952+ // / Advances past any lazy associated type member records.
953+ static llvm::Error skipAssociatedTypeMembers (llvm::BitstreamCursor &Cursor) {
954+ using namespace decls_block ;
955+
956+ BCOffsetRAII lastRecordOffset (Cursor);
957+
958+ while (true ) {
959+ Expected<llvm::BitstreamEntry> maybeEntry =
960+ Cursor.advance (AF_DontPopBlockAtEnd);
961+ if (!maybeEntry)
962+ return maybeEntry.takeError ();
963+ llvm::BitstreamEntry entry = maybeEntry.get ();
964+ if (entry.Kind != llvm::BitstreamEntry::Record)
965+ break ;
966+
967+ Expected<unsigned > maybeRecordID = Cursor.skipRecord (entry.ID );
968+ if (!maybeRecordID)
969+ return maybeRecordID.takeError ();
970+ switch (maybeRecordID.get ()) {
971+ case ASSOCIATED_TYPE:
972+ break ;
973+
974+ default :
975+ // This record is not an associated type.
976+ return llvm::Error::success ();
977+ }
978+
979+ lastRecordOffset.reset ();
980+ }
981+ return llvm::Error::success ();
982+ }
983+
922984GenericSignature ModuleFile::getGenericSignature (
923985 serialization::GenericSignatureID ID) {
924986 auto signature = getGenericSignatureChecked (ID);
@@ -3552,6 +3614,11 @@ class DeclDeserializer {
35523614 if (llvm::Error Err = skipGenericRequirements (MF.DeclTypeCursor ))
35533615 MF.fatal (std::move (Err));
35543616
3617+ proto->setLazyAssociatedTypeMembers (&MF,
3618+ MF.DeclTypeCursor .GetCurrentBitNo ());
3619+ if (llvm::Error Err = skipAssociatedTypeMembers (MF.DeclTypeCursor ))
3620+ MF.fatal (std::move (Err));
3621+
35553622 proto->setMemberLoader (&MF, MF.DeclTypeCursor .GetCurrentBitNo ());
35563623
35573624 return proto;
@@ -6558,6 +6625,14 @@ void ModuleFile::loadRequirementSignature(const ProtocolDecl *decl,
65586625 readGenericRequirements (reqs, DeclTypeCursor);
65596626}
65606627
6628+ void ModuleFile::loadAssociatedTypes (const ProtocolDecl *decl,
6629+ uint64_t contextData,
6630+ SmallVectorImpl<AssociatedTypeDecl *> &assocTypes) {
6631+ BCOffsetRAII restoreOffset (DeclTypeCursor);
6632+ fatalIfNotSuccess (DeclTypeCursor.JumpToBit (contextData));
6633+ readAssociatedTypes (assocTypes, DeclTypeCursor);
6634+ }
6635+
65616636static Optional<ForeignErrorConvention::Kind>
65626637decodeRawStableForeignErrorConventionKind (uint8_t kind) {
65636638 switch (kind) {
0 commit comments