| //===--- 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/SmallString.h" |
| |
| using namespace clang; |
| using namespace tidy; |
| |
| // Returns true if GlobList starts with the negative indicator ('-'), removes it |
| // from the GlobList. |
| static bool ConsumeNegativeIndicator(StringRef &GlobList) { |
| GlobList = GlobList.trim(" \r\n"); |
| 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(',')); |
| 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.find(C) != StringRef::npos) |
| RegexText.push_back('\\'); |
| RegexText.push_back(C); |
| } |
| RegexText.push_back('$'); |
| return llvm::Regex(RegexText); |
| } |
| |
| GlobList::GlobList(StringRef Globs) { |
| do { |
| GlobListItem Item; |
| Item.IsPositive = !ConsumeNegativeIndicator(Globs); |
| Item.Regex = ConsumeGlob(Globs); |
| Items.push_back(std::move(Item)); |
| } while (!Globs.empty()); |
| } |
| |
| bool GlobList::contains(StringRef S) { |
| bool Contains = false; |
| for (const GlobListItem &Item : Items) { |
| if (Item.Regex.match(S)) |
| Contains = Item.IsPositive; |
| } |
| return Contains; |
| } |