39 while (ClassDecl !=
nullptr) {
40 for (
const auto *MethodDecl : ClassDecl->instance_methods()) {
41 if (MethodDecl->getSelector().getAsString() ==
"init")
42 return !MethodDecl->isUnavailable();
44 ClassDecl = ClassDecl->getSuperClass();
59 const SourceManager &SM,
60 const LangOptions &LangOpts) {
61 CharSourceRange CharRange = Lexer::makeFileCharRange(
62 CharSourceRange::getTokenRange(ReceiverRange), SM, LangOpts);
63 return Lexer::getSourceText(CharRange, SM, LangOpts);
67 const SourceManager &SM,
68 const LangOptions &LangOpts) {
74 std::map<StringRef, StringRef> ClassToFactoryMethodMap = {{
"NSDate",
"date"},
76 auto FoundClassFactory = ClassToFactoryMethodMap.find(Receiver);
77 if (FoundClassFactory != ClassToFactoryMethodMap.end()) {
78 StringRef ClassName = FoundClassFactory->first;
79 StringRef FactorySelector = FoundClassFactory->second;
81 std::string(llvm::formatv(
"[{0} {1}]", ClassName, FactorySelector));
82 return FixItHint::CreateReplacement(Expr->getSourceRange(), 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");