@@ -8570,15 +8570,11 @@ namespace {
8570
8570
class ExprWalker : public ASTWalker {
8571
8571
ExprRewriter &Rewriter;
8572
8572
SmallVector<ClosureExpr *, 4 > ClosuresToTypeCheck;
8573
- SmallVector<std::pair<TapExpr *, DeclContext *>, 4 > TapsToTypeCheck;
8574
8573
8575
8574
public:
8576
8575
ExprWalker (ExprRewriter &Rewriter) : Rewriter(Rewriter) { }
8577
8576
8578
- ~ExprWalker () {
8579
- assert (ClosuresToTypeCheck.empty ());
8580
- assert (TapsToTypeCheck.empty ());
8581
- }
8577
+ ~ExprWalker () { assert (ClosuresToTypeCheck.empty ()); }
8582
8578
8583
8579
bool shouldWalkIntoPropertyWrapperPlaceholderValue () override {
8584
8580
// Property wrapper placeholder underlying values are filled in
@@ -8587,9 +8583,7 @@ namespace {
8587
8583
}
8588
8584
8589
8585
// / 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 (); }
8593
8587
8594
8588
// / Process delayed closure bodies and `Tap` expressions.
8595
8589
// /
@@ -8632,27 +8626,6 @@ namespace {
8632
8626
hadError |= TypeChecker::typeCheckClosureBody (closure);
8633
8627
}
8634
8628
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
-
8656
8629
return hadError;
8657
8630
}
8658
8631
@@ -8677,10 +8650,9 @@ namespace {
8677
8650
return Action::SkipChildren (SVE);
8678
8651
}
8679
8652
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);
8684
8656
}
8685
8657
8686
8658
if (auto captureList = dyn_cast<CaptureListExpr>(expr)) {
@@ -8826,6 +8798,26 @@ namespace {
8826
8798
if (auto expr = resultTarget->getAsExpr ())
8827
8799
solution.setExprTypes (expr);
8828
8800
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
+
8829
8821
return resultTarget;
8830
8822
});
8831
8823
}
0 commit comments