[Support] Add GlobPattern::isTrivialMatchAll()

GlobPattern::isTrivialMatchAll() returns true for the GlobPattern "*"
which will match all inputs.

This can be used to avoid performing expensive preparation of the input
for match() when the result of the match will always be true.

Differential Revision: https://reviews.llvm.org/D87468
This commit is contained in:
Andrew Ng 2020-09-07 13:22:12 +01:00
parent 3a0a2a6347
commit 6040e2a6d9
2 changed files with 23 additions and 0 deletions

View File

@ -31,6 +31,16 @@ public:
static Expected<GlobPattern> create(StringRef Pat);
bool match(StringRef S) const;
// Returns true for glob pattern "*". Can be used to avoid expensive
// preparation/acquisition of the input for match().
bool isTrivialMatchAll() const {
if (Prefix && Prefix->empty()) {
assert(!Suffix);
return true;
}
return false;
}
private:
bool matchOne(ArrayRef<BitVector> Pat, StringRef S) const;

View File

@ -133,4 +133,17 @@ TEST_F(GlobPatternTest, ExtSym) {
EXPECT_TRUE((bool)Pat2);
EXPECT_TRUE(Pat2->match("\xFF"));
}
TEST_F(GlobPatternTest, IsTrivialMatchAll) {
Expected<GlobPattern> Pat1 = GlobPattern::create("*");
EXPECT_TRUE((bool)Pat1);
EXPECT_TRUE(Pat1->isTrivialMatchAll());
const char *NegativeCases[] = {"a*", "*a", "?*", "*?", "**", "\\*"};
for (auto *P : NegativeCases) {
Expected<GlobPattern> Pat2 = GlobPattern::create(P);
EXPECT_TRUE((bool)Pat2);
EXPECT_FALSE(Pat2->isTrivialMatchAll());
}
}
}