211 lines · cpp
1//===- CallbacksBinaryOperator.cpp ----------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "CallbacksCommon.h"10 11TEST(RecursiveASTVisitor, StmtCallbacks_TraverseBinaryOperator) {12 class RecordingVisitor : public RecordingVisitorBase<RecordingVisitor> {13 public:14 RecordingVisitor(ShouldTraversePostOrder ShouldTraversePostOrderValue)15 : RecordingVisitorBase(ShouldTraversePostOrderValue) {}16 17 bool TraverseBinaryOperator(BinaryOperator *BO) {18 recordCallback(__func__, BO, [&]() {19 RecordingVisitorBase::TraverseBinaryOperator(BO);20 });21 return true;22 }23 24 bool WalkUpFromStmt(Stmt *S) {25 recordCallback(__func__, S,26 [&]() { RecordingVisitorBase::WalkUpFromStmt(S); });27 return true;28 }29 };30 31 StringRef Code = R"cpp(32void test() {33 1;34 2 + 3;35 4;36}37)cpp";38 39 EXPECT_TRUE(visitorCallbackLogEqual(40 RecordingVisitor(ShouldTraversePostOrder::No), Code,41 R"txt(42WalkUpFromStmt CompoundStmt43WalkUpFromStmt IntegerLiteral(1)44TraverseBinaryOperator BinaryOperator(+)45 WalkUpFromStmt BinaryOperator(+)46 WalkUpFromStmt IntegerLiteral(2)47 WalkUpFromStmt IntegerLiteral(3)48WalkUpFromStmt IntegerLiteral(4)49)txt"));50 51 EXPECT_TRUE(visitorCallbackLogEqual(52 RecordingVisitor(ShouldTraversePostOrder::Yes), Code,53 R"txt(54WalkUpFromStmt IntegerLiteral(1)55TraverseBinaryOperator BinaryOperator(+)56 WalkUpFromStmt IntegerLiteral(2)57 WalkUpFromStmt IntegerLiteral(3)58 WalkUpFromStmt BinaryOperator(+)59WalkUpFromStmt IntegerLiteral(4)60WalkUpFromStmt CompoundStmt61)txt"));62}63 64TEST(RecursiveASTVisitor,65 StmtCallbacks_TraverseBinaryOperator_WalkUpFromBinaryOperator) {66 class RecordingVisitor : public RecordingVisitorBase<RecordingVisitor> {67 public:68 RecordingVisitor(ShouldTraversePostOrder ShouldTraversePostOrderValue)69 : RecordingVisitorBase(ShouldTraversePostOrderValue) {}70 71 bool TraverseBinaryOperator(BinaryOperator *BO) {72 recordCallback(__func__, BO, [&]() {73 RecordingVisitorBase::TraverseBinaryOperator(BO);74 });75 return true;76 }77 78 bool WalkUpFromStmt(Stmt *S) {79 recordCallback(__func__, S,80 [&]() { RecordingVisitorBase::WalkUpFromStmt(S); });81 return true;82 }83 84 bool WalkUpFromExpr(Expr *E) {85 recordCallback(__func__, E,86 [&]() { RecordingVisitorBase::WalkUpFromExpr(E); });87 return true;88 }89 90 bool WalkUpFromBinaryOperator(BinaryOperator *BO) {91 recordCallback(__func__, BO, [&]() {92 RecordingVisitorBase::WalkUpFromBinaryOperator(BO);93 });94 return true;95 }96 };97 98 StringRef Code = R"cpp(99void test() {100 1;101 2 + 3;102 4;103}104)cpp";105 106 EXPECT_TRUE(visitorCallbackLogEqual(107 RecordingVisitor(ShouldTraversePostOrder::No), Code,108 R"txt(109WalkUpFromStmt CompoundStmt110WalkUpFromExpr IntegerLiteral(1)111 WalkUpFromStmt IntegerLiteral(1)112TraverseBinaryOperator BinaryOperator(+)113 WalkUpFromBinaryOperator BinaryOperator(+)114 WalkUpFromExpr BinaryOperator(+)115 WalkUpFromStmt BinaryOperator(+)116 WalkUpFromExpr IntegerLiteral(2)117 WalkUpFromStmt IntegerLiteral(2)118 WalkUpFromExpr IntegerLiteral(3)119 WalkUpFromStmt IntegerLiteral(3)120WalkUpFromExpr IntegerLiteral(4)121 WalkUpFromStmt IntegerLiteral(4)122)txt"));123 124 EXPECT_TRUE(visitorCallbackLogEqual(125 RecordingVisitor(ShouldTraversePostOrder::Yes), Code,126 R"txt(127WalkUpFromExpr IntegerLiteral(1)128 WalkUpFromStmt IntegerLiteral(1)129TraverseBinaryOperator BinaryOperator(+)130 WalkUpFromExpr IntegerLiteral(2)131 WalkUpFromStmt IntegerLiteral(2)132 WalkUpFromExpr IntegerLiteral(3)133 WalkUpFromStmt IntegerLiteral(3)134 WalkUpFromBinaryOperator BinaryOperator(+)135 WalkUpFromExpr BinaryOperator(+)136 WalkUpFromStmt BinaryOperator(+)137WalkUpFromExpr IntegerLiteral(4)138 WalkUpFromStmt IntegerLiteral(4)139WalkUpFromStmt CompoundStmt140)txt"));141}142 143TEST(RecursiveASTVisitor, StmtCallbacks_WalkUpFromBinaryOperator) {144 class RecordingVisitor : public RecordingVisitorBase<RecordingVisitor> {145 public:146 RecordingVisitor(ShouldTraversePostOrder ShouldTraversePostOrderValue)147 : RecordingVisitorBase(ShouldTraversePostOrderValue) {}148 149 bool WalkUpFromStmt(Stmt *S) {150 recordCallback(__func__, S,151 [&]() { RecordingVisitorBase::WalkUpFromStmt(S); });152 return true;153 }154 155 bool WalkUpFromExpr(Expr *E) {156 recordCallback(__func__, E,157 [&]() { RecordingVisitorBase::WalkUpFromExpr(E); });158 return true;159 }160 161 bool WalkUpFromBinaryOperator(BinaryOperator *BO) {162 recordCallback(__func__, BO, [&]() {163 RecordingVisitorBase::WalkUpFromBinaryOperator(BO);164 });165 return true;166 }167 };168 169 StringRef Code = R"cpp(170void test() {171 1;172 2 + 3;173 4;174}175)cpp";176 177 EXPECT_TRUE(visitorCallbackLogEqual(178 RecordingVisitor(ShouldTraversePostOrder::No), Code,179 R"txt(180WalkUpFromStmt CompoundStmt181WalkUpFromExpr IntegerLiteral(1)182 WalkUpFromStmt IntegerLiteral(1)183WalkUpFromBinaryOperator BinaryOperator(+)184 WalkUpFromExpr BinaryOperator(+)185 WalkUpFromStmt BinaryOperator(+)186WalkUpFromExpr IntegerLiteral(2)187 WalkUpFromStmt IntegerLiteral(2)188WalkUpFromExpr IntegerLiteral(3)189 WalkUpFromStmt IntegerLiteral(3)190WalkUpFromExpr IntegerLiteral(4)191 WalkUpFromStmt IntegerLiteral(4)192)txt"));193 194 EXPECT_TRUE(visitorCallbackLogEqual(195 RecordingVisitor(ShouldTraversePostOrder::Yes), Code,196 R"txt(197WalkUpFromExpr IntegerLiteral(1)198 WalkUpFromStmt IntegerLiteral(1)199WalkUpFromExpr IntegerLiteral(2)200 WalkUpFromStmt IntegerLiteral(2)201WalkUpFromExpr IntegerLiteral(3)202 WalkUpFromStmt IntegerLiteral(3)203WalkUpFromBinaryOperator BinaryOperator(+)204 WalkUpFromExpr BinaryOperator(+)205 WalkUpFromStmt BinaryOperator(+)206WalkUpFromExpr IntegerLiteral(4)207 WalkUpFromStmt IntegerLiteral(4)208WalkUpFromStmt CompoundStmt209)txt"));210}211