Skip to content

Commit ba2e4e1

Browse files
authored
[Fix-it] In fixItAvailableAttrRename, handle the case args is TupleShuffleExpr (#3040)
Also, handle the ParenExpr is trailing closure case. Fix-it used to add `fn: ` label before trailing closure: // (tuple_shuffle_expr (paren_expr trailing-closure)) case: @available(*, unavailable, renamed: "bar(fn:)") func foo(closure: () -> Int) {} foo { 0 } // (paren_expr trailing-closure) case: @available(*, unavailable, renamed: "bar(fn:)") func foo(_: () -> Int) {} foo { 0 } // (tuple_shuffle_expr (tuple_expr trailing-closure)) case: @available(*, unavailable, renamed: "bar(x:fn:)") func oldFunc6(_ x: Int, y: @NoEscape () -> Int) { } foo(0) { 1 }
1 parent 600975f commit ba2e4e1

File tree

2 files changed

+88
-1
lines changed

2 files changed

+88
-1
lines changed

lib/Sema/MiscDiagnostics.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1328,6 +1328,14 @@ void swift::fixItAvailableAttrRename(TypeChecker &TC,
13281328
return labelStr.empty() ? Identifier() : TC.Context.getIdentifier(labelStr);
13291329
});
13301330

1331+
if (auto args = dyn_cast<TupleShuffleExpr>(argExpr)) {
1332+
if (!args->getVariadicArgs().empty()) {
1333+
// FIXME: Support variadic arguments.
1334+
return;
1335+
}
1336+
argExpr = args->getSubExpr();
1337+
}
1338+
13311339
if (auto args = dyn_cast<TupleExpr>(argExpr)) {
13321340
if (argumentLabelIDs.size() != args->getNumElements()) {
13331341
// Mismatched lengths; give up.
@@ -1354,7 +1362,12 @@ void swift::fixItAvailableAttrRename(TypeChecker &TC,
13541362
}
13551363
}
13561364

1357-
} else {
1365+
} else if (auto args = dyn_cast<ParenExpr>(argExpr)) {
1366+
if (args->hasTrailingClosure()) {
1367+
// The argument label for a trailing closure is ignored.
1368+
return;
1369+
}
1370+
13581371
if (argumentLabelIDs.size() != 1) {
13591372
// Mismatched lengths; give up.
13601373
return;
@@ -1364,6 +1377,8 @@ void swift::fixItAvailableAttrRename(TypeChecker &TC,
13641377
// Already matching (no labels).
13651378
return;
13661379
}
1380+
} else {
1381+
llvm_unreachable("Unexpected arg expression");
13671382
}
13681383

13691384
diagnoseArgumentLabelError(TC, argExpr, argumentLabelIDs, false, &diag);

test/attr/attr_availability.swift

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,3 +680,75 @@ class Sub : Base {
680680
override func unavailableNoArgsTooMany() {} // expected-error {{'unavailableNoArgsTooMany()' has been renamed to 'shinyLabeledArguments(x:)'}} {{none}}
681681
override func unavailableHasType() {} // expected-error {{'unavailableHasType()' has been replaced by 'Base.shinyLabeledArguments()'}} {{none}}
682682
}
683+
684+
// U: Unnamed, L: Labeled
685+
@available(*, unavailable, renamed: "after(fn:)")
686+
func closure_U_L(_ x: () -> Int) {} // expected-note 3 {{here}}
687+
@available(*, unavailable, renamed: "after(fn:)")
688+
func closure_L_L(x: () -> Int) {} // expected-note 3 {{here}}
689+
@available(*, unavailable, renamed: "after(_:)")
690+
func closure_L_U(x: () -> Int) {} // expected-note 3 {{here}}
691+
692+
@available(*, unavailable, renamed: "after(arg:fn:)")
693+
func closure_UU_LL(_ x: Int, _ y: () -> Int) {} // expected-note 2 {{here}}
694+
@available(*, unavailable, renamed: "after(arg:fn:)")
695+
func closure_LU_LL(x: Int, _ y: () -> Int) {} // expected-note 2 {{here}}
696+
@available(*, unavailable, renamed: "after(arg:fn:)")
697+
func closure_LL_LL(x: Int, y: () -> Int) {} // expected-note 2 {{here}}
698+
@available(*, unavailable, renamed: "after(arg:fn:)")
699+
func closure_UU_LL_ne(_ x: Int, _ y: @noescape () -> Int) {} // expected-note 2 {{here}}
700+
701+
@available(*, unavailable, renamed: "after(arg:_:)")
702+
func closure_UU_LU(_ x: Int, _ closure: () -> Int) {} // expected-note 2 {{here}}
703+
@available(*, unavailable, renamed: "after(arg:_:)")
704+
func closure_LU_LU(x: Int, _ closure: () -> Int) {} // expected-note 2 {{here}}
705+
@available(*, unavailable, renamed: "after(arg:_:)")
706+
func closure_LL_LU(x: Int, y: () -> Int) {} // expected-note 2 {{here}}
707+
@available(*, unavailable, renamed: "after(arg:_:)")
708+
func closure_UU_LU_ne(_ x: Int, _ y: @noescape () -> Int) {} // expected-note 2 {{here}}
709+
710+
func testTrailingClosure() {
711+
closure_U_L { 0 } // expected-error {{'closure_U_L' has been renamed to 'after(fn:)'}} {{3-14=after}} {{none}}
712+
closure_U_L() { 0 } // expected-error {{'closure_U_L' has been renamed to 'after(fn:)'}} {{3-14=after}} {{none}}
713+
closure_U_L({ 0 }) // expected-error {{'closure_U_L' has been renamed to 'after(fn:)'}} {{3-14=after}} {{15-15=fn: }} {{none}}
714+
715+
closure_L_L { 0 } // expected-error {{'closure_L_L(x:)' has been renamed to 'after(fn:)'}} {{3-14=after}} {{none}}
716+
closure_L_L() { 0 } // expected-error {{'closure_L_L(x:)' has been renamed to 'after(fn:)'}} {{3-14=after}} {{none}}
717+
closure_L_L(x: { 0 }) // expected-error {{'closure_L_L(x:)' has been renamed to 'after(fn:)'}} {{3-14=after}} {{15-16=fn}} {{none}}
718+
719+
closure_L_U { 0 } // expected-error {{'closure_L_U(x:)' has been renamed to 'after(_:)'}} {{3-14=after}} {{none}}
720+
closure_L_U() { 0 } // expected-error {{'closure_L_U(x:)' has been renamed to 'after(_:)'}} {{3-14=after}} {{none}}
721+
closure_L_U(x: { 0 }) // expected-error {{'closure_L_U(x:)' has been renamed to 'after(_:)'}} {{3-14=after}} {{15-18=}} {{none}}
722+
723+
closure_UU_LL(0) { 0 } // expected-error {{'closure_UU_LL' has been renamed to 'after(arg:fn:)'}} {{3-16=after}} {{17-17=arg: }} {{none}}
724+
closure_UU_LL(0, { 0 }) // expected-error {{'closure_UU_LL' has been renamed to 'after(arg:fn:)'}} {{3-16=after}} {{17-17=arg: }} {{20-20=fn: }} {{none}}
725+
726+
closure_LU_LL(x: 0) { 0 } // expected-error {{'closure_LU_LL(x:_:)' has been renamed to 'after(arg:fn:)'}} {{3-16=after}} {{17-18=arg}} {{none}}
727+
closure_LU_LL(x: 0, { 0 }) // expected-error {{'closure_LU_LL(x:_:)' has been renamed to 'after(arg:fn:)'}} {{3-16=after}} {{17-18=arg}} {{23-23=fn: }} {{none}}
728+
729+
closure_LL_LL(x: 1) { 1 } // expected-error {{'closure_LL_LL(x:y:)' has been renamed to 'after(arg:fn:)'}} {{3-16=after}} {{17-18=arg}} {{none}}
730+
closure_LL_LL(x: 1, y: { 0 }) // expected-error {{'closure_LL_LL(x:y:)' has been renamed to 'after(arg:fn:)'}} {{3-16=after}} {{17-18=arg}} {{23-24=fn}} {{none}}
731+
732+
closure_UU_LL_ne(1) { 1 } // expected-error {{'closure_UU_LL_ne' has been renamed to 'after(arg:fn:)'}} {{3-19=after}} {{20-20=arg: }} {{none}}
733+
closure_UU_LL_ne(1, { 0 }) // expected-error {{'closure_UU_LL_ne' has been renamed to 'after(arg:fn:)'}} {{3-19=after}} {{20-20=arg: }} {{23-23=fn: }} {{none}}
734+
735+
closure_UU_LU(0) { 0 } // expected-error {{'closure_UU_LU' has been renamed to 'after(arg:_:)'}} {{3-16=after}} {{17-17=arg: }} {{none}}
736+
closure_UU_LU(0, { 0 }) // expected-error {{'closure_UU_LU' has been renamed to 'after(arg:_:)'}} {{3-16=after}} {{17-17=arg: }} {{none}}
737+
738+
closure_LU_LU(x: 0) { 0 } // expected-error {{'closure_LU_LU(x:_:)' has been renamed to 'after(arg:_:)'}} {{3-16=after}} {{17-18=arg}} {{none}}
739+
closure_LU_LU(x: 0, { 0 }) // expected-error {{'closure_LU_LU(x:_:)' has been renamed to 'after(arg:_:)'}} {{3-16=after}} {{17-18=arg}} {{none}}
740+
741+
closure_LL_LU(x: 1) { 1 } // expected-error {{'closure_LL_LU(x:y:)' has been renamed to 'after(arg:_:)'}} {{3-16=after}} {{17-18=arg}} {{none}}
742+
closure_LL_LU(x: 1, y: { 0 }) // expected-error {{'closure_LL_LU(x:y:)' has been renamed to 'after(arg:_:)'}} {{3-16=after}} {{17-18=arg}} {{23-26=}} {{none}}
743+
744+
closure_UU_LU_ne(1) { 1 } // expected-error {{'closure_UU_LU_ne' has been renamed to 'after(arg:_:)'}} {{3-19=after}} {{20-20=arg: }} {{none}}
745+
closure_UU_LU_ne(1, { 0 }) // expected-error {{'closure_UU_LU_ne' has been renamed to 'after(arg:_:)'}} {{3-19=after}} {{20-20=arg: }} {{none}}
746+
}
747+
748+
@available(*, unavailable, renamed: "after(x:y:)")
749+
func variadic1(a: Int ..., b: Int = 0) {} // expected-note {{here}}
750+
751+
func testVariadic() {
752+
// FIXME: fix-it should be: {{1-9=newFn7}} {{10-11=x}} {{none}}
753+
variadic1(a: 1, 1) // expected-error {{'variadic1(a:b:)' has been renamed to 'after(x:y:)'}} {{3-12=after}} {{none}}
754+
}

0 commit comments

Comments
 (0)