@@ -1200,3 +1200,35 @@ operator()(CanType maybeOpaqueType, Type replacementType,
1200
1200
}
1201
1201
return substRef;
1202
1202
}
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