mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[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:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user