Skip to content

Commit 096f6f8

Browse files
xedinahoppen
authored andcommitted
[CSApply] Don't delay tap expression solution application
1 parent e337a39 commit 096f6f8

File tree

1 file changed

+25
-33
lines changed

1 file changed

+25
-33
lines changed

lib/Sema/CSApply.cpp

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8570,15 +8570,11 @@ namespace {
85708570
class ExprWalker : public ASTWalker {
85718571
ExprRewriter &Rewriter;
85728572
SmallVector<ClosureExpr *, 4> ClosuresToTypeCheck;
8573-
SmallVector<std::pair<TapExpr *, DeclContext *>, 4> TapsToTypeCheck;
85748573

85758574
public:
85768575
ExprWalker(ExprRewriter &Rewriter) : Rewriter(Rewriter) { }
85778576

8578-
~ExprWalker() {
8579-
assert(ClosuresToTypeCheck.empty());
8580-
assert(TapsToTypeCheck.empty());
8581-
}
8577+
~ExprWalker() { assert(ClosuresToTypeCheck.empty()); }
85828578

85838579
bool shouldWalkIntoPropertyWrapperPlaceholderValue() override {
85848580
// Property wrapper placeholder underlying values are filled in
@@ -8587,9 +8583,7 @@ namespace {
85878583
}
85888584

85898585
/// Check if there are any closures or tap expressions left to process separately.
8590-
bool hasDelayedTasks() {
8591-
return !ClosuresToTypeCheck.empty() || !TapsToTypeCheck.empty();
8592-
}
8586+
bool hasDelayedTasks() { return !ClosuresToTypeCheck.empty(); }
85938587

85948588
/// Process delayed closure bodies and `Tap` expressions.
85958589
///
@@ -8632,27 +8626,6 @@ namespace {
86328626
hadError |= TypeChecker::typeCheckClosureBody(closure);
86338627
}
86348628

8635-
// Tap expressions too; they should or should not be
8636-
// type-checked under the same conditions as closure bodies.
8637-
{
8638-
for (const auto &tuple : TapsToTypeCheck) {
8639-
auto tap = std::get<0>(tuple);
8640-
auto tapDC = std::get<1>(tuple);
8641-
8642-
hadError |= cs.applySolutionToBody(
8643-
solution, tap, tapDC, [&](SolutionApplicationTarget target) {
8644-
auto resultTarget = rewriteTarget(target);
8645-
if (resultTarget) {
8646-
if (auto expr = resultTarget->getAsExpr())
8647-
solution.setExprTypes(expr);
8648-
}
8649-
8650-
return resultTarget;
8651-
});
8652-
}
8653-
TapsToTypeCheck.clear();
8654-
}
8655-
86568629
return hadError;
86578630
}
86588631

@@ -8677,10 +8650,9 @@ namespace {
86778650
return Action::SkipChildren(SVE);
86788651
}
86798652

8680-
if (auto tap = dyn_cast<TapExpr>(expr)) {
8681-
// We remember the DeclContext because the code to handle
8682-
// single-expression-body closures above changes it.
8683-
TapsToTypeCheck.push_back(std::make_pair(tap, Rewriter.dc));
8653+
if (auto tap = dyn_cast_or_null<TapExpr>(expr)) {
8654+
rewriteTapExpr(tap);
8655+
return Action::SkipChildren(tap);
86848656
}
86858657

86868658
if (auto captureList = dyn_cast<CaptureListExpr>(expr)) {
@@ -8826,6 +8798,26 @@ namespace {
88268798
if (auto expr = resultTarget->getAsExpr())
88278799
solution.setExprTypes(expr);
88288800

8801+
return resultTarget;
8802+
});
8803+
}
8804+
8805+
void rewriteTapExpr(TapExpr *tap) {
8806+
auto &solution = Rewriter.solution;
8807+
8808+
// First, let's visit the tap expression itself
8809+
// and set all of the inferred types.
8810+
Rewriter.visitTapExpr(tap);
8811+
8812+
// Now, let's apply solution to the body
8813+
(void)Rewriter.cs.applySolutionToBody(
8814+
solution, tap, Rewriter.dc, [&](SyntacticElementTarget target) {
8815+
auto resultTarget = rewriteTarget(target);
8816+
if (resultTarget) {
8817+
if (auto expr = resultTarget->getAsExpr())
8818+
solution.setExprTypes(expr);
8819+
}
8820+
88298821
return resultTarget;
88308822
});
88318823
}

0 commit comments

Comments
 (0)