1 //===--- IntegralLiteralExpressionMatcher.h - clang-tidy ------------------===// 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_MODERNIZE_INTEGRAL_LITERAL_EXPRESSION_MATCHER_H 10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_INTEGRAL_LITERAL_EXPRESSION_MATCHER_H 11 12 #include <clang/Lex/Token.h> 13 #include <llvm/ADT/ArrayRef.h> 14 15 namespace clang::tidy::modernize { 16 17 enum class LiteralSize { 18 Unknown = 0, 19 Int, 20 UnsignedInt, 21 Long, 22 UnsignedLong, 23 LongLong, 24 UnsignedLongLong 25 }; 26 27 // Parses an array of tokens and returns true if they conform to the rules of 28 // C++ for whole expressions involving integral literals. Follows the operator 29 // precedence rules of C++. Optionally exclude comma operator expressions. 30 class IntegralLiteralExpressionMatcher { 31 public: IntegralLiteralExpressionMatcher(ArrayRef<Token> Tokens,bool CommaAllowed)32 IntegralLiteralExpressionMatcher(ArrayRef<Token> Tokens, bool CommaAllowed) 33 : Current(Tokens.begin()), End(Tokens.end()), CommaAllowed(CommaAllowed) { 34 } 35 36 bool match(); 37 LiteralSize largestLiteralSize() const; 38 39 private: 40 bool advance(); 41 bool consume(tok::TokenKind Kind); 42 template <typename NonTerminalFunctor, typename IsKindFunctor> 43 bool nonTerminalChainedExpr(const NonTerminalFunctor &NonTerminal, 44 const IsKindFunctor &IsKind); 45 template <tok::TokenKind Kind, typename NonTerminalFunctor> 46 bool nonTerminalChainedExpr(const NonTerminalFunctor &NonTerminal); 47 template <tok::TokenKind K1, tok::TokenKind K2, tok::TokenKind... Ks, 48 typename NonTerminalFunctor> 49 bool nonTerminalChainedExpr(const NonTerminalFunctor &NonTerminal); 50 51 bool unaryOperator(); 52 bool unaryExpr(); 53 bool multiplicativeExpr(); 54 bool additiveExpr(); 55 bool shiftExpr(); 56 bool compareExpr(); 57 bool relationalExpr(); 58 bool equalityExpr(); 59 bool andExpr(); 60 bool exclusiveOrExpr(); 61 bool inclusiveOrExpr(); 62 bool logicalAndExpr(); 63 bool logicalOrExpr(); 64 bool conditionalExpr(); 65 bool commaExpr(); 66 bool expr(); 67 68 ArrayRef<Token>::iterator Current; 69 ArrayRef<Token>::iterator End; 70 LiteralSize LargestSize{LiteralSize::Unknown}; 71 bool CommaAllowed; 72 }; 73 74 } // namespace clang::tidy::modernize 75 76 #endif 77