Skip to content

Commit 1008f06

Browse files
authored
Merge pull request #17672 from nkcsgexi/4.2-global-name
[4.2] migrator: handle member variables change to global ones. rdar://41658300
2 parents faf89e6 + b291a62 commit 1008f06

File tree

9 files changed

+76
-12
lines changed

9 files changed

+76
-12
lines changed

include/swift/IDE/APIDigesterData.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -260,11 +260,10 @@ struct TypeMemberDiffItem: public APIDiffItem {
260260
Optional<uint8_t> removedIndex;
261261
StringRef oldTypeName;
262262
StringRef oldPrintedName;
263-
264263
private:
265264
DeclNameViewer OldNameViewer;
266265
DeclNameViewer NewNameViewer;
267-
266+
std::string NewTypeDot;
268267
public:
269268
TypeMemberDiffItemSubKind Subkind;
270269

@@ -276,7 +275,9 @@ struct TypeMemberDiffItem: public APIDiffItem {
276275
newTypeName(newTypeName), newPrintedName(newPrintedName),
277276
selfIndex(selfIndex), removedIndex(removedIndex), oldTypeName(oldTypeName),
278277
oldPrintedName(oldPrintedName), OldNameViewer(oldPrintedName),
279-
NewNameViewer(newPrintedName), Subkind(getSubKind()) {}
278+
NewNameViewer(newPrintedName),
279+
NewTypeDot(isNewNameGlobal() ? "" : (llvm::Twine(newTypeName) + ".").str()),
280+
Subkind(getSubKind()) {}
280281
static StringRef head();
281282
static void describe(llvm::raw_ostream &os);
282283
static void undef(llvm::raw_ostream &os);
@@ -286,9 +287,11 @@ struct TypeMemberDiffItem: public APIDiffItem {
286287
StringRef getKey() const override { return usr; }
287288
const DeclNameViewer &getOldName() const { return OldNameViewer; }
288289
const DeclNameViewer &getNewName() const { return NewNameViewer; }
290+
StringRef getNewTypeAndDot() const { return NewTypeDot; }
289291
APIDiffItemKind getKind() const override {
290292
return APIDiffItemKind::ADK_TypeMemberDiffItem;
291293
}
294+
bool isNewNameGlobal() const { return newTypeName.empty(); }
292295
private:
293296
TypeMemberDiffItemSubKind getSubKind() const;
294297
};

lib/Migrator/APIDiffMigratorPass.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
329329
if (auto *MI = dyn_cast<TypeMemberDiffItem>(Item)) {
330330
if (MI->Subkind == TypeMemberDiffItemSubKind::FuncRename) {
331331
llvm::raw_svector_ostream OS(Buffer);
332-
OS << MI->newTypeName << "." << MI->newPrintedName;
332+
OS << MI->getNewTypeAndDot() << MI->newPrintedName;
333333
return DeclNameViewer(OS.str());
334334
}
335335
}
@@ -343,8 +343,13 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
343343
if (MD->Subkind == TypeMemberDiffItemSubKind::SimpleReplacement) {
344344
bool NeedNoTypeName = isDotMember &&
345345
MD->oldPrintedName == MD->newPrintedName;
346-
Text = (llvm::Twine(NeedNoTypeName ? "" : MD->newTypeName) + "." +
347-
MD->getNewName().base()).str();
346+
if (NeedNoTypeName) {
347+
Text = (llvm::Twine(MD->isNewNameGlobal() ? "" : ".") +
348+
MD->getNewName().base()).str();
349+
} else {
350+
Text = (llvm::Twine(MD->getNewTypeAndDot()) +
351+
MD->getNewName().base()).str();
352+
}
348353
return true;
349354
}
350355
}
@@ -540,9 +545,15 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
540545
if (Item->Subkind == TypeMemberDiffItemSubKind::QualifiedReplacement) {
541546
bool NeedNoTypeName = isDotMember(ToReplace) &&
542547
Item->oldPrintedName == Item->newPrintedName;
543-
Editor.replace(ToReplace,
544-
(llvm::Twine(NeedNoTypeName ? "" : Item->newTypeName) + "." +
545-
Item->getNewName().base()).str());
548+
if (NeedNoTypeName) {
549+
Editor.replace(ToReplace,
550+
(llvm::Twine(Item->isNewNameGlobal() ? "" : ".") +
551+
Item->getNewName().base()).str());
552+
} else {
553+
Editor.replace(ToReplace,
554+
(llvm::Twine(Item->getNewTypeAndDot()) +
555+
Item->getNewName().base()).str());
556+
}
546557
return true;
547558
}
548559
}
@@ -710,8 +721,8 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
710721
return false;
711722

