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