Mercurial > hg > CbC > CbC_llvm
comparison clang-tools-extra/clang-tidy/GlobList.cpp @ 150:1d019706d866
LLVM10
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 15:10:13 +0900 |
parents | |
children | 2e18cbf3894f |
comparison
equal
deleted
inserted
replaced
147:c2174574ed3a | 150:1d019706d866 |
---|---|
1 //===--- tools/extra/clang-tidy/GlobList.cpp ------------------------------===// | |
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 #include "GlobList.h" | |
10 #include "llvm/ADT/SmallString.h" | |
11 | |
12 using namespace clang; | |
13 using namespace tidy; | |
14 | |
15 // Returns true if GlobList starts with the negative indicator ('-'), removes it | |
16 // from the GlobList. | |
17 static bool ConsumeNegativeIndicator(StringRef &GlobList) { | |
18 GlobList = GlobList.trim(" \r\n"); | |
19 if (GlobList.startswith("-")) { | |
20 GlobList = GlobList.substr(1); | |
21 return true; | |
22 } | |
23 return false; | |
24 } | |
25 | |
26 // Converts first glob from the comma-separated list of globs to Regex and | |
27 // removes it and the trailing comma from the GlobList. | |
28 static llvm::Regex ConsumeGlob(StringRef &GlobList) { | |
29 StringRef UntrimmedGlob = GlobList.substr(0, GlobList.find(',')); | |
30 StringRef Glob = UntrimmedGlob.trim(' '); | |
31 GlobList = GlobList.substr(UntrimmedGlob.size() + 1); | |
32 SmallString<128> RegexText("^"); | |
33 StringRef MetaChars("()^$|*+?.[]\\{}"); | |
34 for (char C : Glob) { | |
35 if (C == '*') | |
36 RegexText.push_back('.'); | |
37 else if (MetaChars.find(C) != StringRef::npos) | |
38 RegexText.push_back('\\'); | |
39 RegexText.push_back(C); | |
40 } | |
41 RegexText.push_back('$'); | |
42 return llvm::Regex(RegexText); | |
43 } | |
44 | |
45 GlobList::GlobList(StringRef Globs) { | |
46 do { | |
47 GlobListItem Item; | |
48 Item.IsPositive = !ConsumeNegativeIndicator(Globs); | |
49 Item.Regex = ConsumeGlob(Globs); | |
50 Items.push_back(std::move(Item)); | |
51 } while (!Globs.empty()); | |
52 } | |
53 | |
54 bool GlobList::contains(StringRef S) { | |
55 bool Contains = false; | |
56 for (const GlobListItem &Item : Items) { | |
57 if (Item.Regex.match(S)) | |
58 Contains = Item.IsPositive; | |
59 } | |
60 return Contains; | |
61 } |