712723
if (Item->Subkind == TypeMemberDiffItemSubKind::GlobalFuncToStaticProperty) {
713-
Editor.replace(Call->getSourceRange(), (llvm::Twine(Item->newTypeName) +
714-
"." + Item->getNewName().base()).str());
724+
Editor.replace(Call->getSourceRange(),
725+
(llvm::Twine(Item->getNewTypeAndDot()) + Item->getNewName().base()).str());
715726
return true;
716727
}
717728
if (*Item->selfIndex)

test/Migrator/Inputs/Cities.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ open class Cities {
1111
open func maroochy(x: Int?, y: Int?) {}
1212
public struct CityKind {
1313
public static let Town = 1
14+
public static let Village = 1
1415
}
1516
}
1617

test/Migrator/Inputs/qualified.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@
3131
"NewPrintedName": "NewTown",
3232
"NewTypeName": "NewCityKind"
3333
},
34+
{
35+
"DiffItemKind": "TypeMemberDiffItem",
36+
"Usr": "s:6CitiesAAC8CityKindV7VillageSivpZ",
37+
"OldPrintedName": "Village",
38+
"OldTypeName": "Cities.CityKind",
39+
"NewPrintedName": "GlobalCityKindVillage",
40+
"NewTypeName": ""
41+
},
3442
{
3543
"DiffItemKind": "TypeMemberDiffItem",
3644
"Usr": "s:6Cities12ToplevelTypeC",
@@ -47,4 +55,12 @@
4755
"NewPrintedName": "orderedMemberSame",
4856
"NewTypeName": "NewFooComparisonResult.Nested"
4957
},
58+
{
59+
"DiffItemKind": "TypeMemberDiffItem",
60+
"Usr": "c:@E@FooComparisonResult@FooOrderedMovedToGlobal",
61+
"OldPrintedName": "orderedMovedToGlobal",
62+
"OldTypeName": "FooComparisonResult",
63+
"NewPrintedName": "orderedMovedToGlobal",
64+
"NewTypeName": ""
65+
},
5066
]

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ typedef NS_ENUM(long, FooComparisonResult) {
5555
FooOrderedSame,
5656
FooOrderedDescending,
5757
FooOrderedMemberSame,
58+
FooOrderedMovedToGlobal,
5859
};
5960

6061
@interface BarBase

test/Migrator/qualified-replacement.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@ func foo() {
1212
_ = FooComparisonResult.orderedSame
1313
let _ : FooComparisonResult = .orderedSame
1414
_ = Cities.CityKind.Town
15+
_ = Cities.CityKind.Village
1516
_ = ToplevelType()
1617
_ = ToplevelType(recordName: "")
1718
bar(.orderedSame)
1819
bar(.orderedMemberSame)
1920
bar(FooComparisonResult.orderedSame)
2021
bar(FooComparisonResult.orderedMemberSame)
22+
bar(FooComparisonResult.orderedMovedToGlobal)
23+
bar(.orderedMovedToGlobal)
2124
}
2225

2326
func foo(_: ToplevelType) {}

