Skip to content

Commit 2327522

Browse files
authored
migrator: handle qualified replacement for member reference expression. rdar://32845918 (#10593) (#10601)
Previously, we only handle dot syntax call expression for qualified replacement, i.e. changing from A.a to B.b. This patch teaches the tool to handle the migration of member reference expression tool.
1 parent c179be4 commit 2327522

File tree

5 files changed

+38
-13
lines changed

5 files changed

+38
-13
lines changed

lib/Migrator/APIDiffMigratorPass.cpp

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -368,20 +368,26 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
368368
}
369369

370370
bool handleQualifiedReplacement(Expr* Call) {
371-
if (auto *DSC = dyn_cast<DotSyntaxCallExpr>(Call)) {
372-
if (auto FD = DSC->getFn()->getReferencedDecl().getDecl()) {
373-
for (auto *I :getRelatedDiffItems(FD)) {
374-
if (auto *Item = dyn_cast<TypeMemberDiffItem>(I)) {
375-
if (Item->Subkind == TypeMemberDiffItemSubKind::
376-
QualifiedReplacement) {
377-
Editor.replace(Call->getSourceRange(),
378-
(llvm::Twine(Item->newTypeName) + "." +
379-
Item->getNewName().base()).str());
380-
return true;
381-
}
371+
auto handleDecl = [&](ValueDecl *VD, SourceRange ToReplace) {
372+
for (auto *I: getRelatedDiffItems(VD)) {
373+
if (auto *Item = dyn_cast<TypeMemberDiffItem>(I)) {
374+
if (Item->Subkind == TypeMemberDiffItemSubKind::QualifiedReplacement) {
375+
Editor.replace(ToReplace, (llvm::Twine(Item->newTypeName) + "." +
376+
Item->getNewName().base()).str());
377+
return true;
382378
}
383379
}
384380
}
381+
return false;
382+
};
383+
if (auto *DSC = dyn_cast<DotSyntaxCallExpr>(Call)) {
384+
if (auto FD = DSC->getFn()->getReferencedDecl().getDecl()) {
385+
if (handleDecl(FD, Call->getSourceRange()))
386+
return true;
387+
}
388+
} else if (auto MRE = dyn_cast<MemberRefExpr>(Call)) {
389+
if (handleDecl(MRE->getReferencedDecl().getDecl(), MRE->getSourceRange()))
390+
return true;
385391
}
386392
return false;
387393
}

test/Migrator/Inputs/Cities.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ open class Cities {
99
open func buderim() -> Cities? { return Cities(x: 1) }
1010
open func noosa() -> [[String : Cities]?] { return [] }
1111
open func maroochy(x: Int?, y: Int?) {}
12+
public struct CityKind {
13+
static public let Town = 1
14+
}
1215
}
1316

1417
public protocol ExtraCities {

test/Migrator/Inputs/qualified.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,13 @@
2222
"OldTypeName": "FooComparisonResult",
2323
"NewPrintedName": "NewFooOrderedSame",
2424
"NewTypeName": "NewFooComparisonResult"
25+
},
26+
{
27+
"DiffItemKind": "TypeMemberDiffItem",
28+
"Usr": "s:6CitiesAAC8CityKindV4TownSivZ",
29+
"OldPrintedName": "town",
30+
"OldTypeName": "Cities.CityKind",
31+
"NewPrintedName": "NewTown",
32+
"NewTypeName": "NewCityKind"
2533
}
2634
]
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
// REQUIRES: objc_interop
2-
// RUN: %empty-directory(%t) && %target-swift-frontend -c -update-code -primary-file %s -F %S/mock-sdk -api-diff-data-file %S/Inputs/qualified.json -emit-migrated-file-path %t/qualified-replacement.swift.result -emit-remap-file-path %t/qualified-replacement.swift.remap -o /dev/null
2+
// RUN: %empty-directory(%t.mod)
3+
// RUN: %target-swift-frontend -emit-module -o %t.mod/Cities.swiftmodule %S/Inputs/Cities.swift -module-name Cities -parse-as-library
4+
// RUN: %empty-directory(%t) && %target-swift-frontend -c -update-code -primary-file %s -F %S/mock-sdk -I %t.mod -api-diff-data-file %S/Inputs/qualified.json -emit-migrated-file-path %t/qualified-replacement.swift.result -emit-remap-file-path %t/qualified-replacement.swift.remap -o /dev/null
35
// RUN: diff -u %S/qualified-replacement.swift.expected %t/qualified-replacement.swift.result
46

7+
import Cities
58
import Bar
69
func foo() {
710
_ = PropertyUserInterface.fieldPlus
811
PropertyUserInterface.methodPlus(1)
912
_ = FooComparisonResult.orderedSame
1013
let _ : FooComparisonResult = .orderedSame
14+
_ = Cities.CityKind.Town
1115
}
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
// REQUIRES: objc_interop
2-
// RUN: %empty-directory(%t) && %target-swift-frontend -c -update-code -primary-file %s -F %S/mock-sdk -api-diff-data-file %S/Inputs/qualified.json -emit-migrated-file-path %t/qualified-replacement.swift.result -emit-remap-file-path %t/qualified-replacement.swift.remap -o /dev/null
2+
// RUN: %empty-directory(%t.mod)
3+
// RUN: %target-swift-frontend -emit-module -o %t.mod/Cities.swiftmodule %S/Inputs/Cities.swift -module-name Cities -parse-as-library
4+
// RUN: %empty-directory(%t) && %target-swift-frontend -c -update-code -primary-file %s -F %S/mock-sdk -I %t.mod -api-diff-data-file %S/Inputs/qualified.json -emit-migrated-file-path %t/qualified-replacement.swift.result -emit-remap-file-path %t/qualified-replacement.swift.remap -o /dev/null
35
// RUN: diff -u %S/qualified-replacement.swift.expected %t/qualified-replacement.swift.result
46

7+
import Cities
58
import Bar
69
func foo() {
710
_ = NewPropertyUserInterface.newFieldPlus
811
NewPropertyUserInterface.newMethodPlus(1)
912
_ = NewFooComparisonResult.NewFooOrderedSame
1013
let _ : FooComparisonResult = NewFooComparisonResult.NewFooOrderedSame
14+
_ = NewCityKind.NewTown
1115
}

0 commit comments

Comments
 (0)