aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/clang14/tools/extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp
diff options
context:
space:
mode:
authorvitalyisaev <vitalyisaev@yandex-team.com>2023-06-29 10:00:50 +0300
committervitalyisaev <vitalyisaev@yandex-team.com>2023-06-29 10:00:50 +0300
commit6ffe9e53658409f212834330e13564e4952558f6 (patch)
tree85b1e00183517648b228aafa7c8fb07f5276f419 /contrib/libs/clang14/tools/extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp
parent726057070f9c5a91fc10fde0d5024913d10f1ab9 (diff)
downloadydb-6ffe9e53658409f212834330e13564e4952558f6.tar.gz
YQ Connector: support managed ClickHouse
Со стороны dqrun можно обратиться к инстансу коннектора, который работает на streaming стенде, и извлечь данные из облачного CH.
Diffstat (limited to 'contrib/libs/clang14/tools/extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp')
-rw-r--r--contrib/libs/clang14/tools/extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/contrib/libs/clang14/tools/extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp b/contrib/libs/clang14/tools/extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp
new file mode 100644
index 0000000000..ed736d1117
--- /dev/null
+++ b/contrib/libs/clang14/tools/extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp
@@ -0,0 +1,97 @@
+//===--- NonPrivateMemberVariablesInClassesCheck.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 "NonPrivateMemberVariablesInClassesCheck.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+
+using namespace clang::ast_matchers;
+
+namespace clang {
+namespace tidy {
+namespace misc {
+
+namespace {
+
+AST_MATCHER(CXXRecordDecl, hasMethods) {
+ return std::distance(Node.method_begin(), Node.method_end()) != 0;
+}
+
+AST_MATCHER(CXXRecordDecl, hasNonStaticNonImplicitMethod) {
+ return hasMethod(unless(anyOf(isStaticStorageClass(), isImplicit())))
+ .matches(Node, Finder, Builder);
+}
+
+AST_MATCHER(CXXRecordDecl, hasNonPublicMemberVariable) {
+ return cxxRecordDecl(has(fieldDecl(unless(isPublic()))))
+ .matches(Node, Finder, Builder);
+}
+
+AST_POLYMORPHIC_MATCHER_P(boolean, AST_POLYMORPHIC_SUPPORTED_TYPES(Stmt, Decl),
+ bool, Boolean) {
+ return Boolean;
+}
+
+} // namespace
+
+NonPrivateMemberVariablesInClassesCheck::
+ NonPrivateMemberVariablesInClassesCheck(StringRef Name,
+ ClangTidyContext *Context)
+ : ClangTidyCheck(Name, Context),
+ IgnoreClassesWithAllMemberVariablesBeingPublic(
+ Options.get("IgnoreClassesWithAllMemberVariablesBeingPublic", false)),
+ IgnorePublicMemberVariables(
+ Options.get("IgnorePublicMemberVariables", false)) {}
+
+void NonPrivateMemberVariablesInClassesCheck::storeOptions(
+ ClangTidyOptions::OptionMap &Opts) {
+ Options.store(Opts, "IgnoreClassesWithAllMemberVariablesBeingPublic",
+ IgnoreClassesWithAllMemberVariablesBeingPublic);
+ Options.store(Opts, "IgnorePublicMemberVariables",
+ IgnorePublicMemberVariables);
+}
+
+void NonPrivateMemberVariablesInClassesCheck::registerMatchers(
+ MatchFinder *Finder) {
+ // We can ignore structs/classes with all member variables being public.
+ auto ShouldIgnoreRecord =
+ allOf(boolean(IgnoreClassesWithAllMemberVariablesBeingPublic),
+ unless(hasNonPublicMemberVariable()));
+
+ // There are three visibility types: public, protected, private.
+ // If we are ok with public fields, then we only want to complain about
+ // protected fields, else we want to complain about all non-private fields.
+ // We can ignore public member variables in structs/classes, in unions.
+ auto InterestingField = IgnorePublicMemberVariables
+ ? fieldDecl(isProtected())
+ : fieldDecl(unless(isPrivate()));
+
+ // We only want the records that not only contain the mutable data (non-static
+ // member variables), but also have some logic (non-static, non-implicit
+ // member functions). We may optionally ignore records where all the member
+ // variables are public.
+ Finder->addMatcher(cxxRecordDecl(anyOf(isStruct(), isClass()), hasMethods(),
+ hasNonStaticNonImplicitMethod(),
+ unless(ShouldIgnoreRecord),
+ forEach(InterestingField.bind("field")))
+ .bind("record"),
+ this);
+}
+
+void NonPrivateMemberVariablesInClassesCheck::check(
+ const MatchFinder::MatchResult &Result) {
+ const auto *Field = Result.Nodes.getNodeAs<FieldDecl>("field");
+ assert(Field && "We should have the field we are going to complain about");
+
+ diag(Field->getLocation(), "member variable %0 has %1 visibility")
+ << Field << Field->getAccess();
+}
+
+} // namespace misc
+} // namespace tidy
+} // namespace clang