diff options
Diffstat (limited to 'llvm/lib/FileCheck/FileCheck.cpp')
-rw-r--r-- | llvm/lib/FileCheck/FileCheck.cpp | 118 |
1 files changed, 82 insertions, 36 deletions
diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp index d6fda5b..c6a5b69 100644 --- a/llvm/lib/FileCheck/FileCheck.cpp +++ b/llvm/lib/FileCheck/FileCheck.cpp @@ -917,6 +917,12 @@ bool Pattern::parsePattern(StringRef PatternStr, StringRef Prefix, return false; } + // If literal check, set fixed string. + if (CheckTy.isLiteralMatch()) { + FixedStr = PatternStr; + return false; + } + // Check to see if this is a fixed string, or if it has regex pieces. if (!MatchFullLinesHere && (PatternStr.size() < 2 || (PatternStr.find("{{") == StringRef::npos && @@ -1588,26 +1594,43 @@ Check::FileCheckType &Check::FileCheckType::setCount(int C) { return *this; } +std::string Check::FileCheckType::getModifiersDescription() const { + if (Modifiers.none()) + return ""; + std::string Ret; + raw_string_ostream OS(Ret); + OS << '{'; + if (isLiteralMatch()) + OS << "LITERAL"; + OS << '}'; + return OS.str(); +} + std::string Check::FileCheckType::getDescription(StringRef Prefix) const { + // Append directive modifiers. + auto WithModifiers = [this, Prefix](StringRef Str) -> std::string { + return (Prefix + Str + getModifiersDescription()).str(); + }; + switch (Kind) { case Check::CheckNone: return "invalid"; case Check::CheckPlain: if (Count > 1) - return Prefix.str() + "-COUNT"; - return std::string(Prefix); + return WithModifiers("-COUNT"); + return WithModifiers(""); case Check::CheckNext: - return Prefix.str() + "-NEXT"; + return WithModifiers("-NEXT"); case Check::CheckSame: - return Prefix.str() + "-SAME"; + return WithModifiers("-SAME"); case Check::CheckNot: - return Prefix.str() + "-NOT"; + return WithModifiers("-NOT"); case Check::CheckDAG: - return Prefix.str() + "-DAG"; + return WithModifiers("-DAG"); case Check::CheckLabel: - return Prefix.str() + "-LABEL"; + return WithModifiers("-LABEL"); case Check::CheckEmpty: - return Prefix.str() + "-EMPTY"; + return WithModifiers("-EMPTY"); case Check::CheckComment: return std::string(Prefix); case Check::CheckEOF: @@ -1625,23 +1648,45 @@ FindCheckType(const FileCheckRequest &Req, StringRef Buffer, StringRef Prefix) { if (Buffer.size() <= Prefix.size()) return {Check::CheckNone, StringRef()}; - char NextChar = Buffer[Prefix.size()]; - - StringRef Rest = Buffer.drop_front(Prefix.size() + 1); - + StringRef Rest = Buffer.drop_front(Prefix.size()); // Check for comment. if (llvm::is_contained(Req.CommentPrefixes, Prefix)) { - if (NextChar == ':') + if (Rest.consume_front(":")) return {Check::CheckComment, Rest}; // Ignore a comment prefix if it has a suffix like "-NOT". return {Check::CheckNone, StringRef()}; } - // Verify that the : is present after the prefix. - if (NextChar == ':') + auto ConsumeModifiers = [&](Check::FileCheckType Ret) + -> std::pair<Check::FileCheckType, StringRef> { + if (Rest.consume_front(":")) + return {Ret, Rest}; + if (!Rest.consume_front("{")) + return {Check::CheckNone, StringRef()}; + + // Parse the modifiers, speparated by commas. + do { + // Allow whitespace in modifiers list. + Rest = Rest.ltrim(); + if (Rest.consume_front("LITERAL")) + Ret.setLiteralMatch(); + else + return {Check::CheckNone, Rest}; + // Allow whitespace in modifiers list. + Rest = Rest.ltrim(); + } while (Rest.consume_front(",")); + if (!Rest.consume_front("}:")) + return {Check::CheckNone, Rest}; + return {Ret, Rest}; + }; + + // Verify that the prefix is followed by directive modifiers or a colon. + if (Rest.consume_front(":")) return {Check::CheckPlain, Rest}; + if (Rest.front() == '{') + return ConsumeModifiers(Check::CheckPlain); - if (NextChar != '-') + if (!Rest.consume_front("-")) return {Check::CheckNone, StringRef()}; if (Rest.consume_front("COUNT-")) { @@ -1651,29 +1696,12 @@ FindCheckType(const FileCheckRequest &Req, StringRef Buffer, StringRef Prefix) { return {Check::CheckBadCount, Rest}; if (Count <= 0 || Count > INT32_MAX) return {Check::CheckBadCount, Rest}; - if (!Rest.consume_front(":")) + if (Rest.front() != ':' && Rest.front() != '{') return {Check::CheckBadCount, Rest}; - return {Check::FileCheckType(Check::CheckPlain).setCount(Count), Rest}; + return ConsumeModifiers( + Check::FileCheckType(Check::CheckPlain).setCount(Count)); } - if (Rest.consume_front("NEXT:")) - return {Check::CheckNext, Rest}; - - if (Rest.consume_front("SAME:")) - return {Check::CheckSame, Rest}; - - if (Rest.consume_front("NOT:")) - return {Check::CheckNot, Rest}; - - if (Rest.consume_front("DAG:")) - return {Check::CheckDAG, Rest}; - - if (Rest.consume_front("LABEL:")) - return {Check::CheckLabel, Rest}; - - if (Rest.consume_front("EMPTY:")) - return {Check::CheckEmpty, Rest}; - // You can't combine -NOT with another suffix. if (Rest.startswith("DAG-NOT:") || Rest.startswith("NOT-DAG:") || Rest.startswith("NEXT-NOT:") || Rest.startswith("NOT-NEXT:") || @@ -1681,6 +1709,24 @@ FindCheckType(const FileCheckRequest &Req, StringRef Buffer, StringRef Prefix) { Rest.startswith("EMPTY-NOT:") || Rest.startswith("NOT-EMPTY:")) return {Check::CheckBadNot, Rest}; + if (Rest.consume_front("NEXT")) + return ConsumeModifiers(Check::CheckNext); + + if (Rest.consume_front("SAME")) + return ConsumeModifiers(Check::CheckSame); + + if (Rest.consume_front("NOT")) + return ConsumeModifiers(Check::CheckNot); + + if (Rest.consume_front("DAG")) + return ConsumeModifiers(Check::CheckDAG); + + if (Rest.consume_front("LABEL")) + return ConsumeModifiers(Check::CheckLabel); + + if (Rest.consume_front("EMPTY")) + return ConsumeModifiers(Check::CheckEmpty); + return {Check::CheckNone, Rest}; } |