Merge pull request #67594 from simanerush/simanerush/pack-iteration-impl

[SE-0408] Enable Pack Iteration
This commit is contained in:
Sima Nerush
2023-12-07 17:09:48 -08:00
committed by GitHub
26 changed files with 840 additions and 185 deletions

View File

@@ -9313,11 +9313,7 @@ ConstraintSystem::simplifyPackElementOfConstraint(Type first, Type second,
}
if (isSingleUnlabeledPackExpansionTuple(patternType)) {
auto *packVar =
createTypeVariable(getConstraintLocator(locator), TVO_CanBindToPack);
addConstraint(ConstraintKind::MaterializePackExpansion, patternType,
packVar,
getConstraintLocator(locator, {ConstraintLocator::Member}));
auto *packVar = addMaterializePackExpansionConstraint(patternType, locator);
addConstraint(ConstraintKind::PackElementOf, elementType, packVar, locator);
return SolutionKind::Solved;
}
@@ -13453,6 +13449,12 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyShapeOfConstraint(
return SolutionKind::Solved;
}
if (isSingleUnlabeledPackExpansionTuple(packTy)) {
auto *packVar = addMaterializePackExpansionConstraint(packTy, locator);
addConstraint(ConstraintKind::ShapeOf, shapeTy, packVar, locator);
return SolutionKind::Solved;
}
// Map element archetypes to the pack context to check for equality.
if (packTy->hasElementArchetype()) {
auto *packEnv = DC->getGenericEnvironmentOfContext();
@@ -14908,6 +14910,7 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyFixConstraint(
case FixKind::AllowInvalidPackElement:
case FixKind::AllowInvalidPackReference:
case FixKind::AllowInvalidPackExpansion:
case FixKind::IgnoreWhereClauseInPackIteration:
case FixKind::MacroMissingPound:
case FixKind::AllowGlobalActorMismatch:
case FixKind::AllowAssociatedValueMismatch:
@@ -15636,6 +15639,16 @@ void ConstraintSystem::addExplicitConversionConstraint(
addDisjunctionConstraint(constraints, locator, rememberChoice);
}
TypeVariableType *ConstraintSystem::addMaterializePackExpansionConstraint(
Type patternType, ConstraintLocatorBuilder locator) {
assert(isSingleUnlabeledPackExpansionTuple(patternType));
TypeVariableType *packVar =
createTypeVariable(getConstraintLocator(locator), TVO_CanBindToPack);
addConstraint(ConstraintKind::MaterializePackExpansion, patternType, packVar,
getConstraintLocator(locator, {ConstraintLocator::Member}));
return packVar;
}
ConstraintSystem::SolutionKind
ConstraintSystem::simplifyConstraint(const Constraint &constraint) {
auto matchKind = constraint.getKind();