@@ -321,9 +321,10 @@ Type ConstraintSystem::openPackExpansionType(PackExpansionType *expansion,
321
321
// "opening" pack expansions is broken.
322
322
{
323
323
if (preparedOverload) {
324
- for (auto pair : preparedOverload->OpenedPackExpansionTypes ) {
325
- if (pair.first == openedPackExpansion)
326
- return pair.second ;
324
+ for (auto change : preparedOverload->Changes ) {
325
+ if (change.Kind == PreparedOverload::Change::OpenedPackExpansionType &&
326
+ change.PackExpansion .TheExpansion == openedPackExpansion)
327
+ return change.PackExpansion .TypeVar ;
327
328
}
328
329
}
329
330
@@ -345,7 +346,7 @@ Type ConstraintSystem::openPackExpansionType(PackExpansionType *expansion,
345
346
expansionVar, openedPackExpansion,
346
347
expansionLoc);
347
348
if (preparedOverload)
348
- preparedOverload->Constraints . push_back (c);
349
+ preparedOverload->addedConstraint (c);
349
350
else
350
351
addUnsolvedConstraint (c);
351
352
@@ -359,7 +360,7 @@ void ConstraintSystem::recordOpenedPackExpansionType(PackExpansionType *expansio
359
360
PreparedOverload *preparedOverload) {
360
361
if (preparedOverload) {
361
362
ASSERT (PreparingOverload);
362
- preparedOverload->OpenedPackExpansionTypes . push_back ({ expansion, expansionVar} );
363
+ preparedOverload->openedPackExpansionType ( expansion, expansionVar);
363
364
return ;
364
365
}
365
366
@@ -699,8 +700,17 @@ Type ConstraintSystem::getUnopenedTypeOfReference(
699
700
}
700
701
701
702
void ConstraintSystem::recordOpenedType (
702
- ConstraintLocator *locator, ArrayRef<OpenedType> openedTypes) {
703
- bool inserted = OpenedTypes.insert ({locator, openedTypes}).second ;
703
+ ConstraintLocator *locator, ArrayRef<OpenedType> replacements,
704
+ PreparedOverload *preparedOverload) {
705
+ if (preparedOverload) {
706
+ ASSERT (PreparingOverload);
707
+ preparedOverload->openedTypes (replacements);
708
+ return ;
709
+ }
710
+
711
+ ASSERT (!PreparingOverload);
712
+
713
+ bool inserted = OpenedTypes.insert ({locator, replacements}).second ;
704
714
ASSERT (inserted);
705
715
706
716
if (solverState)
@@ -715,16 +725,6 @@ void ConstraintSystem::recordOpenedTypes(
715
725
if (replacements.empty ())
716
726
return ;
717
727
718
- if (preparedOverload) {
719
- ASSERT (PreparingOverload);
720
- ASSERT (preparedOverload->Replacements .empty ());
721
- preparedOverload->Replacements .append (
722
- replacements.begin (), replacements.end ());
723
- return ;
724
- }
725
-
726
- ASSERT (!PreparingOverload);
727
-
728
728
// If the last path element is an archetype or associated type, ignore it.
729
729
SmallVector<LocatorPathElt, 2 > pathElts;
730
730
auto anchor = locator.getLocatorParts (pathElts);
@@ -746,7 +746,8 @@ void ConstraintSystem::recordOpenedTypes(
746
746
// FIXME: Get rid of fixmeAllowDuplicates.
747
747
if (!fixmeAllowDuplicates || OpenedTypes.count (locatorPtr) == 0 )
748
748
recordOpenedType (
749
- locatorPtr, llvm::ArrayRef (openedTypes, replacements.size ()));
749
+ locatorPtr, llvm::ArrayRef (openedTypes, replacements.size ()),
750
+ preparedOverload);
750
751
}
751
752
752
753
// / Determine how many levels of argument labels should be removed from the
@@ -2496,35 +2497,55 @@ void ConstraintSystem::recordResolvedOverload(ConstraintLocator *locator,
2496
2497
2497
2498
void PreparedOverload::discharge (ConstraintSystem &cs,
2498
2499
ConstraintLocatorBuilder locator) const {
2499
- for (auto *tv : TypeVariables) {
2500
- cs.addTypeVariable (tv);
2501
- }
2500
+ for (auto change : Changes) {
2501
+ switch (change.Kind ) {
2502
+ case PreparedOverload::Change::AddedTypeVariable:
2503
+ cs.addTypeVariable (change.TypeVar );
2504
+ break ;
2502
2505
2503
- for ( auto *c : Constraints) {
2504
- cs.addUnsolvedConstraint (c );
2505
- cs.activateConstraint (c );
2506
- }
2506
+ case PreparedOverload::Change::AddedConstraint:
2507
+ cs.addUnsolvedConstraint (change. TheConstraint );
2508
+ cs.activateConstraint (change. TheConstraint );
2509
+ break ;
2507
2510
2508
- cs.recordOpenedTypes (locator, Replacements);
2511
+ case PreparedOverload::Change::OpenedTypes: {
2512
+ auto *locatorPtr = cs.getConstraintLocator (locator);
2513
+ ArrayRef<OpenedType> replacements (
2514
+ change.Replacements .Data ,
2515
+ change.Replacements .Count );
2509
2516
2510
- if (OpenedExistential) {
2511
- cs.recordOpenedExistentialType (cs.getConstraintLocator (locator),
2512
- OpenedExistential);
2513
- }
2517
+ // FIXME: Get rid of this conditional.
2518
+ if (cs.getOpenedTypes (locatorPtr).empty ())
2519
+ cs.recordOpenedType (locatorPtr, replacements);
2520
+ break ;
2521
+ }
2514
2522
2515
- for (auto pair : OpenedPackExpansionTypes) {
2516
- cs.recordOpenedPackExpansionType (pair.first , pair.second );
2517
- }
2523
+ case PreparedOverload::Change::OpenedExistentialType: {
2524
+ auto *locatorPtr = cs.getConstraintLocator (locator);
2525
+ cs.recordOpenedExistentialType (locatorPtr,
2526
+ change.TheExistential );
2527
+ break ;
2528
+ }
2529
+
2530
+ case PreparedOverload::Change::OpenedPackExpansionType:
2531
+ cs.recordOpenedPackExpansionType (
2532
+ change.PackExpansion .TheExpansion ,
2533
+ change.PackExpansion .TypeVar );
2534
+ break ;
2518
2535
2519
- if (!PropertyWrappers.empty ()) {
2520
- Expr *anchor = getAsExpr (cs.getConstraintLocator (locator)->getAnchor ());
2521
- for (auto applied : PropertyWrappers) {
2522
- cs.applyPropertyWrapper (anchor, applied);
2536
+ case PreparedOverload::Change::AppliedPropertyWrapper: {
2537
+ auto *locatorPtr = cs.getConstraintLocator (locator);
2538
+ Expr *anchor = getAsExpr (locatorPtr->getAnchor ());
2539
+ cs.applyPropertyWrapper (anchor,
2540
+ { Type (change.PropertyWrapper .WrapperType ),
2541
+ change.PropertyWrapper .InitKind });
2542
+ break ;
2523
2543
}
2524
- }
2525
2544
2526
- for (auto pair : Fixes) {
2527
- cs.recordFix (pair.first , pair.second );
2545
+ case PreparedOverload::Change::AddedFix:
2546
+ cs.recordFix (change.Fix .TheFix , change.Fix .Impact );
2547
+ break ;
2548
+ }
2528
2549
}
2529
2550
}
2530
2551
0 commit comments