Skip to content

Commit 0b8b020

Browse files
committed
migrator: teach the tool to handle qualified replacement. rdar://32466196
1 parent d402593 commit 0b8b020

File tree

6 files changed

+88
-3
lines changed

6 files changed

+88
-3
lines changed

lib/IDE/APIDigesterData.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,10 @@ swift::ide::api::TypeMemberDiffItem::getSubKind() const {
119119
DeclNameViewer NewName = getNewName();
120120
if (!OldName.isFunction()) {
121121
assert(!NewName.isFunction());
122-
return TypeMemberDiffItemSubKind::SimpleReplacement;
122+
if (oldTypeName.empty())
123+
return TypeMemberDiffItemSubKind::SimpleReplacement;
124+
else
125+
return TypeMemberDiffItemSubKind::QualifiedReplacement;
123126
}
124127
assert(OldName.isFunction());
125128
bool ToProperty = !NewName.isFunction();
@@ -145,9 +148,12 @@ swift::ide::api::TypeMemberDiffItem::getSubKind() const {
145148
assert(OldName.argSize() == 0);
146149
assert(!removedIndex);
147150
return TypeMemberDiffItemSubKind::GlobalFuncToStaticProperty;
148-
} else {
151+
} else if (oldTypeName.empty()){
149152
assert(NewName.argSize() == OldName.argSize());
150153
return TypeMemberDiffItemSubKind::SimpleReplacement;
154+
} else {
155+
assert(NewName.argSize() == OldName.argSize());
156+
return TypeMemberDiffItemSubKind::QualifiedReplacement;
151157
}
152158
}
153159

lib/Migrator/APIDiffMigratorPass.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,25 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
366366
}
367367
}
368368

369+
bool handleQualifiedReplacement(Expr* Call) {
370+
if (auto *DSC = dyn_cast<DotSyntaxCallExpr>(Call)) {
371+
if (auto FD = DSC->getFn()->getReferencedDecl().getDecl()) {
372+
for (auto *I :getRelatedDiffItems(FD)) {
373+
if (auto *Item = dyn_cast<TypeMemberDiffItem>(I)) {
374+
if (Item->Subkind == TypeMemberDiffItemSubKind::
375+
QualifiedReplacement) {
376+
Editor.replace(Call->getSourceRange(),
377+
(llvm::Twine(Item->newTypeName) + "." +
378+
Item->getNewName().base()).str());
379+
return true;
380+
}
381+
}
382+
}
383+
}
384+
}
385+
return false;
386+
}
387+
369388
bool handleSpecialCases(ValueDecl *FD, CallExpr* Call, Expr *Arg) {
370389
SpecialCaseDiffItem *Item = nullptr;
371390
for (auto *I: getRelatedDiffItems(FD)) {
@@ -548,8 +567,9 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
548567
}
549568

550569
bool walkToExprPre(Expr *E) override {
570+
if (handleQualifiedReplacement(E))
571+
return false;
551572
if (auto *CE = dyn_cast<CallExpr>(E)) {
552-
553573
auto Fn = CE->getFn();
554574
auto Args = CE->getArg();
555575
switch (Fn->getKind()) {

test/Migrator/mock-sdk/Bar.framework/Headers/Bar.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ enum BarForwardDeclaredEnum {
2424
@interface PropertyUserInterface
2525
- (int) field;
2626
- (void) setField:(int)info;
27+
+ (int) fieldPlus;
28+
+ (void) methodPlus:(int)info;
2729
@end
2830

2931
#define BAR_MACRO_1 0
@@ -34,3 +36,12 @@ typedef struct {
3436
} SomeItemSet;
3537

3638
typedef SomeItemSet SomeEnvironment;
39+
40+
#define CF_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
41+
#define NS_ENUM(_type, _name) CF_ENUM(_type, _name)
42+
43+
typedef NS_ENUM(long, FooComparisonResult) {
44+
FooOrderedAscending = -1L,
45+
FooOrderedSame,
46+
FooOrderedDescending
47+
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// REQUIRES: objc_interop
2+
// RUN: rm -rf %t && mkdir -p %t && %target-swift-frontend -c -update-code -primary-file %s -F %S/mock-sdk -api-diff-data-file %S/qualified.json -emit-migrated-file-path %t/qualified-replacement.swift.result -emit-remap-file-path %t/qualified-replacement.swift.remap -o /dev/null
3+
// RUN: diff -u %S/qualified-replacement.swift.expected %t/qualified-replacement.swift.result
4+
5+
import Bar
6+
func foo() {
7+
_ = PropertyUserInterface.fieldPlus
8+
PropertyUserInterface.methodPlus(1)
9+
_ = FooComparisonResult.orderedSame
10+
let _ : FooComparisonResult = .orderedSame
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// REQUIRES: objc_interop
2+
// RUN: rm -rf %t && mkdir -p %t && %target-swift-frontend -c -update-code -primary-file %s -F %S/mock-sdk -api-diff-data-file %S/qualified.json -emit-migrated-file-path %t/qualified-replacement.swift.result -emit-remap-file-path %t/qualified-replacement.swift.remap -o /dev/null
3+
// RUN: diff -u %S/qualified-replacement.swift.expected %t/qualified-replacement.swift.result
4+
5+
import Bar
6+
func foo() {
7+
_ = NewPropertyUserInterface.newFieldPlus
8+
NewPropertyUserInterface.newMethodPlus(1)
9+
_ = NewFooComparisonResult.NewFooOrderedSame
10+
let _ : FooComparisonResult = NewFooComparisonResult.NewFooOrderedSame
11+
}

test/Migrator/qualified.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
[
2+
{
3+
"DiffItemKind": "TypeMemberDiffItem",
4+
"Usr": "c:objc(cs)PropertyUserInterface(cm)fieldPlus",
5+
"OldPrintedName": "fieldPlus",
6+
"OldTypeName": "PropertyUserInterface",
7+
"NewPrintedName": "newFieldPlus",
8+
"NewTypeName": "NewPropertyUserInterface"
9+
},
10+
{
11+
"DiffItemKind": "TypeMemberDiffItem",
12+
"Usr": "c:objc(cs)PropertyUserInterface(cm)methodPlus:",
13+
"OldPrintedName": "methodPlus(_:)",
14+
"OldTypeName": "PropertyUserInterface",
15+
"NewPrintedName": "newMethodPlus(_:)",
16+
"NewTypeName": "NewPropertyUserInterface"
17+
},
18+
{
19+
"DiffItemKind": "TypeMemberDiffItem",
20+
"Usr": "c:@E@FooComparisonResult@FooOrderedSame",
21+
"OldPrintedName": "FooOrderedSame",
22+
"OldTypeName": "FooComparisonResult",
23+
"NewPrintedName": "NewFooOrderedSame",
24+
"NewTypeName": "NewFooComparisonResult"
25+
}
26+
]

0 commit comments

Comments
 (0)