llvm-project/clang-tools-extra/clang-tidy/objc/ForbiddenSubclassingCheck.cpp
Alexander Kornienko ab2d3ce47d [clang-tidy] Applied clang-tidy fixes. NFC
Applied fixes enabled by the LLVM's .clang-tidy configs. Reverted files where
fixes introduced compile errors:
  clang-tools-extra/clang-tidy/hicpp/NoAssemblerCheck.cpp
  clang-tools-extra/clang-tidy/misc/ThrowByValueCatchByReferenceCheck.cpp

$ clang-tools-extra/clang-tidy/tool/run-clang-tidy.py -fix clang-tools-extra/clang-tidy/
Enabled checks:
    llvm-else-after-return
    llvm-header-guard
    llvm-include-order
    llvm-namespace-comment
    llvm-prefer-isa-or-dyn-cast-in-conditionals
    llvm-prefer-register-over-unsigned
    llvm-qualified-auto
    llvm-twine-local
    misc-definitions-in-headers
    misc-misplaced-const
    misc-new-delete-overloads
    misc-no-recursion
    misc-non-copyable-objects
    misc-redundant-expression
    misc-static-assert
    misc-throw-by-value-catch-by-reference
    misc-unconventional-assign-operator
    misc-uniqueptr-reset-release
    misc-unused-alias-decls
    misc-unused-using-decls
    readability-identifier-naming

Reviewed By: aaron.ballman

Differential Revision: https://reviews.llvm.org/D95614
2021-01-29 01:01:19 +01:00

91 lines
2.6 KiB
C++

//===--- ForbiddenSubclassingCheck.cpp - clang-tidy -----------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "ForbiddenSubclassingCheck.h"
#include "../utils/OptionsUtils.h"
#include "clang/AST/ASTContext.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/SmallVector.h"
using namespace clang::ast_matchers;
namespace clang {
namespace tidy {
namespace objc {
namespace {
constexpr char DefaultForbiddenSuperClassNames[] =
"ABNewPersonViewController;"
"ABPeoplePickerNavigationController;"
"ABPersonViewController;"
"ABUnknownPersonViewController;"
"NSHashTable;"
"NSMapTable;"
"NSPointerArray;"
"NSPointerFunctions;"
"NSTimer;"
"UIActionSheet;"
"UIAlertView;"
"UIImagePickerController;"
"UITextInputMode;"
"UIWebView";
} // namespace
ForbiddenSubclassingCheck::ForbiddenSubclassingCheck(
StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
ForbiddenSuperClassNames(
utils::options::parseStringList(
Options.get("ClassNames", DefaultForbiddenSuperClassNames))) {
}
void ForbiddenSubclassingCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(
objcInterfaceDecl(
isDerivedFrom(
objcInterfaceDecl(
hasAnyName(
std::vector<StringRef>(
ForbiddenSuperClassNames.begin(),
ForbiddenSuperClassNames.end())))
.bind("superclass")))
.bind("subclass"),
this);
}
void ForbiddenSubclassingCheck::check(
const MatchFinder::MatchResult &Result) {
const auto *SubClass = Result.Nodes.getNodeAs<ObjCInterfaceDecl>(
"subclass");
assert(SubClass != nullptr);
const auto *SuperClass = Result.Nodes.getNodeAs<ObjCInterfaceDecl>(
"superclass");
assert(SuperClass != nullptr);
diag(SubClass->getLocation(),
"Objective-C interface %0 subclasses %1, which is not "
"intended to be subclassed")
<< SubClass
<< SuperClass;
}
void ForbiddenSubclassingCheck::storeOptions(
ClangTidyOptions::OptionMap &Opts) {
Options.store(
Opts,
"ForbiddenSuperClassNames",
utils::options::serializeStringList(ForbiddenSuperClassNames));
}
} // namespace objc
} // namespace tidy
} // namespace clang