1*0741a2c9SStefan Pintilie //===-- unittests/Tooling/RecursiveASTVisitorTests/CallbacksCallExpr.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_TraverseCallExpr)11*0741a2c9SStefan Pintilie TEST(RecursiveASTVisitor, StmtCallbacks_TraverseCallExpr) {
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 TraverseCallExpr(CallExpr *CE) {
18*0741a2c9SStefan Pintilie recordCallback(__func__, CE,
19*0741a2c9SStefan Pintilie [&]() { RecordingVisitorBase::TraverseCallExpr(CE); });
20*0741a2c9SStefan Pintilie return true;
21*0741a2c9SStefan Pintilie }
22*0741a2c9SStefan Pintilie
23*0741a2c9SStefan Pintilie bool WalkUpFromStmt(Stmt *S) {
24*0741a2c9SStefan Pintilie recordCallback(__func__, S,
25*0741a2c9SStefan Pintilie [&]() { RecordingVisitorBase::WalkUpFromStmt(S); });
26*0741a2c9SStefan Pintilie return true;
27*0741a2c9SStefan Pintilie }
28*0741a2c9SStefan Pintilie };
29*0741a2c9SStefan Pintilie
30*0741a2c9SStefan Pintilie StringRef Code = R"cpp(
31*0741a2c9SStefan Pintilie void add(int, int);
32*0741a2c9SStefan Pintilie void test() {
33*0741a2c9SStefan Pintilie 1;
34*0741a2c9SStefan Pintilie 2 + 3;
35*0741a2c9SStefan Pintilie add(4, 5);
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 WalkUpFromStmt BinaryOperator(+)
45*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(2)
46*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(3)
47*0741a2c9SStefan Pintilie TraverseCallExpr CallExpr(add)
48*0741a2c9SStefan Pintilie WalkUpFromStmt CallExpr(add)
49*0741a2c9SStefan Pintilie WalkUpFromStmt ImplicitCastExpr
50*0741a2c9SStefan Pintilie WalkUpFromStmt DeclRefExpr(add)
51*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(4)
52*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(5)
53*0741a2c9SStefan Pintilie )txt"));
54*0741a2c9SStefan Pintilie
55*0741a2c9SStefan Pintilie EXPECT_TRUE(visitorCallbackLogEqual(
56*0741a2c9SStefan Pintilie RecordingVisitor(ShouldTraversePostOrder::Yes), Code,
57*0741a2c9SStefan Pintilie R"txt(
58*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(1)
59*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(2)
60*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(3)
61*0741a2c9SStefan Pintilie WalkUpFromStmt BinaryOperator(+)
62*0741a2c9SStefan Pintilie TraverseCallExpr CallExpr(add)
63*0741a2c9SStefan Pintilie WalkUpFromStmt DeclRefExpr(add)
64*0741a2c9SStefan Pintilie WalkUpFromStmt ImplicitCastExpr
65*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(4)
66*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(5)
67*0741a2c9SStefan Pintilie WalkUpFromStmt CallExpr(add)
68*0741a2c9SStefan Pintilie WalkUpFromStmt CompoundStmt
69*0741a2c9SStefan Pintilie )txt"));
70*0741a2c9SStefan Pintilie }
71*0741a2c9SStefan Pintilie
TEST(RecursiveASTVisitor,StmtCallbacks_TraverseCallExpr_WalkUpFromCallExpr)72*0741a2c9SStefan Pintilie TEST(RecursiveASTVisitor, StmtCallbacks_TraverseCallExpr_WalkUpFromCallExpr) {
73*0741a2c9SStefan Pintilie class RecordingVisitor : public RecordingVisitorBase<RecordingVisitor> {
74*0741a2c9SStefan Pintilie public:
75*0741a2c9SStefan Pintilie RecordingVisitor(ShouldTraversePostOrder ShouldTraversePostOrderValue)
76*0741a2c9SStefan Pintilie : RecordingVisitorBase(ShouldTraversePostOrderValue) {}
77*0741a2c9SStefan Pintilie
78*0741a2c9SStefan Pintilie bool TraverseCallExpr(CallExpr *CE) {
79*0741a2c9SStefan Pintilie recordCallback(__func__, CE,
80*0741a2c9SStefan Pintilie [&]() { RecordingVisitorBase::TraverseCallExpr(CE); });
81*0741a2c9SStefan Pintilie return true;
82*0741a2c9SStefan Pintilie }
83*0741a2c9SStefan Pintilie
84*0741a2c9SStefan Pintilie bool WalkUpFromStmt(Stmt *S) {
85*0741a2c9SStefan Pintilie recordCallback(__func__, S,
86*0741a2c9SStefan Pintilie [&]() { RecordingVisitorBase::WalkUpFromStmt(S); });
87*0741a2c9SStefan Pintilie return true;
88*0741a2c9SStefan Pintilie }
89*0741a2c9SStefan Pintilie
90*0741a2c9SStefan Pintilie bool WalkUpFromExpr(Expr *E) {
91*0741a2c9SStefan Pintilie recordCallback(__func__, E,
92*0741a2c9SStefan Pintilie [&]() { RecordingVisitorBase::WalkUpFromExpr(E); });
93*0741a2c9SStefan Pintilie return true;
94*0741a2c9SStefan Pintilie }
95*0741a2c9SStefan Pintilie
96*0741a2c9SStefan Pintilie bool WalkUpFromCallExpr(CallExpr *CE) {
97*0741a2c9SStefan Pintilie recordCallback(__func__, CE,
98*0741a2c9SStefan Pintilie [&]() { RecordingVisitorBase::WalkUpFromCallExpr(CE); });
99*0741a2c9SStefan Pintilie return true;
100*0741a2c9SStefan Pintilie }
101*0741a2c9SStefan Pintilie };
102*0741a2c9SStefan Pintilie
103*0741a2c9SStefan Pintilie StringRef Code = R"cpp(
104*0741a2c9SStefan Pintilie void add(int, int);
105*0741a2c9SStefan Pintilie void test() {
106*0741a2c9SStefan Pintilie 1;
107*0741a2c9SStefan Pintilie 2 + 3;
108*0741a2c9SStefan Pintilie add(4, 5);
109*0741a2c9SStefan Pintilie }
110*0741a2c9SStefan Pintilie )cpp";
111*0741a2c9SStefan Pintilie
112*0741a2c9SStefan Pintilie EXPECT_TRUE(visitorCallbackLogEqual(
113*0741a2c9SStefan Pintilie RecordingVisitor(ShouldTraversePostOrder::No), Code,
114*0741a2c9SStefan Pintilie R"txt(
115*0741a2c9SStefan Pintilie WalkUpFromStmt CompoundStmt
116*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(1)
117*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(1)
118*0741a2c9SStefan Pintilie WalkUpFromExpr BinaryOperator(+)
119*0741a2c9SStefan Pintilie WalkUpFromStmt BinaryOperator(+)
120*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(2)
121*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(2)
122*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(3)
123*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(3)
124*0741a2c9SStefan Pintilie TraverseCallExpr CallExpr(add)
125*0741a2c9SStefan Pintilie WalkUpFromCallExpr CallExpr(add)
126*0741a2c9SStefan Pintilie WalkUpFromExpr CallExpr(add)
127*0741a2c9SStefan Pintilie WalkUpFromStmt CallExpr(add)
128*0741a2c9SStefan Pintilie WalkUpFromExpr ImplicitCastExpr
129*0741a2c9SStefan Pintilie WalkUpFromStmt ImplicitCastExpr
130*0741a2c9SStefan Pintilie WalkUpFromExpr DeclRefExpr(add)
131*0741a2c9SStefan Pintilie WalkUpFromStmt DeclRefExpr(add)
132*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(4)
133*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(4)
134*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(5)
135*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(5)
136*0741a2c9SStefan Pintilie )txt"));
137*0741a2c9SStefan Pintilie
138*0741a2c9SStefan Pintilie EXPECT_TRUE(visitorCallbackLogEqual(
139*0741a2c9SStefan Pintilie RecordingVisitor(ShouldTraversePostOrder::Yes), Code,
140*0741a2c9SStefan Pintilie R"txt(
141*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(1)
142*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(1)
143*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(2)
144*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(2)
145*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(3)
146*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(3)
147*0741a2c9SStefan Pintilie WalkUpFromExpr BinaryOperator(+)
148*0741a2c9SStefan Pintilie WalkUpFromStmt BinaryOperator(+)
149*0741a2c9SStefan Pintilie TraverseCallExpr CallExpr(add)
150*0741a2c9SStefan Pintilie WalkUpFromExpr DeclRefExpr(add)
151*0741a2c9SStefan Pintilie WalkUpFromStmt DeclRefExpr(add)
152*0741a2c9SStefan Pintilie WalkUpFromExpr ImplicitCastExpr
153*0741a2c9SStefan Pintilie WalkUpFromStmt ImplicitCastExpr
154*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(4)
155*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(4)
156*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(5)
157*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(5)
158*0741a2c9SStefan Pintilie WalkUpFromCallExpr CallExpr(add)
159*0741a2c9SStefan Pintilie WalkUpFromExpr CallExpr(add)
160*0741a2c9SStefan Pintilie WalkUpFromStmt CallExpr(add)
161*0741a2c9SStefan Pintilie WalkUpFromStmt CompoundStmt
162*0741a2c9SStefan Pintilie )txt"));
163*0741a2c9SStefan Pintilie }
164*0741a2c9SStefan Pintilie
TEST(RecursiveASTVisitor,StmtCallbacks_WalkUpFromCallExpr)165*0741a2c9SStefan Pintilie TEST(RecursiveASTVisitor, StmtCallbacks_WalkUpFromCallExpr) {
166*0741a2c9SStefan Pintilie class RecordingVisitor : public RecordingVisitorBase<RecordingVisitor> {
167*0741a2c9SStefan Pintilie public:
168*0741a2c9SStefan Pintilie RecordingVisitor(ShouldTraversePostOrder ShouldTraversePostOrderValue)
169*0741a2c9SStefan Pintilie : RecordingVisitorBase(ShouldTraversePostOrderValue) {}
170*0741a2c9SStefan Pintilie
171*0741a2c9SStefan Pintilie bool WalkUpFromStmt(Stmt *S) {
172*0741a2c9SStefan Pintilie recordCallback(__func__, S,
173*0741a2c9SStefan Pintilie [&]() { RecordingVisitorBase::WalkUpFromStmt(S); });
174*0741a2c9SStefan Pintilie return true;
175*0741a2c9SStefan Pintilie }
176*0741a2c9SStefan Pintilie
177*0741a2c9SStefan Pintilie bool WalkUpFromExpr(Expr *E) {
178*0741a2c9SStefan Pintilie recordCallback(__func__, E,
179*0741a2c9SStefan Pintilie [&]() { RecordingVisitorBase::WalkUpFromExpr(E); });
180*0741a2c9SStefan Pintilie return true;
181*0741a2c9SStefan Pintilie }
182*0741a2c9SStefan Pintilie
183*0741a2c9SStefan Pintilie bool WalkUpFromCallExpr(CallExpr *CE) {
184*0741a2c9SStefan Pintilie recordCallback(__func__, CE,
185*0741a2c9SStefan Pintilie [&]() { RecordingVisitorBase::WalkUpFromCallExpr(CE); });
186*0741a2c9SStefan Pintilie return true;
187*0741a2c9SStefan Pintilie }
188*0741a2c9SStefan Pintilie };
189*0741a2c9SStefan Pintilie
190*0741a2c9SStefan Pintilie StringRef Code = R"cpp(
191*0741a2c9SStefan Pintilie void add(int, int);
192*0741a2c9SStefan Pintilie void test() {
193*0741a2c9SStefan Pintilie 1;
194*0741a2c9SStefan Pintilie 2 + 3;
195*0741a2c9SStefan Pintilie add(4, 5);
196*0741a2c9SStefan Pintilie }
197*0741a2c9SStefan Pintilie )cpp";
198*0741a2c9SStefan Pintilie
199*0741a2c9SStefan Pintilie EXPECT_TRUE(visitorCallbackLogEqual(
200*0741a2c9SStefan Pintilie RecordingVisitor(ShouldTraversePostOrder::No), Code,
201*0741a2c9SStefan Pintilie R"txt(
202*0741a2c9SStefan Pintilie WalkUpFromStmt CompoundStmt
203*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(1)
204*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(1)
205*0741a2c9SStefan Pintilie WalkUpFromExpr BinaryOperator(+)
206*0741a2c9SStefan Pintilie WalkUpFromStmt BinaryOperator(+)
207*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(2)
208*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(2)
209*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(3)
210*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(3)
211*0741a2c9SStefan Pintilie WalkUpFromCallExpr CallExpr(add)
212*0741a2c9SStefan Pintilie WalkUpFromExpr CallExpr(add)
213*0741a2c9SStefan Pintilie WalkUpFromStmt CallExpr(add)
214*0741a2c9SStefan Pintilie WalkUpFromExpr ImplicitCastExpr
215*0741a2c9SStefan Pintilie WalkUpFromStmt ImplicitCastExpr
216*0741a2c9SStefan Pintilie WalkUpFromExpr DeclRefExpr(add)
217*0741a2c9SStefan Pintilie WalkUpFromStmt DeclRefExpr(add)
218*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(4)
219*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(4)
220*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(5)
221*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(5)
222*0741a2c9SStefan Pintilie )txt"));
223*0741a2c9SStefan Pintilie
224*0741a2c9SStefan Pintilie EXPECT_TRUE(visitorCallbackLogEqual(
225*0741a2c9SStefan Pintilie RecordingVisitor(ShouldTraversePostOrder::Yes), Code,
226*0741a2c9SStefan Pintilie R"txt(
227*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(1)
228*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(1)
229*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(2)
230*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(2)
231*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(3)
232*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(3)
233*0741a2c9SStefan Pintilie WalkUpFromExpr BinaryOperator(+)
234*0741a2c9SStefan Pintilie WalkUpFromStmt BinaryOperator(+)
235*0741a2c9SStefan Pintilie WalkUpFromExpr DeclRefExpr(add)
236*0741a2c9SStefan Pintilie WalkUpFromStmt DeclRefExpr(add)
237*0741a2c9SStefan Pintilie WalkUpFromExpr ImplicitCastExpr
238*0741a2c9SStefan Pintilie WalkUpFromStmt ImplicitCastExpr
239*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(4)
240*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(4)
241*0741a2c9SStefan Pintilie WalkUpFromExpr IntegerLiteral(5)
242*0741a2c9SStefan Pintilie WalkUpFromStmt IntegerLiteral(5)
243*0741a2c9SStefan Pintilie WalkUpFromCallExpr CallExpr(add)
244*0741a2c9SStefan Pintilie WalkUpFromExpr CallExpr(add)
245*0741a2c9SStefan Pintilie WalkUpFromStmt CallExpr(add)
246*0741a2c9SStefan Pintilie WalkUpFromStmt CompoundStmt
247*0741a2c9SStefan Pintilie )txt"));
248*0741a2c9SStefan Pintilie }
249