//===--- IntegralLiteralExpressionMatcher.h - clang-tidy ------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_INTEGRAL_LITERAL_EXPRESSION_MATCHER_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_INTEGRAL_LITERAL_EXPRESSION_MATCHER_H #include #include namespace clang::tidy::modernize { enum class LiteralSize { Unknown = 0, Int, UnsignedInt, Long, UnsignedLong, LongLong, UnsignedLongLong }; // Parses an array of tokens and returns true if they conform to the rules of // C++ for whole expressions involving integral literals. Follows the operator // precedence rules of C++. Optionally exclude comma operator expressions. class IntegralLiteralExpressionMatcher { public: IntegralLiteralExpressionMatcher(ArrayRef Tokens, bool CommaAllowed) : Current(Tokens.begin()), End(Tokens.end()), CommaAllowed(CommaAllowed) { } bool match(); LiteralSize largestLiteralSize() const; private: bool advance(); bool consume(tok::TokenKind Kind); template bool nonTerminalChainedExpr(const NonTerminalFunctor &NonTerminal, const IsKindFunctor &IsKind); template bool nonTerminalChainedExpr(const NonTerminalFunctor &NonTerminal); template bool nonTerminalChainedExpr(const NonTerminalFunctor &NonTerminal); bool unaryOperator(); bool unaryExpr(); bool multiplicativeExpr(); bool additiveExpr(); bool shiftExpr(); bool compareExpr(); bool relationalExpr(); bool equalityExpr(); bool andExpr(); bool exclusiveOrExpr(); bool inclusiveOrExpr(); bool logicalAndExpr(); bool logicalOrExpr(); bool conditionalExpr(); bool commaExpr(); bool expr(); ArrayRef::iterator Current; ArrayRef::iterator End; LiteralSize LargestSize{LiteralSize::Unknown}; bool CommaAllowed; }; } // namespace clang::tidy::modernize #endif