Skip to content

Commit 13b200d

Browse files
committed
[Constraint system] Generalize saved ASTNode -> solution target mapping.
We are currently only using the “solution targets” map for statement conditions, but we will need it for more entities soon. Start generalizing now.
1 parent c58e0aa commit 13b200d

File tree

4 files changed

+32
-27
lines changed

4 files changed

+32
-27
lines changed

lib/Sema/CSApply.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7461,7 +7461,7 @@ ExprWalker::rewriteTarget(SolutionApplicationTarget target) {
74617461

74627462
case StmtConditionElement::CK_PatternBinding: {
74637463
ConstraintSystem &cs = solution.getConstraintSystem();
7464-
auto target = *cs.getStmtConditionTarget(&condElement);
7464+
auto target = *cs.getSolutionApplicationTarget(&condElement);
74657465
auto resolvedTarget = rewriteTarget(target);
74667466
if (!resolvedTarget)
74677467
return None;

lib/Sema/CSGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4214,7 +4214,7 @@ bool ConstraintSystem::generateConstraints(StmtCondition condition,
42144214
if (generateConstraints(target, FreeTypeVariableBinding::Disallow))
42154215
return true;
42164216

4217-
setStmtConditionTarget(&condElement, target);
4217+
setSolutionApplicationTarget(&condElement, target);
42184218
continue;
42194219
}
42204220
}

lib/Sema/CSSolver.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ Solution ConstraintSystem::finalize() {
172172
solution.contextualTypes.assign(
173173
contextualTypes.begin(), contextualTypes.end());
174174

175-
solution.stmtConditionTargets = stmtConditionTargets;
175+
solution.solutionApplicationTargets = solutionApplicationTargets;
176176

177177
for (auto &e : CheckedConformances)
178178
solution.Conformances.push_back({e.first, e.second});
@@ -246,9 +246,10 @@ void ConstraintSystem::applySolution(const Solution &solution) {
246246
}
247247

248248
// Register the statement condition targets.
249-
for (const auto &stmtConditionTarget : solution.stmtConditionTargets) {
250-
if (!getStmtConditionTarget(stmtConditionTarget.first))
251-
setStmtConditionTarget(stmtConditionTarget.first, stmtConditionTarget.second);
249+
for (const auto &target : solution.solutionApplicationTargets) {
250+
if (!getSolutionApplicationTarget(target.first))
251+
setSolutionApplicationTarget(target.first, target.second);
252+
}
252253
}
253254

254255
// Register the conformances checked along the way to arrive to solution.
@@ -463,7 +464,7 @@ ConstraintSystem::SolverScope::SolverScope(ConstraintSystem &cs)
463464
numResolvedOverloads = cs.ResolvedOverloads.size();
464465
numInferredClosureTypes = cs.ClosureTypes.size();
465466
numContextualTypes = cs.contextualTypes.size();
466-
numStmtConditionTargets = cs.stmtConditionTargets.size();
467+
numSolutionApplicationTargets = cs.solutionApplicationTargets.size();
467468

468469
PreviousScore = cs.CurrentScore;
469470

@@ -541,8 +542,8 @@ ConstraintSystem::SolverScope::~SolverScope() {
541542
// Remove any contextual types.
542543
truncate(cs.contextualTypes, numContextualTypes);
543544

544-
// Remove any statement condition types.
545-
truncate(cs.stmtConditionTargets, numStmtConditionTargets);
545+
// Remove any solution application targets.
546+
truncate(cs.solutionApplicationTargets, numSolutionApplicationTargets);
546547

547548
// Reset the previous score.
548549
cs.CurrentScore = PreviousScore;

lib/Sema/ConstraintSystem.h

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,10 @@ struct ContextualTypeInfo {
803803
Type getType() const { return typeLoc.getType(); }
804804
};
805805

806+
807+
/// Key to the constraint solver's mapping from AST nodes to their corresponding
808+
/// solution application targets.
809+
using SolutionApplicationTargetsKey = const StmtConditionElement *;
806810
/// A complete solution to a constraint system.
807811
///
808812
/// A solution to a constraint system consists of type variable bindings to
@@ -868,9 +872,9 @@ class Solution {
868872
/// Contextual types introduced by this solution.
869873
std::vector<std::pair<const Expr *, ContextualTypeInfo>> contextualTypes;
870874

871-
/// Maps statement condition entries to their solution application targets.
872-
llvm::MapVector<const StmtConditionElement *, SolutionApplicationTarget>
873-
stmtConditionTargets;
875+
/// Maps AST nodes to their solution application targets.
876+
llvm::MapVector<SolutionApplicationTargetsKey, SolutionApplicationTarget>
877+
solutionApplicationTargets;
874878

875879
std::vector<std::pair<ConstraintLocator *, ProtocolConformanceRef>>
876880
Conformances;
@@ -1546,9 +1550,9 @@ class ConstraintSystem {
15461550
llvm::DenseMap<std::pair<const KeyPathExpr *, unsigned>, TypeBase *>
15471551
KeyPathComponentTypes;
15481552

1549-
/// Maps statement condition entries to their solution application targets.
1550-
llvm::MapVector<const StmtConditionElement *, SolutionApplicationTarget>
1551-
stmtConditionTargets;
1553+
/// Maps AST entries to their solution application targets.
1554+
llvm::MapVector<SolutionApplicationTargetsKey, SolutionApplicationTarget>
1555+
solutionApplicationTargets;
15521556

15531557
/// Contextual type information for expressions that are part of this
15541558
/// constraint system.
@@ -2131,8 +2135,8 @@ class ConstraintSystem {
21312135
/// The length of \c contextualTypes.
21322136
unsigned numContextualTypes;
21332137

2134-
/// The length of \c stmtConditionTargets.
2135-
unsigned numStmtConditionTargets;
2138+
/// The length of \c solutionApplicationTargets.
2139+
unsigned numSolutionApplicationTargets;
21362140

21372141
/// The previous score.
21382142
Score PreviousScore;
@@ -2421,18 +2425,18 @@ class ConstraintSystem {
24212425
return CTP_Unused;
24222426
}
24232427

2424-
void setStmtConditionTarget(
2425-
const StmtConditionElement *element, SolutionApplicationTarget target) {
2426-
assert(element != nullptr && "Expected non-null condition element!");
2427-
assert(stmtConditionTargets.count(element) == 0 &&
2428-
"Already set this condition target");
2429-
stmtConditionTargets.insert({element, target});
2428+
void setSolutionApplicationTarget(
2429+
SolutionApplicationTargetsKey key, SolutionApplicationTarget target) {
2430+
assert(key && "Expected non-null solution application target key!");
2431+
assert(solutionApplicationTargets.count(key) == 0 &&
2432+
"Already set this solution application target");
2433+
solutionApplicationTargets.insert({key, target});
24302434
}
24312435

2432-
Optional<SolutionApplicationTarget> getStmtConditionTarget(
2433-
const StmtConditionElement *element) const {
2434-
auto known = stmtConditionTargets.find(element);
2435-
if (known == stmtConditionTargets.end())
2436+
Optional<SolutionApplicationTarget> getSolutionApplicationTarget(
2437+
SolutionApplicationTargetsKey key) const {
2438+
auto known = solutionApplicationTargets.find(key);
2439+
if (known == solutionApplicationTargets.end())
24362440
return None;
24372441
return known->second;
24382442
}

0 commit comments

Comments
 (0)