IntegralLiteralExpressionMatcher.h 2.5 KB

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