Skip to content

Commit 6a79964

Browse files
committed
[Refactoring] Do not try to unique '_'
The async refactorings should not try to unique '_' when it's used as the parameter name. Also skip adding a let binding to the `catch` if the error parameter is '_'. Resolves rdar://82158389
1 parent 0daa9cc commit 6a79964

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

lib/IDE/Refactoring.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7238,7 +7238,7 @@ class AsyncConverter : private SourceEntityWalker {
72387238
/*Success=*/true);
72397239

72407240
addAwaitCall(CE, ArgList.ref(), Blocks.SuccessBlock, SuccessParams,
7241-
InlinePatterns, HandlerDesc, /*AddDeclarations*/ true);
7241+
InlinePatterns, HandlerDesc, /*AddDeclarations=*/true);
72427242
printOutOfLineBindingPatterns(Blocks.SuccessBlock, InlinePatterns);
72437243
convertNodes(Blocks.SuccessBlock.nodesToPrint());
72447244
clearNames(SuccessParams);
@@ -7249,7 +7249,8 @@ class AsyncConverter : private SourceEntityWalker {
72497249

72507250
// Always use the ErrParam name if none is bound.
72517251
prepareNames(Blocks.ErrorBlock, llvm::makeArrayRef(ErrParam),
7252-
ErrInlinePatterns, HandlerDesc.Type != HandlerType::RESULT);
7252+
ErrInlinePatterns,
7253+
/*AddIfMissing=*/HandlerDesc.Type != HandlerType::RESULT);
72537254
preparePlaceholdersAndUnwraps(HandlerDesc, SuccessParams, ErrParam,
72547255
/*Success=*/false);
72557256

@@ -7530,7 +7531,7 @@ class AsyncConverter : private SourceEntityWalker {
75307531
void addCatch(const ParamDecl *ErrParam) {
75317532
OS << "\n" << tok::r_brace << " " << tok::kw_catch << " ";
75327533
auto ErrName = newNameFor(ErrParam, false);
7533-
if (!ErrName.empty()) {
7534+
if (!ErrName.empty() && ErrName != "_") {
75347535
OS << tok::kw_let << " " << ErrName << " ";
75357536
}
75367537
OS << tok::l_brace;
@@ -7614,6 +7615,8 @@ class AsyncConverter : private SourceEntityWalker {
76147615
/// other names in the current scope.
76157616
Identifier createUniqueName(StringRef Name) {
76167617
Identifier Ident = getASTContext().getIdentifier(Name);
7618+
if (Name == "_")
7619+
return Ident;
76177620

76187621
auto &CurrentNames = Scopes.back().Names;
76197622
if (CurrentNames.count(Ident)) {

test/refactoring/ConvertAsync/convert_function.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,3 +622,46 @@ func twoCompletionHandlerCalls(completion: @escaping (String?, Error?) -> Void)
622622
// TWO-COMPLETION-HANDLER-CALLS-NEXT: return res
623623
// TWO-COMPLETION-HANDLER-CALLS-NEXT: return res
624624
// TWO-COMPLETION-HANDLER-CALLS-NEXT: }
625+
626+
// RUN: %refactor-check-compiles -convert-to-async -dump-text -source-filename %s -pos=%(line+1):1 | %FileCheck -check-prefix=NESTED-IGNORED %s
627+
func nestedIgnored() throws {
628+
simple { _ in
629+
print("done")
630+
simple { _ in
631+
print("done")
632+
}
633+
}
634+
}
635+
// NESTED-IGNORED: func nestedIgnored() async throws {
636+
// NESTED-IGNORED-NEXT: let _ = await simple()
637+
// NESTED-IGNORED-NEXT: print("done")
638+
// NESTED-IGNORED-NEXT: let _ = await simple()
639+
// NESTED-IGNORED-NEXT: print("done")
640+
// NESTED-IGNORED-NEXT: }
641+
642+
// RUN: %refactor-check-compiles -convert-to-async -dump-text -source-filename %s -pos=%(line+1):1 | %FileCheck -check-prefix=IGNORED-ERR %s
643+
func nestedIgnoredErr() throws {
644+
simpleErr(arg: "") { str, _ in
645+
if str == nil {
646+
print("error")
647+
}
648+
649+
simpleErr(arg: "") { str, _ in
650+
if str == nil {
651+
print("error")
652+
}
653+
}
654+
}
655+
}
656+
// IGNORED-ERR: func nestedIgnoredErr() async throws {
657+
// IGNORED-ERR-NEXT: do {
658+
// IGNORED-ERR-NEXT: let str = try await simpleErr(arg: "")
659+
// IGNORED-ERR-NEXT: do {
660+
// IGNORED-ERR-NEXT: let str1 = try await simpleErr(arg: "")
661+
// IGNORED-ERR-NEXT: } catch {
662+
// IGNORED-ERR-NEXT: print("error")
663+
// IGNORED-ERR-NEXT: }
664+
// IGNORED-ERR-NEXT: } catch {
665+
// IGNORED-ERR-NEXT: print("error")
666+
// IGNORED-ERR-NEXT: }
667+
// IGNORED-ERR-NEXT: }

0 commit comments

Comments
 (0)