test/Migrator/qualified-replacement.swift.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@ func foo() {
1212
_ = NewFooComparisonResult.NewFooOrderedSame
1313
let _ : FooComparisonResult = NewFooComparisonResult.NewFooOrderedSame
1414
_ = NewCityKind.NewTown
15+
_ = GlobalCityKindVillage
1516
_ = ToplevelWrapper.internalType()
1617
_ = ToplevelWrapper.internalType(recordName: "")
1718
bar(NewFooComparisonResult.NewFooOrderedSame)
1819
bar(.orderedMemberSame)
1920
bar(NewFooComparisonResult.NewFooOrderedSame)
2021
bar(NewFooComparisonResult.Nested.orderedMemberSame)
22+
bar(orderedMovedToGlobal)
23+
bar(orderedMovedToGlobal)
2124
}
2225

2326
func foo(_: ToplevelWrapper.internalType) {}

test/api-digester/Outputs/apinotes-migrator-gen-revert.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
11
[
2+
{
3+
"DiffItemKind": "CommonDiffItem",
4+
"NodeKind": "Var",
5+
"NodeAnnotation": "RevertSimpleStringRepresentableUpdate",
6+
"ChildIndex": "0",
7+
"LeftUsr": "c:@globalAttributeName",
8+
"LeftComment": "AnimalAttributeName",
9+
"RightUsr": "",
10+
"RightComment": "String",
11+
"ModuleName": "APINotesTest"
12+
},
213
{
314
"DiffItemKind": "CommonDiffItem",
415
"NodeKind": "TypeDecl",
@@ -161,6 +172,14 @@
161172
"NewPrintedName": "oldMember",
162173
"NewTypeName": "OldType"
163174
},
175+
{
176+
"DiffItemKind": "TypeMemberDiffItem",
177+
"Usr": "c:@globalAttributeName",
178+
"OldPrintedName": "globalAttributeName",
179+
"OldTypeName": "AnimalAttributeName",
180+
"NewPrintedName": "globalAttributeName",
181+
"NewTypeName": ""
182+
},
164183
{
165184
"DiffItemKind": "TypeMemberDiffItem",
166185
"Usr": "c:objc(pl)TypeWithMethod(cm)plusPrint",

tools/swift-api-digester/swift-api-digester.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2544,6 +2544,12 @@ class TypeMemberDiffFinder : public SDKNodeVisitor {
25442544
if (nodeParent->getKind() == SDKNodeKind::DeclType &&
25452545
diffParent->getKind() == SDKNodeKind::Root)
25462546
TypeMemberDiffs.insert({diffNode, node});
2547+
2548+
// Move from a member variable to global variable.
2549+
if (nodeParent->getKind() == SDKNodeKind::Root &&
2550+
diffParent->getKind() == SDKNodeKind::DeclType)
2551+
TypeMemberDiffs.insert({diffNode, node});
2552+
25472553
// Move from a member variable to another member variable
25482554
if (nodeParent->getKind() == SDKNodeKind::DeclType &&
25492555
diffParent->getKind() == SDKNodeKind::DeclType &&
@@ -3758,7 +3764,8 @@ static void findTypeMemberDiffs(NodePtr leftSDKRoot, NodePtr rightSDKRoot,
37583764
// index, old printed name)
37593765
TypeMemberDiffItem item = {
37603766
right->getAs<SDKNodeDecl>()->getUsr(),
3761-
rightParent->getAs<SDKNodeDecl>()->getFullyQualifiedName(),
3767+
rightParent->getKind() == SDKNodeKind::Root ?
3768+
StringRef() : rightParent->getAs<SDKNodeDecl>()->getFullyQualifiedName(),
37623769
right->getPrintedName(), findSelfIndex(right), None,
37633770
leftParent->getKind() == SDKNodeKind::Root ?
37643771
StringRef() : leftParent->getAs<SDKNodeDecl>()->getFullyQualifiedName(),

0 commit comments

Comments
 (0)