Skip to content

Commit b8ea62e

Browse files
authored
Merge pull request #16470 from rintaro/4.2-ide-walkdefer
[4.2][IDE] Fix visiting DeferStmt
2 parents 0d23f6f + 9273309 commit b8ea62e

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

lib/IDE/SourceEntityWalker.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,18 @@ std::pair<bool, Stmt *> SemaAnnotator::walkToStmtPre(Stmt *S) {
211211
bool TraverseChildren = SEWalker.walkToStmtPre(S);
212212
if (TraverseChildren) {
213213
if (auto *DeferS = dyn_cast<DeferStmt>(S)) {
214+
// Since 'DeferStmt::getTempDecl()' is marked as implicit, we manually
215+
// walk into the body.
214216
if (auto *FD = DeferS->getTempDecl()) {
215217
auto *RetS = FD->getBody()->walk(*this);
216-
// Already walked children.
217-
return { false, RetS };
218+
assert(RetS == FD->getBody());
219+
(void)RetS;
218220
}
221+
bool Continue = SEWalker.walkToStmtPost(DeferS);
222+
if (!Continue)
223+
Cancelled = true;
224+
// Already walked children.
225+
return { false, Continue ? DeferS : nullptr };
219226
}
220227
}
221228
return { TraverseChildren, S };

lib/IDE/SyntaxModel.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -677,11 +677,16 @@ std::pair<bool, Stmt *> ModelASTWalker::walkToStmtPre(Stmt *S) {
677677
}
678678

679679
} else if (auto *DeferS = dyn_cast<DeferStmt>(S)) {
680+
// Since 'DeferStmt::getTempDecl()' is marked as implicit, we manually walk
681+
// into the body.
680682
if (auto *FD = DeferS->getTempDecl()) {
681683
auto *RetS = FD->getBody()->walk(*this);
682-
// Already walked children.
683-
return { false, RetS };
684+
assert(RetS == FD->getBody());
685+
(void)RetS;
686+
walkToStmtPost(DeferS);
684687
}
688+
// Already walked children.
689+
return { false, DeferS };
685690
}
686691

687692
return { true, S };

test/IDE/range_info_basics.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ func testExpressionVariables() -> Int {
144144
return bar()
145145
}
146146

147+
func testDefer() {
148+
defer {
149+
}
150+
}
151+
147152
// RUN: %target-swift-ide-test -range -pos=8:1 -end-pos 8:32 -source-filename %s | %FileCheck %s -check-prefix=CHECK1
148153
// RUN: %target-swift-ide-test -range -pos=9:1 -end-pos 9:26 -source-filename %s | %FileCheck %s -check-prefix=CHECK2
149154
// RUN: %target-swift-ide-test -range -pos=10:1 -end-pos 10:27 -source-filename %s | %FileCheck %s -check-prefix=CHECK3
@@ -181,6 +186,7 @@ func testExpressionVariables() -> Int {
181186
// RUN: %target-swift-ide-test -range -pos=118:1 -end-pos=120:22 -source-filename %s | %FileCheck %s -check-prefix=CHECK-INT
182187
// RUN: %target-swift-ide-test -range -pos=133:1 -end-pos=135:65 -source-filename %s | %FileCheck %s -check-prefix=CHECK-NO-PATTERN
183188
// RUN: %target-swift-ide-test -range -pos=142:12 -end-pos=142:17 -source-filename %s | %FileCheck %s -check-prefix=CHECK-X-Y
189+
// RUN: %target-swift-ide-test -range -pos=147:1 -end-pos=150:1 -source-filename %s | %FileCheck %s -check-prefix=CHECK-INVALID
184190

185191
// CHECK-NO-PATTERN: <Kind>MultiStatement</Kind>
186192
// CHECK-NO-PATTERN-NEXT: <Content>for key in parameters.keys.sorted(by: <) {

0 commit comments

Comments
 (0)