Skip to content

Commit 55f1e86

Browse files
committed
migrator: avoid inserting helper function call for nil expression. rdar://40173366
1 parent 2330dab commit 55f1e86

File tree

3 files changed

+41
-20
lines changed

3 files changed

+41
-20
lines changed

lib/Migrator/APIDiffMigratorPass.cpp

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,12 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
247247

248248
APIDiffItemStore DiffStore;
249249

250+
bool isNilExpr(Expr *E) {
251+
auto Range = E->getSourceRange();
252+
return Range.isValid() && Lexer::getCharSourceRangeFromSourceRange(
253+
SF->getASTContext().SourceMgr, Range).str() == "nil";
254+
}
255+
250256
std::vector<APIDiffItem*> getRelatedDiffItems(ValueDecl *VD) {
251257
std::vector<APIDiffItem*> results;
252258
auto addDiffItems = [&](ValueDecl *VD) {
@@ -696,24 +702,27 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
696702
auto *RD = getReferencedDecl(Reference);
697703
if (!RD)
698704
return false;
699-
std::string Func;
700705
std::string Rename;
706+
Optional<NodeAnnotation> Kind;
707+
StringRef RightComment;
701708
for (auto *Item: getRelatedDiffItems(RD)) {
702709
if (isSimpleReplacement(Item, Rename)) {
703710
} else if (auto *CI = dyn_cast<CommonDiffItem>(Item)) {
704711
if (CI->isStringRepresentableChange() &&
705712
CI->NodeKind == SDKNodeKind::DeclVar) {
706-
SmallString<256> Buffer;
707-
Func = insertHelperFunction(CI->DiffKind, CI->RightComment, Buffer,
708-
FromString);
713+
Kind = CI->DiffKind;
714+
RightComment = CI->RightComment;
709715
}
710716
}
711717
}
712-
if (Func.empty())
718+
if (!Kind.hasValue())
713719
return false;
714-
715-
Editor.insert(WrapperTarget->getStartLoc(), (Twine(Func) + "(").str());
716-
Editor.insertAfterToken(WrapperTarget->getEndLoc(), ")");
720+
if (Kind && !isNilExpr(WrapperTarget)) {
721+
SmallString<256> Buffer;
722+
auto Func = insertHelperFunction(*Kind, RightComment, Buffer, FromString);
723+
Editor.insert(WrapperTarget->getStartLoc(), (Twine(Func) + "(").str());
724+
Editor.insertAfterToken(WrapperTarget->getEndLoc(), ")");
725+
}
717726
if (!Rename.empty()) {
718727
replaceExpr(Reference, Rename);
719728
}
@@ -838,21 +847,25 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
838847
}
839848
if (NewAttributeType.empty())
840849
return;
841-
SmallString<256> Buffer;
842-
auto FuncName = insertHelperFunction(Kind, NewAttributeType, Buffer,
843-
/*FromString*/ArgIdx);
850+
Expr *WrapTarget = Call;
851+
bool FromString = false;
844852
if (ArgIdx) {
845853
ArgIdx --;
854+
FromString = true;
846855
auto AllArgs = getCallArgInfo(SM, Arg, LabelRangeEndAt::LabelNameOnly);
847856
if (AllArgs.size() <= ArgIdx)
848857
return;
849-
auto Exp = AllArgs[ArgIdx].ArgExp;
850-
Editor.insert(Exp->getStartLoc(), (Twine(FuncName) + "(").str());
851-
Editor.insertAfterToken(Exp->getEndLoc(), ")");
852-
} else {
853-
Editor.insert(Call->getStartLoc(), (Twine(FuncName) + "(").str());
854-
Editor.insertAfterToken(Call->getEndLoc(), ")");
858+
WrapTarget = AllArgs[ArgIdx].ArgExp;
859+
// Avoid wrapping nil literal.
860+
if (isNilExpr(WrapTarget))
861+
return;
855862
}
863+
assert(WrapTarget);
864+
SmallString<256> Buffer;
865+
auto FuncName = insertHelperFunction(Kind, NewAttributeType, Buffer,
866+
FromString);
867+
Editor.insert(WrapTarget->getStartLoc(), (Twine(FuncName) + "(").str());
868+
Editor.insertAfterToken(WrapTarget->getEndLoc(), ")");
856869
}
857870

858871
bool walkToExprPre(Expr *E) override {

test/Migrator/string-representable.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ func foo(_ c: Container) -> String {
1212
c.addingAttributes(["a": "b", "a": "b", "a": "b"])
1313
c.adding(attributes: ["a": 1, "a": 2, "a": 3])
1414
c.adding(optionalAttributes: ["a": 1, "a": 2, "a": 3])
15+
_ = Container(optionalAttributes: [:])
16+
_ = Container(optionalAttrArray: [])
1517
_ = Container(optionalAttributes: nil)
1618
_ = Container(optionalAttrArray: nil)
1719
c.adding(attrArray: ["key1", "key2"])
1820
c.add(single: "")
21+
c.add(singleOptional: "")
1922
c.add(singleOptional: nil)
2023
_ = c.getAttrDictionary()
2124
_ = c.getOptionalAttrDictionary()
@@ -36,5 +39,6 @@ func foo(_ c: Container) -> String {
3639
c.adding(optionalAttributes: c.optionalAttrDict)
3740
_ = GlobalAttribute
3841
c.Value = GlobalAttribute
42+
c.optionalAttrDict = nil
3943
return c.Value
4044
}

test/Migrator/string-representable.swift.expected

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@ func foo(_ c: Container) -> String {
1212
c.addingAttributes(convertToCitiesContainerAttributeDictionary(["a": "b", "a": "b", "a": "b"]))
1313
c.adding(attributes: convertToSimpleAttributeDictionary(["a": 1, "a": 2, "a": 3]))
1414
c.adding(optionalAttributes: convertToOptionalSimpleAttributeDictionary(["a": 1, "a": 2, "a": 3]))
15-
_ = Container(optionalAttributes: convertToOptionalSimpleAttributeDictionary(nil))
16-
_ = Container(optionalAttrArray: convertToOptionalSimpleAttributeArray(nil))
15+
_ = Container(optionalAttributes: convertToOptionalSimpleAttributeDictionary([:]))
16+
_ = Container(optionalAttrArray: convertToOptionalSimpleAttributeArray([]))
17+
_ = Container(optionalAttributes: nil)
18+
_ = Container(optionalAttrArray: nil)
1719
c.adding(attrArray: convertToSimpleAttributeArray(["key1", "key2"]))
1820
c.add(single: convertToSimpleAttribute(""))
19-
c.add(singleOptional: convertToOptionalSimpleAttribute(nil))
21+
c.add(singleOptional: convertToOptionalSimpleAttribute(""))
22+
c.add(singleOptional: nil)
2023
_ = convertFromSimpleAttributeDictionary(c.getAttrDictionary())
2124
_ = convertFromOptionalSimpleAttributeDictionary(c.getOptionalAttrDictionary())
2225
_ = convertFromSimpleAttribute(c.getSingleAttr())
@@ -36,6 +39,7 @@ func foo(_ c: Container) -> String {
3639
c.adding(optionalAttributes: convertToOptionalSimpleAttributeDictionary(convertFromOptionalSimpleAttributeDictionary(c.optionalAttrDict)))
3740
_ = convertFromNewAttribute(AttributeWrapper.NewAttribute)
3841
c.Value = convertToNewAttribute(convertFromNewAttribute(AttributeWrapper.NewAttribute))
42+
c.optionalAttrDict = nil
3943
return convertFromNewAttribute(c.Value)
4044
}
4145

0 commit comments

Comments
 (0)