Skip to content

Commit 65b9043

Browse files
authored
migrator: handle function hoist API changes and several its varieties. rdar://31234806 (#9544)
1 parent 118c690 commit 65b9043

15 files changed

+351
-43
lines changed

include/swift/IDE/APIDigesterData.h

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "swift/Basic/LLVM.h"
1717
#include "swift/Basic/JSONSerialization.h"
18+
#include "swift/IDE/Utils.h"
1819
#include "llvm/ADT/ArrayRef.h"
1920
#include "llvm/ADT/StringRef.h"
2021
#include "llvm/ADT/StringSwitch.h"
@@ -198,28 +199,52 @@ struct CommonDiffItem: public APIDiffItem {
198199
// myColor.components
199200
//
200201
//
202+
enum class TypeMemberDiffItemSubKind {
203+
SimpleReplacement,
204+
GlobalFuncToStaticProperty,
205+
HoistSelfOnly,
206+
HoistSelfAndRemoveParam,
207+
HoistSelfAndUseProperty,
208+
};
209+
201210
struct TypeMemberDiffItem: public APIDiffItem {
202211
StringRef usr;
203212
StringRef newTypeName;
204213
StringRef newPrintedName;
205214
Optional<uint8_t> selfIndex;
215+
Optional<uint8_t> removedIndex;
206216
StringRef oldPrintedName;
207217

218+
private:
219+
DeclNameViewer OldNameViewer;
220+
DeclNameViewer NewNameViewer;
221+
222+
public:
223+
TypeMemberDiffItemSubKind Subkind;
224+
225+
public:
208226
TypeMemberDiffItem(StringRef usr, StringRef newTypeName,
209227
StringRef newPrintedName, Optional<uint8_t> selfIndex,
228+
Optional<uint8_t> removedIndex,
210229
StringRef oldPrintedName) : usr(usr),
211230
newTypeName(newTypeName), newPrintedName(newPrintedName),
212-
selfIndex(selfIndex), oldPrintedName(oldPrintedName) {}
231+
selfIndex(selfIndex), removedIndex(removedIndex),
232+
oldPrintedName(oldPrintedName), OldNameViewer(oldPrintedName),
233+
NewNameViewer(newPrintedName), Subkind(getSubKind()) {}
213234
static StringRef head();
214235
static void describe(llvm::raw_ostream &os);
215236
static void undef(llvm::raw_ostream &os);
216237
void streamDef(llvm::raw_ostream &os) const override;
217238
bool operator<(TypeMemberDiffItem Other) const;
218239
static bool classof(const APIDiffItem *D);
219240
StringRef getKey() const override { return usr; }
241+
const DeclNameViewer &getOldName() const { return OldNameViewer; }
242+
const DeclNameViewer &getNewName() const { return NewNameViewer; }
220243
APIDiffItemKind getKind() const override {
221244
return APIDiffItemKind::ADK_TypeMemberDiffItem;
222245
}
246+
private:
247+
TypeMemberDiffItemSubKind getSubKind() const;
223248
};
224249

225250
struct NoEscapeFuncParam: public APIDiffItem {

include/swift/IDE/DigesterEnums.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ DIFF_ITEM_KEY_KIND_STRING(NewPrintedName)
118118
DIFF_ITEM_KEY_KIND_STRING(OldPrintedName)
119119

120120
DIFF_ITEM_KEY_KIND_INT(SelfIndex)
121+
DIFF_ITEM_KEY_KIND_INT(RemovedIndex)
121122
DIFF_ITEM_KEY_KIND_INT(Index)
122123

123124
#undef DIFF_ITEM_KEY_KIND_INT

include/swift/IDE/Utils.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ class RangeResolver : public SourceEntityWalker {
307307
class DeclNameViewer {
308308
StringRef BaseName;
309309
SmallVector<StringRef, 4> Labels;
310+
bool HasParen;
310311
public:
311312
DeclNameViewer(StringRef Text);
312313
DeclNameViewer() : DeclNameViewer(StringRef()) {}
@@ -316,6 +317,7 @@ class DeclNameViewer {
316317
unsigned argSize() const { return Labels.size(); }
317318
unsigned partsCount() const { return 1 + Labels.size(); }
318319
unsigned commonPartsCount(DeclNameViewer &Other) const;
320+
bool isFunction() const { return HasParen; }
319321
};
320322

321323
/// This provide a utility for writing to an underlying string buffer multiple
@@ -415,6 +417,15 @@ enum class LabelRangeEndAt: int8_t {
415417
LabelNameOnly,
416418
};
417419

420+
struct CallArgInfo {
421+
Expr *ArgExp;
422+
CharSourceRange LabelRange;
423+
CharSourceRange getEntireCharRange(const SourceManager &SM) const;
424+
};
425+
426+
std::vector<CallArgInfo>
427+
getCallArgInfo(SourceManager &SM, Expr *Arg, LabelRangeEndAt EndKind);
428+
418429
// Get the ranges of argument labels from an Arg, either tuple or paren.
419430
std::vector<CharSourceRange>
420431
getCallArgLabelRanges(SourceManager &SM, Expr *Arg, LabelRangeEndAt EndKind);

lib/IDE/APIDigesterData.cpp

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
#include "llvm/ADT/StringSet.h"
1314
#include "llvm/Support/YAMLParser.h"
1415
#include "llvm/Support/YAMLTraits.h"
1516
#include "llvm/Support/MemoryBuffer.h"
@@ -105,6 +106,41 @@ StringRef swift::ide::api::TypeMemberDiffItem::head() {
105106
return "SDK_CHANGE_TYPE_MEMBER";
106107
}
107108

109+
TypeMemberDiffItemSubKind
110+
swift::ide::api::TypeMemberDiffItem::getSubKind() const {
111+
DeclNameViewer OldName = getOldName();
112+
DeclNameViewer NewName = getNewName();
113+
if(!OldName.isFunction()) {
114+
assert(!NewName.isFunction());
115+
return TypeMemberDiffItemSubKind::SimpleReplacement;
116+
}
117+
assert(OldName.isFunction());
118+
bool ToProperty = !NewName.isFunction();
119+
if (selfIndex) {
120+
if (removedIndex) {
121+
if (ToProperty)
122+
llvm_unreachable("unknown situation");
123+
else {
124+
assert(NewName.argSize() + 2 == OldName.argSize());
125+
return TypeMemberDiffItemSubKind::HoistSelfAndRemoveParam;
126+
}
127+
} else if (ToProperty) {
128+
assert(OldName.argSize() == 1);
129+
return TypeMemberDiffItemSubKind::HoistSelfAndUseProperty;
130+
} else {
131+
assert(NewName.argSize() + 1 == OldName.argSize());
132+
return TypeMemberDiffItemSubKind::HoistSelfOnly;
133+
}
134+
} else if (ToProperty) {
135+
assert(OldName.argSize() == 0);
136+
assert(!removedIndex);
137+
return TypeMemberDiffItemSubKind::GlobalFuncToStaticProperty;
138+
} else {
139+
assert(NewName.argSize() == OldName.argSize());
140+
return TypeMemberDiffItemSubKind::SimpleReplacement;
141+
}
142+
}
143+
108144
void swift::ide::api::TypeMemberDiffItem::describe(llvm::raw_ostream &os) {
109145
os << "#ifndef " << head() << "\n";
110146
os << "#define " << head() << "(USR, NEW_TYPE_NAME, NEW_PRINTED_NAME, "
@@ -274,11 +310,14 @@ serializeDiffItem(llvm::BumpPtrAllocator &Alloc,
274310
}
275311
case APIDiffItemKind::ADK_TypeMemberDiffItem: {
276312
Optional<uint8_t> SelfIndexShort;
313+
Optional<uint8_t> RemovedIndexShort;
277314
if (SelfIndex)
278315
SelfIndexShort = SelfIndex.getValue();
316+
if (RemovedIndex)
317+
RemovedIndexShort = RemovedIndex.getValue();
279318
return new (Alloc.Allocate<TypeMemberDiffItem>())
280319
TypeMemberDiffItem(Usr, NewTypeName, NewPrintedName, SelfIndexShort,
281-
OldPrintedName);
320+
RemovedIndexShort, OldPrintedName);
282321
}
283322
case APIDiffItemKind::ADK_NoEscapeFuncParam: {
284323
return new (Alloc.Allocate<NoEscapeFuncParam>())
@@ -395,6 +434,7 @@ struct swift::ide::api::APIDiffItemStore::Implementation {
395434
llvm::StringMap<std::vector<APIDiffItem*>> Data;
396435
bool PrintUsr;
397436
std::vector<APIDiffItem*> AllItems;
437+
llvm::StringSet<> PrintedUsrs;
398438
void addStorePath(StringRef FileName) {
399439
llvm::MemoryBuffer *pMemBuffer = nullptr;
400440
{
@@ -428,8 +468,10 @@ struct swift::ide::api::APIDiffItemStore::Implementation {
428468

429469
ArrayRef<APIDiffItem*> swift::ide::api::APIDiffItemStore::
430470
getDiffItems(StringRef Key) const {
431-
if (Impl.PrintUsr)
471+
if (Impl.PrintUsr && !Impl.PrintedUsrs.count(Key)) {
432472
llvm::outs() << Key << "\n";
473+
Impl.PrintedUsrs.insert(Key);
474+
}
433475
return Impl.Data[Key];
434476
}
435477

lib/IDE/SwiftSourceDocInfo.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -962,9 +962,14 @@ void swift::ide::getLocationInfo(const ValueDecl *VD,
962962
}
963963
}
964964

965-
std::vector<CharSourceRange> swift::ide::
966-
getCallArgLabelRanges(SourceManager &SM, Expr *Arg, LabelRangeEndAt EndKind) {
967-
std::vector<CharSourceRange> Ranges;
965+
CharSourceRange CallArgInfo::getEntireCharRange(const SourceManager &SM) const {
966+
return CharSourceRange(SM, LabelRange.getStart(),
967+
Lexer::getLocForEndOfToken(SM, ArgExp->getEndLoc()));
968+
}
969+
970+
std::vector<CallArgInfo> swift::ide::
971+
getCallArgInfo(SourceManager &SM, Expr *Arg, LabelRangeEndAt EndKind) {
972+
std::vector<CallArgInfo> InfoVec;
968973
if (auto *TE = dyn_cast<TupleExpr>(Arg)) {
969974
size_t ElemIndex = 0;
970975
for (Expr *Elem : TE->getElements()) {
@@ -978,13 +983,21 @@ getCallArgLabelRanges(SourceManager &SM, Expr *Arg, LabelRangeEndAt EndKind) {
978983
LabelEnd = LabelStart.getAdvancedLoc(NameIdentifier.getLength());
979984
}
980985

981-
Ranges.push_back(CharSourceRange(SM, LabelStart, LabelEnd));
986+
InfoVec.push_back({Elem, CharSourceRange(SM, LabelStart, LabelEnd)});
982987
++ElemIndex;
983988
}
984989
} else if (auto *PE = dyn_cast<ParenExpr>(Arg)) {
985-
if (PE->getSubExpr())
986-
Ranges.push_back(CharSourceRange(PE->getSubExpr()->getStartLoc(), 0));
990+
if (auto Sub = PE->getSubExpr())
991+
InfoVec.push_back({Sub, CharSourceRange(Sub->getStartLoc(), 0)});
987992
}
993+
return InfoVec;
994+
}
988995

996+
std::vector<CharSourceRange> swift::ide::
997+
getCallArgLabelRanges(SourceManager &SM, Expr *Arg, LabelRangeEndAt EndKind) {
998+
std::vector<CharSourceRange> Ranges;
999+
auto InfoVec = getCallArgInfo(SM, Arg, EndKind);
1000+
std::transform(InfoVec.begin(), InfoVec.end(), std::back_inserter(Ranges),
1001+
[](CallArgInfo &Info) { return Info.LabelRange; });
9891002
return Ranges;
9901003
}

lib/IDE/Utils.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -781,12 +781,14 @@ void ide::collectModuleNames(StringRef SDKPath,
781781
}
782782
}
783783

784-
DeclNameViewer::DeclNameViewer(StringRef Text) {
784+
785+
DeclNameViewer::DeclNameViewer(StringRef Text): HasParen(false) {
785786
auto ArgStart = Text.find_first_of('(');
786787
if (ArgStart == StringRef::npos) {
787788
BaseName = Text;
788789
return;
789790
}
791+
HasParen = true;
790792
BaseName = Text.substr(0, ArgStart);
791793
auto ArgEnd = Text.find_last_of(')');
792794
assert(ArgEnd != StringRef::npos);

0 commit comments

Comments
 (0)