diff options
author | thegeorg <thegeorg@yandex-team.com> | 2024-03-13 13:58:24 +0300 |
---|---|---|
committer | thegeorg <thegeorg@yandex-team.com> | 2024-03-13 14:11:53 +0300 |
commit | 11a895b7e15d1c5a1f52706396b82e3f9db953cb (patch) | |
tree | fabc6d883b0f946151f61ae7865cee9f529a1fdd /contrib/libs/clang16/tools/extra/clang-tidy/GlobList.cpp | |
parent | 9685917341315774aad5733b1793b1e533a88bbb (diff) | |
download | ydb-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.cpp | 75 |
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 |