@@ -247,6 +247,12 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
247
247
248
248
APIDiffItemStore DiffStore;
249
249
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
+
250
256
std::vector<APIDiffItem*> getRelatedDiffItems (ValueDecl *VD) {
251
257
std::vector<APIDiffItem*> results;
252
258
auto addDiffItems = [&](ValueDecl *VD) {
@@ -696,24 +702,27 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
696
702
auto *RD = getReferencedDecl (Reference);
697
703
if (!RD)
698
704
return false ;
699
- std::string Func;
700
705
std::string Rename;
706
+ Optional<NodeAnnotation> Kind;
707
+ StringRef RightComment;
701
708
for (auto *Item: getRelatedDiffItems (RD)) {
702
709
if (isSimpleReplacement (Item, Rename)) {
703
710
} else if (auto *CI = dyn_cast<CommonDiffItem>(Item)) {
704
711
if (CI->isStringRepresentableChange () &&
705
712
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 ;
709
715
}
710
716
}
711
717
}
712
- if (Func. empty ())
718
+ if (!Kind. hasValue ())
713
719
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
+ }
717
726
if (!Rename.empty ()) {
718
727
replaceExpr (Reference, Rename);
719
728
}
@@ -838,21 +847,25 @@ struct APIDiffMigratorPass : public ASTMigratorPass, public SourceEntityWalker {
838
847
}
839
848
if (NewAttributeType.empty ())
840
849
return ;
841
- SmallString<256 > Buffer;
842
- auto FuncName = insertHelperFunction (Kind, NewAttributeType, Buffer,
843
- /* FromString*/ ArgIdx);
850
+ Expr *WrapTarget = Call;
851
+ bool FromString = false ;
844
852
if (ArgIdx) {
845
853
ArgIdx --;
854
+ FromString = true ;
846
855
auto AllArgs = getCallArgInfo (SM, Arg, LabelRangeEndAt::LabelNameOnly);
847
856
if (AllArgs.size () <= ArgIdx)
848
857
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 ;
855
862
}
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 (), " )" );
856
869
}
857
870
858
871
bool walkToExprPre (Expr *E) override {
0 commit comments