Skip to content

Commit 9bd0d9b

Browse files
committed
[Sema] Walk separately-checked closures normally in MiscDiagnostics
We no longer need to make any special affordances for separately-checked closures, walk them normally.
1 parent cbeb4bf commit 9bd0d9b

File tree

6 files changed

+5
-106
lines changed

6 files changed

+5
-106
lines changed

include/swift/AST/ASTWalker.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -634,16 +634,6 @@ class ASTWalker {
634634
}
635635
}
636636

637-
/// This method configures whether the walker should visit the body of a
638-
/// closure that was checked separately from its enclosing expression.
639-
///
640-
/// For work that is performed for every top-level expression, this should
641-
/// be overridden to return false, to avoid duplicating work or visiting
642-
/// bodies of closures that have not yet been type checked.
643-
virtual bool shouldWalkIntoSeparatelyCheckedClosure(ClosureExpr *) {
644-
return true;
645-
}
646-
647637
/// This method configures whether the walker should visit the body of a
648638
/// TapExpr.
649639
virtual bool shouldWalkIntoTapExpression() { return true; }

lib/AST/ASTWalker.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,12 +1012,6 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
10121012
return nullptr;
10131013
}
10141014

1015-
// If the closure was separately type checked and we don't want to
1016-
// visit separately-checked closure bodies, bail out now.
1017-
if (expr->isSeparatelyTypeChecked() &&
1018-
!Walker.shouldWalkIntoSeparatelyCheckedClosure(expr))
1019-
return expr;
1020-
10211015
// Handle other closures.
10221016
if (BraceStmt *body = cast_or_null<BraceStmt>(doIt(expr->getBody()))) {
10231017
expr->setBody(body);

lib/Sema/MiscDiagnostics.cpp

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -59,32 +59,6 @@ static Expr *isImplicitPromotionToOptional(Expr *E) {
5959
return nullptr;
6060
}
6161

62-
ASTWalker::PreWalkAction BaseDiagnosticWalker::walkToDeclPre(Decl *D) {
63-
return Action::VisitNodeIf(isa<ClosureExpr>(D->getDeclContext()) &&
64-
shouldWalkIntoDeclInClosureContext(D));
65-
}
66-
67-
bool BaseDiagnosticWalker::shouldWalkIntoDeclInClosureContext(Decl *D) {
68-
auto *closure = dyn_cast<ClosureExpr>(D->getDeclContext());
69-
assert(closure);
70-
71-
if (closure->isSeparatelyTypeChecked())
72-
return false;
73-
74-
// Let's not walk into declarations contained in a multi-statement
75-
// closure because they'd be handled via `typeCheckDecl` that runs
76-
// syntactic diagnostics.
77-
if (!closure->hasSingleExpressionBody()) {
78-
// Since pattern bindings get their types through solution application,
79-
// `typeCheckDecl` doesn't touch initializers (because they are already
80-
// fully type-checked), so pattern bindings have to be allowed to be
81-
// walked to diagnose syntactic issues.
82-
return isa<PatternBindingDecl>(D);
83-
}
84-
85-
return true;
86-
}
87-
8862
/// Diagnose syntactic restrictions of expressions.
8963
///
9064
/// - Module values may only occur as part of qualification.
@@ -1605,10 +1579,6 @@ static void diagRecursivePropertyAccess(const Expr *E, const DeclContext *DC) {
16051579
cast<VarDecl>(DRE->getDecl())->isSelfParameter();
16061580
}
16071581

1608-
bool shouldWalkIntoSeparatelyCheckedClosure(ClosureExpr *expr) override {
1609-
return false;
1610-
}
1611-
16121582
bool shouldWalkCaptureInitializerExpressions() override { return true; }
16131583

16141584
MacroWalking getMacroWalkingBehavior() const override {
@@ -4590,10 +4560,6 @@ static void checkStmtConditionTrailingClosure(ASTContext &ctx, const Expr *E) {
45904560
public:
45914561
DiagnoseWalker(ASTContext &ctx) : Ctx(ctx) { }
45924562

4593-
bool shouldWalkIntoSeparatelyCheckedClosure(ClosureExpr *expr) override {
4594-
return false;
4595-
}
4596-
45974563
bool shouldWalkCaptureInitializerExpressions() override { return true; }
45984564

45994565
MacroWalking getMacroWalkingBehavior() const override {
@@ -4719,10 +4685,6 @@ class ObjCSelectorWalker : public ASTWalker {
47194685
ObjCSelectorWalker(const DeclContext *dc, Type selectorTy)
47204686
: Ctx(dc->getASTContext()), DC(dc), SelectorTy(selectorTy) { }
47214687

4722-
bool shouldWalkIntoSeparatelyCheckedClosure(ClosureExpr *expr) override {
4723-
return false;
4724-
}
4725-
47264688
bool shouldWalkCaptureInitializerExpressions() override { return true; }
47274689

47284690
MacroWalking getMacroWalkingBehavior() const override {
@@ -5585,10 +5547,6 @@ static void diagnoseUnintendedOptionalBehavior(const Expr *E,
55855547
}
55865548
}
55875549

5588-
bool shouldWalkIntoSeparatelyCheckedClosure(ClosureExpr *expr) override {
5589-
return false;
5590-
}
5591-
55925550
bool shouldWalkCaptureInitializerExpressions() override { return true; }
55935551

55945552
MacroWalking getMacroWalkingBehavior() const override {
@@ -5664,10 +5622,6 @@ static void diagnoseDeprecatedWritableKeyPath(const Expr *E,
56645622
}
56655623
}
56665624

5667-
bool shouldWalkIntoSeparatelyCheckedClosure(ClosureExpr *expr) override {
5668-
return false;
5669-
}
5670-
56715625
bool shouldWalkCaptureInitializerExpressions() override { return true; }
56725626

56735627
MacroWalking getMacroWalkingBehavior() const override {
@@ -5970,10 +5924,6 @@ static void diagUnqualifiedAccessToMethodNamedSelf(const Expr *E,
59705924
public:
59715925
DiagnoseWalker(const DeclContext *DC) : Ctx(DC->getASTContext()), DC(DC) {}
59725926

5973-
bool shouldWalkIntoSeparatelyCheckedClosure(ClosureExpr *expr) override {
5974-
return false;
5975-
}
5976-
59775927
MacroWalking getMacroWalkingBehavior() const override {
59785928
return MacroWalking::Expansion;
59795929
}
@@ -6129,10 +6079,6 @@ diagnoseDictionaryLiteralDuplicateKeyEntries(const Expr *E,
61296079
public:
61306080
DiagnoseWalker(const DeclContext *DC) : Ctx(DC->getASTContext()) {}
61316081

6132-
bool shouldWalkIntoSeparatelyCheckedClosure(ClosureExpr *expr) override {
6133-
return false;
6134-
}
6135-
61366082
MacroWalking getMacroWalkingBehavior() const override {
61376083
return MacroWalking::Expansion;
61386084
}

lib/Sema/MiscDiagnostics.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,19 +133,14 @@ namespace swift {
133133
ForEachStmt *forEach);
134134

135135
class BaseDiagnosticWalker : public ASTWalker {
136-
PreWalkAction walkToDeclPre(Decl *D) override;
137-
138-
bool shouldWalkIntoSeparatelyCheckedClosure(ClosureExpr *expr) override {
139-
return false;
136+
PreWalkAction walkToDeclPre(Decl *D) override {
137+
return Action::VisitNodeIf(isa<PatternBindingDecl>(D));
140138
}
141139

142140
// Only emit diagnostics in the expansion of macros.
143141
MacroWalking getMacroWalkingBehavior() const override {
144142
return MacroWalking::Expansion;
145143
}
146-
147-
private:
148-
static bool shouldWalkIntoDeclInClosureContext(Decl *D);
149144
};
150145

151146
// A simple, deferred diagnostic container.

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3484,10 +3484,6 @@ class ExprAvailabilityWalker : public ASTWalker {
34843484
explicit ExprAvailabilityWalker(const ExportContext &Where)
34853485
: Context(Where.getDeclContext()->getASTContext()), Where(Where) {}
34863486

3487-
bool shouldWalkIntoSeparatelyCheckedClosure(ClosureExpr *expr) override {
3488-
return false;
3489-
}
3490-
34913487
MacroWalking getMacroWalkingBehavior() const override {
34923488
// Expanded source should be type checked and diagnosed separately.
34933489
return MacroWalking::Arguments;

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -329,15 +329,12 @@ void ParentConditionalConformance::diagnoseConformanceStack(
329329
namespace {
330330
/// Produce any additional syntactic diagnostics for a SyntacticElementTarget.
331331
class SyntacticDiagnosticWalker final : public ASTWalker {
332-
SmallVector<DeclContext *, 4> dcStack;
333332
const SyntacticElementTarget &Target;
334333
bool IsTopLevelExprStmt;
335334

336335
SyntacticDiagnosticWalker(const SyntacticElementTarget &target,
337336
bool isExprStmt)
338-
: Target(target), IsTopLevelExprStmt(isExprStmt) {
339-
dcStack.push_back(target.getDeclContext());
340-
}
337+
: Target(target), IsTopLevelExprStmt(isExprStmt) {}
341338

342339
public:
343340
static void check(const SyntacticElementTarget &target, bool isExprStmt) {
@@ -351,31 +348,12 @@ class SyntacticDiagnosticWalker final : public ASTWalker {
351348

352349
PreWalkResult<Expr *> walkToExprPre(Expr *expr) override {
353350
auto isExprStmt = (expr == Target.getAsExpr()) ? IsTopLevelExprStmt : false;
354-
performSyntacticExprDiagnostics(expr, dcStack.back(), isExprStmt);
355-
356-
if (auto closure = dyn_cast<ClosureExpr>(expr)) {
357-
if (closure->isSeparatelyTypeChecked()) {
358-
dcStack.push_back(closure);
359-
return Action::Continue(expr);
360-
}
361-
}
362-
351+
performSyntacticExprDiagnostics(expr, Target.getDeclContext(), isExprStmt);
363352
return Action::SkipNode(expr);
364353
}
365354

366-
PostWalkResult<Expr *> walkToExprPost(Expr *expr) override {
367-
if (auto closure = dyn_cast<ClosureExpr>(expr)) {
368-
if (closure->isSeparatelyTypeChecked()) {
369-
assert(dcStack.back() == closure);
370-
dcStack.pop_back();
371-
}
372-
}
373-
374-
return Action::Continue(expr);
375-
}
376-
377355
PreWalkResult<Stmt *> walkToStmtPre(Stmt *stmt) override {
378-
performStmtDiagnostics(stmt, dcStack.back());
356+
performStmtDiagnostics(stmt, Target.getDeclContext());
379357
return Action::Continue(stmt);
380358
}
381359

0 commit comments

Comments
 (0)