swift-api-digester: teach the tool do detect APINotes' moving one member variable/method to another type. (#9985)

Different from type hoist that moves global variables to static member
variables, we've also seen member variables being moved among different
types via apinotes. Swift-api-digester should be able to detect such
case so that migrator can handle them properly.

rdar://32466196
This commit is contained in:
Xi Ge
2017-05-30 14:23:32 -07:00
committed by GitHub
parent 1043628688
commit d1b0e67620
12 changed files with 60 additions and 3 deletions

View File

@@ -2159,9 +2159,15 @@ class TypeMemberDiffFinder : public SDKNodeVisitor {
auto diffParent = diffNode->getParent();
assert(nodeParent && diffParent && "trying to check Root?");
// Move from global variable to a member variable.
if (nodeParent->getKind() == SDKNodeKind::TypeDecl &&
diffParent->getKind() == SDKNodeKind::Root)
TypeMemberDiffs.push_back({diffNode, node});
// Move from a member variable to another member variable
if (nodeParent->getKind() == SDKNodeKind::TypeDecl &&
diffParent->getKind() == SDKNodeKind::TypeDecl)
TypeMemberDiffs.push_back({diffNode, node});
// Move from a getter/setter function to a property
else if (node->getKind() == SDKNodeKind::Getter &&
diffNode->getKind() == SDKNodeKind::Function &&
node->isNameValid()) {
@@ -2998,6 +3004,7 @@ static void findTypeMemberDiffs(NodePtr leftSDKRoot, NodePtr rightSDKRoot,
RenameDetectorForMemberDiff Detector;
for (auto pair : diffFinder.getDiffs()) {
auto left = pair.first;
auto leftParent = left->getParent();
auto right = pair.second;
auto rightParent = right->getParent();
@@ -3006,6 +3013,8 @@ static void findTypeMemberDiffs(NodePtr leftSDKRoot, NodePtr rightSDKRoot,
TypeMemberDiffItem item = {
right->getAs<SDKNodeDecl>()->getUsr(), constructFullTypeName(rightParent),
right->getPrintedName(), findSelfIndex(right), None,
leftParent->getKind() == SDKNodeKind::Root ?
StringRef() : constructFullTypeName(leftParent),
left->getPrintedName()};
out.emplace_back(item);
Detector.workOn(left, right);