//===- unittests/Tooling/RecursiveASTVisitorTests/CallbacksBinaryOperator.cpp -===// // // 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 // //===----------------------------------------------------------------------===// #include "CallbacksCommon.h" TEST(RecursiveASTVisitor, StmtCallbacks_TraverseBinaryOperator) { class RecordingVisitor : public RecordingVisitorBase { public: RecordingVisitor(ShouldTraversePostOrder ShouldTraversePostOrderValue) : RecordingVisitorBase(ShouldTraversePostOrderValue) {} bool TraverseBinaryOperator(BinaryOperator *BO) { recordCallback(__func__, BO, [&]() { RecordingVisitorBase::TraverseBinaryOperator(BO); }); return true; } bool WalkUpFromStmt(Stmt *S) { recordCallback(__func__, S, [&]() { RecordingVisitorBase::WalkUpFromStmt(S); }); return true; } }; StringRef Code = R"cpp( void test() { 1; 2 + 3; 4; } )cpp"; EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::No), Code, R"txt( WalkUpFromStmt CompoundStmt WalkUpFromStmt IntegerLiteral(1) TraverseBinaryOperator BinaryOperator(+) WalkUpFromStmt BinaryOperator(+) WalkUpFromStmt IntegerLiteral(2) WalkUpFromStmt IntegerLiteral(3) WalkUpFromStmt IntegerLiteral(4) )txt")); EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::Yes), Code, R"txt( WalkUpFromStmt IntegerLiteral(1) TraverseBinaryOperator BinaryOperator(+) WalkUpFromStmt IntegerLiteral(2) WalkUpFromStmt IntegerLiteral(3) WalkUpFromStmt BinaryOperator(+) WalkUpFromStmt IntegerLiteral(4) WalkUpFromStmt CompoundStmt )txt")); } TEST(RecursiveASTVisitor, StmtCallbacks_TraverseBinaryOperator_WalkUpFromBinaryOperator) { class RecordingVisitor : public RecordingVisitorBase { public: RecordingVisitor(ShouldTraversePostOrder ShouldTraversePostOrderValue) : RecordingVisitorBase(ShouldTraversePostOrderValue) {} bool TraverseBinaryOperator(BinaryOperator *BO) { recordCallback(__func__, BO, [&]() { RecordingVisitorBase::TraverseBinaryOperator(BO); }); return true; } bool WalkUpFromStmt(Stmt *S) { recordCallback(__func__, S, [&]() { RecordingVisitorBase::WalkUpFromStmt(S); }); return true; } bool WalkUpFromExpr(Expr *E) { recordCallback(__func__, E, [&]() { RecordingVisitorBase::WalkUpFromExpr(E); }); return true; } bool WalkUpFromBinaryOperator(BinaryOperator *BO) { recordCallback(__func__, BO, [&]() { RecordingVisitorBase::WalkUpFromBinaryOperator(BO); }); return true; } }; StringRef Code = R"cpp( void test() { 1; 2 + 3; 4; } )cpp"; EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::No), Code, R"txt( WalkUpFromStmt CompoundStmt WalkUpFromExpr IntegerLiteral(1) WalkUpFromStmt IntegerLiteral(1) TraverseBinaryOperator BinaryOperator(+) WalkUpFromBinaryOperator BinaryOperator(+) WalkUpFromExpr BinaryOperator(+) WalkUpFromStmt BinaryOperator(+) WalkUpFromExpr IntegerLiteral(2) WalkUpFromStmt IntegerLiteral(2) WalkUpFromExpr IntegerLiteral(3) WalkUpFromStmt IntegerLiteral(3) WalkUpFromExpr IntegerLiteral(4) WalkUpFromStmt IntegerLiteral(4) )txt")); EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::Yes), Code, R"txt( WalkUpFromExpr IntegerLiteral(1) WalkUpFromStmt IntegerLiteral(1) TraverseBinaryOperator BinaryOperator(+) WalkUpFromExpr IntegerLiteral(2) WalkUpFromStmt IntegerLiteral(2) WalkUpFromExpr IntegerLiteral(3) WalkUpFromStmt IntegerLiteral(3) WalkUpFromBinaryOperator BinaryOperator(+) WalkUpFromExpr BinaryOperator(+) WalkUpFromStmt BinaryOperator(+) WalkUpFromExpr IntegerLiteral(4) WalkUpFromStmt IntegerLiteral(4) WalkUpFromStmt CompoundStmt )txt")); } TEST(RecursiveASTVisitor, StmtCallbacks_WalkUpFromBinaryOperator) { class RecordingVisitor : public RecordingVisitorBase { public: RecordingVisitor(ShouldTraversePostOrder ShouldTraversePostOrderValue) : RecordingVisitorBase(ShouldTraversePostOrderValue) {} bool WalkUpFromStmt(Stmt *S) { recordCallback(__func__, S, [&]() { RecordingVisitorBase::WalkUpFromStmt(S); }); return true; } bool WalkUpFromExpr(Expr *E) { recordCallback(__func__, E, [&]() { RecordingVisitorBase::WalkUpFromExpr(E); }); return true; } bool WalkUpFromBinaryOperator(BinaryOperator *BO) { recordCallback(__func__, BO, [&]() { RecordingVisitorBase::WalkUpFromBinaryOperator(BO); }); return true; } }; StringRef Code = R"cpp( void test() { 1; 2 + 3; 4; } )cpp"; EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::No), Code, R"txt( WalkUpFromStmt CompoundStmt WalkUpFromExpr IntegerLiteral(1) WalkUpFromStmt IntegerLiteral(1) WalkUpFromBinaryOperator BinaryOperator(+) WalkUpFromExpr BinaryOperator(+) WalkUpFromStmt BinaryOperator(+) WalkUpFromExpr IntegerLiteral(2) WalkUpFromStmt IntegerLiteral(2) WalkUpFromExpr IntegerLiteral(3) WalkUpFromStmt IntegerLiteral(3) WalkUpFromExpr IntegerLiteral(4) WalkUpFromStmt IntegerLiteral(4) )txt")); EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::Yes), Code, R"txt( WalkUpFromExpr IntegerLiteral(1) WalkUpFromStmt IntegerLiteral(1) WalkUpFromExpr IntegerLiteral(2) WalkUpFromStmt IntegerLiteral(2) WalkUpFromExpr IntegerLiteral(3) WalkUpFromStmt IntegerLiteral(3) WalkUpFromBinaryOperator BinaryOperator(+) WalkUpFromExpr BinaryOperator(+) WalkUpFromStmt BinaryOperator(+) WalkUpFromExpr IntegerLiteral(4) WalkUpFromStmt IntegerLiteral(4) WalkUpFromStmt CompoundStmt )txt")); }