Skip to content

Commit 0717448

Browse files
committed
[Refactoring] Handle default arguments when converting call to async
Default arguments were still being visited when converting the call, adding extra commas to the converted call. Skip over them. Resolves rdar://74248990
1 parent 384b309 commit 0717448

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

lib/IDE/Refactoring.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5155,12 +5155,17 @@ class AsyncConverter : private SourceEntityWalker {
51555155
/*ToEndOfToken=*/true);
51565156

51575157
OS << tok::l_paren;
5158+
size_t realArgCount = 0;
51585159
for (size_t I = 0, E = Args.size() - 1; I < E; ++I) {
5159-
if (I > 0)
5160+
if (isa<DefaultArgumentExpr>(Args[I]))
5161+
continue;
5162+
5163+
if (realArgCount > 0)
51605164
OS << tok::comma << " ";
51615165
// Can't just add the range as we need to perform replacements
51625166
convertNode(Args[I], /*StartOverride=*/CE->getArgumentLabelLoc(I),
51635167
/*ConvertCalls=*/false);
5168+
realArgCount++;
51645169
}
51655170
OS << tok::r_paren;
51665171
}

test/refactoring/ConvertAsync/basic.swift

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ func genericError<E>(completion: (String?, E?) -> Void) where E: Error { }
112112
func otherName(execute: (String) -> Void) { }
113113
// OTHER-NAME: func otherName() async -> String { }
114114

115+
// RUN: %refactor -add-async-alternative -dump-text -source-filename %s -pos=%(line+1):1 | %FileCheck -check-prefix=DEFAULT_ARGS %s
116+
func defaultArgs(a: Int, b: Int = 10, completion: (String) -> Void) { }
117+
// DEFAULT_ARGS: func defaultArgs(a: Int, b: Int = 10) async -> String { }
118+
115119
struct MyStruct {
116120
var someVar: (Int) -> Void {
117121
get {
@@ -175,7 +179,7 @@ func noParamAutoclosure(completion: @autoclosure () -> Void) { }
175179
// 2. Check that the various ways to call a function (and the positions the
176180
// refactoring is called from) are handled correctly
177181

178-
// RUN: %refactor -convert-to-async -dump-text -source-filename %s -pos=%(line+1):1 | %FileCheck -check-prefixes=CONVERT-FUNC,CALL,CALL-NOLABEL,CALL-WRAPPED,TRAILING,TRAILING-PARENS,TRAILING-WRAPPED,CALL-ARG,MANY-CALL,MEMBER-CALL,MEMBER-CALL2,MEMBER-PARENS,EMPTY-CAPTURE,CAPTURE %s
182+
// RUN: %refactor -convert-to-async -dump-text -source-filename %s -pos=%(line+1):1 | %FileCheck -check-prefixes=CONVERT-FUNC,CALL,CALL-NOLABEL,CALL-WRAPPED,TRAILING,TRAILING-PARENS,TRAILING-WRAPPED,CALL-ARG,MANY-CALL,MEMBER-CALL,MEMBER-CALL2,MEMBER-PARENS,EMPTY-CAPTURE,CAPTURE,DEFAULT-ARGS-MISSING,DEFAULT-ARGS-CALL %s
179183
func testCalls() {
180184
// CONVERT-FUNC: {{^}}func testCalls() async {
181185
// RUN: %refactor -convert-call-to-async-alternative -dump-text -source-filename %s -pos=%(line+4):3 | %FileCheck -check-prefix=CALL %s
@@ -302,5 +306,19 @@ func testCalls() {
302306
// CONVERT-FUNC: otherName(execute: { str in{{$}}
303307
// CONVERT-FUNC-NEXT: print("otherName"){{$}}
304308
// CONVERT-FUNC-NEXT: }){{$}}
309+
310+
// RUN: %refactor -convert-call-to-async-alternative -dump-text -source-filename %s -pos=%(line+1):3 | %FileCheck -check-prefix=DEFAULT-ARGS-MISSING %s
311+
defaultArgs(a: 1) { str in
312+
print("defaultArgs missing")
313+
}
314+
// DEFAULT-ARGS-MISSING: let str = await defaultArgs(a: 1){{$}}
315+
// DEFAULT-ARGS-MISSING-NEXT: {{^}}print("defaultArgs missing")
316+
317+
// RUN: %refactor -convert-call-to-async-alternative -dump-text -source-filename %s -pos=%(line+1):3 | %FileCheck -check-prefix=DEFAULT-ARGS-CALL %s
318+
defaultArgs(a: 1, b: 2) { str in
319+
print("defaultArgs")
320+
}
321+
// DEFAULT-ARGS-CALL: let str = await defaultArgs(a: 1, b: 2){{$}}
322+
// DEFAULT-ARGS-CALL-NEXT: {{^}}print("defaultArgs")
305323
}
306324
// CONVERT-FUNC: {{^}}}

0 commit comments

Comments
 (0)