diff --git a/clang-tools-extra/clang-tidy/GlobList.h b/clang-tools-extra/clang-tidy/GlobList.h --- a/clang-tools-extra/clang-tidy/GlobList.h +++ b/clang-tools-extra/clang-tidy/GlobList.h @@ -12,7 +12,7 @@ #include "clang/Basic/LLVM.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Regex.h" -#include +#include namespace clang { namespace tidy { @@ -28,14 +28,15 @@ /// Returns \c true if the pattern matches \p S. The result is the last /// matching glob's Positive flag. - bool contains(StringRef S) { return contains(S, false); } + bool contains(StringRef S); private: - bool contains(StringRef S, bool Contains); - bool Positive; - llvm::Regex Regex; - std::unique_ptr NextGlob; + struct GlobListItem { + bool IsPositive; + mutable llvm::Regex Regex; + }; + std::vector Items; }; } // end namespace tidy diff --git a/clang-tools-extra/clang-tidy/GlobList.cpp b/clang-tools-extra/clang-tidy/GlobList.cpp --- a/clang-tools-extra/clang-tidy/GlobList.cpp +++ b/clang-tools-extra/clang-tidy/GlobList.cpp @@ -42,15 +42,20 @@ return llvm::Regex(RegexText); } -GlobList::GlobList(StringRef Globs) - : Positive(!ConsumeNegativeIndicator(Globs)), Regex(ConsumeGlob(Globs)), - NextGlob(Globs.empty() ? nullptr : new GlobList(Globs)) {} - -bool GlobList::contains(StringRef S, bool Contains) { - if (Regex.match(S)) - Contains = Positive; +GlobList::GlobList(StringRef Globs) { + do { + GlobListItem Item; + Item.IsPositive = !ConsumeNegativeIndicator(Globs); + Item.Regex = ConsumeGlob(Globs); + Items.push_back(std::move(Item)); + } while (!Globs.empty()); +} - if (NextGlob) - Contains = NextGlob->contains(S, Contains); +bool GlobList::contains(StringRef S) { + bool Contains = false; + for (const GlobListItem &Item : Items) { + if (Item.Regex.match(S)) + Contains = Item.IsPositive; + } return Contains; }