blob: 965deefc3a5a9296a90d357550c0914623849774 [file] [log] [blame]
Sam McCallb536a2a2017-12-19 12:23:48 +00001//===-- SourceCodeTests.cpp ------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Sam McCallb536a2a2017-12-19 12:23:48 +00006//
7//===----------------------------------------------------------------------===//
Ilya Biryukov060f7fe2019-01-29 14:31:19 +00008#include "Annotations.h"
Sam McCalla69698f2019-03-27 17:47:49 +00009#include "Context.h"
10#include "Protocol.h"
Sam McCallb536a2a2017-12-19 12:23:48 +000011#include "SourceCode.h"
Eric Liu00d99bd2019-04-11 09:36:36 +000012#include "clang/Format/Format.h"
Simon Marchi766338a2018-03-21 14:36:46 +000013#include "llvm/Support/Error.h"
Sam McCallb536a2a2017-12-19 12:23:48 +000014#include "llvm/Support/raw_os_ostream.h"
Simon Marchi766338a2018-03-21 14:36:46 +000015#include "llvm/Testing/Support/Error.h"
Sam McCallb536a2a2017-12-19 12:23:48 +000016#include "gmock/gmock.h"
17#include "gtest/gtest.h"
18
Sam McCallc008af62018-10-20 15:30:37 +000019namespace clang {
Sam McCallb536a2a2017-12-19 12:23:48 +000020namespace clangd {
Sam McCallb536a2a2017-12-19 12:23:48 +000021namespace {
22
Ilya Biryukov060f7fe2019-01-29 14:31:19 +000023using llvm::Failed;
24using llvm::HasValue;
25
Sam McCallb536a2a2017-12-19 12:23:48 +000026MATCHER_P2(Pos, Line, Col, "") {
Sam McCalla69698f2019-03-27 17:47:49 +000027 return arg.line == int(Line) && arg.character == int(Col);
Sam McCallb536a2a2017-12-19 12:23:48 +000028}
29
Ilya Biryukov7beea3a2018-02-14 10:52:04 +000030/// A helper to make tests easier to read.
31Position position(int line, int character) {
32 Position Pos;
33 Pos.line = line;
34 Pos.character = character;
35 return Pos;
36}
37
Kadir Cetinkayaa9c9d002018-08-13 08:23:01 +000038Range range(const std::pair<int, int> p1, const std::pair<int, int> p2) {
39 Range range;
40 range.start = position(p1.first, p1.second);
41 range.end = position(p2.first, p2.second);
42 return range;
43}
44
Sam McCall71891122018-10-23 11:51:53 +000045TEST(SourceCodeTests, lspLength) {
46 EXPECT_EQ(lspLength(""), 0UL);
47 EXPECT_EQ(lspLength("ascii"), 5UL);
48 // BMP
49 EXPECT_EQ(lspLength("↓"), 1UL);
50 EXPECT_EQ(lspLength("¥"), 1UL);
51 // astral
52 EXPECT_EQ(lspLength("😂"), 2UL);
Sam McCalla69698f2019-03-27 17:47:49 +000053
54 WithContextValue UTF8(kCurrentOffsetEncoding, OffsetEncoding::UTF8);
55 EXPECT_EQ(lspLength(""), 0UL);
56 EXPECT_EQ(lspLength("ascii"), 5UL);
57 // BMP
58 EXPECT_EQ(lspLength("↓"), 3UL);
59 EXPECT_EQ(lspLength("¥"), 2UL);
60 // astral
61 EXPECT_EQ(lspLength("😂"), 4UL);
Sam McCall8b25d222019-03-28 14:37:51 +000062
63 WithContextValue UTF32(kCurrentOffsetEncoding, OffsetEncoding::UTF32);
64 EXPECT_EQ(lspLength(""), 0UL);
65 EXPECT_EQ(lspLength("ascii"), 5UL);
66 // BMP
67 EXPECT_EQ(lspLength("↓"), 1UL);
68 EXPECT_EQ(lspLength("¥"), 1UL);
69 // astral
70 EXPECT_EQ(lspLength("😂"), 1UL);
Sam McCall71891122018-10-23 11:51:53 +000071}
72
Sam McCalla69698f2019-03-27 17:47:49 +000073// The = → 🡆 below are ASCII (1 byte), BMP (3 bytes), and astral (4 bytes).
74const char File[] = R"(0:0 = 0
751:0 8
762:0 🡆 18)";
77struct Line {
78 unsigned Number;
79 unsigned Offset;
80 unsigned Length;
81};
82Line FileLines[] = {Line{0, 0, 7}, Line{1, 8, 9}, Line{2, 18, 11}};
83
Sam McCallb536a2a2017-12-19 12:23:48 +000084TEST(SourceCodeTests, PositionToOffset) {
85 // line out of bounds
Ilya Biryukovf2001aa2019-01-07 15:45:19 +000086 EXPECT_THAT_EXPECTED(positionToOffset(File, position(-1, 2)), llvm::Failed());
Sam McCallb536a2a2017-12-19 12:23:48 +000087 // first line
Simon Marchi766338a2018-03-21 14:36:46 +000088 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, -1)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +000089 llvm::Failed()); // out of range
Simon Marchi766338a2018-03-21 14:36:46 +000090 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 0)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +000091 llvm::HasValue(0)); // first character
Simon Marchi766338a2018-03-21 14:36:46 +000092 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 3)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +000093 llvm::HasValue(3)); // middle character
Simon Marchi766338a2018-03-21 14:36:46 +000094 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 6)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +000095 llvm::HasValue(6)); // last character
Simon Marchi766338a2018-03-21 14:36:46 +000096 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 7)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +000097 llvm::HasValue(7)); // the newline itself
Simon Marchi766338a2018-03-21 14:36:46 +000098 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 7), false),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +000099 llvm::HasValue(7));
Simon Marchi766338a2018-03-21 14:36:46 +0000100 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 8)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000101 llvm::HasValue(7)); // out of range
Simon Marchi766338a2018-03-21 14:36:46 +0000102 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 8), false),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000103 llvm::Failed()); // out of range
Sam McCallb536a2a2017-12-19 12:23:48 +0000104 // middle line
Simon Marchi766338a2018-03-21 14:36:46 +0000105 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, -1)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000106 llvm::Failed()); // out of range
Simon Marchi766338a2018-03-21 14:36:46 +0000107 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 0)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000108 llvm::HasValue(8)); // first character
Simon Marchi766338a2018-03-21 14:36:46 +0000109 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 3)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000110 llvm::HasValue(11)); // middle character
Simon Marchi766338a2018-03-21 14:36:46 +0000111 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 3), false),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000112 llvm::HasValue(11));
Simon Marchi766338a2018-03-21 14:36:46 +0000113 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 6)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000114 llvm::HasValue(16)); // last character
Simon Marchi766338a2018-03-21 14:36:46 +0000115 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 7)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000116 llvm::HasValue(17)); // the newline itself
Simon Marchi766338a2018-03-21 14:36:46 +0000117 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 8)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000118 llvm::HasValue(17)); // out of range
Simon Marchi766338a2018-03-21 14:36:46 +0000119 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 8), false),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000120 llvm::Failed()); // out of range
Sam McCallb536a2a2017-12-19 12:23:48 +0000121 // last line
Simon Marchi766338a2018-03-21 14:36:46 +0000122 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, -1)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000123 llvm::Failed()); // out of range
Simon Marchi766338a2018-03-21 14:36:46 +0000124 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 0)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000125 llvm::HasValue(18)); // first character
Simon Marchi766338a2018-03-21 14:36:46 +0000126 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 3)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000127 llvm::HasValue(21)); // middle character
Sam McCalla4962cc2018-04-27 11:59:28 +0000128 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 5), false),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000129 llvm::Failed()); // middle of surrogate pair
Sam McCalla4962cc2018-04-27 11:59:28 +0000130 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 5)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000131 llvm::HasValue(26)); // middle of surrogate pair
Sam McCalla4962cc2018-04-27 11:59:28 +0000132 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 6), false),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000133 llvm::HasValue(26)); // end of surrogate pair
Simon Marchi766338a2018-03-21 14:36:46 +0000134 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 8)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000135 llvm::HasValue(28)); // last character
Sam McCalla4962cc2018-04-27 11:59:28 +0000136 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 9)),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000137 llvm::HasValue(29)); // EOF
Sam McCalla4962cc2018-04-27 11:59:28 +0000138 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 10), false),
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000139 llvm::Failed()); // out of range
Sam McCallb536a2a2017-12-19 12:23:48 +0000140 // line out of bounds
Ilya Biryukovf2001aa2019-01-07 15:45:19 +0000141 EXPECT_THAT_EXPECTED(positionToOffset(File, position(3, 0)), llvm::Failed());
142 EXPECT_THAT_EXPECTED(positionToOffset(File, position(3, 1)), llvm::Failed());
Sam McCalla69698f2019-03-27 17:47:49 +0000143
Sam McCall8b25d222019-03-28 14:37:51 +0000144 // Codepoints are similar, except near astral characters.
145 WithContextValue UTF32(kCurrentOffsetEncoding, OffsetEncoding::UTF32);
146 // line out of bounds
147 EXPECT_THAT_EXPECTED(positionToOffset(File, position(-1, 2)), llvm::Failed());
148 // first line
149 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, -1)),
150 llvm::Failed()); // out of range
151 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 0)),
152 llvm::HasValue(0)); // first character
153 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 3)),
154 llvm::HasValue(3)); // middle character
155 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 6)),
156 llvm::HasValue(6)); // last character
157 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 7)),
158 llvm::HasValue(7)); // the newline itself
159 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 7), false),
160 llvm::HasValue(7));
161 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 8)),
162 llvm::HasValue(7)); // out of range
163 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 8), false),
164 llvm::Failed()); // out of range
165 // middle line
166 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, -1)),
167 llvm::Failed()); // out of range
168 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 0)),
169 llvm::HasValue(8)); // first character
170 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 3)),
171 llvm::HasValue(11)); // middle character
172 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 3), false),
173 llvm::HasValue(11));
174 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 6)),
175 llvm::HasValue(16)); // last character
176 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 7)),
177 llvm::HasValue(17)); // the newline itself
178 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 8)),
179 llvm::HasValue(17)); // out of range
180 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 8), false),
181 llvm::Failed()); // out of range
182 // last line
183 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, -1)),
184 llvm::Failed()); // out of range
185 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 0)),
186 llvm::HasValue(18)); // first character
187 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 4)),
188 llvm::HasValue(22)); // Before astral character.
189 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 5), false),
190 llvm::HasValue(26)); // after astral character
191 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 7)),
192 llvm::HasValue(28)); // last character
193 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 8)),
194 llvm::HasValue(29)); // EOF
195 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 9), false),
196 llvm::Failed()); // out of range
197 // line out of bounds
198 EXPECT_THAT_EXPECTED(positionToOffset(File, position(3, 0)), llvm::Failed());
199 EXPECT_THAT_EXPECTED(positionToOffset(File, position(3, 1)), llvm::Failed());
200
Sam McCalla69698f2019-03-27 17:47:49 +0000201 // Test UTF-8, where transformations are trivial.
202 WithContextValue UTF8(kCurrentOffsetEncoding, OffsetEncoding::UTF8);
203 EXPECT_THAT_EXPECTED(positionToOffset(File, position(-1, 2)), llvm::Failed());
204 EXPECT_THAT_EXPECTED(positionToOffset(File, position(3, 0)), llvm::Failed());
205 for (Line L : FileLines) {
206 EXPECT_THAT_EXPECTED(positionToOffset(File, position(L.Number, -1)),
207 llvm::Failed()); // out of range
208 for (unsigned I = 0; I <= L.Length; ++I)
209 EXPECT_THAT_EXPECTED(positionToOffset(File, position(L.Number, I)),
210 llvm::HasValue(L.Offset + I));
211 EXPECT_THAT_EXPECTED(positionToOffset(File, position(L.Number, L.Length+1)),
212 llvm::HasValue(L.Offset + L.Length));
213 EXPECT_THAT_EXPECTED(
214 positionToOffset(File, position(L.Number, L.Length + 1), false),
215 llvm::Failed()); // out of range
216 }
Sam McCallb536a2a2017-12-19 12:23:48 +0000217}
218
219TEST(SourceCodeTests, OffsetToPosition) {
220 EXPECT_THAT(offsetToPosition(File, 0), Pos(0, 0)) << "start of file";
221 EXPECT_THAT(offsetToPosition(File, 3), Pos(0, 3)) << "in first line";
222 EXPECT_THAT(offsetToPosition(File, 6), Pos(0, 6)) << "end of first line";
223 EXPECT_THAT(offsetToPosition(File, 7), Pos(0, 7)) << "first newline";
224 EXPECT_THAT(offsetToPosition(File, 8), Pos(1, 0)) << "start of second line";
Sam McCalla4962cc2018-04-27 11:59:28 +0000225 EXPECT_THAT(offsetToPosition(File, 12), Pos(1, 4)) << "before BMP char";
226 EXPECT_THAT(offsetToPosition(File, 13), Pos(1, 5)) << "in BMP char";
227 EXPECT_THAT(offsetToPosition(File, 15), Pos(1, 5)) << "after BMP char";
228 EXPECT_THAT(offsetToPosition(File, 16), Pos(1, 6)) << "end of second line";
229 EXPECT_THAT(offsetToPosition(File, 17), Pos(1, 7)) << "second newline";
230 EXPECT_THAT(offsetToPosition(File, 18), Pos(2, 0)) << "start of last line";
231 EXPECT_THAT(offsetToPosition(File, 21), Pos(2, 3)) << "in last line";
232 EXPECT_THAT(offsetToPosition(File, 22), Pos(2, 4)) << "before astral char";
233 EXPECT_THAT(offsetToPosition(File, 24), Pos(2, 6)) << "in astral char";
234 EXPECT_THAT(offsetToPosition(File, 26), Pos(2, 6)) << "after astral char";
235 EXPECT_THAT(offsetToPosition(File, 28), Pos(2, 8)) << "end of last line";
236 EXPECT_THAT(offsetToPosition(File, 29), Pos(2, 9)) << "EOF";
237 EXPECT_THAT(offsetToPosition(File, 30), Pos(2, 9)) << "out of bounds";
Sam McCalla69698f2019-03-27 17:47:49 +0000238
Sam McCall8b25d222019-03-28 14:37:51 +0000239 // Codepoints are similar, except near astral characters.
240 WithContextValue UTF32(kCurrentOffsetEncoding, OffsetEncoding::UTF32);
241 EXPECT_THAT(offsetToPosition(File, 0), Pos(0, 0)) << "start of file";
242 EXPECT_THAT(offsetToPosition(File, 3), Pos(0, 3)) << "in first line";
243 EXPECT_THAT(offsetToPosition(File, 6), Pos(0, 6)) << "end of first line";
244 EXPECT_THAT(offsetToPosition(File, 7), Pos(0, 7)) << "first newline";
245 EXPECT_THAT(offsetToPosition(File, 8), Pos(1, 0)) << "start of second line";
246 EXPECT_THAT(offsetToPosition(File, 12), Pos(1, 4)) << "before BMP char";
247 EXPECT_THAT(offsetToPosition(File, 13), Pos(1, 5)) << "in BMP char";
248 EXPECT_THAT(offsetToPosition(File, 15), Pos(1, 5)) << "after BMP char";
249 EXPECT_THAT(offsetToPosition(File, 16), Pos(1, 6)) << "end of second line";
250 EXPECT_THAT(offsetToPosition(File, 17), Pos(1, 7)) << "second newline";
251 EXPECT_THAT(offsetToPosition(File, 18), Pos(2, 0)) << "start of last line";
252 EXPECT_THAT(offsetToPosition(File, 21), Pos(2, 3)) << "in last line";
253 EXPECT_THAT(offsetToPosition(File, 22), Pos(2, 4)) << "before astral char";
254 EXPECT_THAT(offsetToPosition(File, 24), Pos(2, 5)) << "in astral char";
255 EXPECT_THAT(offsetToPosition(File, 26), Pos(2, 5)) << "after astral char";
256 EXPECT_THAT(offsetToPosition(File, 28), Pos(2, 7)) << "end of last line";
257 EXPECT_THAT(offsetToPosition(File, 29), Pos(2, 8)) << "EOF";
258 EXPECT_THAT(offsetToPosition(File, 30), Pos(2, 8)) << "out of bounds";
259
Sam McCalla69698f2019-03-27 17:47:49 +0000260 WithContextValue UTF8(kCurrentOffsetEncoding, OffsetEncoding::UTF8);
261 for (Line L : FileLines) {
262 for (unsigned I = 0; I <= L.Length; ++I)
263 EXPECT_THAT(offsetToPosition(File, L.Offset + I), Pos(L.Number, I));
264 }
265 EXPECT_THAT(offsetToPosition(File, 30), Pos(2, 11)) << "out of bounds";
Sam McCallb536a2a2017-12-19 12:23:48 +0000266}
267
Kadir Cetinkayaa9c9d002018-08-13 08:23:01 +0000268TEST(SourceCodeTests, IsRangeConsecutive) {
Haojian Wuaa3ed5a2019-01-25 15:14:03 +0000269 EXPECT_TRUE(isRangeConsecutive(range({2, 2}, {2, 3}), range({2, 3}, {2, 4})));
Kadir Cetinkayaa9c9d002018-08-13 08:23:01 +0000270 EXPECT_FALSE(
Haojian Wuaa3ed5a2019-01-25 15:14:03 +0000271 isRangeConsecutive(range({0, 2}, {0, 3}), range({2, 3}, {2, 4})));
Kadir Cetinkayaa9c9d002018-08-13 08:23:01 +0000272 EXPECT_FALSE(
Haojian Wuaa3ed5a2019-01-25 15:14:03 +0000273 isRangeConsecutive(range({2, 2}, {2, 3}), range({2, 4}, {2, 5})));
Kadir Cetinkayaa9c9d002018-08-13 08:23:01 +0000274}
275
Ilya Biryukov060f7fe2019-01-29 14:31:19 +0000276TEST(SourceCodeTests, SourceLocationInMainFile) {
277 Annotations Source(R"cpp(
278 ^in^t ^foo
279 ^bar
280 ^baz ^() {} {} {} {} { }^
281)cpp");
282
283 SourceManagerForFile Owner("foo.cpp", Source.code());
284 SourceManager &SM = Owner.get();
285
286 SourceLocation StartOfFile = SM.getLocForStartOfFile(SM.getMainFileID());
287 EXPECT_THAT_EXPECTED(sourceLocationInMainFile(SM, position(0, 0)),
288 HasValue(StartOfFile));
289 // End of file.
290 EXPECT_THAT_EXPECTED(
291 sourceLocationInMainFile(SM, position(4, 0)),
292 HasValue(StartOfFile.getLocWithOffset(Source.code().size())));
293 // Column number is too large.
294 EXPECT_THAT_EXPECTED(sourceLocationInMainFile(SM, position(0, 1)), Failed());
295 EXPECT_THAT_EXPECTED(sourceLocationInMainFile(SM, position(0, 100)),
296 Failed());
297 EXPECT_THAT_EXPECTED(sourceLocationInMainFile(SM, position(4, 1)), Failed());
298 // Line number is too large.
299 EXPECT_THAT_EXPECTED(sourceLocationInMainFile(SM, position(5, 0)), Failed());
300 // Check all positions mentioned in the test return valid results.
301 for (auto P : Source.points()) {
302 size_t Offset = llvm::cantFail(positionToOffset(Source.code(), P));
303 EXPECT_THAT_EXPECTED(sourceLocationInMainFile(SM, P),
304 HasValue(StartOfFile.getLocWithOffset(Offset)));
305 }
306}
307
Eric Liu00d99bd2019-04-11 09:36:36 +0000308TEST(SourceCodeTests, CollectIdentifiers) {
309 auto Style = format::getLLVMStyle();
310 auto IDs = collectIdentifiers(R"cpp(
311 #include "a.h"
312 void foo() { int xyz; int abc = xyz; return foo(); }
313 )cpp",
314 Style);
315 EXPECT_EQ(IDs.size(), 7u);
316 EXPECT_EQ(IDs["include"], 1u);
317 EXPECT_EQ(IDs["void"], 1u);
318 EXPECT_EQ(IDs["int"], 2u);
319 EXPECT_EQ(IDs["xyz"], 2u);
320 EXPECT_EQ(IDs["abc"], 1u);
321 EXPECT_EQ(IDs["return"], 1u);
322 EXPECT_EQ(IDs["foo"], 2u);
323}
324
Sam McCallb536a2a2017-12-19 12:23:48 +0000325} // namespace
326} // namespace clangd
327} // namespace clang