diff --git a/clang-tools-extra/clang-tidy/modernize/IntegralLiteralExpressionMatcher.cpp b/clang-tools-extra/clang-tidy/modernize/IntegralLiteralExpressionMatcher.cpp index 9b97b46d580ee..ecf3a18199ffe 100644 --- a/clang-tools-extra/clang-tidy/modernize/IntegralLiteralExpressionMatcher.cpp +++ b/clang-tools-extra/clang-tidy/modernize/IntegralLiteralExpressionMatcher.cpp @@ -10,7 +10,6 @@ #include #include -#include namespace clang::tidy::modernize { @@ -48,10 +47,10 @@ bool IntegralLiteralExpressionMatcher::consume(tok::TokenKind Kind) { return false; } +template bool IntegralLiteralExpressionMatcher::nonTerminalChainedExpr( - bool (IntegralLiteralExpressionMatcher::*NonTerminal)(), - const std::function &IsKind) { - if (!(this->*NonTerminal)()) + const NonTerminalFunctor &NonTerminal, const IsKindFunctor &IsKind) { + if (!NonTerminal()) return false; if (Current == End) return true; @@ -63,13 +62,28 @@ bool IntegralLiteralExpressionMatcher::nonTerminalChainedExpr( if (!advance()) return false; - if (!(this->*NonTerminal)()) + if (!NonTerminal()) return false; } return true; } +template +bool IntegralLiteralExpressionMatcher::nonTerminalChainedExpr( + const NonTerminalFunctor &NonTerminal) { + return nonTerminalChainedExpr(NonTerminal, + [](Token Tok) { return Tok.is(Kind); }); +} + +template +bool IntegralLiteralExpressionMatcher::nonTerminalChainedExpr( + const NonTerminalFunctor &NonTerminal) { + return nonTerminalChainedExpr( + NonTerminal, [](Token Tok) { return Tok.isOneOf(K1, K2, Ks...); }); +} + // Advance over unary operators. bool IntegralLiteralExpressionMatcher::unaryOperator() { if (Current->isOneOf(tok::TokenKind::minus, tok::TokenKind::plus, @@ -155,18 +169,18 @@ bool IntegralLiteralExpressionMatcher::unaryExpr() { bool IntegralLiteralExpressionMatcher::multiplicativeExpr() { return nonTerminalChainedExpr( - &IntegralLiteralExpressionMatcher::unaryExpr); + [this] { return unaryExpr(); }); } bool IntegralLiteralExpressionMatcher::additiveExpr() { return nonTerminalChainedExpr( - &IntegralLiteralExpressionMatcher::multiplicativeExpr); + [this] { return multiplicativeExpr(); }); } bool IntegralLiteralExpressionMatcher::shiftExpr() { return nonTerminalChainedExpr( - &IntegralLiteralExpressionMatcher::additiveExpr); + [this] { return additiveExpr(); }); } bool IntegralLiteralExpressionMatcher::compareExpr() { @@ -190,38 +204,38 @@ bool IntegralLiteralExpressionMatcher::relationalExpr() { return nonTerminalChainedExpr( - &IntegralLiteralExpressionMatcher::compareExpr); + [this] { return compareExpr(); }); } bool IntegralLiteralExpressionMatcher::equalityExpr() { return nonTerminalChainedExpr( - &IntegralLiteralExpressionMatcher::relationalExpr); + [this] { return relationalExpr(); }); } bool IntegralLiteralExpressionMatcher::andExpr() { return nonTerminalChainedExpr( - &IntegralLiteralExpressionMatcher::equalityExpr); + [this] { return equalityExpr(); }); } bool IntegralLiteralExpressionMatcher::exclusiveOrExpr() { return nonTerminalChainedExpr( - &IntegralLiteralExpressionMatcher::andExpr); + [this] { return andExpr(); }); } bool IntegralLiteralExpressionMatcher::inclusiveOrExpr() { return nonTerminalChainedExpr( - &IntegralLiteralExpressionMatcher::exclusiveOrExpr); + [this] { return exclusiveOrExpr(); }); } bool IntegralLiteralExpressionMatcher::logicalAndExpr() { return nonTerminalChainedExpr( - &IntegralLiteralExpressionMatcher::inclusiveOrExpr); + [this] { return inclusiveOrExpr(); }); } bool IntegralLiteralExpressionMatcher::logicalOrExpr() { return nonTerminalChainedExpr( - &IntegralLiteralExpressionMatcher::logicalAndExpr); + [this] { return logicalAndExpr(); }); } bool IntegralLiteralExpressionMatcher::conditionalExpr() { @@ -263,12 +277,10 @@ bool IntegralLiteralExpressionMatcher::conditionalExpr() { } bool IntegralLiteralExpressionMatcher::commaExpr() { - auto Pred = CommaAllowed - ? std::function( - [](Token Tok) { return Tok.is(tok::TokenKind::comma); }) - : std::function([](Token) { return false; }); - return nonTerminalChainedExpr( - &IntegralLiteralExpressionMatcher::conditionalExpr, Pred); + auto NonTerminal = [this] { return conditionalExpr(); }; + if (CommaAllowed) + return nonTerminalChainedExpr(NonTerminal); + return nonTerminalChainedExpr(NonTerminal, [](Token) { return false; }); } bool IntegralLiteralExpressionMatcher::expr() { return commaExpr(); } diff --git a/clang-tools-extra/clang-tidy/modernize/IntegralLiteralExpressionMatcher.h b/clang-tools-extra/clang-tidy/modernize/IntegralLiteralExpressionMatcher.h index e8ccb5bd8df9f..22893784b07f8 100644 --- a/clang-tools-extra/clang-tidy/modernize/IntegralLiteralExpressionMatcher.h +++ b/clang-tools-extra/clang-tidy/modernize/IntegralLiteralExpressionMatcher.h @@ -39,21 +39,14 @@ class IntegralLiteralExpressionMatcher { private: bool advance(); bool consume(tok::TokenKind Kind); - bool nonTerminalChainedExpr( - bool (IntegralLiteralExpressionMatcher::*NonTerminal)(), - const std::function &IsKind); - template - bool nonTerminalChainedExpr( - bool (IntegralLiteralExpressionMatcher::*NonTerminal)()) { - return nonTerminalChainedExpr(NonTerminal, - [](Token Tok) { return Tok.is(Kind); }); - } - template - bool nonTerminalChainedExpr( - bool (IntegralLiteralExpressionMatcher::*NonTerminal)()) { - return nonTerminalChainedExpr( - NonTerminal, [](Token Tok) { return Tok.isOneOf(K1, K2, Ks...); }); - } + 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();