[CS] Generalize implied result handling

Track the implied result exprs in the constraint
system, and allow arbitrary propagation of
implied results down if/switch expression
branches. This is required for allowing implied
results in non-single-expression closures.
This commit is contained in:
Hamish Knight
2024-02-06 14:14:27 +00:00
parent d73e394ea7
commit 61a4148925
9 changed files with 146 additions and 100 deletions

View File

@@ -148,6 +148,10 @@ Solution ConstraintSystem::finalize() {
(void)inserted;
}
// Remember implied results.
for (auto impliedResult : ImpliedResults)
solution.ImpliedResults.insert(impliedResult);
// Remember the opened types.
for (const auto &opened : OpenedTypes) {
// We shouldn't ever register opened types multiple times,
@@ -294,6 +298,10 @@ void ConstraintSystem::applySolution(const Solution &solution) {
argumentMatchingChoices.insert(argumentMatch);
}
// Remember implied results.
for (auto impliedResult : solution.ImpliedResults)
ImpliedResults.insert(impliedResult);
// Register the solution's opened types.
for (const auto &opened : solution.OpenedTypes) {
OpenedTypes.insert(opened);
@@ -667,6 +675,7 @@ ConstraintSystem::SolverScope::SolverScope(ConstraintSystem &cs)
numAppliedPropertyWrappers = cs.appliedPropertyWrappers.size();
numResolvedOverloads = cs.ResolvedOverloads.size();
numInferredClosureTypes = cs.ClosureTypes.size();
numImpliedResults = cs.ImpliedResults.size();
numContextualTypes = cs.contextualTypes.size();
numTargets = cs.targets.size();
numCaseLabelItems = cs.caseLabelItems.size();
@@ -789,6 +798,9 @@ ConstraintSystem::SolverScope::~SolverScope() {
// Remove any inferred closure types (e.g. used in result builder body).
truncate(cs.ClosureTypes, numInferredClosureTypes);
// Remove any implied results.
truncate(cs.ImpliedResults, numImpliedResults);
// Remove any contextual types.
truncate(cs.contextualTypes, numContextualTypes);