Skip to content

Commit 3752965

Browse files
committed
[IDE] Don't walk into closures in ThrowingEntityAnalyzer
We don't want to consider any `try` exprs here.
1 parent e25c39c commit 3752965

File tree

4 files changed

+59
-0
lines changed

4 files changed

+59
-0
lines changed

lib/IDE/IDERequests.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,10 @@ static bool hasUnhandledError(ArrayRef<ASTNode> Nodes) {
393393
return !Throwing;
394394
}
395395
bool walkToExprPre(Expr *E) override {
396+
// Don't walk into closures, they only produce effects when called.
397+
if (isa<ClosureExpr>(E))
398+
return false;
399+
396400
if (isa<TryExpr>(E)) {
397401
Throwing = true;
398402
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
enum Err : Error {
2+
case wat
3+
}
4+
5+
func throwsSomething() throws { throw Err.wat }
6+
func consumesErrClosure(_ fn: () throws -> Void) {}
7+
func rethrowsErrClosure(_ fn: () throws -> Void) rethrows {}
8+
9+
fileprivate func new_name() {
10+
consumesErrClosure { throw Err.wat }
11+
consumesErrClosure { try throwsSomething() }
12+
}
13+
14+
func testThrowingClosure() throws {
15+
new_name()
16+
try rethrowsErrClosure { try throwsSomething() }
17+
}
18+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
enum Err : Error {
2+
case wat
3+
}
4+
5+
func throwsSomething() throws { throw Err.wat }
6+
func consumesErrClosure(_ fn: () throws -> Void) {}
7+
func rethrowsErrClosure(_ fn: () throws -> Void) rethrows {}
8+
9+
fileprivate func new_name() throws {
10+
consumesErrClosure { throw Err.wat }
11+
consumesErrClosure { try throwsSomething() }
12+
try rethrowsErrClosure { try throwsSomething() }
13+
}
14+
15+
func testThrowingClosure() throws {
16+
try new_name()
17+
}
18+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
enum Err : Error {
2+
case wat
3+
}
4+
5+
func throwsSomething() throws { throw Err.wat }
6+
func consumesErrClosure(_ fn: () throws -> Void) {}
7+
func rethrowsErrClosure(_ fn: () throws -> Void) rethrows {}
8+
9+
func testThrowingClosure() throws {
10+
consumesErrClosure { throw Err.wat }
11+
consumesErrClosure { try throwsSomething() }
12+
try rethrowsErrClosure { try throwsSomething() }
13+
}
14+
15+
// RUN: %empty-directory(%t.result)
16+
// RUN: %refactor -extract-function -source-filename %s -pos=10:1 -end-pos=11:47 >> %t.result/consumes_err.swift
17+
// RUN: diff -u %S/Outputs/throw_errors3/consumes_err.swift.expected %t.result/consumes_err.swift
18+
// RUN: %refactor -extract-function -source-filename %s -pos=10:1 -end-pos=12:51 >> %t.result/rethrows_err.swift
19+
// RUN: diff -u %S/Outputs/throw_errors3/rethrows_err.swift.expected %t.result/rethrows_err.swift

0 commit comments

Comments
 (0)