================ @@ -0,0 +1,147 @@ +//===--- VisibilityChangeToVirtualFunctionCheck.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 "VisibilityChangeToVirtualFunctionCheck.h" +#include "../utils/Matchers.h" +#include "../utils/OptionsUtils.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; +using namespace clang; + +namespace { +AST_MATCHER(NamedDecl, isOperatorDecl) { + DeclarationName::NameKind NK = Node.getDeclName().getNameKind(); + return NK != DeclarationName::Identifier && + NK != DeclarationName::CXXConstructorName && + NK != DeclarationName::CXXDestructorName; +} +} // namespace + +namespace clang::tidy { + +template <> +struct OptionEnumMapping< + misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind> { + static llvm::ArrayRef<std::pair< + misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind, StringRef>> + getEnumMapping() { + static constexpr std::pair< + misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind, StringRef> + Mapping[] = { + {misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind::Any, + "any"}, + {misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind::Widening, + "widening"}, + {misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind:: + Narrowing, + "narrowing"}, + }; + return {Mapping}; + } +}; + +namespace misc { + +VisibilityChangeToVirtualFunctionCheck::VisibilityChangeToVirtualFunctionCheck( + StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), + DetectVisibilityChange( + Options.get("DisallowedVisibilityChange", ChangeKind::Any)), + CheckDestructors(Options.get("CheckDestructors", false)), + CheckOperators(Options.get("CheckOperators", false)), + IgnoredFunctions(utils::options::parseStringList( + Options.get("IgnoredFunctions", ""))) {} + +void VisibilityChangeToVirtualFunctionCheck::storeOptions( + ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "DisallowedVisibilityChange", DetectVisibilityChange); + Options.store(Opts, "CheckDestructors", CheckDestructors); + Options.store(Opts, "CheckOperators", CheckOperators); + Options.store(Opts, "IgnoredFunctions", + utils::options::serializeStringList(IgnoredFunctions)); +} + +void VisibilityChangeToVirtualFunctionCheck::registerMatchers( + MatchFinder *Finder) { + auto IgnoredDecl = + namedDecl(matchers::matchesAnyListedName(IgnoredFunctions)); + auto FilterDestructors = + CheckDestructors ? decl() : decl(unless(cxxDestructorDecl())); + auto FilterOperators = + CheckOperators ? namedDecl() : namedDecl(unless(isOperatorDecl())); + Finder->addMatcher( ---------------- balazske wrote:
Why is move of `unless(isExpansionInSystemHeader())` needed? https://github.com/llvm/llvm-project/pull/140086 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits