39 while (ClassDecl !=
nullptr) {
40 for (
const auto *MethodDecl : ClassDecl->instance_methods())
41 if (MethodDecl->getSelector().getAsString() ==
"init")
42 return !MethodDecl->isUnavailable();
43 ClassDecl = ClassDecl->getSuperClass();
58 const SourceManager &SM,
59 const LangOptions &LangOpts) {
60 const CharSourceRange CharRange = Lexer::makeFileCharRange(
61 CharSourceRange::getTokenRange(ReceiverRange), SM, LangOpts);
62 return Lexer::getSourceText(CharRange, SM, LangOpts);
66 const SourceManager &SM,
67 const LangOptions &LangOpts) {
73 static constexpr std::pair<StringRef, StringRef> ClassToFactoryMethodMap[] = {
74 {
"NSDate",
"date"}, {
"NSNull",
"null"}};
75 const auto *FoundClassFactory =
76 llvm::find_if(ClassToFactoryMethodMap,
77 [&](
const auto &
Entry) {
return Entry.first == Receiver; });
78 if (FoundClassFactory != std::end(ClassToFactoryMethodMap)) {
79 const auto &[ClassName, FactorySelector] = *FoundClassFactory;
80 const std::string NewCall =
81 std::string(llvm::formatv(
"[{0} {1}]", ClassName, FactorySelector));
82 return FixItHint::CreateReplacement(Expr->getSourceRange(), NewCall);
86 const std::string NewCall =
87 std::string(llvm::formatv(
"[[{0} alloc] init]", Receiver));
88 return FixItHint::CreateReplacement(Expr->getSourceRange(), NewCall);
106 if (
const auto *CallExpr =
107 Result.Nodes.getNodeAs<ObjCMessageExpr>(
"new_call")) {
112 diag(CallExpr->getExprLoc(),
"do not create objects with +new")
114 Result.Context->getLangOpts());
117 if (
const auto *DeclExpr =
118 Result.Nodes.getNodeAs<ObjCMethodDecl>(
"new_override")) {
119 diag(DeclExpr->getBeginLoc(),
"classes should not override +new");