//===- unittests/Tooling/RecursiveASTVisitorTests/CallbacksCompoundAssignOperator.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_TraverseCompoundAssignOperator) { class RecordingVisitor : public RecordingVisitorBase { public: RecordingVisitor(ShouldTraversePostOrder ShouldTraversePostOrderValue) : RecordingVisitorBase(ShouldTraversePostOrderValue) {} bool TraverseCompoundAssignOperator(CompoundAssignOperator *CAO) { recordCallback(__func__, CAO, [&]() { RecordingVisitorBase::TraverseCompoundAssignOperator(CAO); }); return true; } bool WalkUpFromStmt(Stmt *S) { recordCallback(__func__, S, [&]() { RecordingVisitorBase::WalkUpFromStmt(S); }); return true; } }; StringRef Code = R"cpp( void test(int a) { 1; a += 2; 3; } )cpp"; EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::No), Code, R"txt( WalkUpFromStmt CompoundStmt WalkUpFromStmt IntegerLiteral(1) TraverseCompoundAssignOperator CompoundAssignOperator(+=) WalkUpFromStmt CompoundAssignOperator(+=) WalkUpFromStmt DeclRefExpr(a) WalkUpFromStmt IntegerLiteral(2) WalkUpFromStmt IntegerLiteral(3) )txt")); EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::Yes), Code, R"txt( WalkUpFromStmt IntegerLiteral(1) TraverseCompoundAssignOperator CompoundAssignOperator(+=) WalkUpFromStmt DeclRefExpr(a) WalkUpFromStmt IntegerLiteral(2) WalkUpFromStmt CompoundAssignOperator(+=) WalkUpFromStmt IntegerLiteral(3) WalkUpFromStmt CompoundStmt )txt")); } TEST( RecursiveASTVisitor, StmtCallbacks_TraverseCompoundAssignOperator_WalkUpFromCompoundAssignOperator) { class RecordingVisitor : public RecordingVisitorBase { public: RecordingVisitor(ShouldTraversePostOrder ShouldTraversePostOrderValue) : RecordingVisitorBase(ShouldTraversePostOrderValue) {} bool TraverseCompoundAssignOperator(CompoundAssignOperator *CAO) { recordCallback(__func__, CAO, [&]() { RecordingVisitorBase::TraverseCompoundAssignOperator(CAO); }); 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 WalkUpFromCompoundAssignOperator(CompoundAssignOperator *CAO) { recordCallback(__func__, CAO, [&]() { RecordingVisitorBase::WalkUpFromCompoundAssignOperator(CAO); }); return true; } }; StringRef Code = R"cpp( void test(int a) { 1; a += 2; 3; } )cpp"; EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::No), Code, R"txt( WalkUpFromStmt CompoundStmt WalkUpFromExpr IntegerLiteral(1) WalkUpFromStmt IntegerLiteral(1) TraverseCompoundAssignOperator CompoundAssignOperator(+=) WalkUpFromCompoundAssignOperator CompoundAssignOperator(+=) WalkUpFromExpr CompoundAssignOperator(+=) WalkUpFromStmt CompoundAssignOperator(+=) WalkUpFromExpr DeclRefExpr(a) WalkUpFromStmt DeclRefExpr(a) WalkUpFromExpr IntegerLiteral(2) WalkUpFromStmt IntegerLiteral(2) WalkUpFromExpr IntegerLiteral(3) WalkUpFromStmt IntegerLiteral(3) )txt")); EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::Yes), Code, R"txt( WalkUpFromExpr IntegerLiteral(1) WalkUpFromStmt IntegerLiteral(1) TraverseCompoundAssignOperator CompoundAssignOperator(+=) WalkUpFromExpr DeclRefExpr(a) WalkUpFromStmt DeclRefExpr(a) WalkUpFromExpr IntegerLiteral(2) WalkUpFromStmt IntegerLiteral(2) WalkUpFromCompoundAssignOperator CompoundAssignOperator(+=) WalkUpFromExpr CompoundAssignOperator(+=) WalkUpFromStmt CompoundAssignOperator(+=) WalkUpFromExpr IntegerLiteral(3) WalkUpFromStmt IntegerLiteral(3) WalkUpFromStmt CompoundStmt )txt")); } TEST(RecursiveASTVisitor, StmtCallbacks_WalkUpFromCompoundAssignOperator) { 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 WalkUpFromCompoundAssignOperator(CompoundAssignOperator *CAO) { recordCallback(__func__, CAO, [&]() { RecordingVisitorBase::WalkUpFromCompoundAssignOperator(CAO); }); return true; } }; StringRef Code = R"cpp( void test(int a) { 1; a += 2; 3; } )cpp"; EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::No), Code, R"txt( WalkUpFromStmt CompoundStmt WalkUpFromExpr IntegerLiteral(1) WalkUpFromStmt IntegerLiteral(1) WalkUpFromCompoundAssignOperator CompoundAssignOperator(+=) WalkUpFromExpr CompoundAssignOperator(+=) WalkUpFromStmt CompoundAssignOperator(+=) WalkUpFromExpr DeclRefExpr(a) WalkUpFromStmt DeclRefExpr(a) WalkUpFromExpr IntegerLiteral(2) WalkUpFromStmt IntegerLiteral(2) WalkUpFromExpr IntegerLiteral(3) WalkUpFromStmt IntegerLiteral(3) )txt")); EXPECT_TRUE(visitorCallbackLogEqual( RecordingVisitor(ShouldTraversePostOrder::Yes), Code, R"txt( WalkUpFromExpr IntegerLiteral(1) WalkUpFromStmt IntegerLiteral(1) WalkUpFromExpr DeclRefExpr(a) WalkUpFromStmt DeclRefExpr(a) WalkUpFromExpr IntegerLiteral(2) WalkUpFromStmt IntegerLiteral(2) WalkUpFromCompoundAssignOperator CompoundAssignOperator(+=) WalkUpFromExpr CompoundAssignOperator(+=) WalkUpFromStmt CompoundAssignOperator(+=) WalkUpFromExpr IntegerLiteral(3) WalkUpFromStmt IntegerLiteral(3) WalkUpFromStmt CompoundStmt )txt")); }