@@ -3447,58 +3447,50 @@ class DeclDeserializer {
3447
3447
GenericSignatureID interfaceSigID;
3448
3448
TypeID interfaceTypeID;
3449
3449
GenericSignatureID genericSigID;
3450
- SubstitutionMapID underlyingTypeID ;
3450
+ SubstitutionMapID underlyingTypeSubsID ;
3451
3451
uint8_t rawAccessLevel;
3452
3452
decls_block::OpaqueTypeLayout::readRecord (scratch, contextID,
3453
3453
namingDeclID, interfaceSigID,
3454
3454
interfaceTypeID, genericSigID,
3455
- underlyingTypeID, rawAccessLevel);
3455
+ underlyingTypeSubsID,
3456
+ rawAccessLevel);
3456
3457
3457
3458
auto declContext = MF.getDeclContext (contextID);
3458
3459
auto interfaceSig = MF.getGenericSignature (interfaceSigID);
3459
- auto interfaceType = MF.getType (interfaceTypeID)
3460
- ->castTo <GenericTypeParamType>();
3460
+ auto interfaceType = MF.getType (interfaceTypeID);
3461
3461
3462
3462
// Check for reentrancy.
3463
3463
if (declOrOffset.isComplete ())
3464
3464
return cast<OpaqueTypeDecl>(declOrOffset.get ());
3465
-
3465
+
3466
+ auto genericParams = MF.maybeReadGenericParams (declContext);
3467
+
3466
3468
// Create the decl.
3467
3469
auto opaqueDecl = OpaqueTypeDecl::get (
3468
- /* NamingDecl*/ nullptr , /* GenericParams*/ nullptr , declContext,
3469
- interfaceSig, /* OpaqueReturnTypeReprs*/ { }, interfaceType);
3470
+ /* NamingDecl=*/ nullptr , genericParams, declContext,
3471
+ interfaceSig, /* OpaqueReturnTypeReprs*/ { },
3472
+ interfaceType->castTo <GenericTypeParamType>());
3470
3473
declOrOffset = opaqueDecl;
3471
3474
3472
3475
auto namingDecl = cast<ValueDecl>(MF.getDecl (namingDeclID));
3473
3476
opaqueDecl->setNamingDecl (namingDecl);
3474
3477
3478
+ opaqueDecl->setInterfaceType (MetatypeType::get (interfaceType));
3479
+
3475
3480
if (auto accessLevel = getActualAccessLevel (rawAccessLevel))
3476
3481
opaqueDecl->setAccess (*accessLevel);
3477
3482
else
3478
3483
MF.fatal ();
3479
3484
3480
- if (auto genericParams = MF.maybeReadGenericParams (opaqueDecl)) {
3481
- ctx.evaluator .cacheOutput (GenericParamListRequest{opaqueDecl},
3482
- std::move (genericParams));
3483
- }
3484
-
3485
3485
auto genericSig = MF.getGenericSignature (genericSigID);
3486
3486
if (genericSig)
3487
3487
opaqueDecl->setGenericSignature (genericSig);
3488
- if (underlyingTypeID ) {
3489
- auto subMapOrError = MF.getSubstitutionMapChecked (underlyingTypeID );
3488
+ if (underlyingTypeSubsID ) {
3489
+ auto subMapOrError = MF.getSubstitutionMapChecked (underlyingTypeSubsID );
3490
3490
if (!subMapOrError)
3491
3491
return subMapOrError.takeError ();
3492
3492
opaqueDecl->setUnderlyingTypeSubstitutions (subMapOrError.get ());
3493
3493
}
3494
- SubstitutionMap subs;
3495
- if (genericSig) {
3496
- subs = genericSig->getIdentitySubstitutionMap ();
3497
- }
3498
- // TODO [OPAQUE SUPPORT]: multiple opaque types
3499
- auto opaqueTy = OpaqueTypeArchetypeType::get (opaqueDecl, 0 , subs);
3500
- auto metatype = MetatypeType::get (opaqueTy);
3501
- opaqueDecl->setInterfaceType (metatype);
3502
3494
return opaqueDecl;
3503
3495
}
3504
3496
@@ -5522,9 +5514,10 @@ class TypeDeserializer {
5522
5514
Expected<Type> deserializeOpaqueArchetypeType (ArrayRef<uint64_t > scratch,
5523
5515
StringRef blobData) {
5524
5516
DeclID opaqueDeclID;
5517
+ unsigned ordinal;
5525
5518
SubstitutionMapID subsID;
5526
- decls_block::OpaqueArchetypeTypeLayout::readRecord (scratch,
5527
- opaqueDeclID, subsID);
5519
+ decls_block::OpaqueArchetypeTypeLayout::readRecord (
5520
+ scratch, opaqueDeclID, ordinal , subsID);
5528
5521
5529
5522
auto opaqueTypeOrError = MF.getDeclChecked (opaqueDeclID);
5530
5523
if (!opaqueTypeOrError)
@@ -5535,9 +5528,7 @@ class TypeDeserializer {
5535
5528
if (!subsOrError)
5536
5529
return subsOrError.takeError ();
5537
5530
5538
- // TODO [OPAQUE SUPPORT]: to support multiple opaque types we will probably
5539
- // have to serialize the ordinal, which is always 0 for now
5540
- return OpaqueTypeArchetypeType::get (opaqueDecl, 0 , subsOrError.get ());
5531
+ return OpaqueTypeArchetypeType::get (opaqueDecl, ordinal, subsOrError.get ());
5541
5532
}
5542
5533
5543
5534
Expected<Type> deserializeNestedArchetypeType (ArrayRef<uint64_t > scratch,
0 commit comments