annotate clang-tools-extra/clangd/unittests/SelectionTests.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 1f2b6ac9f198
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-- SelectionTests.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 #include "Annotations.h"
anatofuz
parents:
diff changeset
9 #include "Selection.h"
anatofuz
parents:
diff changeset
10 #include "SourceCode.h"
anatofuz
parents:
diff changeset
11 #include "TestTU.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
12 #include "support/TestTracer.h"
150
anatofuz
parents:
diff changeset
13 #include "clang/AST/Decl.h"
anatofuz
parents:
diff changeset
14 #include "llvm/Support/Casting.h"
anatofuz
parents:
diff changeset
15 #include "gmock/gmock.h"
anatofuz
parents:
diff changeset
16 #include "gtest/gtest.h"
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 namespace clang {
anatofuz
parents:
diff changeset
19 namespace clangd {
anatofuz
parents:
diff changeset
20 namespace {
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
21 using ::testing::ElementsAreArray;
150
anatofuz
parents:
diff changeset
22 using ::testing::UnorderedElementsAreArray;
anatofuz
parents:
diff changeset
23
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
24 // Create a selection tree corresponding to a point or pair of points.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
25 // This uses the precisely-defined createRight semantics. The fuzzier
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
26 // createEach is tested separately.
150
anatofuz
parents:
diff changeset
27 SelectionTree makeSelectionTree(const StringRef MarkedCode, ParsedAST &AST) {
anatofuz
parents:
diff changeset
28 Annotations Test(MarkedCode);
anatofuz
parents:
diff changeset
29 switch (Test.points().size()) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
30 case 1: { // Point selection.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
31 unsigned Offset = cantFail(positionToOffset(Test.code(), Test.point()));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
32 return SelectionTree::createRight(AST.getASTContext(), AST.getTokens(),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
33 Offset, Offset);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
34 }
150
anatofuz
parents:
diff changeset
35 case 2: // Range selection.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
36 return SelectionTree::createRight(
150
anatofuz
parents:
diff changeset
37 AST.getASTContext(), AST.getTokens(),
anatofuz
parents:
diff changeset
38 cantFail(positionToOffset(Test.code(), Test.points()[0])),
anatofuz
parents:
diff changeset
39 cantFail(positionToOffset(Test.code(), Test.points()[1])));
anatofuz
parents:
diff changeset
40 default:
anatofuz
parents:
diff changeset
41 ADD_FAILURE() << "Expected 1-2 points for selection.\n" << MarkedCode;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
42 return SelectionTree::createRight(AST.getASTContext(), AST.getTokens(), 0u,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
43 0u);
150
anatofuz
parents:
diff changeset
44 }
anatofuz
parents:
diff changeset
45 }
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 Range nodeRange(const SelectionTree::Node *N, ParsedAST &AST) {
anatofuz
parents:
diff changeset
48 if (!N)
anatofuz
parents:
diff changeset
49 return Range{};
anatofuz
parents:
diff changeset
50 const SourceManager &SM = AST.getSourceManager();
anatofuz
parents:
diff changeset
51 const LangOptions &LangOpts = AST.getLangOpts();
anatofuz
parents:
diff changeset
52 StringRef Buffer = SM.getBufferData(SM.getMainFileID());
anatofuz
parents:
diff changeset
53 if (llvm::isa_and_nonnull<TranslationUnitDecl>(N->ASTNode.get<Decl>()))
anatofuz
parents:
diff changeset
54 return Range{Position{}, offsetToPosition(Buffer, Buffer.size())};
anatofuz
parents:
diff changeset
55 auto FileRange =
anatofuz
parents:
diff changeset
56 toHalfOpenFileRange(SM, LangOpts, N->ASTNode.getSourceRange());
anatofuz
parents:
diff changeset
57 assert(FileRange && "We should be able to get the File Range");
anatofuz
parents:
diff changeset
58 return Range{
anatofuz
parents:
diff changeset
59 offsetToPosition(Buffer, SM.getFileOffset(FileRange->getBegin())),
anatofuz
parents:
diff changeset
60 offsetToPosition(Buffer, SM.getFileOffset(FileRange->getEnd()))};
anatofuz
parents:
diff changeset
61 }
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 std::string nodeKind(const SelectionTree::Node *N) {
anatofuz
parents:
diff changeset
64 return N ? N->kind() : "<null>";
anatofuz
parents:
diff changeset
65 }
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 std::vector<const SelectionTree::Node *> allNodes(const SelectionTree &T) {
anatofuz
parents:
diff changeset
68 std::vector<const SelectionTree::Node *> Result = {&T.root()};
anatofuz
parents:
diff changeset
69 for (unsigned I = 0; I < Result.size(); ++I) {
anatofuz
parents:
diff changeset
70 const SelectionTree::Node *N = Result[I];
anatofuz
parents:
diff changeset
71 Result.insert(Result.end(), N->Children.begin(), N->Children.end());
anatofuz
parents:
diff changeset
72 }
anatofuz
parents:
diff changeset
73 return Result;
anatofuz
parents:
diff changeset
74 }
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 // Returns true if Common is a descendent of Root.
anatofuz
parents:
diff changeset
77 // Verifies nothing is selected above Common.
anatofuz
parents:
diff changeset
78 bool verifyCommonAncestor(const SelectionTree::Node &Root,
anatofuz
parents:
diff changeset
79 const SelectionTree::Node *Common,
anatofuz
parents:
diff changeset
80 StringRef MarkedCode) {
anatofuz
parents:
diff changeset
81 if (&Root == Common)
anatofuz
parents:
diff changeset
82 return true;
anatofuz
parents:
diff changeset
83 if (Root.Selected)
anatofuz
parents:
diff changeset
84 ADD_FAILURE() << "Selected nodes outside common ancestor\n" << MarkedCode;
anatofuz
parents:
diff changeset
85 bool Seen = false;
anatofuz
parents:
diff changeset
86 for (const SelectionTree::Node *Child : Root.Children)
anatofuz
parents:
diff changeset
87 if (verifyCommonAncestor(*Child, Common, MarkedCode)) {
anatofuz
parents:
diff changeset
88 if (Seen)
anatofuz
parents:
diff changeset
89 ADD_FAILURE() << "Saw common ancestor twice\n" << MarkedCode;
anatofuz
parents:
diff changeset
90 Seen = true;
anatofuz
parents:
diff changeset
91 }
anatofuz
parents:
diff changeset
92 return Seen;
anatofuz
parents:
diff changeset
93 }
anatofuz
parents:
diff changeset
94
anatofuz
parents:
diff changeset
95 TEST(SelectionTest, CommonAncestor) {
anatofuz
parents:
diff changeset
96 struct Case {
anatofuz
parents:
diff changeset
97 // Selection is between ^marks^.
anatofuz
parents:
diff changeset
98 // common ancestor marked with a [[range]].
anatofuz
parents:
diff changeset
99 const char *Code;
anatofuz
parents:
diff changeset
100 const char *CommonAncestorKind;
anatofuz
parents:
diff changeset
101 };
anatofuz
parents:
diff changeset
102 Case Cases[] = {
anatofuz
parents:
diff changeset
103 {
anatofuz
parents:
diff changeset
104 R"cpp(
anatofuz
parents:
diff changeset
105 template <typename T>
anatofuz
parents:
diff changeset
106 int x = [[T::^U::]]ccc();
anatofuz
parents:
diff changeset
107 )cpp",
anatofuz
parents:
diff changeset
108 "NestedNameSpecifierLoc",
anatofuz
parents:
diff changeset
109 },
anatofuz
parents:
diff changeset
110 {
anatofuz
parents:
diff changeset
111 R"cpp(
anatofuz
parents:
diff changeset
112 struct AAA { struct BBB { static int ccc(); };};
anatofuz
parents:
diff changeset
113 int x = AAA::[[B^B^B]]::ccc();
anatofuz
parents:
diff changeset
114 )cpp",
anatofuz
parents:
diff changeset
115 "RecordTypeLoc",
anatofuz
parents:
diff changeset
116 },
anatofuz
parents:
diff changeset
117 {
anatofuz
parents:
diff changeset
118 R"cpp(
anatofuz
parents:
diff changeset
119 struct AAA { struct BBB { static int ccc(); };};
anatofuz
parents:
diff changeset
120 int x = AAA::[[B^BB^]]::ccc();
anatofuz
parents:
diff changeset
121 )cpp",
anatofuz
parents:
diff changeset
122 "RecordTypeLoc",
anatofuz
parents:
diff changeset
123 },
anatofuz
parents:
diff changeset
124 {
anatofuz
parents:
diff changeset
125 R"cpp(
anatofuz
parents:
diff changeset
126 struct AAA { struct BBB { static int ccc(); };};
anatofuz
parents:
diff changeset
127 int x = [[AAA::BBB::c^c^c]]();
anatofuz
parents:
diff changeset
128 )cpp",
anatofuz
parents:
diff changeset
129 "DeclRefExpr",
anatofuz
parents:
diff changeset
130 },
anatofuz
parents:
diff changeset
131 {
anatofuz
parents:
diff changeset
132 R"cpp(
anatofuz
parents:
diff changeset
133 struct AAA { struct BBB { static int ccc(); };};
anatofuz
parents:
diff changeset
134 int x = [[AAA::BBB::cc^c(^)]];
anatofuz
parents:
diff changeset
135 )cpp",
anatofuz
parents:
diff changeset
136 "CallExpr",
anatofuz
parents:
diff changeset
137 },
anatofuz
parents:
diff changeset
138
anatofuz
parents:
diff changeset
139 {
anatofuz
parents:
diff changeset
140 R"cpp(
anatofuz
parents:
diff changeset
141 void foo() { [[if (1^11) { return; } else {^ }]] }
anatofuz
parents:
diff changeset
142 )cpp",
anatofuz
parents:
diff changeset
143 "IfStmt",
anatofuz
parents:
diff changeset
144 },
anatofuz
parents:
diff changeset
145 {
anatofuz
parents:
diff changeset
146 R"cpp(
anatofuz
parents:
diff changeset
147 int x(int);
anatofuz
parents:
diff changeset
148 #define M(foo) x(foo)
anatofuz
parents:
diff changeset
149 int a = 42;
anatofuz
parents:
diff changeset
150 int b = M([[^a]]);
anatofuz
parents:
diff changeset
151 )cpp",
anatofuz
parents:
diff changeset
152 "DeclRefExpr",
anatofuz
parents:
diff changeset
153 },
anatofuz
parents:
diff changeset
154 {
anatofuz
parents:
diff changeset
155 R"cpp(
anatofuz
parents:
diff changeset
156 void foo();
anatofuz
parents:
diff changeset
157 #define CALL_FUNCTION(X) X()
anatofuz
parents:
diff changeset
158 void bar() { CALL_FUNCTION([[f^o^o]]); }
anatofuz
parents:
diff changeset
159 )cpp",
anatofuz
parents:
diff changeset
160 "DeclRefExpr",
anatofuz
parents:
diff changeset
161 },
anatofuz
parents:
diff changeset
162 {
anatofuz
parents:
diff changeset
163 R"cpp(
anatofuz
parents:
diff changeset
164 void foo();
anatofuz
parents:
diff changeset
165 #define CALL_FUNCTION(X) X()
anatofuz
parents:
diff changeset
166 void bar() { [[CALL_FUNC^TION(fo^o)]]; }
anatofuz
parents:
diff changeset
167 )cpp",
anatofuz
parents:
diff changeset
168 "CallExpr",
anatofuz
parents:
diff changeset
169 },
anatofuz
parents:
diff changeset
170 {
anatofuz
parents:
diff changeset
171 R"cpp(
anatofuz
parents:
diff changeset
172 void foo();
anatofuz
parents:
diff changeset
173 #define CALL_FUNCTION(X) X()
anatofuz
parents:
diff changeset
174 void bar() { [[C^ALL_FUNC^TION(foo)]]; }
anatofuz
parents:
diff changeset
175 )cpp",
anatofuz
parents:
diff changeset
176 "CallExpr",
anatofuz
parents:
diff changeset
177 },
anatofuz
parents:
diff changeset
178 {
anatofuz
parents:
diff changeset
179 R"cpp(
anatofuz
parents:
diff changeset
180 void foo();
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
181 #^define CALL_FUNCTION(X) X(^)
150
anatofuz
parents:
diff changeset
182 void bar() { CALL_FUNCTION(foo); }
anatofuz
parents:
diff changeset
183 )cpp",
anatofuz
parents:
diff changeset
184 nullptr,
anatofuz
parents:
diff changeset
185 },
anatofuz
parents:
diff changeset
186 {
anatofuz
parents:
diff changeset
187 R"cpp(
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
188 void foo();
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
189 #define CALL_FUNCTION(X) X()
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
190 void bar() { CALL_FUNCTION(foo^)^; }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
191 )cpp",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
192 nullptr,
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
193 },
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
194 {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
195 R"cpp(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
196 namespace ns {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
197 #if 0
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
198 void fo^o() {}
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
199 #endif
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
200 }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
201 )cpp",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
202 nullptr,
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
203 },
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
204 {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
205 R"cpp(
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
206 #define TARGET void foo()
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
207 [[TAR^GET{ return; }]]
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
208 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
209 "FunctionDecl",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
210 },
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
211 {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
212 R"cpp(
150
anatofuz
parents:
diff changeset
213 struct S { S(const char*); };
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
214 [[S s ^= "foo"]];
150
anatofuz
parents:
diff changeset
215 )cpp",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
216 // The AST says a CXXConstructExpr covers the = sign in C++14.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
217 // But we consider CXXConstructExpr to only own brackets.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
218 // (It's not the interesting constructor anyway, just S(&&)).
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
219 "VarDecl",
150
anatofuz
parents:
diff changeset
220 },
anatofuz
parents:
diff changeset
221 {
anatofuz
parents:
diff changeset
222 R"cpp(
anatofuz
parents:
diff changeset
223 struct S { S(const char*); };
anatofuz
parents:
diff changeset
224 [[S ^s = "foo"]];
anatofuz
parents:
diff changeset
225 )cpp",
anatofuz
parents:
diff changeset
226 "VarDecl",
anatofuz
parents:
diff changeset
227 },
anatofuz
parents:
diff changeset
228 {
anatofuz
parents:
diff changeset
229 R"cpp(
anatofuz
parents:
diff changeset
230 [[^void]] (*S)(int) = nullptr;
anatofuz
parents:
diff changeset
231 )cpp",
anatofuz
parents:
diff changeset
232 "BuiltinTypeLoc",
anatofuz
parents:
diff changeset
233 },
anatofuz
parents:
diff changeset
234 {
anatofuz
parents:
diff changeset
235 R"cpp(
anatofuz
parents:
diff changeset
236 [[void (*S)^(int)]] = nullptr;
anatofuz
parents:
diff changeset
237 )cpp",
anatofuz
parents:
diff changeset
238 "FunctionProtoTypeLoc",
anatofuz
parents:
diff changeset
239 },
anatofuz
parents:
diff changeset
240 {
anatofuz
parents:
diff changeset
241 R"cpp(
anatofuz
parents:
diff changeset
242 [[void (^*S)(int)]] = nullptr;
anatofuz
parents:
diff changeset
243 )cpp",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
244 "PointerTypeLoc",
150
anatofuz
parents:
diff changeset
245 },
anatofuz
parents:
diff changeset
246 {
anatofuz
parents:
diff changeset
247 R"cpp(
anatofuz
parents:
diff changeset
248 [[void (*^S)(int) = nullptr]];
anatofuz
parents:
diff changeset
249 )cpp",
anatofuz
parents:
diff changeset
250 "VarDecl",
anatofuz
parents:
diff changeset
251 },
anatofuz
parents:
diff changeset
252 {
anatofuz
parents:
diff changeset
253 R"cpp(
anatofuz
parents:
diff changeset
254 [[void ^(*S)(int)]] = nullptr;
anatofuz
parents:
diff changeset
255 )cpp",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
256 "ParenTypeLoc",
150
anatofuz
parents:
diff changeset
257 },
anatofuz
parents:
diff changeset
258 {
anatofuz
parents:
diff changeset
259 R"cpp(
anatofuz
parents:
diff changeset
260 struct S {
anatofuz
parents:
diff changeset
261 int foo() const;
anatofuz
parents:
diff changeset
262 int bar() { return [[f^oo]](); }
anatofuz
parents:
diff changeset
263 };
anatofuz
parents:
diff changeset
264 )cpp",
anatofuz
parents:
diff changeset
265 "MemberExpr", // Not implicit CXXThisExpr, or its implicit cast!
anatofuz
parents:
diff changeset
266 },
anatofuz
parents:
diff changeset
267 {
anatofuz
parents:
diff changeset
268 R"cpp(
anatofuz
parents:
diff changeset
269 auto lambda = [](const char*){ return 0; };
anatofuz
parents:
diff changeset
270 int x = lambda([["y^"]]);
anatofuz
parents:
diff changeset
271 )cpp",
anatofuz
parents:
diff changeset
272 "StringLiteral", // Not DeclRefExpr to operator()!
anatofuz
parents:
diff changeset
273 },
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
274 {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
275 R"cpp(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
276 struct Foo {};
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
277 struct Bar : [[v^ir^tual private Foo]] {};
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
278 )cpp",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
279 "CXXBaseSpecifier",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
280 },
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
281 {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
282 R"cpp(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
283 struct Foo {};
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
284 struct Bar : private [[Fo^o]] {};
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
285 )cpp",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
286 "RecordTypeLoc",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
287 },
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
288 {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
289 R"cpp(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
290 struct Foo {};
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
291 struct Bar : [[Fo^o]] {};
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
292 )cpp",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
293 "RecordTypeLoc",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
294 },
150
anatofuz
parents:
diff changeset
295
anatofuz
parents:
diff changeset
296 // Point selections.
anatofuz
parents:
diff changeset
297 {"void foo() { [[^foo]](); }", "DeclRefExpr"},
anatofuz
parents:
diff changeset
298 {"void foo() { [[f^oo]](); }", "DeclRefExpr"},
anatofuz
parents:
diff changeset
299 {"void foo() { [[fo^o]](); }", "DeclRefExpr"},
anatofuz
parents:
diff changeset
300 {"void foo() { [[foo^()]]; }", "CallExpr"},
anatofuz
parents:
diff changeset
301 {"void foo() { [[foo^]] (); }", "DeclRefExpr"},
anatofuz
parents:
diff changeset
302 {"int bar; void foo() [[{ foo (); }]]^", "CompoundStmt"},
anatofuz
parents:
diff changeset
303 {"int x = [[42]]^;", "IntegerLiteral"},
anatofuz
parents:
diff changeset
304
anatofuz
parents:
diff changeset
305 // Ignores whitespace, comments, and semicolons in the selection.
anatofuz
parents:
diff changeset
306 {"void foo() { [[foo^()]]; /*comment*/^}", "CallExpr"},
anatofuz
parents:
diff changeset
307
anatofuz
parents:
diff changeset
308 // Tricky case: FunctionTypeLoc in FunctionDecl has a hole in it.
anatofuz
parents:
diff changeset
309 {"[[^void]] foo();", "BuiltinTypeLoc"},
anatofuz
parents:
diff changeset
310 {"[[void foo^()]];", "FunctionProtoTypeLoc"},
anatofuz
parents:
diff changeset
311 {"[[^void foo^()]];", "FunctionDecl"},
anatofuz
parents:
diff changeset
312 {"[[void ^foo()]];", "FunctionDecl"},
anatofuz
parents:
diff changeset
313 // Tricky case: two VarDecls share a specifier.
anatofuz
parents:
diff changeset
314 {"[[int ^a]], b;", "VarDecl"},
anatofuz
parents:
diff changeset
315 {"[[int a, ^b]];", "VarDecl"},
anatofuz
parents:
diff changeset
316 // Tricky case: CXXConstructExpr wants to claim the whole init range.
anatofuz
parents:
diff changeset
317 {
anatofuz
parents:
diff changeset
318 R"cpp(
anatofuz
parents:
diff changeset
319 struct X { X(int); };
anatofuz
parents:
diff changeset
320 class Y {
anatofuz
parents:
diff changeset
321 X x;
anatofuz
parents:
diff changeset
322 Y() : [[^x(4)]] {}
anatofuz
parents:
diff changeset
323 };
anatofuz
parents:
diff changeset
324 )cpp",
anatofuz
parents:
diff changeset
325 "CXXCtorInitializer", // Not the CXXConstructExpr!
anatofuz
parents:
diff changeset
326 },
anatofuz
parents:
diff changeset
327 // Tricky case: anonymous struct is a sibling of the VarDecl.
anatofuz
parents:
diff changeset
328 {"[[st^ruct {int x;}]] y;", "CXXRecordDecl"},
anatofuz
parents:
diff changeset
329 {"[[struct {int x;} ^y]];", "VarDecl"},
anatofuz
parents:
diff changeset
330 {"struct {[[int ^x]];} y;", "FieldDecl"},
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
331
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
332 // Tricky case: nested ArrayTypeLocs have the same token range.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
333 {"const int x = 1, y = 2; int array[^[[x]]][10][y];", "DeclRefExpr"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
334 {"const int x = 1, y = 2; int array[x][10][^[[y]]];", "DeclRefExpr"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
335 {"const int x = 1, y = 2; int array[x][^[[10]]][y];", "IntegerLiteral"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
336 {"const int x = 1, y = 2; [[i^nt]] array[x][10][y];", "BuiltinTypeLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
337 {"void func(int x) { int v_array[^[[x]]][10]; }", "DeclRefExpr"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
338
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
339 {"int (*getFunc([[do^uble]]))(int);", "BuiltinTypeLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
340
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
341 // Member pointers and pack expansion use declarator syntax, but are
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
342 // restricted so they don't need special casing.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
343 {"class X{}; [[int X::^*]]y[10];", "MemberPointerTypeLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
344 {"template<typename ...T> void foo([[T*^...]]x);",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
345 "PackExpansionTypeLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
346 {"template<typename ...T> void foo([[^T]]*...x);",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
347 "TemplateTypeParmTypeLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
348
150
anatofuz
parents:
diff changeset
349 // FIXME: the AST has no location info for qualifiers.
anatofuz
parents:
diff changeset
350 {"const [[a^uto]] x = 42;", "AutoTypeLoc"},
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
351 {"co^nst auto x = 42;", nullptr},
150
anatofuz
parents:
diff changeset
352
anatofuz
parents:
diff changeset
353 {"^", nullptr},
anatofuz
parents:
diff changeset
354 {"void foo() { [[foo^^]] (); }", "DeclRefExpr"},
anatofuz
parents:
diff changeset
355
anatofuz
parents:
diff changeset
356 // FIXME: Ideally we'd get a declstmt or the VarDecl itself here.
anatofuz
parents:
diff changeset
357 // This doesn't happen now; the RAV doesn't traverse a node containing ;.
anatofuz
parents:
diff changeset
358 {"int x = 42;^", nullptr},
anatofuz
parents:
diff changeset
359
anatofuz
parents:
diff changeset
360 // Common ancestor is logically TUDecl, but we never return that.
anatofuz
parents:
diff changeset
361 {"^int x; int y;^", nullptr},
anatofuz
parents:
diff changeset
362
anatofuz
parents:
diff changeset
363 // Node types that have caused problems in the past.
anatofuz
parents:
diff changeset
364 {"template <typename T> void foo() { [[^T]] t; }",
anatofuz
parents:
diff changeset
365 "TemplateTypeParmTypeLoc"},
anatofuz
parents:
diff changeset
366
anatofuz
parents:
diff changeset
367 // No crash
anatofuz
parents:
diff changeset
368 {
anatofuz
parents:
diff changeset
369 R"cpp(
anatofuz
parents:
diff changeset
370 template <class T> struct Foo {};
anatofuz
parents:
diff changeset
371 template <[[template<class> class /*cursor here*/^U]]>
anatofuz
parents:
diff changeset
372 struct Foo<U<int>*> {};
anatofuz
parents:
diff changeset
373 )cpp",
anatofuz
parents:
diff changeset
374 "TemplateTemplateParmDecl"},
anatofuz
parents:
diff changeset
375
anatofuz
parents:
diff changeset
376 // Foreach has a weird AST, ensure we can select parts of the range init.
anatofuz
parents:
diff changeset
377 // This used to fail, because the DeclStmt for C claimed the whole range.
anatofuz
parents:
diff changeset
378 {
anatofuz
parents:
diff changeset
379 R"cpp(
anatofuz
parents:
diff changeset
380 struct Str {
anatofuz
parents:
diff changeset
381 const char *begin();
anatofuz
parents:
diff changeset
382 const char *end();
anatofuz
parents:
diff changeset
383 };
anatofuz
parents:
diff changeset
384 Str makeStr(const char*);
anatofuz
parents:
diff changeset
385 void loop() {
anatofuz
parents:
diff changeset
386 for (const char C : [[mak^eStr("foo"^)]])
anatofuz
parents:
diff changeset
387 ;
anatofuz
parents:
diff changeset
388 }
anatofuz
parents:
diff changeset
389 )cpp",
anatofuz
parents:
diff changeset
390 "CallExpr"},
anatofuz
parents:
diff changeset
391
anatofuz
parents:
diff changeset
392 // User-defined literals are tricky: is 12_i one token or two?
anatofuz
parents:
diff changeset
393 // For now we treat it as one, and the UserDefinedLiteral as a leaf.
anatofuz
parents:
diff changeset
394 {
anatofuz
parents:
diff changeset
395 R"cpp(
anatofuz
parents:
diff changeset
396 struct Foo{};
anatofuz
parents:
diff changeset
397 Foo operator""_ud(unsigned long long);
anatofuz
parents:
diff changeset
398 Foo x = [[^12_ud]];
anatofuz
parents:
diff changeset
399 )cpp",
anatofuz
parents:
diff changeset
400 "UserDefinedLiteral"},
anatofuz
parents:
diff changeset
401
anatofuz
parents:
diff changeset
402 {
anatofuz
parents:
diff changeset
403 R"cpp(
anatofuz
parents:
diff changeset
404 int a;
anatofuz
parents:
diff changeset
405 decltype([[^a]] + a) b;
anatofuz
parents:
diff changeset
406 )cpp",
anatofuz
parents:
diff changeset
407 "DeclRefExpr"},
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
408 {"[[decltype^(1)]] b;", "DecltypeTypeLoc"}, // Not the VarDecl.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
409 // decltype(auto) is an AutoTypeLoc!
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
410 {"[[de^cltype(a^uto)]] a = 1;", "AutoTypeLoc"},
150
anatofuz
parents:
diff changeset
411
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
412 // Objective-C nullability attributes.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
413 {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
414 R"cpp(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
415 @interface I{}
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
416 @property(nullable) [[^I]] *x;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
417 @end
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
418 )cpp",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
419 "ObjCInterfaceTypeLoc"},
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
420 {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
421 R"cpp(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
422 @interface I{}
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
423 - (void)doSomething:(nonnull [[i^d]])argument;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
424 @end
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
425 )cpp",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
426 "TypedefTypeLoc"},
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
427
150
anatofuz
parents:
diff changeset
428 // Objective-C OpaqueValueExpr/PseudoObjectExpr has weird ASTs.
anatofuz
parents:
diff changeset
429 // Need to traverse the contents of the OpaqueValueExpr to the POE,
anatofuz
parents:
diff changeset
430 // and ensure we traverse only the syntactic form of the PseudoObjectExpr.
anatofuz
parents:
diff changeset
431 {
anatofuz
parents:
diff changeset
432 R"cpp(
anatofuz
parents:
diff changeset
433 @interface I{}
anatofuz
parents:
diff changeset
434 @property(retain) I*x;
anatofuz
parents:
diff changeset
435 @property(retain) I*y;
anatofuz
parents:
diff changeset
436 @end
anatofuz
parents:
diff changeset
437 void test(I *f) { [[^f]].x.y = 0; }
anatofuz
parents:
diff changeset
438 )cpp",
anatofuz
parents:
diff changeset
439 "DeclRefExpr"},
anatofuz
parents:
diff changeset
440 {
anatofuz
parents:
diff changeset
441 R"cpp(
anatofuz
parents:
diff changeset
442 @interface I{}
anatofuz
parents:
diff changeset
443 @property(retain) I*x;
anatofuz
parents:
diff changeset
444 @property(retain) I*y;
anatofuz
parents:
diff changeset
445 @end
anatofuz
parents:
diff changeset
446 void test(I *f) { [[f.^x]].y = 0; }
anatofuz
parents:
diff changeset
447 )cpp",
anatofuz
parents:
diff changeset
448 "ObjCPropertyRefExpr"},
anatofuz
parents:
diff changeset
449 // Examples with implicit properties.
anatofuz
parents:
diff changeset
450 {
anatofuz
parents:
diff changeset
451 R"cpp(
anatofuz
parents:
diff changeset
452 @interface I{}
anatofuz
parents:
diff changeset
453 -(int)foo;
anatofuz
parents:
diff changeset
454 @end
anatofuz
parents:
diff changeset
455 int test(I *f) { return 42 + [[^f]].foo; }
anatofuz
parents:
diff changeset
456 )cpp",
anatofuz
parents:
diff changeset
457 "DeclRefExpr"},
anatofuz
parents:
diff changeset
458 {
anatofuz
parents:
diff changeset
459 R"cpp(
anatofuz
parents:
diff changeset
460 @interface I{}
anatofuz
parents:
diff changeset
461 -(int)foo;
anatofuz
parents:
diff changeset
462 @end
anatofuz
parents:
diff changeset
463 int test(I *f) { return 42 + [[f.^foo]]; }
anatofuz
parents:
diff changeset
464 )cpp",
anatofuz
parents:
diff changeset
465 "ObjCPropertyRefExpr"},
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
466 {"struct foo { [[int has^h<:32:>]]; };", "FieldDecl"},
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
467 {"struct foo { [[op^erator int()]]; };", "CXXConversionDecl"},
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
468 {"struct foo { [[^~foo()]]; };", "CXXDestructorDecl"},
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
469 {"struct foo { [[~^foo()]]; };", "CXXDestructorDecl"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
470 {"template <class T> struct foo { ~foo<[[^T]]>(){} };",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
471 "TemplateTypeParmTypeLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
472 {"struct foo {}; void bar(foo *f) { [[f->~^foo]](); }", "MemberExpr"},
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
473 {"struct foo { [[fo^o(){}]] };", "CXXConstructorDecl"},
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
474
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
475 {R"cpp(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
476 struct S1 { void f(); };
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
477 struct S2 { S1 * operator->(); };
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
478 void test(S2 s2) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
479 s2[[-^>]]f();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
480 }
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
481 )cpp",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
482 "DeclRefExpr"}, // DeclRefExpr to the "operator->" method.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
483
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
484 // Template template argument.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
485 {R"cpp(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
486 template <typename> class Vector {};
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
487 template <template <typename> class Container> class A {};
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
488 A<[[V^ector]]> a;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
489 )cpp",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
490 "TemplateArgumentLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
491
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
492 // Attributes
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
493 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
494 void f(int * __attribute__(([[no^nnull]])) );
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
495 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
496 "NonNullAttr"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
497
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
498 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
499 // Digraph syntax for attributes to avoid accidental annotations.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
500 class <:[gsl::Owner([[in^t]])]:> X{};
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
501 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
502 "BuiltinTypeLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
503
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
504 // This case used to crash - AST has a null Attr
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
505 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
506 @interface I
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
507 [[@property(retain, nonnull) <:[My^Object2]:> *x]]; // error-ok
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
508 @end
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
509 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
510 "ObjCPropertyDecl"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
511
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
512 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
513 typedef int Foo;
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
514 enum Bar : [[Fo^o]] {};
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
515 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
516 "TypedefTypeLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
517 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
518 typedef int Foo;
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
519 enum Bar : [[Fo^o]];
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
520 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
521 "TypedefTypeLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
522
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
523 // lambda captured var-decl
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
524 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
525 void test(int bar) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
526 auto l = [^[[foo = bar]]] { };
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
527 })cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
528 "VarDecl"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
529 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
530 /*error-ok*/
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
531 void func() [[{^]])cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
532 "CompoundStmt"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
533 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
534 void func() { [[__^func__]]; }
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
535 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
536 "PredefinedExpr"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
537
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
538 // using enum
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
539 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
540 namespace ns { enum class A {}; };
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
541 using enum ns::[[^A]];
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
542 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
543 "EnumTypeLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
544 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
545 namespace ns { enum class A {}; using B = A; };
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
546 using enum ns::[[^B]];
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
547 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
548 "TypedefTypeLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
549 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
550 namespace ns { enum class A {}; };
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
551 using enum [[^ns::]]A;
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
552 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
553 "NestedNameSpecifierLoc"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
554 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
555 namespace ns { enum class A {}; };
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
556 [[using ^enum ns::A]];
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
557 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
558 "UsingEnumDecl"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
559 {R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
560 namespace ns { enum class A {}; };
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
561 [[^using enum ns::A]];
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
562 )cpp",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
563 "UsingEnumDecl"},
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
564 };
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
565
150
anatofuz
parents:
diff changeset
566 for (const Case &C : Cases) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
567 trace::TestTracer Tracer;
150
anatofuz
parents:
diff changeset
568 Annotations Test(C.Code);
anatofuz
parents:
diff changeset
569
anatofuz
parents:
diff changeset
570 TestTU TU;
anatofuz
parents:
diff changeset
571 TU.Code = std::string(Test.code());
anatofuz
parents:
diff changeset
572
anatofuz
parents:
diff changeset
573 TU.ExtraArgs.push_back("-xobjective-c++");
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
574 TU.ExtraArgs.push_back("-std=c++20");
150
anatofuz
parents:
diff changeset
575
anatofuz
parents:
diff changeset
576 auto AST = TU.build();
anatofuz
parents:
diff changeset
577 auto T = makeSelectionTree(C.Code, AST);
anatofuz
parents:
diff changeset
578 EXPECT_EQ("TranslationUnitDecl", nodeKind(&T.root())) << C.Code;
anatofuz
parents:
diff changeset
579
anatofuz
parents:
diff changeset
580 if (Test.ranges().empty()) {
anatofuz
parents:
diff changeset
581 // If no [[range]] is marked in the example, there should be no selection.
anatofuz
parents:
diff changeset
582 EXPECT_FALSE(T.commonAncestor()) << C.Code << "\n" << T;
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
583 EXPECT_THAT(Tracer.takeMetric("selection_recovery", "C++"),
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
584 testing::IsEmpty());
150
anatofuz
parents:
diff changeset
585 } else {
anatofuz
parents:
diff changeset
586 // If there is an expected selection, common ancestor should exist
anatofuz
parents:
diff changeset
587 // with the appropriate node type.
anatofuz
parents:
diff changeset
588 EXPECT_EQ(C.CommonAncestorKind, nodeKind(T.commonAncestor()))
anatofuz
parents:
diff changeset
589 << C.Code << "\n"
anatofuz
parents:
diff changeset
590 << T;
anatofuz
parents:
diff changeset
591 // Convert the reported common ancestor to a range and verify it.
anatofuz
parents:
diff changeset
592 EXPECT_EQ(nodeRange(T.commonAncestor(), AST), Test.range())
anatofuz
parents:
diff changeset
593 << C.Code << "\n"
anatofuz
parents:
diff changeset
594 << T;
anatofuz
parents:
diff changeset
595
anatofuz
parents:
diff changeset
596 // Check that common ancestor is reachable on exactly one path from root,
anatofuz
parents:
diff changeset
597 // and no nodes outside it are selected.
anatofuz
parents:
diff changeset
598 EXPECT_TRUE(verifyCommonAncestor(T.root(), T.commonAncestor(), C.Code))
anatofuz
parents:
diff changeset
599 << C.Code;
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
600 EXPECT_THAT(Tracer.takeMetric("selection_recovery", "C++"),
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
601 ElementsAreArray({0}));
150
anatofuz
parents:
diff changeset
602 }
anatofuz
parents:
diff changeset
603 }
anatofuz
parents:
diff changeset
604 }
anatofuz
parents:
diff changeset
605
anatofuz
parents:
diff changeset
606 // Regression test: this used to match the injected X, not the outer X.
anatofuz
parents:
diff changeset
607 TEST(SelectionTest, InjectedClassName) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
608 const char *Code = "struct ^X { int x; };";
150
anatofuz
parents:
diff changeset
609 auto AST = TestTU::withCode(Annotations(Code).code()).build();
anatofuz
parents:
diff changeset
610 auto T = makeSelectionTree(Code, AST);
anatofuz
parents:
diff changeset
611 ASSERT_EQ("CXXRecordDecl", nodeKind(T.commonAncestor())) << T;
anatofuz
parents:
diff changeset
612 auto *D = dyn_cast<CXXRecordDecl>(T.commonAncestor()->ASTNode.get<Decl>());
anatofuz
parents:
diff changeset
613 EXPECT_FALSE(D->isInjectedClassName());
anatofuz
parents:
diff changeset
614 }
anatofuz
parents:
diff changeset
615
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
616 TEST(SelectionTree, Metrics) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
617 const char *Code = R"cpp(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
618 // error-ok: testing behavior on recovery expression
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
619 int foo();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
620 int foo(int, int);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
621 int x = fo^o(42);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
622 )cpp";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
623 auto AST = TestTU::withCode(Annotations(Code).code()).build();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
624 trace::TestTracer Tracer;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
625 auto T = makeSelectionTree(Code, AST);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
626 EXPECT_THAT(Tracer.takeMetric("selection_recovery", "C++"),
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
627 ElementsAreArray({1}));
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
628 EXPECT_THAT(Tracer.takeMetric("selection_recovery_type", "C++"),
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
629 ElementsAreArray({1}));
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
630 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
631
150
anatofuz
parents:
diff changeset
632 // FIXME: Doesn't select the binary operator node in
anatofuz
parents:
diff changeset
633 // #define FOO(X) X + 1
anatofuz
parents:
diff changeset
634 // int a, b = [[FOO(a)]];
anatofuz
parents:
diff changeset
635 TEST(SelectionTest, Selected) {
anatofuz
parents:
diff changeset
636 // Selection with ^marks^.
anatofuz
parents:
diff changeset
637 // Partially selected nodes marked with a [[range]].
anatofuz
parents:
diff changeset
638 // Completely selected nodes marked with a $C[[range]].
anatofuz
parents:
diff changeset
639 const char *Cases[] = {
anatofuz
parents:
diff changeset
640 R"cpp( int abc, xyz = [[^ab^c]]; )cpp",
anatofuz
parents:
diff changeset
641 R"cpp( int abc, xyz = [[a^bc^]]; )cpp",
anatofuz
parents:
diff changeset
642 R"cpp( int abc, xyz = $C[[^abc^]]; )cpp",
anatofuz
parents:
diff changeset
643 R"cpp(
anatofuz
parents:
diff changeset
644 void foo() {
anatofuz
parents:
diff changeset
645 [[if ([[1^11]]) $C[[{
anatofuz
parents:
diff changeset
646 $C[[return]];
anatofuz
parents:
diff changeset
647 }]] else [[{^
anatofuz
parents:
diff changeset
648 }]]]]
anatofuz
parents:
diff changeset
649 char z;
anatofuz
parents:
diff changeset
650 }
anatofuz
parents:
diff changeset
651 )cpp",
anatofuz
parents:
diff changeset
652 R"cpp(
anatofuz
parents:
diff changeset
653 template <class T>
anatofuz
parents:
diff changeset
654 struct unique_ptr {};
anatofuz
parents:
diff changeset
655 void foo(^$C[[unique_ptr<$C[[unique_ptr<$C[[int]]>]]>]]^ a) {}
anatofuz
parents:
diff changeset
656 )cpp",
anatofuz
parents:
diff changeset
657 R"cpp(int a = [[5 >^> 1]];)cpp",
anatofuz
parents:
diff changeset
658 R"cpp(
anatofuz
parents:
diff changeset
659 #define ECHO(X) X
anatofuz
parents:
diff changeset
660 ECHO(EC^HO($C[[int]]) EC^HO(a));
anatofuz
parents:
diff changeset
661 )cpp",
anatofuz
parents:
diff changeset
662 R"cpp( $C[[^$C[[int]] a^]]; )cpp",
anatofuz
parents:
diff changeset
663 R"cpp( $C[[^$C[[int]] a = $C[[5]]^]]; )cpp",
anatofuz
parents:
diff changeset
664 };
anatofuz
parents:
diff changeset
665 for (const char *C : Cases) {
anatofuz
parents:
diff changeset
666 Annotations Test(C);
anatofuz
parents:
diff changeset
667 auto AST = TestTU::withCode(Test.code()).build();
anatofuz
parents:
diff changeset
668 auto T = makeSelectionTree(C, AST);
anatofuz
parents:
diff changeset
669
anatofuz
parents:
diff changeset
670 std::vector<Range> Complete, Partial;
anatofuz
parents:
diff changeset
671 for (const SelectionTree::Node *N : allNodes(T))
anatofuz
parents:
diff changeset
672 if (N->Selected == SelectionTree::Complete)
anatofuz
parents:
diff changeset
673 Complete.push_back(nodeRange(N, AST));
anatofuz
parents:
diff changeset
674 else if (N->Selected == SelectionTree::Partial)
anatofuz
parents:
diff changeset
675 Partial.push_back(nodeRange(N, AST));
anatofuz
parents:
diff changeset
676 EXPECT_THAT(Complete, UnorderedElementsAreArray(Test.ranges("C"))) << C;
anatofuz
parents:
diff changeset
677 EXPECT_THAT(Partial, UnorderedElementsAreArray(Test.ranges())) << C;
anatofuz
parents:
diff changeset
678 }
anatofuz
parents:
diff changeset
679 }
anatofuz
parents:
diff changeset
680
anatofuz
parents:
diff changeset
681 TEST(SelectionTest, PathologicalPreprocessor) {
anatofuz
parents:
diff changeset
682 const char *Case = R"cpp(
anatofuz
parents:
diff changeset
683 #define MACRO while(1)
anatofuz
parents:
diff changeset
684 void test() {
anatofuz
parents:
diff changeset
685 #include "Expand.inc"
anatofuz
parents:
diff changeset
686 br^eak;
anatofuz
parents:
diff changeset
687 }
anatofuz
parents:
diff changeset
688 )cpp";
anatofuz
parents:
diff changeset
689 Annotations Test(Case);
anatofuz
parents:
diff changeset
690 auto TU = TestTU::withCode(Test.code());
anatofuz
parents:
diff changeset
691 TU.AdditionalFiles["Expand.inc"] = "MACRO\n";
anatofuz
parents:
diff changeset
692 auto AST = TU.build();
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
693 EXPECT_THAT(AST.getDiagnostics(), ::testing::IsEmpty());
150
anatofuz
parents:
diff changeset
694 auto T = makeSelectionTree(Case, AST);
anatofuz
parents:
diff changeset
695
anatofuz
parents:
diff changeset
696 EXPECT_EQ("BreakStmt", T.commonAncestor()->kind());
anatofuz
parents:
diff changeset
697 EXPECT_EQ("WhileStmt", T.commonAncestor()->Parent->kind());
anatofuz
parents:
diff changeset
698 }
anatofuz
parents:
diff changeset
699
anatofuz
parents:
diff changeset
700 TEST(SelectionTest, IncludedFile) {
anatofuz
parents:
diff changeset
701 const char *Case = R"cpp(
anatofuz
parents:
diff changeset
702 void test() {
anatofuz
parents:
diff changeset
703 #include "Exp^and.inc"
anatofuz
parents:
diff changeset
704 break;
anatofuz
parents:
diff changeset
705 }
anatofuz
parents:
diff changeset
706 )cpp";
anatofuz
parents:
diff changeset
707 Annotations Test(Case);
anatofuz
parents:
diff changeset
708 auto TU = TestTU::withCode(Test.code());
anatofuz
parents:
diff changeset
709 TU.AdditionalFiles["Expand.inc"] = "while(1)\n";
anatofuz
parents:
diff changeset
710 auto AST = TU.build();
anatofuz
parents:
diff changeset
711 auto T = makeSelectionTree(Case, AST);
anatofuz
parents:
diff changeset
712
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
713 EXPECT_EQ(nullptr, T.commonAncestor());
150
anatofuz
parents:
diff changeset
714 }
anatofuz
parents:
diff changeset
715
anatofuz
parents:
diff changeset
716 TEST(SelectionTest, MacroArgExpansion) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
717 // If a macro arg is expanded several times, we only consider the first one
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
718 // selected.
150
anatofuz
parents:
diff changeset
719 const char *Case = R"cpp(
anatofuz
parents:
diff changeset
720 int mul(int, int);
anatofuz
parents:
diff changeset
721 #define SQUARE(X) mul(X, X);
anatofuz
parents:
diff changeset
722 int nine = SQUARE(^3);
anatofuz
parents:
diff changeset
723 )cpp";
anatofuz
parents:
diff changeset
724 Annotations Test(Case);
anatofuz
parents:
diff changeset
725 auto AST = TestTU::withCode(Test.code()).build();
anatofuz
parents:
diff changeset
726 auto T = makeSelectionTree(Case, AST);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
727 EXPECT_EQ("IntegerLiteral", T.commonAncestor()->kind());
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
728 EXPECT_TRUE(T.commonAncestor()->Selected);
150
anatofuz
parents:
diff changeset
729
anatofuz
parents:
diff changeset
730 // Verify that the common assert() macro doesn't suffer from this.
anatofuz
parents:
diff changeset
731 // (This is because we don't associate the stringified token with the arg).
anatofuz
parents:
diff changeset
732 Case = R"cpp(
anatofuz
parents:
diff changeset
733 void die(const char*);
anatofuz
parents:
diff changeset
734 #define assert(x) (x ? (void)0 : die(#x))
anatofuz
parents:
diff changeset
735 void foo() { assert(^42); }
anatofuz
parents:
diff changeset
736 )cpp";
anatofuz
parents:
diff changeset
737 Test = Annotations(Case);
anatofuz
parents:
diff changeset
738 AST = TestTU::withCode(Test.code()).build();
anatofuz
parents:
diff changeset
739 T = makeSelectionTree(Case, AST);
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
740 EXPECT_EQ("IntegerLiteral", T.commonAncestor()->kind());
150
anatofuz
parents:
diff changeset
741
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
742 // Reduced from private bug involving RETURN_IF_ERROR.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
743 // Due to >>-splitting and a bug in isBeforeInTranslationUnit, the inner
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
744 // S<int> would claim way too many tokens.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
745 Case = R"cpp(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
746 #define ID(x) x
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
747 template <typename T> class S {};
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
748 ID(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
749 ID(S<S<int>> x);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
750 int ^y;
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
751 )
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
752 )cpp";
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
753 Test = Annotations(Case);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
754 AST = TestTU::withCode(Test.code()).build();
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
755 T = makeSelectionTree(Case, AST);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
756 // not TemplateSpecializationTypeLoc!
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
757 EXPECT_EQ("VarDecl", T.commonAncestor()->kind());
150
anatofuz
parents:
diff changeset
758 }
anatofuz
parents:
diff changeset
759
anatofuz
parents:
diff changeset
760 TEST(SelectionTest, Implicit) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
761 const char *Test = R"cpp(
150
anatofuz
parents:
diff changeset
762 struct S { S(const char*); };
anatofuz
parents:
diff changeset
763 int f(S);
anatofuz
parents:
diff changeset
764 int x = f("^");
anatofuz
parents:
diff changeset
765 )cpp";
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
766 auto TU = TestTU::withCode(Annotations(Test).code());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
767 // C++14 AST contains some temporaries that C++17 elides.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
768 TU.ExtraArgs.push_back("-std=c++17");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
769 auto AST = TU.build();
150
anatofuz
parents:
diff changeset
770 auto T = makeSelectionTree(Test, AST);
anatofuz
parents:
diff changeset
771
anatofuz
parents:
diff changeset
772 const SelectionTree::Node *Str = T.commonAncestor();
anatofuz
parents:
diff changeset
773 EXPECT_EQ("StringLiteral", nodeKind(Str)) << "Implicit selected?";
anatofuz
parents:
diff changeset
774 EXPECT_EQ("ImplicitCastExpr", nodeKind(Str->Parent));
anatofuz
parents:
diff changeset
775 EXPECT_EQ("CXXConstructExpr", nodeKind(Str->Parent->Parent));
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
776 const SelectionTree::Node *ICE = Str->Parent->Parent->Parent;
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
777 EXPECT_EQ("ImplicitCastExpr", nodeKind(ICE));
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
778 EXPECT_EQ("CallExpr", nodeKind(ICE->Parent));
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
779 EXPECT_EQ(Str, &ICE->ignoreImplicit())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
780 << "Didn't unwrap " << nodeKind(&ICE->ignoreImplicit());
150
anatofuz
parents:
diff changeset
781
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
782 EXPECT_EQ(ICE, &Str->outerImplicit());
150
anatofuz
parents:
diff changeset
783 }
anatofuz
parents:
diff changeset
784
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
785 TEST(SelectionTest, CreateAll) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
786 llvm::Annotations Test("int$unique^ a=1$ambiguous^+1; $empty^");
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
787 auto AST = TestTU::withCode(Test.code()).build();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
788 unsigned Seen = 0;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
789 SelectionTree::createEach(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
790 AST.getASTContext(), AST.getTokens(), Test.point("ambiguous"),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
791 Test.point("ambiguous"), [&](SelectionTree T) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
792 // Expect to see the right-biased tree first.
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
793 if (Seen == 0) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
794 EXPECT_EQ("BinaryOperator", nodeKind(T.commonAncestor()));
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
795 } else if (Seen == 1) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
796 EXPECT_EQ("IntegerLiteral", nodeKind(T.commonAncestor()));
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
797 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
798 ++Seen;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
799 return false;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
800 });
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
801 EXPECT_EQ(2u, Seen);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
802
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
803 Seen = 0;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
804 SelectionTree::createEach(AST.getASTContext(), AST.getTokens(),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
805 Test.point("ambiguous"), Test.point("ambiguous"),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
806 [&](SelectionTree T) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
807 ++Seen;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
808 return true;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
809 });
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
810 EXPECT_EQ(1u, Seen) << "Return true --> stop iterating";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
811
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
812 Seen = 0;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
813 SelectionTree::createEach(AST.getASTContext(), AST.getTokens(),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
814 Test.point("unique"), Test.point("unique"),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
815 [&](SelectionTree T) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
816 ++Seen;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
817 return false;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
818 });
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
819 EXPECT_EQ(1u, Seen) << "no ambiguity --> only one tree";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
820
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
821 Seen = 0;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
822 SelectionTree::createEach(AST.getASTContext(), AST.getTokens(),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
823 Test.point("empty"), Test.point("empty"),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
824 [&](SelectionTree T) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
825 EXPECT_FALSE(T.commonAncestor());
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
826 ++Seen;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
827 return false;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
828 });
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
829 EXPECT_EQ(1u, Seen) << "empty tree still created";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
830
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
831 Seen = 0;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
832 SelectionTree::createEach(AST.getASTContext(), AST.getTokens(),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
833 Test.point("unique"), Test.point("ambiguous"),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
834 [&](SelectionTree T) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
835 ++Seen;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
836 return false;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
837 });
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
838 EXPECT_EQ(1u, Seen) << "one tree for nontrivial selection";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
839 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
840
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
841 TEST(SelectionTest, DeclContextIsLexical) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
842 llvm::Annotations Test("namespace a { void $1^foo(); } void a::$2^foo();");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
843 auto AST = TestTU::withCode(Test.code()).build();
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
844 {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
845 auto ST = SelectionTree::createRight(AST.getASTContext(), AST.getTokens(),
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
846 Test.point("1"), Test.point("1"));
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
847 EXPECT_FALSE(ST.commonAncestor()->getDeclContext().isTranslationUnit());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
848 }
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
849 {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
850 auto ST = SelectionTree::createRight(AST.getASTContext(), AST.getTokens(),
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
851 Test.point("2"), Test.point("2"));
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
852 EXPECT_TRUE(ST.commonAncestor()->getDeclContext().isTranslationUnit());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
853 }
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
854 }
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
855
150
anatofuz
parents:
diff changeset
856 } // namespace
anatofuz
parents:
diff changeset
857 } // namespace clangd
anatofuz
parents:
diff changeset
858 } // namespace clang