Skip to content

Commit 87b5df7

Browse files
committed
[Constraint system] Abstract the record of an applied function builder.
std::pair and std::tuple are a bad, bad drug. NFC, but helps with future refactoring.
1 parent c128f6f commit 87b5df7

File tree

4 files changed

+26
-20
lines changed

4 files changed

+26
-20
lines changed

lib/Sema/BuilderTransform.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -586,14 +586,16 @@ ConstraintSystem::TypeMatchResult ConstraintSystem::applyFunctionBuilder(
586586
assert(transformedType && "Missing type");
587587

588588
// Record the transformation.
589-
assert(std::find_if(builderTransformedClosures.begin(),
590-
builderTransformedClosures.end(),
591-
[&](const std::tuple<ClosureExpr *, Type, Expr *> &elt) {
592-
return std::get<0>(elt) == closure;
593-
}) == builderTransformedClosures.end() &&
589+
assert(std::find_if(
590+
builderTransformedClosures.begin(),
591+
builderTransformedClosures.end(),
592+
[&](const std::pair<ClosureExpr *, AppliedBuilderTransform> &elt) {
593+
return elt.first == closure;
594+
}) == builderTransformedClosures.end() &&
594595
"already transformed this closure along this path!?!");
595596
builderTransformedClosures.push_back(
596-
std::make_tuple(closure, builderType, singleExpr));
597+
std::make_pair(closure,
598+
AppliedBuilderTransform{builderType, singleExpr}));
597599

598600
// Bind the result type of the closure to the type of the transformed
599601
// expression.

lib/Sema/CSApply.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7461,7 +7461,7 @@ namespace {
74617461
auto builder =
74627462
Rewriter.solution.builderTransformedClosures.find(closure);
74637463
if (builder != Rewriter.solution.builderTransformedClosures.end()) {
7464-
auto singleExpr = builder->second.second;
7464+
auto singleExpr = builder->second.singleExpr;
74657465
auto returnStmt = new (tc.Context) ReturnStmt(
74667466
singleExpr->getStartLoc(), singleExpr, /*implicit=*/true);
74677467
auto braceStmt = BraceStmt::create(
@@ -7586,7 +7586,7 @@ bool ConstraintSystem::applySolutionFixes(Expr *E, const Solution &solution) {
75867586
if (auto *closure = dyn_cast<ClosureExpr>(E)) {
75877587
auto result = solution.builderTransformedClosures.find(closure);
75887588
if (result != solution.builderTransformedClosures.end()) {
7589-
auto *transformedExpr = result->second.second;
7589+
auto *transformedExpr = result->second.singleExpr;
75907590
// Since this closure has been transformed into something
75917591
// else let's look inside transformed expression instead.
75927592
transformedExpr->walk(*this);

lib/Sema/CSSolver.cpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,11 @@ Solution ConstraintSystem::finalize() {
174174

175175
for (const auto &transformed : builderTransformedClosures) {
176176
auto known =
177-
solution.builderTransformedClosures.find(std::get<0>(transformed));
177+
solution.builderTransformedClosures.find(transformed.first);
178178
if (known != solution.builderTransformedClosures.end()) {
179-
assert(known->second.second == std::get<2>(transformed));
179+
assert(known->second.singleExpr == transformed.second.singleExpr);
180180
}
181-
solution.builderTransformedClosures.insert(
182-
std::make_pair(std::get<0>(transformed),
183-
std::make_pair(std::get<1>(transformed),
184-
std::get<2>(transformed))));
181+
solution.builderTransformedClosures.insert(transformed);
185182
}
186183

187184
return solution;
@@ -253,10 +250,7 @@ void ConstraintSystem::applySolution(const Solution &solution) {
253250
CheckedConformances.push_back(conformance);
254251

255252
for (const auto &transformed : solution.builderTransformedClosures) {
256-
builderTransformedClosures.push_back(
257-
std::make_tuple(transformed.first,
258-
transformed.second.first,
259-
transformed.second.second));
253+
builderTransformedClosures.push_back(transformed);
260254
}
261255

262256
// Register any fixes produced along this path.

lib/Sema/ConstraintSystem.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,16 @@ enum ScoreKind {
502502
/// The number of score kinds.
503503
const unsigned NumScoreKinds = SK_LastScoreKind + 1;
504504

505+
/// Describes what happened when a function builder transform was applied
506+
/// to a particular closure.
507+
struct AppliedBuilderTransform {
508+
/// The builder type that was applied to the closure.
509+
Type builderType;
510+
511+
/// The single expression to which the closure was transformed.
512+
Expr *singleExpr;
513+
};
514+
505515
/// Describes the fixed score of a solution to the constraint system.
506516
struct Score {
507517
unsigned Data[NumScoreKinds] = {};
@@ -656,7 +666,7 @@ class Solution {
656666
Conformances;
657667

658668
/// The set of closures that have been transformed by a function builder.
659-
llvm::MapVector<ClosureExpr *, std::pair<Type, Expr *>>
669+
llvm::MapVector<ClosureExpr *, AppliedBuilderTransform>
660670
builderTransformedClosures;
661671

662672
/// Simplify the given type by substituting all occurrences of
@@ -1150,7 +1160,7 @@ class ConstraintSystem {
11501160
CheckedConformances;
11511161

11521162
/// The set of closures that have been transformed by a function builder.
1153-
SmallVector<std::tuple<ClosureExpr *, Type, Expr *>, 4>
1163+
std::vector<std::pair<ClosureExpr *, AppliedBuilderTransform>>
11541164
builderTransformedClosures;
11551165

11561166
public:

0 commit comments

Comments
 (0)