Skip to content

Commit 3f3df9f

Browse files
authored
Merge pull request #4401 from rintaro/fixit-autoclosure-escaping
[Parse] Improve fix-it for '@autoclosure(escaping)'
2 parents 9d07e80 + ed8f901 commit 3f3df9f

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,7 +1444,7 @@ bool Parser::parseTypeAttribute(TypeAttributes &Attributes, bool justChecking) {
14441444
SourceLoc Loc = consumeToken();
14451445

14461446
bool isAutoclosureEscaping = false;
1447-
SourceLoc autoclosureEscapingRightParenLoc;
1447+
SourceRange autoclosureEscapingParenRange;
14481448
StringRef conventionName;
14491449

14501450
// Handle @autoclosure(escaping)
@@ -1462,9 +1462,9 @@ bool Parser::parseTypeAttribute(TypeAttributes &Attributes, bool justChecking) {
14621462
}
14631463

14641464
if (isAutoclosureEscaping) {
1465-
consumeToken(tok::l_paren);
1465+
autoclosureEscapingParenRange.Start = consumeToken(tok::l_paren);
14661466
consumeToken(tok::identifier);
1467-
autoclosureEscapingRightParenLoc = consumeToken(tok::r_paren);
1467+
autoclosureEscapingParenRange.End = consumeToken(tok::r_paren);
14681468
}
14691469
} else if (attr == TAK_convention) {
14701470
SourceLoc LPLoc;
@@ -1516,9 +1516,11 @@ bool Parser::parseTypeAttribute(TypeAttributes &Attributes, bool justChecking) {
15161516
if (Attributes.has(TAK_noescape)) {
15171517
diagnose(Loc, diag::attr_noescape_conflicts_escaping_autoclosure);
15181518
} else {
1519+
StringRef replacement = " @escaping ";
1520+
if (autoclosureEscapingParenRange.End.getAdvancedLoc(1) != Tok.getLoc())
1521+
replacement = replacement.drop_back();
15191522
diagnose(Loc, diag::attr_autoclosure_escaping_deprecated)
1520-
.fixItReplace({Loc, autoclosureEscapingRightParenLoc},
1521-
"@autoclosure @escaping ");
1523+
.fixItReplace(autoclosureEscapingParenRange, replacement);
15221524
}
15231525
Attributes.setAttr(TAK_escaping, Loc);
15241526
} else if (Attributes.has(TAK_noescape)) {

test/attr/attr_autoclosure.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,22 +75,22 @@ func func10(@autoclosure(escaping _: () -> ()) { } // expected-error{{expected '
7575
// expected-note@-1{{to match this opening '('}}
7676
7777
func func11(_: @autoclosure(escaping) @noescape () -> ()) { } // expected-error{{@escaping conflicts with @noescape}}
78-
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{17-38=@autoclosure @escaping }}
78+
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{28-38= @escaping}}
7979

8080
class Super {
8181
func f1(_ x: @autoclosure(escaping) () -> ()) { }
82-
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{17-38=@autoclosure @escaping }}
82+
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{28-38= @escaping}}
8383
func f2(_ x: @autoclosure(escaping) () -> ()) { } // expected-note {{potential overridden instance method 'f2' here}}
84-
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{17-38=@autoclosure @escaping }}
84+
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{28-38= @escaping}}
8585
func f3(x: @autoclosure () -> ()) { }
8686
}
8787

8888
class Sub : Super {
8989
override func f1(_ x: @autoclosure(escaping)() -> ()) { }
90-
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{26-47=@autoclosure @escaping }}
90+
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{37-47= @escaping }}
9191
override func f2(_ x: @autoclosure () -> ()) { } // expected-error{{does not override any method}} // expected-note{{type does not match superclass instance method with type '(@autoclosure @escaping () -> ()) -> ()'}}
9292
override func f3(_ x: @autoclosure(escaping) () -> ()) { } // expected-error{{does not override any method}}
93-
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{26-47=@autoclosure @escaping }}
93+
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{37-47= @escaping}}
9494
}
9595

9696
func func12_sink(_ x: @escaping () -> Int) { }
@@ -101,7 +101,7 @@ func func12a(_ x: @autoclosure () -> Int) {
101101
func12_sink(x) // expected-error {{passing non-escaping parameter 'x' to function expecting an @escaping closure}}
102102
}
103103
func func12b(_ x: @autoclosure(escaping) () -> Int) {
104-
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{20-41=@autoclosure @escaping }}
104+
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{31-41= @escaping}}
105105
func12_sink(x) // ok
106106
}
107107
func func12c(_ x: @autoclosure @escaping () -> Int) {
@@ -132,7 +132,7 @@ enum AutoclosureFailableOf<T> {
132132

133133
let _ : (@autoclosure () -> ()) -> ()
134134
let _ : (@autoclosure(escaping) () -> ()) -> ()
135-
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{11-32=@autoclosure @escaping }}
135+
// expected-warning@-1{{@autoclosure(escaping) is deprecated; use @autoclosure @escaping instead}} {{22-32= @escaping}}
136136

137137
// escaping is the name of param type
138138
let _ : (@autoclosure(escaping) -> ()) -> () // expected-error {{use of undeclared type 'escaping'}}

0 commit comments

Comments
 (0)