@@ -1200,3 +1200,35 @@ operator()(CanType maybeOpaqueType, Type replacementType,
12001200 }
12011201 return substRef;
12021202}
1203+
1204+ Type ReplaceExistentialArchetypesWithConcreteTypes::getInterfaceType (
1205+ ExistentialArchetypeType *type) const {
1206+ return type->getInterfaceType ().transformRec (
1207+ [&](TypeBase *type) -> std::optional<Type> {
1208+ if (isa<GenericTypeParamType>(type))
1209+ return type->getASTContext ().TheSelfType ;
1210+ return std::nullopt ;
1211+ });
1212+ }
1213+
1214+ Type ReplaceExistentialArchetypesWithConcreteTypes::operator ()(
1215+ SubstitutableType *type) const {
1216+ auto *existentialArchetype = dyn_cast<ExistentialArchetypeType>(type);
1217+ if (!existentialArchetype ||
1218+ existentialArchetype->getGenericEnvironment () != env)
1219+ return type;
1220+
1221+ auto interfaceType = getInterfaceType (existentialArchetype);
1222+ return interfaceType.subst (subs);
1223+ }
1224+
1225+ ProtocolConformanceRef ReplaceExistentialArchetypesWithConcreteTypes::operator ()(
1226+ CanType origType, Type substType, ProtocolDecl *proto) const {
1227+ auto existentialArchetype = dyn_cast<ExistentialArchetypeType>(origType);
1228+ if (!existentialArchetype ||
1229+ existentialArchetype->getGenericEnvironment () != env)
1230+ return ProtocolConformanceRef::forAbstract (substType, proto);
1231+
1232+ return subs.lookupConformance (
1233+ getInterfaceType (existentialArchetype)->getCanonicalType (), proto);
1234+ }
0 commit comments