Merge pull request #40747 from DougGregor/opaque-type-archetype-environment

This commit is contained in:
Doug Gregor
2022-01-06 06:50:50 -08:00
committed by GitHub
10 changed files with 449 additions and 248 deletions

View File

@@ -837,7 +837,8 @@ Type ConstraintSystem::openType(Type type, OpenedTypeMap &replacements) {
Type ConstraintSystem::openOpaqueType(OpaqueTypeArchetypeType *opaque,
ConstraintLocatorBuilder locator) {
auto opaqueLocatorKey = getOpenOpaqueLocator(locator, opaque->getDecl());
auto opaqueDecl = opaque->getDecl();
auto opaqueLocatorKey = getOpenOpaqueLocator(locator, opaqueDecl);
// If we have already opened this opaque type, look in the known set of
// replacements.
@@ -858,9 +859,22 @@ Type ConstraintSystem::openOpaqueType(OpaqueTypeArchetypeType *opaque,
// corresponding to the underlying type should be the constraints on the
// underlying return type.
auto opaqueLocator = locator.withPathElement(
LocatorPathElt::OpenedOpaqueArchetype(opaque->getDecl()));
LocatorPathElt::OpenedOpaqueArchetype(opaqueDecl));
OpenedTypeMap replacements;
openGeneric(DC, opaque->getBoundSignature(), opaqueLocator, replacements);
openGeneric(DC, opaqueDecl->getOpaqueInterfaceGenericSignature(),
opaqueLocator, replacements);
// If there is an outer generic signature, bind the outer parameters based
// on the substitutions in the opaque type.
auto subs = opaque->getSubstitutions();
if (auto genericSig = subs.getGenericSignature()) {
for (auto *genericParamPtr : genericSig.getGenericParams()) {
Type genericParam(genericParamPtr);
addConstraint(
ConstraintKind::Bind, openType(genericParam, replacements),
genericParam.subst(subs), opaqueLocator);
}
}
recordOpenedTypes(opaqueLocatorKey, replacements);