mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Serialization: Rework serialization of nested archetypes.
Explicitly serialize the parent archetype so that it can be any kind of root archetype.
This commit is contained in:
@@ -3027,7 +3027,7 @@ public:
|
||||
MF.error();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
// Set the interface type.
|
||||
fn->computeType();
|
||||
|
||||
@@ -4686,12 +4686,12 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
|
||||
break;
|
||||
}
|
||||
|
||||
case decls_block::ARCHETYPE_TYPE: {
|
||||
case decls_block::PRIMARY_ARCHETYPE_TYPE: {
|
||||
GenericEnvironmentID envID;
|
||||
TypeID interfaceTypeID;
|
||||
unsigned depth, index;
|
||||
|
||||
decls_block::ArchetypeTypeLayout::readRecord(scratch, envID,
|
||||
interfaceTypeID);
|
||||
decls_block::PrimaryArchetypeTypeLayout::readRecord(scratch, envID,
|
||||
depth, index);
|
||||
|
||||
auto env = getGenericEnvironment(envID);
|
||||
if (!env) {
|
||||
@@ -4699,7 +4699,7 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
|
||||
break;
|
||||
}
|
||||
|
||||
Type interfaceType = getType(interfaceTypeID);
|
||||
Type interfaceType = GenericTypeParamType::get(depth, index, ctx);
|
||||
Type contextType = env->mapTypeIntoContext(interfaceType);
|
||||
typeOrOffset = contextType;
|
||||
|
||||
@@ -4711,15 +4711,37 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
|
||||
break;
|
||||
}
|
||||
|
||||
case decls_block::OPENED_EXISTENTIAL_TYPE: {
|
||||
case decls_block::OPENED_ARCHETYPE_TYPE: {
|
||||
TypeID existentialID;
|
||||
|
||||
decls_block::OpenedExistentialTypeLayout::readRecord(scratch,
|
||||
existentialID);
|
||||
decls_block::OpenedArchetypeTypeLayout::readRecord(scratch,
|
||||
existentialID);
|
||||
|
||||
typeOrOffset = OpenedArchetypeType::get(getType(existentialID));
|
||||
break;
|
||||
}
|
||||
|
||||
case decls_block::NESTED_ARCHETYPE_TYPE: {
|
||||
TypeID rootID, interfaceTyID;
|
||||
decls_block::NestedArchetypeTypeLayout::readRecord(scratch,
|
||||
rootID, interfaceTyID);
|
||||
|
||||
auto rootTy = getType(rootID)->castTo<ArchetypeType>();
|
||||
auto interfaceTy = getType(interfaceTyID)->castTo<DependentMemberType>();
|
||||
auto rootInterfaceTy = interfaceTy->getRootGenericParam();
|
||||
|
||||
auto sig = rootTy->getGenericEnvironment()->getGenericSignature();
|
||||
|
||||
auto subs = SubstitutionMap::get(sig,
|
||||
[&](SubstitutableType *t) -> Type {
|
||||
if (t->isEqual(rootInterfaceTy))
|
||||
return rootTy;
|
||||
return t;
|
||||
}, LookUpConformanceInModule(getAssociatedModule()));
|
||||
|
||||
typeOrOffset = Type(interfaceTy).subst(subs);
|
||||
break;
|
||||
}
|
||||
|
||||
case decls_block::GENERIC_TYPE_PARAM_TYPE: {
|
||||
DeclID declIDOrDepth;
|
||||
|
||||
Reference in New Issue
Block a user