1 //===--- GlobList.h ---------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GLOBLIST_H 10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GLOBLIST_H 11 12 #include "clang/Basic/LLVM.h" 13 #include "llvm/ADT/SmallVector.h" 14 #include "llvm/ADT/StringMap.h" 15 #include "llvm/ADT/StringRef.h" 16 #include "llvm/Support/Regex.h" 17 18 namespace clang::tidy { 19 20 /// Read-only set of strings represented as a list of positive and negative 21 /// globs. 22 /// 23 /// Positive globs add all matched strings to the set, negative globs remove 24 /// them in the order of appearance in the list. 25 class GlobList { 26 public: 27 virtual ~GlobList() = default; 28 29 /// \p Globs is a comma-separated list of globs (only the '*' metacharacter is 30 /// supported) with an optional '-' prefix to denote exclusion. 31 /// 32 /// An empty \p Globs string is interpreted as one glob that matches an empty 33 /// string. 34 /// 35 /// \p KeepNegativeGlobs a bool flag indicating whether to keep negative 36 /// globs from \p Globs or not. When false, negative globs are simply ignored. 37 GlobList(StringRef Globs, bool KeepNegativeGlobs = true); 38 39 /// Returns \c true if the pattern matches \p S. The result is the last 40 /// matching glob's Positive flag. 41 virtual bool contains(StringRef S) const; 42 43 private: 44 struct GlobListItem { 45 bool IsPositive; 46 llvm::Regex Regex; 47 }; 48 SmallVector<GlobListItem, 0> Items; 49 }; 50 51 /// A \p GlobList that caches search results, so that search is performed only 52 /// once for the same query. 53 class CachedGlobList final : public GlobList { 54 public: 55 using GlobList::GlobList; 56 57 /// \see GlobList::contains 58 bool contains(StringRef S) const override; 59 60 private: 61 mutable llvm::StringMap<bool> Cache; 62 }; 63 64 } // namespace clang::tidy 65 66 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GLOBLIST_H 67