aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/clang16/tools/extra/clang-tidy/GlobList.cpp
diff options
context:
space:
mode:
authorthegeorg <thegeorg@yandex-team.com>2024-03-13 13:58:24 +0300
committerthegeorg <thegeorg@yandex-team.com>2024-03-13 14:11:53 +0300
commit11a895b7e15d1c5a1f52706396b82e3f9db953cb (patch)
treefabc6d883b0f946151f61ae7865cee9f529a1fdd /contrib/libs/clang16/tools/extra/clang-tidy/GlobList.cpp
parent9685917341315774aad5733b1793b1e533a88bbb (diff)
downloadydb-11a895b7e15d1c5a1f52706396b82e3f9db953cb.tar.gz
Export clang-format16 via ydblib project
6e6be3a95868fde888d801b7590af4044049563f
Diffstat (limited to 'contrib/libs/clang16/tools/extra/clang-tidy/GlobList.cpp')
-rw-r--r--contrib/libs/clang16/tools/extra/clang-tidy/GlobList.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/contrib/libs/clang16/tools/extra/clang-tidy/GlobList.cpp b/contrib/libs/clang16/tools/extra/clang-tidy/GlobList.cpp
new file mode 100644
index 0000000000..acd08dd3ee
--- /dev/null
+++ b/contrib/libs/clang16/tools/extra/clang-tidy/GlobList.cpp
@@ -0,0 +1,75 @@
+//===--- tools/extra/clang-tidy/GlobList.cpp ------------------------------===//
+//
+// 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 "GlobList.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SmallString.h"
+
+namespace clang::tidy {
+
+// Returns true if GlobList starts with the negative indicator ('-'), removes it
+// from the GlobList.
+static bool consumeNegativeIndicator(StringRef &GlobList) {
+ GlobList = GlobList.trim();
+ if (GlobList.startswith("-")) {
+ GlobList = GlobList.substr(1);
+ return true;
+ }
+ return false;
+}
+
+// Converts first glob from the comma-separated list of globs to Regex and
+// removes it and the trailing comma from the GlobList.
+static llvm::Regex consumeGlob(StringRef &GlobList) {
+ StringRef UntrimmedGlob = GlobList.substr(0, GlobList.find_first_of(",\n"));
+ StringRef Glob = UntrimmedGlob.trim();
+ GlobList = GlobList.substr(UntrimmedGlob.size() + 1);
+ SmallString<128> RegexText("^");
+ StringRef MetaChars("()^$|*+?.[]\\{}");
+ for (char C : Glob) {
+ if (C == '*')
+ RegexText.push_back('.');
+ else if (MetaChars.contains(C))
+ RegexText.push_back('\\');
+ RegexText.push_back(C);
+ }
+ RegexText.push_back('$');
+ return llvm::Regex(RegexText);
+}
+
+GlobList::GlobList(StringRef Globs, bool KeepNegativeGlobs /* =true */) {
+ Items.reserve(Globs.count(',') + Globs.count('\n') + 1);
+ do {
+ GlobListItem Item;
+ Item.IsPositive = !consumeNegativeIndicator(Globs);
+ Item.Regex = consumeGlob(Globs);
+ if (Item.IsPositive || KeepNegativeGlobs)
+ Items.push_back(std::move(Item));
+ } while (!Globs.empty());
+}
+
+bool GlobList::contains(StringRef S) const {
+ // Iterating the container backwards as the last match determins if S is in
+ // the list.
+ for (const GlobListItem &Item : llvm::reverse(Items)) {
+ if (Item.Regex.match(S))
+ return Item.IsPositive;
+ }
+ return false;
+}
+
+bool CachedGlobList::contains(StringRef S) const {
+ auto Entry = Cache.try_emplace(S);
+ bool &Value = Entry.first->getValue();
+ // If the entry was just inserted, determine its required value.
+ if (Entry.second)
+ Value = GlobList::contains(S);
+ return Value;
+}
+
+} // namespace clang::tidy