annotate clang/unittests/Tooling/FixItTest.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents c4bab56944e8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- unittest/Tooling/FixitTest.cpp ------------------------------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "clang/Tooling/FixIt.h"
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
10 #include "clang/ASTMatchers/ASTMatchFinder.h"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
11 #include "clang/ASTMatchers/ASTMatchers.h"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
12 #include "clang/Testing/TestAST.h"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
13 #include "gtest/gtest.h"
150
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 using namespace clang;
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 using tooling::fixit::getText;
anatofuz
parents:
diff changeset
18 using tooling::fixit::createRemoval;
anatofuz
parents:
diff changeset
19 using tooling::fixit::createReplacement;
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 namespace {
anatofuz
parents:
diff changeset
22
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
23 const CallExpr &onlyCall(ASTContext &Ctx) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
24 using namespace ast_matchers;
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
25 auto Calls = match(callExpr().bind(""), Ctx);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
26 EXPECT_EQ(Calls.size(), 1u);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
27 return *Calls.front().getNodeAs<CallExpr>("");
150
anatofuz
parents:
diff changeset
28 }
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 TEST(FixItTest, getText) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
31 TestAST AST("void foo(int x, int y) { foo(x, y); }");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
32 const CallExpr &CE = onlyCall(AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
33 EXPECT_EQ("foo(x, y)", getText(CE, AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
34 EXPECT_EQ("foo(x, y)", getText(CE.getSourceRange(), AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
35 EXPECT_EQ("x", getText(*CE.getArg(0), AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
36 EXPECT_EQ("y", getText(*CE.getArg(1), AST.context()));
150
anatofuz
parents:
diff changeset
37
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
38 AST = TestAST("#define APPLY(f, x, y) f(x, y)\n"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
39 "void foo(int x, int y) { APPLY(foo, x, y); }");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
40 const CallExpr &CE2 = onlyCall(AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
41 EXPECT_EQ("APPLY(foo, x, y)", getText(CE2, AST.context()));
150
anatofuz
parents:
diff changeset
42 }
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 TEST(FixItTest, getTextWithMacro) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
45 TestAST AST("#define F foo(\n"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
46 "#define OO x, y)\n"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
47 "void foo(int x, int y) { F OO ; }");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
48 const CallExpr &CE = onlyCall(AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
49 EXPECT_EQ("F OO", getText(CE, AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
50 EXPECT_EQ("", getText(*CE.getArg(0), AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
51 EXPECT_EQ("", getText(*CE.getArg(1), AST.context()));
150
anatofuz
parents:
diff changeset
52
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
53 AST = TestAST("#define FOO(x, y) (void)x; (void)y; foo(x, y);\n"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
54 "void foo(int x, int y) { FOO(x,y) }");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
55 const CallExpr &CE2 = onlyCall(AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
56 EXPECT_EQ("", getText(CE2, AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
57 EXPECT_EQ("x", getText(*CE2.getArg(0), AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
58 EXPECT_EQ("y", getText(*CE2.getArg(1), AST.context()));
150
anatofuz
parents:
diff changeset
59 }
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 TEST(FixItTest, createRemoval) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
62 TestAST AST("void foo(int x, int y) { foo(x, y); }");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
63 const CallExpr &CE = onlyCall(AST.context());
150
anatofuz
parents:
diff changeset
64
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
65 FixItHint Hint = createRemoval(CE);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
66 EXPECT_EQ("foo(x, y)", getText(Hint.RemoveRange.getAsRange(), AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
67 EXPECT_TRUE(Hint.InsertFromRange.isInvalid());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
68 EXPECT_TRUE(Hint.CodeToInsert.empty());
150
anatofuz
parents:
diff changeset
69
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
70 FixItHint Hint0 = createRemoval(*CE.getArg(0));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
71 EXPECT_EQ("x", getText(Hint0.RemoveRange.getAsRange(), AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
72 EXPECT_TRUE(Hint0.InsertFromRange.isInvalid());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
73 EXPECT_TRUE(Hint0.CodeToInsert.empty());
150
anatofuz
parents:
diff changeset
74
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
75 FixItHint Hint1 = createRemoval(*CE.getArg(1));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
76 EXPECT_EQ("y", getText(Hint1.RemoveRange.getAsRange(), AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
77 EXPECT_TRUE(Hint1.InsertFromRange.isInvalid());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
78 EXPECT_TRUE(Hint1.CodeToInsert.empty());
150
anatofuz
parents:
diff changeset
79
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
80 AST = TestAST("void foo(int x, int y) { foo(x + y, y + x); }");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
81 const CallExpr &CE2 = onlyCall(AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
82 Hint0 = createRemoval(*CE2.getArg(0));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
83 EXPECT_EQ("x + y", getText(Hint0.RemoveRange.getAsRange(), AST.context()));
150
anatofuz
parents:
diff changeset
84
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
85 Hint1 = createRemoval(*CE2.getArg(1));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
86 EXPECT_EQ("y + x", getText(Hint1.RemoveRange.getAsRange(), AST.context()));
150
anatofuz
parents:
diff changeset
87 }
anatofuz
parents:
diff changeset
88
anatofuz
parents:
diff changeset
89 TEST(FixItTest, createRemovalWithMacro) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
90 TestAST AST("#define FOO foo(1, 1)\n"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
91 "void foo(int x, int y) { FOO; }");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
92 const CallExpr &CE = onlyCall(AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
93 FixItHint Hint = createRemoval(CE);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
94 EXPECT_EQ("FOO", getText(Hint.RemoveRange.getAsRange(), AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
95 EXPECT_TRUE(Hint.InsertFromRange.isInvalid());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
96 EXPECT_TRUE(Hint.CodeToInsert.empty());
150
anatofuz
parents:
diff changeset
97
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
98 FixItHint Hint0 = createRemoval(*CE.getArg(0));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
99 EXPECT_EQ("input.mm:2:26 <Spelling=input.mm:1:17>",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
100 Hint0.RemoveRange.getBegin().printToString(AST.sourceManager()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
101 EXPECT_EQ("input.mm:2:26 <Spelling=input.mm:1:17>",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
102 Hint0.RemoveRange.getEnd().printToString(AST.sourceManager()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
103 EXPECT_TRUE(Hint0.InsertFromRange.isInvalid());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
104 EXPECT_TRUE(Hint0.CodeToInsert.empty());
150
anatofuz
parents:
diff changeset
105
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
106 FixItHint Hint1 = createRemoval(*CE.getArg(1));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
107 EXPECT_EQ("input.mm:2:26 <Spelling=input.mm:1:20>",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
108 Hint1.RemoveRange.getBegin().printToString(AST.sourceManager()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
109 EXPECT_EQ("input.mm:2:26 <Spelling=input.mm:1:20>",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
110 Hint1.RemoveRange.getEnd().printToString(AST.sourceManager()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
111 EXPECT_TRUE(Hint1.InsertFromRange.isInvalid());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
112 EXPECT_TRUE(Hint1.CodeToInsert.empty());
150
anatofuz
parents:
diff changeset
113
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
114 AST = TestAST("#define FOO(x, y) (void)x; (void)y; foo(x, y);\n"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
115 "void foo(int x, int y) { FOO(x,y) }");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
116 const CallExpr &CE2 = onlyCall(AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
117 Hint = createRemoval(CE2);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
118 EXPECT_EQ("input.mm:2:26 <Spelling=input.mm:1:37>",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
119 Hint.RemoveRange.getBegin().printToString(AST.sourceManager()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
120 EXPECT_EQ("input.mm:2:26 <Spelling=input.mm:1:45>",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
121 Hint.RemoveRange.getEnd().printToString(AST.sourceManager()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
122 EXPECT_TRUE(Hint.InsertFromRange.isInvalid());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
123 EXPECT_TRUE(Hint.CodeToInsert.empty());
150
anatofuz
parents:
diff changeset
124 }
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126 TEST(FixItTest, createReplacement) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
127 for (const char *Code : {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
128 "void foo(int x, int y) { foo(x, y); }",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
129
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
130 "#define APPLY(f, x, y) f(x, y)\n"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
131 "void foo(int x, int y) { APPLY(foo, x, y); }",
150
anatofuz
parents:
diff changeset
132
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
133 "#define APPLY(f, P) f(P)\n"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
134 "#define PAIR(x, y) x, y\n"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
135 "void foo(int x, int y) { APPLY(foo, PAIR(x, y)); }\n",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
136 }) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
137 TestAST AST(Code);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
138 const CallExpr &CE = onlyCall(AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
139 const Expr *P0 = CE.getArg(0);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
140 const Expr *P1 = CE.getArg(1);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
141 FixItHint Hint0 = createReplacement(*P0, *P1, AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
142 FixItHint Hint1 = createReplacement(*P1, *P0, AST.context());
150
anatofuz
parents:
diff changeset
143
anatofuz
parents:
diff changeset
144 // Validate Hint0 fields.
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
145 EXPECT_EQ("x", getText(Hint0.RemoveRange.getAsRange(), AST.context()));
150
anatofuz
parents:
diff changeset
146 EXPECT_TRUE(Hint0.InsertFromRange.isInvalid());
anatofuz
parents:
diff changeset
147 EXPECT_EQ(Hint0.CodeToInsert, "y");
anatofuz
parents:
diff changeset
148
anatofuz
parents:
diff changeset
149 // Validate Hint1 fields.
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
150 EXPECT_EQ("y", getText(Hint1.RemoveRange.getAsRange(), AST.context()));
150
anatofuz
parents:
diff changeset
151 EXPECT_TRUE(Hint1.InsertFromRange.isInvalid());
anatofuz
parents:
diff changeset
152 EXPECT_EQ(Hint1.CodeToInsert, "x");
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
153 }
150
anatofuz
parents:
diff changeset
154 }
anatofuz
parents:
diff changeset
155
anatofuz
parents:
diff changeset
156 TEST(FixItTest, createReplacementWithMacro) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
157 TestAST AST("#define FOO foo(1, 1)\n"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
158 "void foo(int x, int y) { FOO; }");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
159 const CallExpr &CE = onlyCall(AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
160 FixItHint Hint =
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
161 createReplacement(*CE.getArg(0), *CE.getArg(1), AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
162 EXPECT_EQ("input.mm:2:26 <Spelling=input.mm:1:17>",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
163 Hint.RemoveRange.getBegin().printToString(AST.sourceManager()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
164 EXPECT_EQ("input.mm:2:26 <Spelling=input.mm:1:17>",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
165 Hint.RemoveRange.getEnd().printToString(AST.sourceManager()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
166 EXPECT_TRUE(Hint.InsertFromRange.isInvalid());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
167 EXPECT_TRUE(Hint.CodeToInsert.empty());
150
anatofuz
parents:
diff changeset
168
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
169 AST = TestAST("#define FOO(x, y) (void)x; (void)y; foo(x, y);\n"
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
170 "void foo(int x, int y) { FOO(x,y) }");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
171 const CallExpr &CE2 = onlyCall(AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
172 Hint = createReplacement(*CE2.getArg(0), *CE2.getArg(1), AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
173 EXPECT_EQ("input.mm:2:26 <Spelling=input.mm:2:30>",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
174 Hint.RemoveRange.getEnd().printToString(AST.sourceManager()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
175 EXPECT_EQ("input.mm:2:26 <Spelling=input.mm:2:30>",
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
176 Hint.RemoveRange.getBegin().printToString(AST.sourceManager()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
177 EXPECT_TRUE(Hint.InsertFromRange.isInvalid());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
178 EXPECT_EQ("y", Hint.CodeToInsert);
150
anatofuz
parents:
diff changeset
179
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
180 AST = TestAST("void foo(int x, int y) { foo(x + y, y + x); }");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
181 const CallExpr &CE3 = onlyCall(AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
182 Hint = createReplacement(*CE3.getArg(0), *CE3.getArg(1), AST.context());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
183 EXPECT_EQ("x + y", getText(Hint.RemoveRange.getAsRange(), AST.context()));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
184 EXPECT_TRUE(Hint.InsertFromRange.isInvalid());
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
185 EXPECT_EQ("y + x", Hint.CodeToInsert);
150
anatofuz
parents:
diff changeset
186 }
anatofuz
parents:
diff changeset
187
anatofuz
parents:
diff changeset
188 } // end anonymous namespace