4314 lines · cpp
1//===- unittest/Format/TokenAnnotatorTest.cpp - Formatting unit tests -----===//2//3// 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-exception6//7//===----------------------------------------------------------------------===//8 9#include "clang/Format/Format.h"10 11#include "FormatTestUtils.h"12#include "TestLexer.h"13#include "gtest/gtest.h"14 15namespace clang {16namespace format {17 18// Not really the equality, but everything we need.19static bool operator==(const FormatToken &LHS,20 const FormatToken &RHS) noexcept {21 return LHS.Tok.getKind() == RHS.Tok.getKind() &&22 LHS.getType() == RHS.getType();23}24 25namespace {26 27class TokenAnnotatorTest : public testing::Test {28protected:29 TokenList annotate(StringRef Code,30 const FormatStyle &Style = getLLVMStyle()) {31 return TestLexer(Allocator, Buffers, Style).annotate(Code);32 }33 llvm::SpecificBumpPtrAllocator<FormatToken> Allocator;34 std::vector<std::unique_ptr<llvm::MemoryBuffer>> Buffers;35};36 37#define EXPECT_TOKEN_KIND(FormatTok, Kind) \38 EXPECT_EQ((FormatTok)->Tok.getKind(), Kind) << *(FormatTok)39#define EXPECT_TOKEN_TYPE(FormatTok, Type) \40 EXPECT_EQ((FormatTok)->getType(), Type) << *(FormatTok)41#define EXPECT_TOKEN_PRECEDENCE(FormatTok, Prec) \42 EXPECT_EQ((FormatTok)->getPrecedence(), Prec) << *(FormatTok)43#define EXPECT_BRACE_KIND(FormatTok, Kind) \44 EXPECT_EQ(FormatTok->getBlockKind(), Kind) << *(FormatTok)45#define EXPECT_SPLIT_PENALTY(FormatTok, Penalty) \46 EXPECT_EQ(FormatTok->SplitPenalty, Penalty) << *(FormatTok)47#define EXPECT_TOKEN(FormatTok, Kind, Type) \48 do { \49 EXPECT_TOKEN_KIND(FormatTok, Kind); \50 EXPECT_TOKEN_TYPE(FormatTok, Type); \51 } while (false)52 53TEST_F(TokenAnnotatorTest, UnderstandsUsesOfStarAndAmp) {54 auto Tokens = annotate("auto x = [](const decltype(x) &ptr) {};");55 ASSERT_EQ(Tokens.size(), 18u) << Tokens;56 EXPECT_TOKEN(Tokens[7], tok::kw_decltype, TT_Unknown);57 EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_TypeDeclarationParen);58 EXPECT_TOKEN(Tokens[9], tok::identifier, TT_Unknown);59 EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);60 EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);61 62 Tokens = annotate("auto x = [](const decltype(x) *ptr) {};");63 ASSERT_EQ(Tokens.size(), 18u) << Tokens;64 EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);65 EXPECT_TOKEN(Tokens[11], tok::star, TT_PointerOrReference);66 67 Tokens = annotate("#define lambda [](const decltype(x) &ptr) {}");68 ASSERT_EQ(Tokens.size(), 17u) << Tokens;69 EXPECT_TOKEN(Tokens[7], tok::kw_decltype, TT_Unknown);70 EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_TypeDeclarationParen);71 EXPECT_TOKEN(Tokens[9], tok::identifier, TT_Unknown);72 EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);73 EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);74 75 Tokens = annotate("#define lambda [](const decltype(x) *ptr) {}");76 ASSERT_EQ(Tokens.size(), 17u) << Tokens;77 EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);78 EXPECT_TOKEN(Tokens[11], tok::star, TT_PointerOrReference);79 80 Tokens = annotate("void f() {\n"81 " while (p < a && *p == 'a')\n"82 " p++;\n"83 "}");84 ASSERT_EQ(Tokens.size(), 21u) << Tokens;85 EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);86 EXPECT_TOKEN(Tokens[11], tok::star, TT_UnaryOperator);87 88 Tokens = annotate("case *x:");89 ASSERT_EQ(Tokens.size(), 5u) << Tokens;90 EXPECT_TOKEN(Tokens[1], tok::star, TT_UnaryOperator);91 Tokens = annotate("case &x:");92 ASSERT_EQ(Tokens.size(), 5u) << Tokens;93 EXPECT_TOKEN(Tokens[1], tok::amp, TT_UnaryOperator);94 95 Tokens = annotate("bool b = 3 == int{3} && true;");96 ASSERT_EQ(Tokens.size(), 13u) << Tokens;97 EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_BinaryOperator);98 99 Tokens = annotate("struct {\n"100 "} *ptr;");101 ASSERT_EQ(Tokens.size(), 7u) << Tokens;102 EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);103 Tokens = annotate("union {\n"104 "} *ptr;");105 ASSERT_EQ(Tokens.size(), 7u) << Tokens;106 EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);107 Tokens = annotate("class {\n"108 "} *ptr;");109 ASSERT_EQ(Tokens.size(), 7u) << Tokens;110 EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);111 112 Tokens = annotate("struct {\n"113 "} &&ptr = {};");114 ASSERT_EQ(Tokens.size(), 10u) << Tokens;115 EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_PointerOrReference);116 Tokens = annotate("union {\n"117 "} &&ptr = {};");118 ASSERT_EQ(Tokens.size(), 10u) << Tokens;119 EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_PointerOrReference);120 Tokens = annotate("class {\n"121 "} &&ptr = {};");122 ASSERT_EQ(Tokens.size(), 10u) << Tokens;123 EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_PointerOrReference);124 Tokens = annotate("int i = int{42} * 2;");125 ASSERT_EQ(Tokens.size(), 11u) << Tokens;126 EXPECT_TOKEN(Tokens[7], tok::star, TT_BinaryOperator);127 128 Tokens = annotate("delete[] *ptr;");129 ASSERT_EQ(Tokens.size(), 7u) << Tokens;130 EXPECT_TOKEN(Tokens[3], tok::star, TT_UnaryOperator);131 Tokens = annotate("delete[] **ptr;");132 ASSERT_EQ(Tokens.size(), 8u) << Tokens;133 EXPECT_TOKEN(Tokens[3], tok::star, TT_UnaryOperator);134 EXPECT_TOKEN(Tokens[4], tok::star, TT_UnaryOperator);135 Tokens = annotate("delete[] *(ptr);");136 ASSERT_EQ(Tokens.size(), 9u) << Tokens;137 EXPECT_TOKEN(Tokens[3], tok::star, TT_UnaryOperator);138 139 Tokens = annotate("void f() { void (*fnptr)(char* foo); }");140 ASSERT_EQ(Tokens.size(), 18u) << Tokens;141 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_FunctionTypeLParen);142 // FIXME: The star of a function pointer probably makes more sense as143 // TT_PointerOrReference.144 EXPECT_TOKEN(Tokens[7], tok::star, TT_UnaryOperator);145 EXPECT_TOKEN(Tokens[12], tok::star, TT_PointerOrReference);146 147 Tokens = annotate("void f() { void (*fnptr)(t* foo); }");148 ASSERT_EQ(Tokens.size(), 18u) << Tokens;149 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_FunctionTypeLParen);150 EXPECT_TOKEN(Tokens[7], tok::star, TT_UnaryOperator);151 EXPECT_TOKEN(Tokens[12], tok::star, TT_PointerOrReference);152 153 Tokens = annotate("int f3() { return sizeof(Foo&); }");154 ASSERT_EQ(Tokens.size(), 14u) << Tokens;155 EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);156 157 Tokens = annotate("int f4() { return sizeof(Foo&&); }");158 ASSERT_EQ(Tokens.size(), 14u) << Tokens;159 EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_PointerOrReference);160 161 Tokens = annotate("void f5() { int f6(Foo&, Bar&); }");162 ASSERT_EQ(Tokens.size(), 17u) << Tokens;163 EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);164 EXPECT_TOKEN(Tokens[12], tok::amp, TT_PointerOrReference);165 166 Tokens = annotate("void f7() { int f8(Foo&&, Bar&&); }");167 ASSERT_EQ(Tokens.size(), 17u) << Tokens;168 EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_PointerOrReference);169 EXPECT_TOKEN(Tokens[12], tok::ampamp, TT_PointerOrReference);170 171 Tokens = annotate("Type1 &val1 = val2;");172 ASSERT_EQ(Tokens.size(), 7u) << Tokens;173 EXPECT_TOKEN(Tokens[1], tok::amp, TT_PointerOrReference);174 175 Tokens = annotate("Type1 *val1 = &val2;");176 ASSERT_EQ(Tokens.size(), 8u) << Tokens;177 EXPECT_TOKEN(Tokens[1], tok::star, TT_PointerOrReference);178 EXPECT_TOKEN(Tokens[4], tok::amp, TT_UnaryOperator);179 180 Tokens = annotate("val1 & val2;");181 ASSERT_EQ(Tokens.size(), 5u) << Tokens;182 EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);183 184 Tokens = annotate("val1 & val2.member;");185 ASSERT_EQ(Tokens.size(), 7u) << Tokens;186 EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);187 188 Tokens = annotate("val1 & val2.*member;");189 ASSERT_EQ(Tokens.size(), 7u) << Tokens;190 EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);191 192 Tokens = annotate("val1.*member & val2;");193 ASSERT_EQ(Tokens.size(), 7u) << Tokens;194 EXPECT_TOKEN(Tokens[3], tok::amp, TT_BinaryOperator);195 196 Tokens = annotate("val1 & val2->*member;");197 ASSERT_EQ(Tokens.size(), 7u) << Tokens;198 EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);199 200 Tokens = annotate("val1->member & val2;");201 ASSERT_EQ(Tokens.size(), 7u) << Tokens;202 EXPECT_TOKEN(Tokens[3], tok::amp, TT_BinaryOperator);203 204 Tokens = annotate("val1 & val2 & val3;");205 ASSERT_EQ(Tokens.size(), 7u) << Tokens;206 EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);207 EXPECT_TOKEN(Tokens[3], tok::amp, TT_BinaryOperator);208 209 Tokens = annotate("val1 & val2 // comment\n"210 " & val3;");211 ASSERT_EQ(Tokens.size(), 8u) << Tokens;212 EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);213 EXPECT_TOKEN(Tokens[4], tok::amp, TT_BinaryOperator);214 215 Tokens =216 annotate("val1 & val2.member & val3.member() & val4 & val5->member;");217 ASSERT_EQ(Tokens.size(), 19u) << Tokens;218 EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);219 EXPECT_TOKEN(Tokens[5], tok::amp, TT_BinaryOperator);220 EXPECT_TOKEN(Tokens[11], tok::amp, TT_BinaryOperator);221 EXPECT_TOKEN(Tokens[13], tok::amp, TT_BinaryOperator);222 223 Tokens = annotate("class c {\n"224 " void func(type &a) { a & member; }\n"225 " anotherType &member;\n"226 "}");227 ASSERT_EQ(Tokens.size(), 22u) << Tokens;228 EXPECT_TOKEN(Tokens[7], tok::amp, TT_PointerOrReference);229 EXPECT_TOKEN(Tokens[12], tok::amp, TT_BinaryOperator);230 EXPECT_TOKEN(Tokens[17], tok::amp, TT_PointerOrReference);231 232 Tokens = annotate("struct S {\n"233 " auto Mem = C & D;\n"234 "}");235 ASSERT_EQ(Tokens.size(), 12u) << Tokens;236 EXPECT_TOKEN(Tokens[7], tok::amp, TT_BinaryOperator);237 238 Tokens =239 annotate("template <typename T> void swap() noexcept(Bar<T> && Foo<T>);");240 ASSERT_EQ(Tokens.size(), 23u) << Tokens;241 EXPECT_TOKEN(Tokens[15], tok::ampamp, TT_BinaryOperator);242 243 Tokens = annotate("template <typename T> struct S {\n"244 " explicit(Bar<T> && Foo<T>) S(const S &);\n"245 "};");246 ASSERT_EQ(Tokens.size(), 30u) << Tokens;247 EXPECT_TOKEN(Tokens[14], tok::ampamp, TT_BinaryOperator);248 249 Tokens = annotate("template <bool B = C && D> struct S {};");250 ASSERT_EQ(Tokens.size(), 15u) << Tokens;251 EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_BinaryOperator);252 253 Tokens = annotate("template <typename T, bool B = C && D> struct S {};");254 ASSERT_EQ(Tokens.size(), 18u) << Tokens;255 EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_BinaryOperator);256 257 Tokens = annotate("template <typename T, typename U = T&&> struct S {};");258 ASSERT_EQ(Tokens.size(), 17u) << Tokens;259 EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_PointerOrReference);260 261 Tokens = annotate("template <typename T = int (*)(int)> struct S {};");262 ASSERT_EQ(Tokens.size(), 19u) << Tokens;263 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_FunctionTypeLParen);264 EXPECT_TOKEN(Tokens[7], tok::star, TT_PointerOrReference);265 266 Tokens = annotate("Foo<A && B> a = {};");267 ASSERT_EQ(Tokens.size(), 12u) << Tokens;268 EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_BinaryOperator);269 270 Tokens = annotate("Foo<A &&> a = {};");271 ASSERT_EQ(Tokens.size(), 11u) << Tokens;272 EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_PointerOrReference);273 274 Tokens = annotate("template <typename T>\n"275 "enable_if_t<is_integral_v<T>, bool> // comment\n"276 "operator~(T &a);");277 ASSERT_EQ(Tokens.size(), 24u) << Tokens;278 EXPECT_TOKEN(Tokens[19], tok::amp, TT_PointerOrReference);279 280 Tokens = annotate("template <enable_if_t<foo && !bar>* = nullptr> void f();");281 ASSERT_EQ(Tokens.size(), 19u) << Tokens;282 EXPECT_TOKEN(Tokens[5], tok::ampamp, TT_BinaryOperator);283 284 Tokens =285 annotate("auto foo() noexcept(noexcept(bar()) && "286 "trait<std::decay_t<decltype(bar())>> && noexcept(baz())) {}");287 ASSERT_EQ(Tokens.size(), 38u) << Tokens;288 EXPECT_TOKEN(Tokens[12], tok::ampamp, TT_BinaryOperator);289 EXPECT_TOKEN(Tokens[27], tok::ampamp, TT_BinaryOperator);290 291 Tokens = annotate("foo = *i < *j && *j > *k;");292 ASSERT_EQ(Tokens.size(), 15u) << Tokens;293 EXPECT_TOKEN(Tokens[4], tok::less, TT_BinaryOperator);294 EXPECT_TOKEN(Tokens[7], tok::ampamp, TT_BinaryOperator);295 EXPECT_TOKEN(Tokens[10], tok::greater, TT_BinaryOperator);296 297 Tokens = annotate("if (Foo *foo; bar)");298 ASSERT_EQ(Tokens.size(), 9u) << Tokens;299 EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);300 301 Tokens = annotate("if (Foo **foo(); bar)");302 ASSERT_EQ(Tokens.size(), 12u) << Tokens;303 EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);304 EXPECT_TOKEN(Tokens[4], tok::star, TT_PointerOrReference);305 306 Tokens = annotate("if (Foo *&foo{a}; bar)");307 ASSERT_EQ(Tokens.size(), 13u) << Tokens;308 EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);309 EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference);310 311 FormatStyle Style = getLLVMStyle();312 Style.TypeNames.push_back("MYI");313 Tokens = annotate("if (MYI *p{nullptr})", Style);314 ASSERT_EQ(Tokens.size(), 10u) << Tokens;315 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_TypeName);316 EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);317 318 Style.TypeNames.push_back("Class");319 Tokens = annotate("if (Class *obj {getObj()})", Style);320 ASSERT_EQ(Tokens.size(), 12u) << Tokens;321 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_TypeName);322 EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);323 324 Tokens = annotate("class Foo {\n"325 " void operator<() {}\n"326 " Foo &f;\n"327 "};");328 ASSERT_EQ(Tokens.size(), 17u) << Tokens;329 EXPECT_TOKEN(Tokens[4], tok::kw_operator, TT_FunctionDeclarationName);330 EXPECT_TOKEN(Tokens[5], tok::less, TT_OverloadedOperator);331 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_OverloadedOperatorLParen);332 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_FunctionLBrace);333 EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);334 335 Tokens = annotate("if (new && num) {\n"336 " new = 1;\n"337 "}\n"338 "if (!delete && num) {\n"339 " delete = 1;\n"340 "}");341 ASSERT_EQ(Tokens.size(), 26u) << Tokens;342 EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_BinaryOperator);343 EXPECT_TOKEN(Tokens[16], tok::ampamp, TT_BinaryOperator);344 345 Tokens = annotate("#define FOO \\\n"346 " void foo() { f(a * b); }");347 ASSERT_EQ(Tokens.size(), 17u) << Tokens;348 EXPECT_TOKEN(Tokens[11], tok::star, TT_BinaryOperator);349 350 Tokens = annotate("for (int i; Foo *&foo : foos)");351 ASSERT_EQ(Tokens.size(), 13u) << Tokens;352 EXPECT_TOKEN(Tokens[6], tok::star, TT_PointerOrReference);353 EXPECT_TOKEN(Tokens[7], tok::amp, TT_PointerOrReference);354 EXPECT_TOKEN(Tokens[9], tok::colon, TT_RangeBasedForLoopColon);355 356 Tokens = annotate("#define FOO auto Foo = [] { f(a * b); };");357 ASSERT_EQ(Tokens.size(), 19u) << Tokens;358 EXPECT_TOKEN(Tokens[12], tok::star, TT_BinaryOperator);359 360 Tokens = annotate("namespace {\n"361 "#define FOO(x) void foo(a##x *b);\n"362 "}");363 ASSERT_EQ(Tokens.size(), 20u) << Tokens;364 EXPECT_TOKEN(Tokens[14], tok::star, TT_PointerOrReference);365 366 Tokens = annotate("#define foo(x) _Generic(x, bar *: 1, default: 0)");367 ASSERT_EQ(Tokens.size(), 20u) << Tokens;368 EXPECT_TOKEN(Tokens[11], tok::star, TT_PointerOrReference);369 370 Tokens = annotate("Thingy kConfig = {\n"371 " 1,\n"372 " (uint16_t)(kScale * height_pixels),\n"373 "};");374 ASSERT_EQ(Tokens.size(), 18u) << Tokens;375 EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_CastRParen);376 EXPECT_TOKEN(Tokens[11], tok::star, TT_BinaryOperator);377 378 Tokens = annotate("template <typename T>\n"379 "concept C = requires(T a, T b) { a && b; };");380 ASSERT_EQ(Tokens.size(), 24u) << Tokens;381 EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_RequiresExpressionLBrace);382 EXPECT_TOKEN(Tokens[18], tok::ampamp, TT_BinaryOperator);383 384 Tokens = annotate("template <typename T, typename V>\n"385 "concept CheckMultiplicableBy = requires(T a, V b) {\n"386 " { a * b } -> std::same_as<T>;\n"387 "};");388 ASSERT_EQ(Tokens.size(), 36u) << Tokens;389 EXPECT_TOKEN(Tokens[19], tok::l_brace, TT_RequiresExpressionLBrace);390 EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_CompoundRequirementLBrace);391 EXPECT_TOKEN(Tokens[22], tok::star, TT_BinaryOperator);392 393 Tokens = annotate("bool foo = requires { static_cast<Foo &&>(1); };");394 ASSERT_EQ(Tokens.size(), 17u) << Tokens;395 EXPECT_TOKEN(Tokens[8], tok::ampamp, TT_PointerOrReference);396 397 Tokens = annotate("return s.operator int *();");398 ASSERT_EQ(Tokens.size(), 10u) << Tokens;399 // Not TT_FunctionDeclarationName.400 EXPECT_TOKEN(Tokens[3], tok::kw_operator, TT_Unknown);401 EXPECT_TOKEN(Tokens[5], tok::star, TT_PointerOrReference);402 // Not TT_FunctionDeclarationLParen.403 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_Unknown);404 405 Tokens = annotate("B &b = x.operator B &();");406 ASSERT_EQ(Tokens.size(), 13u) << Tokens;407 EXPECT_TOKEN(Tokens[8], tok::amp, TT_PointerOrReference);408 409 Tokens = annotate("int8_t *a = MacroCall(int8_t, width * height * length);");410 ASSERT_EQ(Tokens.size(), 16u) << Tokens;411 EXPECT_TOKEN(Tokens[9], tok::star, TT_BinaryOperator);412 EXPECT_TOKEN(Tokens[11], tok::star, TT_BinaryOperator);413 414 Tokens = annotate("float foo[3] = {M * H * H, H * M * H, H * H * M};");415 ASSERT_EQ(Tokens.size(), 27u) << Tokens;416 EXPECT_TOKEN(Tokens[16], tok::star, TT_BinaryOperator);417 EXPECT_TOKEN(Tokens[22], tok::star, TT_BinaryOperator);418 419 Tokens = annotate("NSError *__autoreleasing *foo;",420 getLLVMStyle(FormatStyle::LK_ObjC));421 ASSERT_EQ(Tokens.size(), 7u) << Tokens;422 EXPECT_TOKEN(Tokens[1], tok::star, TT_PointerOrReference);423 EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);424}425 426TEST_F(TokenAnnotatorTest, UnderstandsUsesOfPlusAndMinus) {427 auto Tokens = annotate("x - 0");428 ASSERT_EQ(Tokens.size(), 4u) << Tokens;429 EXPECT_TOKEN(Tokens[1], tok::minus, TT_BinaryOperator);430 Tokens = annotate("0 + 0");431 ASSERT_EQ(Tokens.size(), 4u) << Tokens;432 EXPECT_TOKEN(Tokens[1], tok::plus, TT_BinaryOperator);433 Tokens = annotate("x + +0");434 ASSERT_EQ(Tokens.size(), 5u) << Tokens;435 EXPECT_TOKEN(Tokens[2], tok::plus, TT_UnaryOperator);436 Tokens = annotate("x ? -0 : +0");437 ASSERT_EQ(Tokens.size(), 8u) << Tokens;438 EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);439 EXPECT_TOKEN(Tokens[5], tok::plus, TT_UnaryOperator);440 Tokens = annotate("(-0)");441 ASSERT_EQ(Tokens.size(), 5u) << Tokens;442 EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);443 Tokens = annotate("0, -0");444 ASSERT_EQ(Tokens.size(), 5u) << Tokens;445 EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);446 Tokens = annotate("for (; -1;) {\n}");447 ASSERT_EQ(Tokens.size(), 10u) << Tokens;448 EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);449 Tokens = annotate("x = -1;");450 ASSERT_EQ(Tokens.size(), 6u) << Tokens;451 EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);452 Tokens = annotate("x[-1]");453 ASSERT_EQ(Tokens.size(), 6u) << Tokens;454 EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);455 Tokens = annotate("x = {-1};");456 ASSERT_EQ(Tokens.size(), 8u) << Tokens;457 EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);458 Tokens = annotate("case -x:");459 ASSERT_EQ(Tokens.size(), 5u) << Tokens;460 EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);461 Tokens = annotate("co_await -x;");462 ASSERT_EQ(Tokens.size(), 5u) << Tokens;463 EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);464 Tokens = annotate("co_return -x;");465 ASSERT_EQ(Tokens.size(), 5u) << Tokens;466 EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);467 Tokens = annotate("co_yield -x;");468 ASSERT_EQ(Tokens.size(), 5u) << Tokens;469 EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);470 Tokens = annotate("delete -x;");471 ASSERT_EQ(Tokens.size(), 5u) << Tokens;472 EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);473 Tokens = annotate("return -x;");474 ASSERT_EQ(Tokens.size(), 5u) << Tokens;475 EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);476 Tokens = annotate("throw -x;");477 ASSERT_EQ(Tokens.size(), 5u) << Tokens;478 EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);479 Tokens = annotate("sizeof -x");480 ASSERT_EQ(Tokens.size(), 4u) << Tokens;481 EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);482 Tokens = annotate("co_await +x;");483 ASSERT_EQ(Tokens.size(), 5u) << Tokens;484 EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);485 Tokens = annotate("co_return +x;");486 ASSERT_EQ(Tokens.size(), 5u) << Tokens;487 EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);488 Tokens = annotate("co_yield +x;");489 ASSERT_EQ(Tokens.size(), 5u) << Tokens;490 EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);491 Tokens = annotate("delete +x;");492 ASSERT_EQ(Tokens.size(), 5u) << Tokens;493 EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);494 Tokens = annotate("return +x;");495 ASSERT_EQ(Tokens.size(), 5u) << Tokens;496 EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);497 Tokens = annotate("throw +x;");498 ASSERT_EQ(Tokens.size(), 5u) << Tokens;499 EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);500 Tokens = annotate("sizeof +x");501 ASSERT_EQ(Tokens.size(), 4u) << Tokens;502 EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);503 Tokens = annotate("(int)-x");504 ASSERT_EQ(Tokens.size(), 6u) << Tokens;505 EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);506 Tokens = annotate("(-x)");507 ASSERT_EQ(Tokens.size(), 5u) << Tokens;508 EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);509 Tokens = annotate("!+x");510 ASSERT_EQ(Tokens.size(), 4u) << Tokens;511 EXPECT_TOKEN(Tokens[0], tok::exclaim, TT_UnaryOperator);512 EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);513}514 515TEST_F(TokenAnnotatorTest, UnderstandsClasses) {516 auto Tokens = annotate("class C {};");517 ASSERT_EQ(Tokens.size(), 6u) << Tokens;518 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName);519 EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);520 EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_ClassRBrace);521 522 Tokens = annotate("const class C {} c;");523 ASSERT_EQ(Tokens.size(), 8u) << Tokens;524 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_ClassHeadName);525 EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_ClassLBrace);526 EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_ClassRBrace);527 528 Tokens = annotate("const class {} c;");529 ASSERT_EQ(Tokens.size(), 7u) << Tokens;530 EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);531 EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_ClassRBrace);532 533 Tokens = annotate("class [[deprecated(\"\")]] C { int i; };");534 ASSERT_EQ(Tokens.size(), 17u) << Tokens;535 EXPECT_TOKEN(Tokens[9], tok::identifier, TT_ClassHeadName);536 EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_ClassLBrace);537 EXPECT_TOKEN(Tokens[14], tok::r_brace, TT_ClassRBrace);538}539 540TEST_F(TokenAnnotatorTest, UnderstandsStructs) {541 auto Tokens = annotate("struct S {};");542 ASSERT_EQ(Tokens.size(), 6u) << Tokens;543 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName);544 EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_StructLBrace);545 EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_StructRBrace);546 547 Tokens = annotate("struct macro(a) S {};");548 ASSERT_EQ(Tokens.size(), 10u) << Tokens;549 EXPECT_TOKEN(Tokens[5], tok::identifier, TT_ClassHeadName);550 EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_StructLBrace);551 EXPECT_TOKEN(Tokens[7], tok::r_brace, TT_StructRBrace);552 553 Tokens = annotate("struct EXPORT_MACRO [[nodiscard]] C { int i; };");554 ASSERT_EQ(Tokens.size(), 15u) << Tokens;555 EXPECT_TOKEN(Tokens[7], tok::identifier, TT_ClassHeadName);556 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_StructLBrace);557 EXPECT_TOKEN(Tokens[12], tok::r_brace, TT_StructRBrace);558 559 Tokens = annotate("struct [[deprecated]] [[nodiscard]] C { int i; };");560 ASSERT_EQ(Tokens.size(), 19u) << Tokens;561 EXPECT_TOKEN(Tokens[11], tok::identifier, TT_ClassHeadName);562 EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_StructLBrace);563 EXPECT_TOKEN(Tokens[16], tok::r_brace, TT_StructRBrace);564 565 Tokens = annotate("struct macro(a) S {\n"566 " void f(T &t);\n"567 "};");568 ASSERT_EQ(Tokens.size(), 18u) << Tokens;569 EXPECT_TOKEN(Tokens[5], tok::identifier, TT_ClassHeadName);570 EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_StructLBrace);571 EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);572 EXPECT_TOKEN(Tokens[15], tok::r_brace, TT_StructRBrace);573 574 Tokens = annotate("template <typename T> struct S<const T[N]> {};");575 ASSERT_EQ(Tokens.size(), 18u) << Tokens;576 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_ClassHeadName);577 EXPECT_TOKEN(Tokens[7], tok::less, TT_TemplateOpener);578 EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare);579 EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);580 EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_StructLBrace);581 EXPECT_TOKEN(Tokens[15], tok::r_brace, TT_StructRBrace);582 583 Tokens = annotate("template <typename T> struct S<T const[N]> {};");584 ASSERT_EQ(Tokens.size(), 18u) << Tokens;585 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_ClassHeadName);586 EXPECT_TOKEN(Tokens[7], tok::less, TT_TemplateOpener);587 EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare);588 EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);589 EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_StructLBrace);590 EXPECT_TOKEN(Tokens[15], tok::r_brace, TT_StructRBrace);591 592 Tokens = annotate("template <typename T, unsigned n> struct S<T const[n]> {\n"593 " void f(T const (&a)[n]);\n"594 "};");595 ASSERT_EQ(Tokens.size(), 35u) << Tokens;596 EXPECT_TOKEN(Tokens[9], tok::identifier, TT_ClassHeadName);597 EXPECT_TOKEN(Tokens[10], tok::less, TT_TemplateOpener);598 EXPECT_TOKEN(Tokens[13], tok::l_square, TT_ArraySubscriptLSquare);599 EXPECT_TOKEN(Tokens[16], tok::greater, TT_TemplateCloser);600 EXPECT_TOKEN(Tokens[17], tok::l_brace, TT_StructLBrace);601 EXPECT_TOKEN(Tokens[23], tok::l_paren, TT_FunctionTypeLParen);602 EXPECT_TOKEN(Tokens[24], tok::amp, TT_UnaryOperator);603 EXPECT_TOKEN(Tokens[27], tok::l_square, TT_ArraySubscriptLSquare);604 EXPECT_TOKEN(Tokens[32], tok::r_brace, TT_StructRBrace);605 606 Tokens = annotate("template <typename T, enum E e> struct S {};");607 ASSERT_EQ(Tokens.size(), 15u) << Tokens;608 EXPECT_TOKEN(Tokens[10], tok::identifier, TT_ClassHeadName);609 EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_StructLBrace);610 611 Tokens = annotate(612 "template <> struct __declspec(foo) Op<Bar *> : OpImpl<Bar *> {};");613 ASSERT_EQ(Tokens.size(), 23u) << Tokens;614 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_AttributeLParen);615 EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_AttributeRParen);616 EXPECT_TOKEN(Tokens[8], tok::identifier, TT_ClassHeadName);617 EXPECT_TOKEN(Tokens[13], tok::colon, TT_InheritanceColon);618 EXPECT_TOKEN(Tokens[19], tok::l_brace, TT_StructLBrace);619 EXPECT_TOKEN(Tokens[20], tok::r_brace, TT_StructRBrace);620 621 Tokens = annotate("class Outer {\n"622 " struct Inner final : Base {};\n"623 "};");624 ASSERT_EQ(Tokens.size(), 14u) << Tokens;625 EXPECT_TOKEN(Tokens[5], tok::identifier, TT_Unknown); // Not TT_StartOfName626 EXPECT_TOKEN(Tokens[6], tok::colon, TT_InheritanceColon);627 628 constexpr StringRef Code("struct EXPORT StructName {};");629 630 Tokens = annotate(Code);631 ASSERT_EQ(Tokens.size(), 7u) << Tokens;632 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_ClassHeadName);633 EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_StructLBrace);634 EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_StructRBrace);635 636 auto Style = getLLVMStyle();637 Style.AttributeMacros.push_back("EXPORT");638 Tokens = annotate(Code, Style);639 ASSERT_EQ(Tokens.size(), 7u) << Tokens;640 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_AttributeMacro);641 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_ClassHeadName);642 EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_StructLBrace);643 EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_StructRBrace);644}645 646TEST_F(TokenAnnotatorTest, UnderstandsUnions) {647 auto Tokens = annotate("union U {};");648 ASSERT_EQ(Tokens.size(), 6u) << Tokens;649 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName);650 EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);651 EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_UnionRBrace);652 653 Tokens = annotate("union U { void f() { return; } };");654 ASSERT_EQ(Tokens.size(), 14u) << Tokens;655 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName);656 EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);657 EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_FunctionLBrace);658 EXPECT_TOKEN(Tokens[11], tok::r_brace, TT_UnionRBrace);659}660 661TEST_F(TokenAnnotatorTest, UnderstandsEnums) {662 auto Tokens = annotate("enum E {};");663 ASSERT_EQ(Tokens.size(), 6u) << Tokens;664 EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_EnumLBrace);665 EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_EnumRBrace);666}667 668TEST_F(TokenAnnotatorTest, UnderstandsDefaultedAndDeletedFunctions) {669 auto Tokens = annotate("auto operator<=>(const T &) const & = default;");670 ASSERT_EQ(Tokens.size(), 14u) << Tokens;671 EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);672 673 Tokens = annotate("template <typename T> void F(T) && = delete;");674 ASSERT_EQ(Tokens.size(), 15u) << Tokens;675 EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);676}677 678TEST_F(TokenAnnotatorTest, UnderstandsVariables) {679 auto Tokens =680 annotate("inline bool var = is_integral_v<int> && is_signed_v<int>;");681 ASSERT_EQ(Tokens.size(), 15u) << Tokens;682 EXPECT_TOKEN(Tokens[8], tok::ampamp, TT_BinaryOperator);683}684 685TEST_F(TokenAnnotatorTest, UnderstandsVariableTemplates) {686 auto Tokens =687 annotate("template <typename T> "688 "inline bool var = is_integral_v<int> && is_signed_v<int>;");689 ASSERT_EQ(Tokens.size(), 20u) << Tokens;690 EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);691}692 693TEST_F(TokenAnnotatorTest, UnderstandsTemplatesInMacros) {694 auto Tokens =695 annotate("#define FOO(typeName) \\\n"696 " { #typeName, foo<FooType>(new foo<realClass>(#typeName)) }");697 ASSERT_EQ(Tokens.size(), 27u) << Tokens;698 EXPECT_TOKEN(Tokens[11], tok::less, TT_TemplateOpener);699 EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);700 EXPECT_TOKEN(Tokens[17], tok::less, TT_TemplateOpener);701 EXPECT_TOKEN(Tokens[19], tok::greater, TT_TemplateCloser);702}703 704TEST_F(TokenAnnotatorTest, UnderstandsGreaterAfterTemplateCloser) {705 auto Tokens = annotate("if (std::tuple_size_v<T> > 0)");706 ASSERT_EQ(Tokens.size(), 12u) << Tokens;707 EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener);708 EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);709 EXPECT_TOKEN(Tokens[8], tok::greater, TT_BinaryOperator);710}711 712TEST_F(TokenAnnotatorTest, UnderstandsTernaryInTemplate) {713 // IsExpression = false714 auto Tokens = annotate("foo<true ? 1 : 2>();");715 ASSERT_EQ(Tokens.size(), 12u) << Tokens;716 EXPECT_TOKEN(Tokens[1], tok::less, TT_TemplateOpener);717 EXPECT_TOKEN(Tokens[3], tok::question, TT_ConditionalExpr);718 EXPECT_TOKEN(Tokens[5], tok::colon, TT_ConditionalExpr);719 EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);720 721 // IsExpression = true722 723 Tokens = annotate("return foo<true ? 1 : 2>();");724 ASSERT_EQ(Tokens.size(), 13u) << Tokens;725 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);726 EXPECT_TOKEN(Tokens[4], tok::question, TT_ConditionalExpr);727 EXPECT_TOKEN(Tokens[6], tok::colon, TT_ConditionalExpr);728 EXPECT_TOKEN(Tokens[8], tok::greater, TT_TemplateCloser);729 730 Tokens = annotate("return foo<true ? 1 : 2>{};");731 ASSERT_EQ(Tokens.size(), 13u) << Tokens;732 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);733 EXPECT_TOKEN(Tokens[4], tok::question, TT_ConditionalExpr);734 EXPECT_TOKEN(Tokens[6], tok::colon, TT_ConditionalExpr);735 EXPECT_TOKEN(Tokens[8], tok::greater, TT_TemplateCloser);736}737 738TEST_F(TokenAnnotatorTest, UnderstandsNonTemplateAngleBrackets) {739 auto Tokens = annotate("return a < b && c > d;");740 ASSERT_EQ(Tokens.size(), 10u) << Tokens;741 EXPECT_TOKEN(Tokens[2], tok::less, TT_BinaryOperator);742 EXPECT_TOKEN(Tokens[6], tok::greater, TT_BinaryOperator);743 744 Tokens = annotate("a < 0 ? b : a > 0 ? c : d;");745 ASSERT_EQ(Tokens.size(), 15u) << Tokens;746 EXPECT_TOKEN(Tokens[1], tok::less, TT_BinaryOperator);747 EXPECT_TOKEN(Tokens[7], tok::greater, TT_BinaryOperator);748 749 Tokens = annotate("return A < B ? true : A > B;");750 ASSERT_EQ(Tokens.size(), 12u) << Tokens;751 EXPECT_TOKEN(Tokens[2], tok::less, TT_BinaryOperator);752 EXPECT_TOKEN(Tokens[8], tok::greater, TT_BinaryOperator);753 754 Tokens = annotate("return A < B ? true : A > B ? false : false;");755 ASSERT_EQ(Tokens.size(), 16u) << Tokens;756 EXPECT_TOKEN(Tokens[2], tok::less, TT_BinaryOperator);757 EXPECT_TOKEN(Tokens[8], tok::greater, TT_BinaryOperator);758 759 Tokens = annotate("return checklower ? a < b : a > b;");760 ASSERT_EQ(Tokens.size(), 12u) << Tokens;761 EXPECT_TOKEN(Tokens[4], tok::less, TT_BinaryOperator);762 EXPECT_TOKEN(Tokens[8], tok::greater, TT_BinaryOperator);763 764 Tokens = annotate("return A < B != A > B;");765 ASSERT_EQ(Tokens.size(), 10u) << Tokens;766 // FIXME:767 // EXPECT_TOKEN(Tokens[2], tok::less, TT_BinaryOperator);768 // EXPECT_TOKEN(Tokens[6], tok::greater, TT_BinaryOperator);769 770 Tokens = annotate("ratio{-1, 2} < ratio{-1, 3} == -1 / 3 > -1 / 2;");771 ASSERT_EQ(Tokens.size(), 27u) << Tokens;772 EXPECT_TOKEN(Tokens[7], tok::less, TT_BinaryOperator);773 EXPECT_TOKEN(Tokens[20], tok::greater, TT_BinaryOperator);774 775 Tokens = annotate("bool foo = a < b && (c * d) > e;");776 ASSERT_EQ(Tokens.size(), 16u) << Tokens;777 EXPECT_TOKEN(Tokens[4], tok::less, TT_BinaryOperator);778 EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_BinaryOperator);779 EXPECT_TOKEN(Tokens[9], tok::star, TT_BinaryOperator);780 EXPECT_TOKEN(Tokens[12], tok::greater, TT_BinaryOperator);781}782 783TEST_F(TokenAnnotatorTest, UnderstandsTemplateTemplateParameters) {784 auto Tokens = annotate("template <template <typename...> typename X,\n"785 " template <typename...> class Y,\n"786 " typename... T>\n"787 "class A {};");788 ASSERT_EQ(Tokens.size(), 28u) << Tokens;789 EXPECT_TOKEN(Tokens[1], tok::less, TT_TemplateOpener);790 EXPECT_TOKEN(Tokens[3], tok::less, TT_TemplateOpener);791 EXPECT_TOKEN(Tokens[6], tok::greater, TT_TemplateCloser);792 EXPECT_FALSE(Tokens[6]->ClosesTemplateDeclaration);793 EXPECT_TOKEN(Tokens[11], tok::less, TT_TemplateOpener);794 EXPECT_TOKEN(Tokens[14], tok::greater, TT_TemplateCloser);795 EXPECT_FALSE(Tokens[14]->ClosesTemplateDeclaration);796 EXPECT_TOKEN(Tokens[16], tok::identifier, TT_Unknown);797 EXPECT_TOKEN(Tokens[21], tok::greater, TT_TemplateCloser);798 EXPECT_TRUE(Tokens[21]->ClosesTemplateDeclaration);799 EXPECT_TOKEN(Tokens[23], tok::identifier, TT_ClassHeadName);800}801 802TEST_F(TokenAnnotatorTest, UnderstandsCommonCppTemplates) {803 auto Tokens =804 annotate("static_assert(std::conditional_t<A || B, C, D>::value);");805 ASSERT_EQ(Tokens.size(), 19u) << Tokens;806 EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener);807 EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);808 809 Tokens =810 annotate("static_assert(std::conditional<A || B, C, D>::type::value);");811 ASSERT_EQ(Tokens.size(), 21u) << Tokens;812 EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener);813 EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);814 815 Tokens = annotate("static_assert(fancy_v<A || B>);");816 ASSERT_EQ(Tokens.size(), 11u) << Tokens;817 EXPECT_TOKEN(Tokens[3], tok::less, TT_TemplateOpener);818 EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);819 820 Tokens = annotate("static_assert(fancy<A || B>::value);");821 ASSERT_EQ(Tokens.size(), 13u) << Tokens;822 EXPECT_TOKEN(Tokens[3], tok::less, TT_TemplateOpener);823 EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);824}825 826TEST_F(TokenAnnotatorTest, UnderstandsWhitespaceSensitiveMacros) {827 FormatStyle Style = getLLVMStyle();828 Style.WhitespaceSensitiveMacros.push_back("FOO");829 830 auto Tokens = annotate("FOO(1+2 )", Style);831 ASSERT_EQ(Tokens.size(), 7u) << Tokens;832 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_UntouchableMacroFunc);833 834 Tokens = annotate("FOO(a:b:c)", Style);835 ASSERT_EQ(Tokens.size(), 9u) << Tokens;836 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_UntouchableMacroFunc);837}838 839TEST_F(TokenAnnotatorTest, UnderstandsDelete) {840 auto Tokens = annotate("delete (void *)p;");841 ASSERT_EQ(Tokens.size(), 8u) << Tokens;842 EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_CastRParen);843 844 Tokens = annotate("delete[] (void *)p;");845 ASSERT_EQ(Tokens.size(), 10u) << Tokens;846 EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_CastRParen);847 848 Tokens = annotate("delete[] /*comment*/ (void *)p;");849 ASSERT_EQ(Tokens.size(), 11u) << Tokens;850 EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);851 852 Tokens = annotate("delete[/*comment*/] (void *)p;");853 ASSERT_EQ(Tokens.size(), 11u) << Tokens;854 EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);855 856 Tokens = annotate("delete/*comment*/[] (void *)p;");857 ASSERT_EQ(Tokens.size(), 11u) << Tokens;858 EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);859}860 861TEST_F(TokenAnnotatorTest, UnderstandsCasts) {862 auto Tokens = annotate("(void)p;");863 ASSERT_EQ(Tokens.size(), 6u) << Tokens;864 EXPECT_TOKEN(Tokens[2], tok::r_paren, TT_CastRParen);865 866 Tokens = annotate("(uint32_t)&&label;");867 ASSERT_EQ(Tokens.size(), 7u) << Tokens;868 EXPECT_TOKEN(Tokens[2], tok::r_paren, TT_CastRParen);869 EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_UnaryOperator);870 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_Unknown);871 872 Tokens = annotate("auto x = (Foo)p;");873 ASSERT_EQ(Tokens.size(), 9u) << Tokens;874 EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_CastRParen);875 876 Tokens = annotate("(std::vector<int>)p;");877 ASSERT_EQ(Tokens.size(), 11u) << Tokens;878 EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);879 880 Tokens = annotate("return (Foo)p;");881 ASSERT_EQ(Tokens.size(), 7u) << Tokens;882 EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_CastRParen);883 884 Tokens = annotate("throw (Foo)p;");885 ASSERT_EQ(Tokens.size(), 7u) << Tokens;886 EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_CastRParen);887 888 Tokens = annotate("#define FOO(x) (((uint64_t)(x) * BAR) / 100)");889 ASSERT_EQ(Tokens.size(), 21u) << Tokens;890 EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_CastRParen);891 EXPECT_TOKEN(Tokens[13], tok::r_paren, TT_Unknown);892 EXPECT_TOKEN(Tokens[14], tok::star, TT_BinaryOperator);893 894 Tokens = annotate("#define foo(i) ((i) - bar)");895 ASSERT_EQ(Tokens.size(), 14u) << Tokens;896 EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_Unknown);897 EXPECT_TOKEN(Tokens[10], tok::minus, TT_BinaryOperator);898 899 Tokens = annotate("return (Foo) & 10;");900 ASSERT_EQ(Tokens.size(), 8u) << Tokens;901 EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_Unknown);902 EXPECT_TOKEN(Tokens[4], tok::amp, TT_BinaryOperator);903 904 Tokens = annotate("return (struct foo){};");905 ASSERT_EQ(Tokens.size(), 9u) << Tokens;906 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown);907 EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_CastRParen);908 909 Tokens = annotate("#define FOO(bar) foo((uint64_t)&bar)");910 ASSERT_EQ(Tokens.size(), 15u) << Tokens;911 EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_CastRParen);912 EXPECT_TOKEN(Tokens[11], tok::amp, TT_UnaryOperator);913 914 Tokens = annotate("#define FOO(bar) foo((Foo) & bar)");915 ASSERT_EQ(Tokens.size(), 15u) << Tokens;916 EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_Unknown);917 EXPECT_TOKEN(Tokens[11], tok::amp, TT_BinaryOperator);918 919 Tokens = annotate("func((void (*)())&a);");920 ASSERT_EQ(Tokens.size(), 15u) << Tokens;921 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_FunctionTypeLParen);922 EXPECT_TOKEN(Tokens[5], tok::star, TT_PointerOrReference);923 EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_CastRParen);924 EXPECT_TOKEN(Tokens[10], tok::amp, TT_UnaryOperator);925 926 Tokens = annotate("int result = ((int)a) - b;");927 ASSERT_EQ(Tokens.size(), 13u) << Tokens;928 EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_CastRParen);929 EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_Unknown);930 EXPECT_TOKEN(Tokens[9], tok::minus, TT_BinaryOperator);931 932 Tokens = annotate("return (double)(foo(30)) - 15;");933 ASSERT_EQ(Tokens.size(), 14u) << Tokens;934 EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_CastRParen);935 EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_Unknown);936 EXPECT_TOKEN(Tokens[10], tok::minus, TT_BinaryOperator);937 938 Tokens = annotate("return (::Type)(1 + 2);");939 ASSERT_EQ(Tokens.size(), 12u) << Tokens;940 EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_CastRParen);941 942 Tokens = annotate("return (Namespace::Class)(1 + 2);");943 ASSERT_EQ(Tokens.size(), 13u) << Tokens;944 EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_CastRParen);945 946 Tokens = annotate("return (Foo (*)(void *, Bar, ...))&foo;");947 ASSERT_EQ(Tokens.size(), 19u) << Tokens;948 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_FunctionTypeLParen);949 EXPECT_TOKEN(Tokens[14], tok::r_paren, TT_CastRParen);950 EXPECT_TOKEN(Tokens[15], tok::amp, TT_UnaryOperator);951 952 Tokens = annotate("return (Foo (Bar::*)())&Bar::foo;");953 ASSERT_EQ(Tokens.size(), 17u) << Tokens;954 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_FunctionTypeLParen);955 EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_CastRParen);956 EXPECT_TOKEN(Tokens[11], tok::amp, TT_UnaryOperator);957 958 auto Style = getLLVMStyle();959 Style.TypeNames.push_back("Foo");960 Tokens = annotate("#define FOO(bar) foo((Foo)&bar)", Style);961 ASSERT_EQ(Tokens.size(), 15u) << Tokens;962 EXPECT_TOKEN(Tokens[9], tok::identifier, TT_TypeName);963 EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_CastRParen);964 EXPECT_TOKEN(Tokens[11], tok::amp, TT_UnaryOperator);965}966 967TEST_F(TokenAnnotatorTest, UnderstandsDynamicExceptionSpecifier) {968 auto Tokens = annotate("void f() throw(int);");969 ASSERT_EQ(Tokens.size(), 10u) << Tokens;970 EXPECT_TOKEN(Tokens[4], tok::kw_throw, TT_Unknown);971}972 973TEST_F(TokenAnnotatorTest, UnderstandsFunctionRefQualifiers) {974 auto Tokens = annotate("void f() &;");975 ASSERT_EQ(Tokens.size(), 7u) << Tokens;976 EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference);977 978 Tokens = annotate("void operator=(T) &&;");979 ASSERT_EQ(Tokens.size(), 9u) << Tokens;980 EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_PointerOrReference);981 982 Tokens = annotate("template <typename T> void f() &;");983 ASSERT_EQ(Tokens.size(), 12u) << Tokens;984 EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);985 986 Tokens = annotate("template <typename T> void operator=(T) &;");987 ASSERT_EQ(Tokens.size(), 14u) << Tokens;988 EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);989}990 991TEST_F(TokenAnnotatorTest, UnderstandsOverloadedOperators) {992 auto Tokens = annotate("x.operator+()");993 ASSERT_EQ(Tokens.size(), 7u) << Tokens;994 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);995 EXPECT_TOKEN(Tokens[3], tok::plus, TT_OverloadedOperator);996 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);997 Tokens = annotate("x.operator=()");998 ASSERT_EQ(Tokens.size(), 7u) << Tokens;999 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);1000 EXPECT_TOKEN(Tokens[3], tok::equal, TT_OverloadedOperator);1001 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);1002 Tokens = annotate("x.operator+=()");1003 ASSERT_EQ(Tokens.size(), 7u) << Tokens;1004 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);1005 EXPECT_TOKEN(Tokens[3], tok::plusequal, TT_OverloadedOperator);1006 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);1007 Tokens = annotate("x.operator,()");1008 ASSERT_EQ(Tokens.size(), 7u) << Tokens;1009 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);1010 EXPECT_TOKEN(Tokens[3], tok::comma, TT_OverloadedOperator);1011 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);1012 Tokens = annotate("x.operator()()");1013 ASSERT_EQ(Tokens.size(), 8u) << Tokens;1014 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);1015 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_OverloadedOperator);1016 EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_OverloadedOperator);1017 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_OverloadedOperatorLParen);1018 Tokens = annotate("x.operator[]()");1019 ASSERT_EQ(Tokens.size(), 8u) << Tokens;1020 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);1021 // EXPECT_TOKEN(Tokens[3], tok::l_square, TT_OverloadedOperator);1022 // EXPECT_TOKEN(Tokens[4], tok::r_square, TT_OverloadedOperator);1023 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_OverloadedOperatorLParen);1024 Tokens = annotate("x.operator\"\"_a()");1025 ASSERT_EQ(Tokens.size(), 7u) << Tokens;1026 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);1027 EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator);1028 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);1029 Tokens = annotate("x.operator\"\" _a()");1030 ASSERT_EQ(Tokens.size(), 8u) << Tokens;1031 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);1032 EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator);1033 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_OverloadedOperatorLParen);1034 Tokens = annotate("x.operator\"\"if()");1035 ASSERT_EQ(Tokens.size(), 7u) << Tokens;1036 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);1037 EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator);1038 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);1039 Tokens = annotate("x.operator\"\"s()");1040 ASSERT_EQ(Tokens.size(), 7u) << Tokens;1041 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);1042 EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator);1043 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);1044 Tokens = annotate("x.operator\"\" s()");1045 ASSERT_EQ(Tokens.size(), 8u) << Tokens;1046 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);1047 EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator);1048 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_OverloadedOperatorLParen);1049 1050 Tokens = annotate("int operator+(int);");1051 ASSERT_EQ(Tokens.size(), 8u) << Tokens;1052 EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName);1053 EXPECT_TOKEN(Tokens[2], tok::plus, TT_OverloadedOperator);1054 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_OverloadedOperatorLParen);1055 Tokens = annotate("auto operator=(T&) {}");1056 ASSERT_EQ(Tokens.size(), 10u) << Tokens;1057 EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName);1058 EXPECT_TOKEN(Tokens[2], tok::equal, TT_OverloadedOperator);1059 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_OverloadedOperatorLParen);1060 Tokens = annotate("auto operator()() {}");1061 ASSERT_EQ(Tokens.size(), 9u) << Tokens;1062 EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName);1063 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_OverloadedOperator);1064 EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_OverloadedOperator);1065 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);1066 1067 Tokens = annotate("class Foo {\n"1068 " int operator+(a* b);\n"1069 "}");1070 ASSERT_EQ(Tokens.size(), 14u) << Tokens;1071 EXPECT_TOKEN(Tokens[4], tok::kw_operator, TT_FunctionDeclarationName);1072 EXPECT_TOKEN(Tokens[5], tok::plus, TT_OverloadedOperator);1073 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_OverloadedOperatorLParen);1074 EXPECT_TOKEN(Tokens[8], tok::star, TT_PointerOrReference);1075 1076 Tokens = annotate("class Foo {\n"1077 " int c = operator+(a * b);\n"1078 "}");1079 ASSERT_EQ(Tokens.size(), 16u) << Tokens;1080 EXPECT_TOKEN(Tokens[6], tok::kw_operator, TT_Unknown);1081 EXPECT_TOKEN(Tokens[7], tok::plus, TT_OverloadedOperator);1082 EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_OverloadedOperatorLParen);1083 EXPECT_TOKEN(Tokens[10], tok::star, TT_BinaryOperator);1084 1085 Tokens = annotate("void foo() {\n"1086 " operator+(a * b);\n"1087 "}");1088 ASSERT_EQ(Tokens.size(), 15u) << Tokens;1089 EXPECT_TOKEN(Tokens[5], tok::kw_operator, TT_Unknown);1090 EXPECT_TOKEN(Tokens[6], tok::plus, TT_OverloadedOperator);1091 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_OverloadedOperatorLParen);1092 EXPECT_TOKEN(Tokens[9], tok::star, TT_BinaryOperator);1093 1094 Tokens = annotate("return operator+(a * b, c & d) + operator+(a && b && c);");1095 ASSERT_EQ(Tokens.size(), 24u) << Tokens;1096 EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_Unknown);1097 EXPECT_TOKEN(Tokens[2], tok::plus, TT_OverloadedOperator);1098 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_OverloadedOperatorLParen);1099 EXPECT_TOKEN(Tokens[5], tok::star, TT_BinaryOperator);1100 EXPECT_TOKEN(Tokens[9], tok::amp, TT_BinaryOperator);1101 EXPECT_TOKEN(Tokens[13], tok::kw_operator, TT_Unknown);1102 EXPECT_TOKEN(Tokens[14], tok::plus, TT_OverloadedOperator);1103 EXPECT_TOKEN(Tokens[15], tok::l_paren, TT_OverloadedOperatorLParen);1104 EXPECT_TOKEN(Tokens[17], tok::ampamp, TT_BinaryOperator);1105 EXPECT_TOKEN(Tokens[19], tok::ampamp, TT_BinaryOperator);1106 1107 Tokens = annotate("class Foo {\n"1108 " void foo() {\n"1109 " operator+(a * b);\n"1110 " }\n"1111 "}");1112 ASSERT_EQ(Tokens.size(), 19u) << Tokens;1113 EXPECT_TOKEN(Tokens[8], tok::kw_operator, TT_Unknown);1114 EXPECT_TOKEN(Tokens[9], tok::plus, TT_OverloadedOperator);1115 EXPECT_TOKEN(Tokens[10], tok::l_paren, TT_OverloadedOperatorLParen);1116 EXPECT_TOKEN(Tokens[12], tok::star, TT_BinaryOperator);1117 1118 Tokens = annotate("std::vector<Foo> operator()(Foo &foo);");1119 ASSERT_EQ(Tokens.size(), 16u) << Tokens;1120 EXPECT_TOKEN(Tokens[3], tok::less, TT_TemplateOpener);1121 EXPECT_TOKEN(Tokens[5], tok::greater, TT_TemplateCloser);1122 EXPECT_TOKEN(Tokens[6], tok::kw_operator, TT_FunctionDeclarationName);1123 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_OverloadedOperator);1124 EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_OverloadedOperator);1125 EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_OverloadedOperatorLParen);1126 EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);1127 1128 Tokens = annotate("decltype(auto) operator()(T &x);");1129 ASSERT_EQ(Tokens.size(), 14u) << Tokens;1130 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_TypeDeclarationParen);1131 EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_TypeDeclarationParen);1132 EXPECT_TOKEN(Tokens[4], tok::kw_operator, TT_FunctionDeclarationName);1133 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_OverloadedOperator);1134 EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_OverloadedOperator);1135 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_OverloadedOperatorLParen);1136 EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);1137 1138 Tokens = annotate("friend ostream& ::operator<<(ostream& lhs, foo& rhs);");1139 ASSERT_EQ(Tokens.size(), 17u) << Tokens;1140 EXPECT_TOKEN(Tokens[4], tok::kw_operator, TT_FunctionDeclarationName);1141 EXPECT_TOKEN(Tokens[5], tok::lessless, TT_OverloadedOperator);1142 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_OverloadedOperatorLParen);1143 EXPECT_TOKEN(Tokens[8], tok::amp, TT_PointerOrReference);1144 EXPECT_TOKEN(Tokens[12], tok::amp, TT_PointerOrReference);1145 1146 Tokens = annotate("::foo::bar& ::foo::bar::operator=(::foo::bar& other);");1147 ASSERT_EQ(Tokens.size(), 22u) << Tokens;1148 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_FunctionDeclarationName);1149 EXPECT_TOKEN(Tokens[17], tok::amp, TT_PointerOrReference);1150 1151 Tokens = annotate("SomeLoooooooooooooooooType::Awaitable\n"1152 "SomeLoooooooooooooooooType::operator co_await();");1153 ASSERT_EQ(Tokens.size(), 11u) << Tokens;1154 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_FunctionDeclarationName);1155 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_OverloadedOperatorLParen);1156 1157 Tokens = annotate("using std::operator==;");1158 ASSERT_EQ(Tokens.size(), 7u) << Tokens;1159 // Not TT_FunctionDeclarationName.1160 EXPECT_TOKEN(Tokens[3], tok::kw_operator, TT_Unknown);1161 1162 Tokens = annotate("SomeAPI::operator()();");1163 ASSERT_EQ(Tokens.size(), 9u) << Tokens;1164 // Not TT_FunctionDeclarationName.1165 EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_Unknown);1166}1167 1168TEST_F(TokenAnnotatorTest, OverloadedOperatorInTemplate) {1169 struct {1170 const char *Text;1171 tok::TokenKind Kind;1172 } Operators[] = {{"+", tok::plus},1173 {"-", tok::minus},1174 // FIXME:1175 // {"*", tok::star},1176 {"/", tok::slash},1177 {"%", tok::percent},1178 {"^", tok::caret},1179 // FIXME:1180 // {"&", tok::amp},1181 {"|", tok::pipe},1182 {"~", tok::tilde},1183 {"!", tok::exclaim},1184 {"=", tok::equal},1185 // FIXME:1186 // {"<", tok::less},1187 {">", tok::greater},1188 {"+=", tok::plusequal},1189 {"-=", tok::minusequal},1190 {"*=", tok::starequal},1191 {"/=", tok::slashequal},1192 {"%=", tok::percentequal},1193 {"^=", tok::caretequal},1194 {"&=", tok::ampequal},1195 {"|=", tok::pipeequal},1196 {"<<", tok::lessless},1197 {">>", tok::greatergreater},1198 {">>=", tok::greatergreaterequal},1199 {"<<=", tok::lesslessequal},1200 {"==", tok::equalequal},1201 {"!=", tok::exclaimequal},1202 {"<=", tok::lessequal},1203 {">=", tok::greaterequal},1204 {"<=>", tok::spaceship},1205 {"&&", tok::ampamp},1206 {"||", tok::pipepipe},1207 {"++", tok::plusplus},1208 {"--", tok::minusminus},1209 {",", tok::comma},1210 {"->*", tok::arrowstar},1211 {"->", tok::arrow}};1212 1213 for (const auto &Operator : Operators) {1214 std::string Input("C<&operator");1215 Input += Operator.Text;1216 Input += " > a;";1217 auto Tokens = annotate(std::string(Input));1218 ASSERT_EQ(Tokens.size(), 9u) << Tokens;1219 EXPECT_TOKEN(Tokens[1], tok::less, TT_TemplateOpener);1220 EXPECT_TOKEN(Tokens[4], Operator.Kind, TT_OverloadedOperator);1221 EXPECT_TOKEN(Tokens[5], tok::greater, TT_TemplateCloser);1222 }1223 1224 auto Tokens = annotate("C<&operator< <X>> lt;");1225 ASSERT_EQ(Tokens.size(), 12u) << Tokens;1226 EXPECT_TOKEN(Tokens[1], tok::less, TT_TemplateOpener);1227 EXPECT_TOKEN(Tokens[4], tok::less, TT_OverloadedOperator);1228 EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener);1229 EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);1230 EXPECT_TOKEN(Tokens[8], tok::greater, TT_TemplateCloser);1231}1232 1233TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) {1234 auto Tokens = annotate("template <typename T>\n"1235 "concept C = (Foo && Bar) && (Bar && Baz);");1236 1237 ASSERT_EQ(Tokens.size(), 21u) << Tokens;1238 EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);1239 EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);1240 EXPECT_TOKEN(Tokens[16], tok::ampamp, TT_BinaryOperator);1241 1242 Tokens = annotate("template <typename T>\n"1243 "concept C = Foo && !Bar;");1244 1245 ASSERT_EQ(Tokens.size(), 14u) << Tokens;1246 EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_BinaryOperator);1247 EXPECT_TOKEN(Tokens[10], tok::exclaim, TT_UnaryOperator);1248 1249 Tokens = annotate("template <typename T>\n"1250 "concept C = requires(T t) {\n"1251 " { t.foo() };\n"1252 "} && Bar<T> && Baz<T>;");1253 ASSERT_EQ(Tokens.size(), 35u) << Tokens;1254 EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);1255 EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);1256 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);1257 EXPECT_TOKEN(Tokens[23], tok::ampamp, TT_BinaryOperator);1258 EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);1259 1260 Tokens = annotate("template<typename T>\n"1261 "requires C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>\n"1262 "struct Foo;");1263 ASSERT_EQ(Tokens.size(), 36u) << Tokens;1264 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);1265 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);1266 EXPECT_EQ(Tokens[6]->FakeLParens.size(), 1u);1267 EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);1268 EXPECT_TOKEN(Tokens[16], tok::pipepipe, TT_BinaryOperator);1269 EXPECT_TOKEN(Tokens[21], tok::ampamp, TT_BinaryOperator);1270 EXPECT_TOKEN(Tokens[27], tok::ampamp, TT_BinaryOperator);1271 // Not TT_TrailingAnnotation.1272 EXPECT_TOKEN(Tokens[28], tok::identifier, TT_Unknown);1273 EXPECT_TOKEN(Tokens[31], tok::greater, TT_TemplateCloser);1274 EXPECT_EQ(Tokens[31]->FakeRParens, 1u);1275 EXPECT_TRUE(Tokens[31]->ClosesRequiresClause);1276 // Not TT_TrailingAnnotation.1277 EXPECT_TOKEN(Tokens[33], tok::identifier, TT_Unknown);1278 1279 Tokens =1280 annotate("template <typename T>\n"1281 " requires(C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>)\n"1282 "struct Foo;");1283 ASSERT_EQ(Tokens.size(), 38u) << Tokens;1284 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);1285 EXPECT_TOKEN(Tokens[7], tok::identifier, TT_Unknown);1286 EXPECT_EQ(Tokens[7]->FakeLParens.size(), 1u);1287 EXPECT_TOKEN(Tokens[11], tok::ampamp, TT_BinaryOperator);1288 EXPECT_TOKEN(Tokens[17], tok::pipepipe, TT_BinaryOperator);1289 EXPECT_TOKEN(Tokens[22], tok::ampamp, TT_BinaryOperator);1290 EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);1291 EXPECT_TOKEN(Tokens[32], tok::greater, TT_TemplateCloser);1292 EXPECT_EQ(Tokens[32]->FakeRParens, 1u);1293 EXPECT_TOKEN(Tokens[33], tok::r_paren, TT_Unknown);1294 EXPECT_TRUE(Tokens[33]->ClosesRequiresClause);1295 EXPECT_TOKEN(Tokens[35], tok::identifier, TT_Unknown);1296 1297 Tokens = annotate("template <typename T>\n"1298 "void foo(T) noexcept requires Bar<T>;");1299 ASSERT_EQ(Tokens.size(), 18u) << Tokens;1300 EXPECT_TOKEN(Tokens[11], tok::kw_requires, TT_RequiresClause);1301 1302 Tokens = annotate("template <typename T>\n"1303 "requires Bar<T> || Baz<T>\n"1304 "auto foo(T) -> int;");1305 ASSERT_EQ(Tokens.size(), 24u) << Tokens;1306 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);1307 EXPECT_EQ(Tokens[11]->FakeLParens.size(), 0u);1308 EXPECT_TRUE(Tokens[14]->ClosesRequiresClause);1309 EXPECT_TOKEN(Tokens[20], tok::arrow, TT_TrailingReturnArrow);1310 1311 Tokens = annotate("template <typename T>\n"1312 "requires Bar<T>\n"1313 "bool foo(T) { return false; }");1314 ASSERT_EQ(Tokens.size(), 21u) << Tokens;1315 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);1316 EXPECT_TRUE(Tokens[9]->ClosesRequiresClause);1317 EXPECT_TOKEN(Tokens[11], tok::identifier, TT_FunctionDeclarationName);1318 EXPECT_TOKEN(Tokens[12], tok::l_paren, TT_FunctionDeclarationLParen);1319 1320 Tokens = annotate("template <typename T>\n"1321 "requires Bar<T>\n"1322 "decltype(auto) foo(T) { return false; }");1323 ASSERT_EQ(Tokens.size(), 24u) << Tokens;1324 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);1325 EXPECT_TRUE(Tokens[9]->ClosesRequiresClause);1326 EXPECT_TOKEN(Tokens[14], tok::identifier, TT_FunctionDeclarationName);1327 EXPECT_TOKEN(Tokens[15], tok::l_paren, TT_FunctionDeclarationLParen);1328 1329 Tokens = annotate("template <typename T>\n"1330 "struct S {\n"1331 " void foo() const requires Bar<T>;\n"1332 " void bar() const & requires Baz<T>;\n"1333 " void bar() && requires Baz2<T>;\n"1334 " void baz() const & noexcept requires Baz<T>;\n"1335 " void baz() && noexcept requires Baz2<T>;\n"1336 "};\n"1337 "\n"1338 "void S::bar() const & requires Baz<T> { }");1339 ASSERT_EQ(Tokens.size(), 85u) << Tokens;1340 EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);1341 EXPECT_TOKEN(Tokens[24], tok::amp, TT_PointerOrReference);1342 EXPECT_TOKEN(Tokens[25], tok::kw_requires, TT_RequiresClause);1343 EXPECT_TOKEN(Tokens[35], tok::ampamp, TT_PointerOrReference);1344 EXPECT_TOKEN(Tokens[36], tok::kw_requires, TT_RequiresClause);1345 EXPECT_TOKEN(Tokens[47], tok::amp, TT_PointerOrReference);1346 EXPECT_TOKEN(Tokens[49], tok::kw_requires, TT_RequiresClause);1347 EXPECT_TOKEN(Tokens[59], tok::ampamp, TT_PointerOrReference);1348 EXPECT_TOKEN(Tokens[61], tok::kw_requires, TT_RequiresClause);1349 EXPECT_TOKEN(Tokens[76], tok::amp, TT_PointerOrReference);1350 EXPECT_TOKEN(Tokens[77], tok::kw_requires, TT_RequiresClause);1351 1352 Tokens = annotate("void Class::member() && requires(Constant) {}");1353 ASSERT_EQ(Tokens.size(), 14u) << Tokens;1354 EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);1355 1356 Tokens = annotate("void Class::member() && requires(Constant<T>) {}");1357 ASSERT_EQ(Tokens.size(), 17u) << Tokens;1358 EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);1359 1360 Tokens =1361 annotate("void Class::member() && requires(Namespace::Constant<T>) {}");1362 ASSERT_EQ(Tokens.size(), 19u) << Tokens;1363 EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);1364 1365 Tokens = annotate("void Class::member() && requires(typename "1366 "Namespace::Outer<T>::Inner::Constant) {}");1367 ASSERT_EQ(Tokens.size(), 24u) << Tokens;1368 EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);1369 1370 Tokens = annotate("struct [[nodiscard]] zero_t {\n"1371 " template<class T>\n"1372 " requires requires { number_zero_v<T>; }\n"1373 " [[nodiscard]] constexpr operator T() const { "1374 "return number_zero_v<T>; }\n"1375 "};");1376 ASSERT_EQ(Tokens.size(), 44u) << Tokens;1377 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_ClassHeadName);1378 EXPECT_TOKEN(Tokens[11], tok::identifier, TT_Unknown);1379 EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);1380 EXPECT_TOKEN(Tokens[14], tok::kw_requires, TT_RequiresExpression);1381 EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_RequiresExpressionLBrace);1382 EXPECT_TOKEN(Tokens[21], tok::r_brace, TT_Unknown);1383 EXPECT_EQ(Tokens[21]->MatchingParen, Tokens[15]);1384 EXPECT_TRUE(Tokens[21]->ClosesRequiresClause);1385 1386 Tokens = annotate("template <typename Foo>\n"1387 "void Fun(const Foo &F)\n"1388 " requires requires(Foo F) {\n"1389 " { F.Bar() } -> std::same_as<int>;\n"1390 " };");1391 ASSERT_EQ(Tokens.size(), 38u) << Tokens;1392 EXPECT_TOKEN(Tokens[19], tok::l_brace, TT_RequiresExpressionLBrace);1393 1394 Tokens =1395 annotate("template <typename... Ts>\n"1396 " requires requires {\n"1397 " requires std::same_as<int, SomeTemplate<void(Ts &&...)>>;\n"1398 " }\n"1399 "void Foo();");1400 ASSERT_EQ(Tokens.size(), 34u) << Tokens;1401 EXPECT_TOKEN(Tokens[21], tok::ampamp, TT_PointerOrReference);1402 1403 Tokens =1404 annotate("template <class A, class B> concept C ="1405 "std::same_as<std::iter_value_t<A>, std::iter_value_t<B>>;");1406 ASSERT_EQ(Tokens.size(), 31u) << Tokens;1407 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown);1408 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);1409 EXPECT_TOKEN(Tokens[8], tok::kw_concept, TT_Unknown);1410 EXPECT_TOKEN(Tokens[14], tok::less, TT_TemplateOpener);1411 EXPECT_TOKEN(Tokens[18], tok::less, TT_TemplateOpener);1412 EXPECT_TOKEN(Tokens[20], tok::greater, TT_TemplateCloser);1413 EXPECT_TOKEN(Tokens[25], tok::less, TT_TemplateOpener);1414 EXPECT_TOKEN(Tokens[27], tok::greater, TT_TemplateCloser);1415 EXPECT_TOKEN(Tokens[28], tok::greater, TT_TemplateCloser);1416 1417 Tokens = annotate("auto bar() -> int requires(is_integral_v<T>) {}");1418 ASSERT_EQ(Tokens.size(), 16u) << Tokens;1419 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);1420 1421 Tokens = annotate("auto bar() -> void requires(is_integral_v<T>) {}");1422 ASSERT_EQ(Tokens.size(), 16u) << Tokens;1423 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);1424 1425 Tokens = annotate("auto bar() -> MyType requires(is_integral_v<T>) {}");1426 ASSERT_EQ(Tokens.size(), 16u) << Tokens;1427 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);1428 1429 Tokens =1430 annotate("auto bar() -> SOME_MACRO_TYPE requires(is_integral_v<T>) {}");1431 ASSERT_EQ(Tokens.size(), 16u) << Tokens;1432 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);1433 1434 Tokens =1435 annotate("auto bar() -> qualified::type requires(is_integral_v<T>) {}");1436 ASSERT_EQ(Tokens.size(), 18u) << Tokens;1437 EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresClause);1438 1439 Tokens =1440 annotate("auto bar() -> Template<type> requires(is_integral_v<T>) {}");1441 ASSERT_EQ(Tokens.size(), 19u) << Tokens;1442 EXPECT_TOKEN(Tokens[9], tok::kw_requires, TT_RequiresClause);1443 1444 Tokens = annotate("void foo() requires((A<T>) && C) {}");1445 ASSERT_EQ(Tokens.size(), 18u) << Tokens;1446 EXPECT_TOKEN(Tokens[4], tok::kw_requires, TT_RequiresClause);1447 EXPECT_TOKEN(Tokens[12], tok::ampamp, TT_BinaryOperator);1448 1449 Tokens = annotate("void foo() requires(((A<T>) && C)) {}");1450 ASSERT_EQ(Tokens.size(), 20u) << Tokens;1451 EXPECT_TOKEN(Tokens[4], tok::kw_requires, TT_RequiresClause);1452 EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);1453 1454 Tokens = annotate("void foo() requires([](T&&){}(t)) {}");1455 ASSERT_EQ(Tokens.size(), 21u) << Tokens;1456 EXPECT_TOKEN(Tokens[4], tok::kw_requires, TT_RequiresClause);1457 EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);1458 1459 Tokens = annotate("void foo() requires([](T&& u){}(t)) {}");1460 ASSERT_EQ(Tokens.size(), 22u) << Tokens;1461 EXPECT_TOKEN(Tokens[4], tok::kw_requires, TT_RequiresClause);1462 EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);1463 1464 Tokens = annotate("void f() & requires(true) {}");1465 ASSERT_EQ(Tokens.size(), 12u) << Tokens;1466 EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference);1467 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);1468 1469 Tokens = annotate("void f() & requires(C<true, true>) {}");1470 ASSERT_EQ(Tokens.size(), 17u) << Tokens;1471 EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference);1472 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);1473 1474 Tokens = annotate("template <typename T>\n"1475 "concept C = (!Foo<T>) && Bar;");1476 ASSERT_EQ(Tokens.size(), 19u) << Tokens;1477 EXPECT_TOKEN(Tokens[15], tok::ampamp, TT_BinaryOperator);1478 1479 Tokens = annotate("void f() & requires(C<decltype(x)>) {}");1480 ASSERT_EQ(Tokens.size(), 18u) << Tokens;1481 EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference);1482 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);1483 1484 Tokens = annotate("auto f() -> int& requires(C<decltype(x)>) {}");1485 ASSERT_EQ(Tokens.size(), 20u) << Tokens;1486 EXPECT_TOKEN(Tokens[6], tok::amp, TT_PointerOrReference);1487 EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);1488 1489 Tokens = annotate("bool x = t && requires(decltype(t) x) { x.foo(); };");1490 ASSERT_EQ(Tokens.size(), 23u) << Tokens;1491 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresExpression);1492 1493 Tokens = annotate("bool x = t && requires(Foo<decltype(t)> x) { x.foo(); };");1494 ASSERT_EQ(Tokens.size(), 26u) << Tokens;1495 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresExpression);1496 1497 Tokens = annotate("bool x = t && requires(Foo<C1 || C2> x) { x.foo(); };");1498 ASSERT_EQ(Tokens.size(), 25u) << Tokens;1499 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresExpression);1500 1501 // Second function definition is required due to lookahead1502 Tokens = annotate("void f() &\n"1503 " requires(n == 1)\n"1504 "{}\n"1505 "void g();");1506 ASSERT_EQ(Tokens.size(), 19u) << Tokens;1507 EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference);1508 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);1509 1510 Tokens = annotate("void foo() &&\n"1511 " requires(!bar)\n"1512 "{\n"1513 " baz();\n"1514 "}");1515 ASSERT_EQ(Tokens.size(), 17u) << Tokens;1516 EXPECT_TOKEN(Tokens[4], tok::ampamp, TT_PointerOrReference);1517 EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);1518 1519 Tokens = annotate("auto foo() -> auto *\n"1520 " requires(not bar)\n"1521 "{\n"1522 " return baz;\n"1523 "}");1524 ASSERT_EQ(Tokens.size(), 18u) << Tokens;1525 EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);1526 EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_FunctionLBrace);1527}1528 1529TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) {1530 auto Tokens = annotate("bool b = requires(int i) { i + 5; };");1531 ASSERT_EQ(Tokens.size(), 16u) << Tokens;1532 EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);1533 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);1534 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);1535 1536 Tokens = annotate("bool foo{requires { 0; }};");1537 ASSERT_EQ(Tokens.size(), 11u) << Tokens;1538 EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);1539 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_RequiresExpressionLBrace);1540 1541 Tokens = annotate("if (requires(int i) { i + 5; }) return;");1542 ASSERT_EQ(Tokens.size(), 17u) << Tokens;1543 EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);1544 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);1545 EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_RequiresExpressionLBrace);1546 1547 Tokens = annotate("if (func() && requires(int i) { i + 5; }) return;");1548 ASSERT_EQ(Tokens.size(), 21u) << Tokens;1549 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresExpression);1550 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_RequiresExpressionLParen);1551 EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_RequiresExpressionLBrace);1552 1553 Tokens = annotate("foo(requires(const T t) {});");1554 ASSERT_EQ(Tokens.size(), 13u) << Tokens;1555 EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);1556 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);1557 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);1558 1559 Tokens = annotate("foo(requires(const int t) {});");1560 ASSERT_EQ(Tokens.size(), 13u) << Tokens;1561 EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);1562 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);1563 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);1564 1565 Tokens = annotate("foo(requires(const T t) {});");1566 ASSERT_EQ(Tokens.size(), 13u) << Tokens;1567 EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);1568 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);1569 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);1570 1571 Tokens = annotate("foo(requires(int const* volatile t) {});");1572 ASSERT_EQ(Tokens.size(), 15u) << Tokens;1573 EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);1574 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);1575 EXPECT_TOKEN(Tokens[6], tok::star, TT_PointerOrReference);1576 EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace);1577 1578 Tokens = annotate("foo(requires(T const* volatile t) {});");1579 ASSERT_EQ(Tokens.size(), 15u) << Tokens;1580 EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);1581 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);1582 EXPECT_TOKEN(Tokens[6], tok::star, TT_PointerOrReference);1583 EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace);1584 1585 Tokens = annotate("foo(requires(T& t) {});");1586 ASSERT_EQ(Tokens.size(), 13u) << Tokens;1587 EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);1588 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);1589 EXPECT_TOKEN(Tokens[5], tok::amp, TT_PointerOrReference);1590 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);1591 1592 Tokens = annotate("foo(requires(T&& t) {});");1593 ASSERT_EQ(Tokens.size(), 13u) << Tokens;1594 EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);1595 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);1596 EXPECT_TOKEN(Tokens[5], tok::ampamp, TT_PointerOrReference);1597 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);1598 1599 Tokens = annotate("bool foo = requires(T& t) {};");1600 ASSERT_EQ(Tokens.size(), 13u) << Tokens;1601 EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);1602 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);1603 EXPECT_TOKEN(Tokens[6], tok::amp, TT_PointerOrReference);1604 EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_RequiresExpressionLBrace);1605 1606 Tokens = annotate("bool foo = requires(T&& t) {};");1607 ASSERT_EQ(Tokens.size(), 13u) << Tokens;1608 EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);1609 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);1610 EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_PointerOrReference);1611 EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_RequiresExpressionLBrace);1612 1613 Tokens =1614 annotate("foo(requires(const typename Outer<T>::Inner * const t) {});");1615 ASSERT_EQ(Tokens.size(), 21u) << Tokens;1616 EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);1617 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);1618 EXPECT_TOKEN(Tokens[12], tok::star, TT_PointerOrReference);1619 EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_RequiresExpressionLBrace);1620 1621 Tokens = annotate("template <typename T>\n"1622 "concept C = requires(T T) {\n"1623 " requires Bar<T> && Foo<T>;\n"1624 "};");1625 ASSERT_EQ(Tokens.size(), 28u) << Tokens;1626 EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);1627 EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);1628 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);1629 EXPECT_TOKEN(Tokens[14], tok::kw_requires,1630 TT_RequiresClauseInARequiresExpression);1631 1632 Tokens = annotate("template <typename T>\n"1633 "concept C = requires(T T) {\n"1634 " { t.func() } -> std::same_as<int>;"1635 " requires Bar<T> && Foo<T>;\n"1636 "};");1637 ASSERT_EQ(Tokens.size(), 43u) << Tokens;1638 EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);1639 EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);1640 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);1641 EXPECT_TOKEN(Tokens[29], tok::kw_requires,1642 TT_RequiresClauseInARequiresExpression);1643 1644 // Invalid Code, but we don't want to crash. See http://llvm.org/PR54350.1645 Tokens = annotate("bool r10 = requires (struct new_struct { int x; } s) { "1646 "requires true; };");1647 ASSERT_EQ(Tokens.size(), 21u) << Tokens;1648 EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);1649 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);1650 EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_RequiresExpressionLBrace);1651 1652 Tokens = annotate("bool foo = requires(C<true, true> c) {\n"1653 " { c.foo(); }\n"1654 "};");1655 ASSERT_EQ(Tokens.size(), 25u) << Tokens;1656 EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);1657 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);1658 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);1659}1660 1661TEST_F(TokenAnnotatorTest, UnderstandsPragmaRegion) {1662 // Everything after #pragma region should be ImplicitStringLiteral1663 auto Tokens = annotate("#pragma region Foo(Bar: Hello)");1664 ASSERT_EQ(Tokens.size(), 10u) << Tokens;1665 EXPECT_TOKEN(Tokens[5], tok::identifier, TT_ImplicitStringLiteral);1666 EXPECT_TOKEN(Tokens[6], tok::colon, TT_ImplicitStringLiteral);1667 EXPECT_TOKEN(Tokens[7], tok::identifier, TT_ImplicitStringLiteral);1668 1669 // Make sure it's annotated correctly inside a function as well1670 Tokens = annotate("void test(){\n#pragma region Foo(Bar: Hello)\n}");1671 ASSERT_EQ(Tokens.size(), 16u) << Tokens;1672 EXPECT_TOKEN(Tokens[10], tok::identifier, TT_ImplicitStringLiteral);1673 EXPECT_TOKEN(Tokens[11], tok::colon, TT_ImplicitStringLiteral);1674 EXPECT_TOKEN(Tokens[12], tok::identifier, TT_ImplicitStringLiteral);1675}1676 1677TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) {1678 const char *BaseCode = nullptr;1679 const char *ConstrainedCode = nullptr;1680 auto BaseTokenCount = 0u;1681 auto RequiresTokenCount = 0u;1682 auto PrefixTokenCount = 0u;1683 1684 auto TestRequires = [&](int Line) {1685 const auto BaseTokens = annotate(BaseCode);1686 const auto ConstrainedTokens = annotate(ConstrainedCode);1687 1688#define LINE " (Line " << Line << ')'1689 1690 ASSERT_EQ(BaseTokens.size(), BaseTokenCount) << BaseTokens << LINE;1691 ASSERT_EQ(ConstrainedTokens.size(), BaseTokenCount + RequiresTokenCount)1692 << LINE;1693 1694 for (auto I = 0u; I < BaseTokenCount; ++I) {1695 EXPECT_EQ(1696 *BaseTokens[I],1697 *ConstrainedTokens[I < PrefixTokenCount ? I : I + RequiresTokenCount])1698 << I << LINE;1699 }1700 1701#undef LINE1702 };1703 1704 BaseCode = "template<typename T>\n"1705 "T Pi = 3.14;";1706 ConstrainedCode = "template<typename T>\n"1707 " requires Foo<T>\n"1708 "T Pi = 3.14;";1709 BaseTokenCount = 11;1710 RequiresTokenCount = 5;1711 PrefixTokenCount = 5;1712 TestRequires(__LINE__);1713 1714 BaseCode = "template<typename T>\n"1715 "struct Bar;";1716 ConstrainedCode = "template<typename T>\n"1717 " requires Foo<T>\n"1718 "struct Bar;";1719 BaseTokenCount = 9;1720 TestRequires(__LINE__);1721 1722 BaseCode = "template<typename T>\n"1723 "struct Bar {\n"1724 " T foo();\n"1725 " T bar();\n"1726 "};";1727 ConstrainedCode = "template<typename T>\n"1728 " requires Foo<T>\n"1729 "struct Bar {\n"1730 " T foo();\n"1731 " T bar();\n"1732 "};";1733 BaseTokenCount = 21;1734 TestRequires(__LINE__);1735 1736 BaseCode = "template<typename T>\n"1737 "Bar(T) -> Bar<T>;";1738 ConstrainedCode = "template<typename T>\n"1739 " requires Foo<T>\n"1740 "Bar(T) -> Bar<T>;";1741 BaseTokenCount = 16;1742 TestRequires(__LINE__);1743 1744 BaseCode = "template<typename T>\n"1745 "T foo();";1746 ConstrainedCode = "template<typename T>\n"1747 " requires Foo<T>\n"1748 "T foo();";1749 BaseTokenCount = 11;1750 TestRequires(__LINE__);1751 1752 BaseCode = "template<typename T>\n"1753 "T foo() {\n"1754 " auto bar = baz();\n"1755 " return bar + T{};\n"1756 "}";1757 ConstrainedCode = "template<typename T>\n"1758 " requires Foo<T>\n"1759 "T foo() {\n"1760 " auto bar = baz();\n"1761 " return bar + T{};\n"1762 "}";1763 BaseTokenCount = 26;1764 TestRequires(__LINE__);1765 1766 BaseCode = "template<typename T>\n"1767 "T foo();";1768 ConstrainedCode = "template<typename T>\n"1769 "T foo() requires Foo<T>;";1770 BaseTokenCount = 11;1771 PrefixTokenCount = 9;1772 TestRequires(__LINE__);1773 1774 BaseCode = "template<typename T>\n"1775 "T foo() {\n"1776 " auto bar = baz();\n"1777 " return bar + T{};\n"1778 "}";1779 ConstrainedCode = "template<typename T>\n"1780 "T foo() requires Foo<T> {\n"1781 " auto bar = baz();\n"1782 " return bar + T{};\n"1783 "}";1784 BaseTokenCount = 26;1785 TestRequires(__LINE__);1786 1787 BaseCode = "template<typename T>\n"1788 "T foo();";1789 ConstrainedCode = "template<typename T>\n"1790 " requires(Foo<T>)\n"1791 "T foo();";1792 BaseTokenCount = 11;1793 RequiresTokenCount = 7;1794 PrefixTokenCount = 5;1795 TestRequires(__LINE__);1796 1797 BaseCode = "template<typename T>\n"1798 "Bar(T) -> Bar<typename T::I>;";1799 ConstrainedCode = "template<typename T>\n"1800 " requires requires(T &&t) {\n"1801 " typename T::I;\n"1802 " }\n"1803 "Bar(T) -> Bar<typename T::I>;";1804 BaseTokenCount = 19;1805 RequiresTokenCount = 14;1806 PrefixTokenCount = 5;1807 TestRequires(__LINE__);1808 1809 BaseCode = "struct [[nodiscard]] zero_t {\n"1810 " template<class T>\n"1811 " [[nodiscard]] constexpr operator T() const { return v<T>; }\n"1812 "};";1813 ConstrainedCode =1814 "struct [[nodiscard]] zero_t {\n"1815 " template<class T>\n"1816 " requires requires { v<T>; }\n"1817 " [[nodiscard]] constexpr operator T() const { return v<T>; }\n"1818 "};";1819 BaseTokenCount = 35;1820 RequiresTokenCount = 9;1821 PrefixTokenCount = 13;1822 TestRequires(__LINE__);1823 1824 BaseCode = "constexpr Foo(Foo const &other)\n"1825 " : value{other.value} {\n"1826 " do_magic();\n"1827 " do_more_magic();\n"1828 "}";1829 ConstrainedCode = "constexpr Foo(Foo const &other)\n"1830 " requires std::is_copy_constructible<T>\n"1831 " : value{other.value} {\n"1832 " do_magic();\n"1833 " do_more_magic();\n"1834 "}";1835 BaseTokenCount = 26;1836 RequiresTokenCount = 7;1837 PrefixTokenCount = 8;1838 TestRequires(__LINE__);1839 1840 BaseCode = "constexpr Foo(Foo const &other)\n"1841 " : value{other.value} {\n"1842 " do_magic();\n"1843 " do_more_magic();\n"1844 "}";1845 ConstrainedCode = "constexpr Foo(Foo const &other)\n"1846 " requires (std::is_copy_constructible<T>)\n"1847 " : value{other.value} {\n"1848 " do_magic();\n"1849 " do_more_magic();\n"1850 "}";1851 RequiresTokenCount = 9;1852 TestRequires(__LINE__);1853 1854 BaseCode = "template<typename T>\n"1855 "ANNOTATE(\"S\"\n"1856 " \"S\")\n"1857 "void foo();";1858 ConstrainedCode = "template<typename T>\n"1859 " requires(true)\n"1860 "ANNOTATE(\"S\"\n"1861 " \"S\")\n"1862 "void foo();";1863 BaseTokenCount = 16;1864 RequiresTokenCount = 4;1865 PrefixTokenCount = 5;1866 TestRequires(__LINE__);1867}1868 1869TEST_F(TokenAnnotatorTest, UnderstandsAsm) {1870 auto Tokens = annotate("__asm{\n"1871 "\"a\":\n"1872 ": x\n"1873 ":};");1874 ASSERT_EQ(Tokens.size(), 10u) << Tokens;1875 EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);1876 EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_InlineASMBrace);1877 EXPECT_TOKEN(Tokens[3], tok::colon, TT_InlineASMColon);1878 EXPECT_TOKEN(Tokens[4], tok::colon, TT_InlineASMColon);1879 EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);1880 EXPECT_TOKEN(Tokens[7], tok::r_brace, TT_InlineASMBrace);1881 1882 Tokens = annotate("__asm(\n"1883 "\"a\":\n"1884 ": x\n"1885 ":);");1886 ASSERT_EQ(Tokens.size(), 10u) << Tokens;1887 EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);1888 EXPECT_TOKEN(Tokens[3], tok::colon, TT_InlineASMColon);1889 EXPECT_TOKEN(Tokens[4], tok::colon, TT_InlineASMColon);1890 EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);1891 1892 Tokens = annotate("asm volatile (\n"1893 "\"a_label:\"\n"1894 ":\n"1895 ": x\n"1896 ":);");1897 ASSERT_EQ(Tokens.size(), 11u) << Tokens;1898 EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);1899 EXPECT_TOKEN(Tokens[4], tok::colon, TT_InlineASMColon);1900 EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);1901 EXPECT_TOKEN(Tokens[7], tok::colon, TT_InlineASMColon);1902 1903 Tokens = annotate("__asm__(\n"1904 "\"a_label:\"\n"1905 ": x\n"1906 ":\n"1907 ": y);");1908 ASSERT_EQ(Tokens.size(), 11u) << Tokens;1909 EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);1910 EXPECT_TOKEN(Tokens[3], tok::colon, TT_InlineASMColon);1911 EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);1912 EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);1913 1914 Tokens = annotate("__asm volatile (\n"1915 "\"a_label:\"\n"1916 "\"a b c(%%x)\"\n"1917 ":\n"1918 ": x\n"1919 ":);");1920 ASSERT_EQ(Tokens.size(), 12u) << Tokens;1921 EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);1922 EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);1923 EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);1924 EXPECT_TOKEN(Tokens[8], tok::colon, TT_InlineASMColon);1925 1926 Tokens = annotate("asm(\n"1927 "\"insn\"\n"1928 ": \"=r\" (var1), \"=&r\" (value)\n"1929 ":\n"1930 ": \"memory\");");1931 ASSERT_EQ(Tokens.size(), 19u) << Tokens;1932 EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);1933 EXPECT_TOKEN(Tokens[3], tok::colon, TT_InlineASMColon);1934 EXPECT_TOKEN(Tokens[13], tok::colon, TT_InlineASMColon);1935 EXPECT_TOKEN(Tokens[14], tok::colon, TT_InlineASMColon);1936 1937 Tokens = annotate("__asm__ volatile (\n"1938 "\"ldr r1, [r0, %%[sym]]\"\n"1939 ":\n"1940 ": [sym] \"J\" (aaaaa(aaaa, aaaa))\n"1941 ");");1942 ASSERT_EQ(Tokens.size(), 21u) << Tokens;1943 EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);1944 EXPECT_TOKEN(Tokens[4], tok::colon, TT_InlineASMColon);1945 EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);1946 EXPECT_TOKEN(Tokens[6], tok::l_square, TT_InlineASMSymbolicNameLSquare);1947}1948 1949TEST_F(TokenAnnotatorTest, UnderstandsObjCBlock) {1950 auto Tokens = annotate("int (^)() = ^ ()\n"1951 " external_source_symbol() { //\n"1952 " return 1;\n"1953 "};");1954 ASSERT_EQ(Tokens.size(), 21u) << Tokens;1955 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ObjCBlockLParen);1956 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_ObjCBlockLBrace);1957 1958 Tokens = annotate("int *p = ^int*(){ //\n"1959 " return nullptr;\n"1960 "}();");1961 ASSERT_EQ(Tokens.size(), 19u) << Tokens;1962 EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_ObjCBlockLBrace);1963 1964 Tokens = annotate("id (^block)(Foo *a) = ^id _Nullable(Foo *_Nullable a) {\n"1965 " return a;\n"1966 "};");1967 ASSERT_EQ(Tokens.size(), 27u) << Tokens;1968 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown); // Not CtorDtorDeclName.1969 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ObjCBlockLParen);1970}1971 1972TEST_F(TokenAnnotatorTest, UnderstandsObjCMethodExpr) {1973 auto Tokens = annotate("void f() {\n"1974 " //\n"1975 " BOOL a = [b.c n] > 1;\n"1976 "}");1977 ASSERT_EQ(Tokens.size(), 20u) << Tokens;1978 EXPECT_TOKEN(Tokens[9], tok::l_square, TT_ObjCMethodExpr);1979 EXPECT_TOKEN(Tokens[15], tok::greater, TT_BinaryOperator);1980 1981 Tokens = annotate("a = @selector(name:);");1982 ASSERT_EQ(Tokens.size(), 10u) << Tokens;1983 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_ObjCSelector);1984 EXPECT_TOKEN(Tokens[6], tok::colon, TT_ObjCSelector);1985 EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_ObjCSelector);1986 1987 Tokens =1988 annotate("[object respondsToSelector:@selector(name:param1:param2:)\n"1989 " respondsToSelector:@selector(name:param1:param2:)];");1990 ASSERT_EQ(Tokens.size(), 29u) << Tokens;1991 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_ObjCMethodExpr);1992 EXPECT_TOKEN(Tokens[3], tok::colon, TT_ObjCMethodExpr);1993 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_ObjCSelector);1994 EXPECT_TOKEN(Tokens[8], tok::colon, TT_ObjCSelector);1995 EXPECT_TOKEN(Tokens[10], tok::colon, TT_ObjCSelector);1996 EXPECT_TOKEN(Tokens[12], tok::colon, TT_ObjCSelector);1997 EXPECT_TOKEN(Tokens[13], tok::r_paren, TT_ObjCSelector);1998 EXPECT_TOKEN(Tokens[15], tok::colon, TT_ObjCMethodExpr);1999 EXPECT_TOKEN(Tokens[18], tok::l_paren, TT_ObjCSelector);2000 EXPECT_TOKEN(Tokens[20], tok::colon, TT_ObjCSelector);2001 EXPECT_TOKEN(Tokens[22], tok::colon, TT_ObjCSelector);2002 EXPECT_TOKEN(Tokens[24], tok::colon, TT_ObjCSelector);2003 EXPECT_TOKEN(Tokens[25], tok::r_paren, TT_ObjCSelector);2004 EXPECT_TOKEN(Tokens[26], tok::r_square, TT_ObjCMethodExpr);2005 2006 Tokens = annotate("[a b:c];");2007 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2008 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_ObjCMethodExpr);2009 EXPECT_TOKEN(Tokens[3], tok::colon, TT_ObjCMethodExpr);2010 EXPECT_TOKEN(Tokens[5], tok::r_square, TT_ObjCMethodExpr);2011}2012 2013TEST_F(TokenAnnotatorTest, UnderstandsObjCMethodDecl) {2014 auto Tokens = annotate("/**/ - (void)foo;");2015 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2016 EXPECT_TOKEN(Tokens[1], tok::minus, TT_ObjCMethodSpecifier);2017 EXPECT_TOKEN(Tokens[5], tok::identifier, TT_SelectorName);2018}2019 2020TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {2021 auto Tokens = annotate("[]() constexpr {}");2022 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2023 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2024 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);2025 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);2026 2027 Tokens = annotate("[]() consteval {}");2028 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2029 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2030 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);2031 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);2032 2033 Tokens = annotate("[]() mutable {}");2034 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2035 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2036 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);2037 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);2038 2039 Tokens = annotate("[]() static {}");2040 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2041 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2042 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);2043 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);2044 2045 Tokens = annotate("[]() -> auto {}");2046 ASSERT_EQ(Tokens.size(), 9u) << Tokens;2047 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2048 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);2049 EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);2050 EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_LambdaLBrace);2051 2052 Tokens = annotate("[]() -> auto & {}");2053 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2054 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2055 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);2056 EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);2057 EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);2058 2059 Tokens = annotate("[]() -> auto * {}");2060 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2061 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2062 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);2063 EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);2064 EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);2065 2066 Tokens = annotate("[] {}");2067 ASSERT_EQ(Tokens.size(), 5u) << Tokens;2068 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2069 EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_LambdaLBrace);2070 2071 Tokens = annotate("[] noexcept {}");2072 ASSERT_EQ(Tokens.size(), 6u) << Tokens;2073 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2074 EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_LambdaLBrace);2075 2076 Tokens = annotate("[] -> auto {}");2077 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2078 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2079 EXPECT_TOKEN(Tokens[2], tok::arrow, TT_LambdaArrow);2080 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_LambdaLBrace);2081 2082 Tokens = annotate("[] -> struct S { return {}; }");2083 ASSERT_EQ(Tokens.size(), 12u) << Tokens;2084 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2085 EXPECT_TOKEN(Tokens[2], tok::arrow, TT_LambdaArrow);2086 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_Unknown);2087 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);2088 2089 Tokens = annotate("foo([&](u32 bar) __attribute__((attr)) -> void {});");2090 ASSERT_EQ(Tokens.size(), 22u) << Tokens;2091 EXPECT_TOKEN(Tokens[2], tok::l_square, TT_LambdaLSquare);2092 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_LambdaDefinitionLParen);2093 EXPECT_TOKEN(Tokens[15], tok::arrow, TT_LambdaArrow);2094 EXPECT_TOKEN(Tokens[17], tok::l_brace, TT_LambdaLBrace);2095 2096 Tokens = annotate("[] <typename T> () {}");2097 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2098 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2099 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2100 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_LambdaDefinitionLParen);2101 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_LambdaLBrace);2102 2103 Tokens = annotate("[] <typename T> {}");2104 ASSERT_EQ(Tokens.size(), 9u) << Tokens;2105 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2106 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2107 EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_LambdaLBrace);2108 2109 Tokens = annotate("[] <typename... T> () {}");2110 ASSERT_EQ(Tokens.size(), 12u) << Tokens;2111 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2112 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2113 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_LambdaDefinitionLParen);2114 EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);2115 2116 Tokens = annotate("[] <typename... T> {}");2117 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2118 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2119 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2120 EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);2121 2122 Tokens = annotate("[] <int... T> () {}");2123 ASSERT_EQ(Tokens.size(), 12u) << Tokens;2124 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2125 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2126 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_LambdaDefinitionLParen);2127 EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);2128 2129 Tokens = annotate("[] <int... T> {}");2130 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2131 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2132 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2133 EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);2134 2135 Tokens = annotate("[] <Foo... T> () {}");2136 ASSERT_EQ(Tokens.size(), 12u) << Tokens;2137 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2138 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2139 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_LambdaDefinitionLParen);2140 EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);2141 2142 Tokens = annotate("[] <Foo... T> {}");2143 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2144 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2145 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2146 EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);2147 2148 // Lambdas with a requires-clause2149 Tokens = annotate("[] <typename T> (T t) requires Bar<T> {}");2150 ASSERT_EQ(Tokens.size(), 18u) << Tokens;2151 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2152 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2153 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_LambdaDefinitionLParen);2154 EXPECT_TOKEN(Tokens[10], tok::kw_requires, TT_RequiresClause);2155 EXPECT_TRUE(Tokens[14]->ClosesRequiresClause);2156 EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_LambdaLBrace);2157 2158 Tokens = annotate("[] <typename T> (T &&t) requires Bar<T> {}");2159 ASSERT_EQ(Tokens.size(), 19u) << Tokens;2160 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2161 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2162 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_LambdaDefinitionLParen);2163 EXPECT_TOKEN(Tokens[8], tok::ampamp, TT_PointerOrReference);2164 EXPECT_TOKEN(Tokens[11], tok::kw_requires, TT_RequiresClause);2165 EXPECT_TRUE(Tokens[15]->ClosesRequiresClause);2166 EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_LambdaLBrace);2167 2168 Tokens = annotate("[] <typename T> (T t) requires Foo<T> || Bar<T> {}");2169 ASSERT_EQ(Tokens.size(), 23u) << Tokens;2170 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2171 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2172 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_LambdaDefinitionLParen);2173 EXPECT_TOKEN(Tokens[10], tok::kw_requires, TT_RequiresClause);2174 EXPECT_TRUE(Tokens[19]->ClosesRequiresClause);2175 EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);2176 2177 Tokens = annotate("[] <typename T> (T t) -> T requires Bar<T> {}");2178 ASSERT_EQ(Tokens.size(), 20u) << Tokens;2179 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2180 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2181 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_LambdaDefinitionLParen);2182 EXPECT_TOKEN(Tokens[10], tok::arrow, TT_LambdaArrow);2183 EXPECT_TOKEN(Tokens[12], tok::kw_requires, TT_RequiresClause);2184 EXPECT_TRUE(Tokens[16]->ClosesRequiresClause);2185 EXPECT_TOKEN(Tokens[17], tok::l_brace, TT_LambdaLBrace);2186 2187 Tokens = annotate("[] <typename T> requires Bar<T> (T t) {}");2188 ASSERT_EQ(Tokens.size(), 18u) << Tokens;2189 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2190 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2191 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);2192 EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);2193 // FIXME:2194 // EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_LambdaDefinitionLParen);2195 EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_LambdaLBrace);2196 2197 Tokens = annotate("[] <typename T> requires Bar<T> (T &&t) {}");2198 ASSERT_EQ(Tokens.size(), 19u) << Tokens;2199 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2200 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2201 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);2202 EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);2203 // FIXME:2204 // EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_LambdaDefinitionLParen);2205 EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_PointerOrReference);2206 EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_LambdaLBrace);2207 2208 Tokens = annotate("[] <typename T> requires Foo<T> || Bar<T> (T t) {}");2209 ASSERT_EQ(Tokens.size(), 23u) << Tokens;2210 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2211 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2212 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);2213 EXPECT_TRUE(Tokens[15]->ClosesRequiresClause);2214 // FIXME:2215 // EXPECT_TOKEN(Tokens[16], tok::l_paren, TT_LambdaDefinitionLParen);2216 EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);2217 2218 Tokens = annotate("[] <typename T> requires true (T&& t) {}");2219 ASSERT_EQ(Tokens.size(), 16u) << Tokens;2220 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2221 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2222 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);2223 EXPECT_TRUE(Tokens[7]->ClosesRequiresClause);2224 // FIXME:2225 // EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_LambdaDefinitionLParen);2226 EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);2227 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_LambdaLBrace);2228 2229 Tokens = annotate("[] <typename T> requires Bar<T> {}");2230 ASSERT_EQ(Tokens.size(), 14u) << Tokens;2231 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2232 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2233 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);2234 EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);2235 EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_LambdaLBrace);2236 2237 Tokens = annotate("[] <typename T> requires Bar<T> noexcept {}");2238 ASSERT_EQ(Tokens.size(), 15u) << Tokens;2239 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2240 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2241 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);2242 EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);2243 EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_LambdaLBrace);2244 2245 Tokens = annotate("[] <typename T> requires Bar<T> -> T {}");2246 ASSERT_EQ(Tokens.size(), 16u) << Tokens;2247 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2248 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2249 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);2250 EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);2251 EXPECT_TOKEN(Tokens[11], tok::arrow, TT_LambdaArrow);2252 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_LambdaLBrace);2253 2254 Tokens = annotate("[] <typename T> requires Foo<T> (T t) requires Bar<T> {}");2255 ASSERT_EQ(Tokens.size(), 23u) << Tokens;2256 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2257 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2258 EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);2259 EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);2260 // FIXME:2261 // EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_LambdaDefinitionLParen);2262 EXPECT_TOKEN(Tokens[15], tok::kw_requires, TT_RequiresClause);2263 EXPECT_TRUE(Tokens[19]->ClosesRequiresClause);2264 EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);2265 2266 Tokens = annotate("[] <typename T = int> (T t) {}");2267 ASSERT_EQ(Tokens.size(), 15u) << Tokens;2268 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2269 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2270 EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);2271 EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_LambdaDefinitionLParen);2272 EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_LambdaLBrace);2273 2274 Tokens = annotate("[] <int I = 0> (T t) {}");2275 ASSERT_EQ(Tokens.size(), 15u) << Tokens;2276 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2277 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2278 EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);2279 EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_LambdaDefinitionLParen);2280 EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_LambdaLBrace);2281 2282 Tokens = annotate("[] <bool b = false> (T t) {}");2283 ASSERT_EQ(Tokens.size(), 15u) << Tokens;2284 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2285 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2286 EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);2287 EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_LambdaDefinitionLParen);2288 EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_LambdaLBrace);2289 2290 Tokens = annotate("[] <bool b = true && false> (T&& t) {}");2291 ASSERT_EQ(Tokens.size(), 18u) << Tokens;2292 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2293 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2294 EXPECT_TOKEN(Tokens[7], tok::ampamp, TT_BinaryOperator);2295 EXPECT_TOKEN(Tokens[9], tok::greater, TT_TemplateCloser);2296 EXPECT_TOKEN(Tokens[10], tok::l_paren, TT_LambdaDefinitionLParen);2297 EXPECT_TOKEN(Tokens[12], tok::ampamp, TT_PointerOrReference);2298 EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_LambdaLBrace);2299 2300 Tokens = annotate("[] <typename T = int> requires Foo<T> (T t) {}");2301 ASSERT_EQ(Tokens.size(), 20u) << Tokens;2302 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);2303 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);2304 EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);2305 EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresClause);2306 // FIXME:2307 // EXPECT_TOKEN(Tokens[13], tok::l_paren, TT_LambdaDefinitionLParen);2308 EXPECT_TOKEN(Tokens[17], tok::l_brace, TT_LambdaLBrace);2309 2310 Tokens = annotate("auto foo{(std::function<int()>)[] { return 0; }};");2311 ASSERT_EQ(Tokens.size(), 23u) << Tokens;2312 EXPECT_TOKEN(Tokens[13], tok::l_square, TT_LambdaLSquare);2313 EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_LambdaLBrace);2314 2315 Tokens = annotate("auto foo{(int (*)())[] { return 0; }};");2316 ASSERT_EQ(Tokens.size(), 21u) << Tokens;2317 EXPECT_TOKEN(Tokens[11], tok::l_square, TT_LambdaLSquare);2318 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_LambdaLBrace);2319 2320 Tokens = annotate("SomeFunction({[]() -> int *[] { return {}; }});");2321 ASSERT_EQ(Tokens.size(), 22u) << Tokens;2322 EXPECT_TOKEN(Tokens[3], tok::l_square, TT_LambdaLSquare);2323 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_LambdaDefinitionLParen);2324 EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare);2325}2326 2327TEST_F(TokenAnnotatorTest, UnderstandsFunctionAnnotations) {2328 auto Tokens = annotate("template <typename T>\n"2329 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"2330 "string OldFunction(const string ¶meter) {}");2331 ASSERT_EQ(Tokens.size(), 20u) << Tokens;2332 EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_FunctionAnnotationRParen);2333 2334 Tokens = annotate("template <typename T>\n"2335 "A(T) noexcept;");2336 ASSERT_EQ(Tokens.size(), 12u) << Tokens;2337 EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_Unknown);2338 2339 Tokens = annotate("FOO(bar)();");2340 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2341 EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_Unknown);2342}2343 2344TEST_F(TokenAnnotatorTest, UnderstandsFunctionDeclarationNames) {2345 auto Tokens = annotate("void f [[noreturn]] ();");2346 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2347 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);2348 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_FunctionDeclarationLParen);2349 2350 Tokens = annotate("void f [[noreturn]] () {}");2351 ASSERT_EQ(Tokens.size(), 12u) << Tokens;2352 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);2353 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_FunctionDeclarationLParen);2354 2355 Tokens = annotate("#define FOO Foo::\n"2356 "FOO Foo();");2357 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2358 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_FunctionDeclarationName);2359 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_FunctionDeclarationLParen);2360 2361 Tokens = annotate("struct Foo {\n"2362 " Bar (*func)();\n"2363 "};");2364 ASSERT_EQ(Tokens.size(), 14u) << Tokens;2365 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown);2366 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_FunctionTypeLParen);2367 2368 Tokens = annotate("void instanceof();");2369 ASSERT_EQ(Tokens.size(), 6u) << Tokens;2370 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);2371 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);2372 2373 Tokens = annotate("#define FUNC(foo, bar, baz) \\\n"2374 " auto foo##bar##baz() -> Type {}");2375 ASSERT_EQ(Tokens.size(), 23u) << Tokens;2376 EXPECT_TOKEN(Tokens[11], tok::identifier, TT_FunctionDeclarationName);2377 EXPECT_TOKEN(Tokens[16], tok::l_paren, TT_FunctionDeclarationLParen);2378 EXPECT_TOKEN(Tokens[18], tok::arrow, TT_TrailingReturnArrow);2379 2380 Tokens = annotate("void __stdcall f();");2381 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2382 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_FunctionDeclarationName);2383 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_FunctionDeclarationLParen);2384 2385 Tokens = annotate("int iso_time(time_t);");2386 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2387 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);2388 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);2389 2390 auto Style = getLLVMStyle();2391 Style.TypeNames.push_back("MyType");2392 Tokens = annotate("int iso_time(MyType);", Style);2393 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2394 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);2395 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);2396 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_TypeName);2397}2398 2399TEST_F(TokenAnnotatorTest, UnderstandsCtorAndDtorDeclNames) {2400 auto Tokens = annotate("class Foo { public: Foo(); };");2401 ASSERT_EQ(Tokens.size(), 12u) << Tokens;2402 EXPECT_TOKEN(Tokens[5], tok::identifier, TT_CtorDtorDeclName);2403 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_FunctionDeclarationLParen);2404 2405 Tokens = annotate("class Foo { public: ~Foo(); };");2406 ASSERT_EQ(Tokens.size(), 13u) << Tokens;2407 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_CtorDtorDeclName);2408 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_FunctionDeclarationLParen);2409 2410 Tokens = annotate("struct Foo { [[deprecated]] Foo() {} };");2411 ASSERT_EQ(Tokens.size(), 16u) << Tokens;2412 EXPECT_TOKEN(Tokens[8], tok::identifier, TT_CtorDtorDeclName);2413 EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_FunctionDeclarationLParen);2414 EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_FunctionLBrace);2415 2416 Tokens = annotate("struct Foo { [[deprecated]] ~Foo() {} };");2417 ASSERT_EQ(Tokens.size(), 17u) << Tokens;2418 EXPECT_TOKEN(Tokens[9], tok::identifier, TT_CtorDtorDeclName);2419 EXPECT_TOKEN(Tokens[10], tok::l_paren, TT_FunctionDeclarationLParen);2420 EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_FunctionLBrace);2421 2422 Tokens = annotate("struct Foo { Foo() [[deprecated]] {} };");2423 ASSERT_EQ(Tokens.size(), 16u) << Tokens;2424 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_CtorDtorDeclName);2425 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_FunctionDeclarationLParen);2426 EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_FunctionLBrace);2427 2428 Tokens = annotate("struct Foo { ~Foo() [[deprecated]] {} };");2429 ASSERT_EQ(Tokens.size(), 17u) << Tokens;2430 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_CtorDtorDeclName);2431 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_FunctionDeclarationLParen);2432 EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_FunctionLBrace);2433 2434 Tokens = annotate("struct Foo { [[deprecated]] explicit Foo() {} };");2435 ASSERT_EQ(Tokens.size(), 17u) << Tokens;2436 EXPECT_TOKEN(Tokens[9], tok::identifier, TT_CtorDtorDeclName);2437 EXPECT_TOKEN(Tokens[10], tok::l_paren, TT_FunctionDeclarationLParen);2438 EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_FunctionLBrace);2439 2440 Tokens = annotate("struct Foo { virtual [[deprecated]] ~Foo() {} };");2441 ASSERT_EQ(Tokens.size(), 18u) << Tokens;2442 EXPECT_TOKEN(Tokens[10], tok::identifier, TT_CtorDtorDeclName);2443 EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_FunctionDeclarationLParen);2444 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_FunctionLBrace);2445 2446 Tokens = annotate("Foo::Foo() {}");2447 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2448 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_CtorDtorDeclName);2449 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_FunctionDeclarationLParen);2450 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_FunctionLBrace);2451 2452 Tokens = annotate("Foo::~Foo() {}");2453 ASSERT_EQ(Tokens.size(), 9u) << Tokens;2454 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_CtorDtorDeclName);2455 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_FunctionDeclarationLParen);2456 EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_FunctionLBrace);2457 2458 Tokens = annotate("struct Test {\n"2459 " Test()\n"2460 " : l([] {\n"2461 " Short::foo();\n"2462 " }) {}\n"2463 "};");2464 ASSERT_EQ(Tokens.size(), 25u) << Tokens;2465 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_CtorDtorDeclName);2466 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_FunctionDeclarationLParen);2467 EXPECT_TOKEN(Tokens[14], tok::identifier, TT_Unknown);2468}2469 2470TEST_F(TokenAnnotatorTest, UnderstandsC11GenericSelection) {2471 auto Tokens = annotate("_Generic(x, int: 1, default: 0)");2472 ASSERT_EQ(Tokens.size(), 13u) << Tokens;2473 EXPECT_TOKEN(Tokens[0], tok::kw__Generic, TT_Unknown);2474 EXPECT_TOKEN(Tokens[5], tok::colon, TT_GenericSelectionColon);2475 EXPECT_TOKEN(Tokens[9], tok::colon, TT_GenericSelectionColon);2476}2477 2478TEST_F(TokenAnnotatorTest, UnderstandsTrailingReturnArrow) {2479 auto Tokens = annotate("auto f() -> int;");2480 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2481 EXPECT_TOKEN(Tokens[4], tok::arrow, TT_TrailingReturnArrow);2482 2483 Tokens = annotate("auto operator->() -> int;");2484 ASSERT_EQ(Tokens.size(), 9u) << Tokens;2485 EXPECT_TOKEN(Tokens[2], tok::arrow, TT_OverloadedOperator);2486 EXPECT_TOKEN(Tokens[5], tok::arrow, TT_TrailingReturnArrow);2487 2488 Tokens = annotate("auto operator++(int) -> int;");2489 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2490 EXPECT_TOKEN(Tokens[6], tok::arrow, TT_TrailingReturnArrow);2491 2492 Tokens = annotate("auto operator=() -> int;");2493 ASSERT_EQ(Tokens.size(), 9u) << Tokens;2494 EXPECT_TOKEN(Tokens[5], tok::arrow, TT_TrailingReturnArrow);2495 2496 Tokens = annotate("auto operator=(int) -> int;");2497 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2498 EXPECT_TOKEN(Tokens[6], tok::arrow, TT_TrailingReturnArrow);2499 2500 Tokens = annotate("auto foo() -> auto { return Val; }");2501 ASSERT_EQ(Tokens.size(), 12u) << Tokens;2502 EXPECT_TOKEN(Tokens[4], tok::arrow, TT_TrailingReturnArrow);2503 2504 Tokens = annotate("struct S { auto bar() const -> int; };");2505 ASSERT_EQ(Tokens.size(), 14u) << Tokens;2506 EXPECT_TOKEN(Tokens[8], tok::arrow, TT_TrailingReturnArrow);2507 2508 // Not trailing return arrows2509 Tokens = annotate("auto a = b->c;");2510 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2511 EXPECT_TOKEN(Tokens[4], tok::arrow, TT_Unknown);2512 2513 Tokens = annotate("auto a = (b)->c;");2514 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2515 EXPECT_TOKEN(Tokens[6], tok::arrow, TT_Unknown);2516 2517 Tokens = annotate("auto a = b()->c;");2518 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2519 EXPECT_TOKEN(Tokens[6], tok::arrow, TT_Unknown);2520 2521 Tokens = annotate("auto a = b->c();");2522 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2523 EXPECT_TOKEN(Tokens[4], tok::arrow, TT_Unknown);2524 2525 Tokens = annotate("decltype(auto) a = b()->c;");2526 ASSERT_EQ(Tokens.size(), 13u) << Tokens;2527 EXPECT_TOKEN(Tokens[9], tok::arrow, TT_Unknown);2528 2529 Tokens = annotate("void f() { auto a = b->c(); }");2530 ASSERT_EQ(Tokens.size(), 16u) << Tokens;2531 EXPECT_TOKEN(Tokens[9], tok::arrow, TT_Unknown);2532 2533 Tokens = annotate("void f() { auto a = b()->c; }");2534 ASSERT_EQ(Tokens.size(), 16u) << Tokens;2535 EXPECT_TOKEN(Tokens[11], tok::arrow, TT_Unknown);2536 2537 Tokens = annotate("#define P(ptr) auto p = (ptr)->p");2538 ASSERT_EQ(Tokens.size(), 15u) << Tokens;2539 EXPECT_TOKEN(Tokens[12], tok::arrow, TT_Unknown);2540 2541 Tokens = annotate("void f() FOO(foo->bar);");2542 ASSERT_EQ(Tokens.size(), 12u) << Tokens;2543 EXPECT_TOKEN(Tokens[7], tok::arrow, TT_Unknown);2544 2545 Tokens = annotate("__attribute__((cold)) C() : Base(obj->func()) {}");2546 ASSERT_EQ(Tokens.size(), 21u) << Tokens;2547 EXPECT_TOKEN(Tokens[13], tok::arrow, TT_Unknown);2548 2549 Tokens = annotate("Class<Type>{foo}->func(arg);");2550 ASSERT_EQ(Tokens.size(), 14u) << Tokens;2551 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_Unknown); // Not FunctionLBrace2552 EXPECT_BRACE_KIND(Tokens[4], BK_BracedInit);2553 EXPECT_BRACE_KIND(Tokens[6], BK_BracedInit);2554 EXPECT_TOKEN(Tokens[7], tok::arrow, TT_Unknown);2555 2556 auto Style = getLLVMStyle();2557 Style.StatementAttributeLikeMacros.push_back("emit");2558 Tokens = annotate("emit foo()->bar;", Style);2559 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2560 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_StatementAttributeLikeMacro);2561 EXPECT_TOKEN(Tokens[4], tok::arrow, TT_Unknown);2562 2563 // Mixed2564 Tokens = annotate("auto f() -> int { auto a = b()->c; }");2565 ASSERT_EQ(Tokens.size(), 18u) << Tokens;2566 EXPECT_TOKEN(Tokens[4], tok::arrow, TT_TrailingReturnArrow);2567 EXPECT_TOKEN(Tokens[13], tok::arrow, TT_Unknown);2568}2569 2570TEST_F(TokenAnnotatorTest, UnderstandHashInMacro) {2571 auto Tokens = annotate("#define Foo(Bar) \\\n"2572 " { \\\n"2573 " #Bar \\\n"2574 " }");2575 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2576 EXPECT_BRACE_KIND(Tokens[6], BK_BracedInit);2577 EXPECT_BRACE_KIND(Tokens[9], BK_BracedInit);2578 2579 Tokens = annotate("#define Foo(Bar) \\\n"2580 " { #Bar }");2581 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2582 EXPECT_BRACE_KIND(Tokens[6], BK_BracedInit);2583 EXPECT_BRACE_KIND(Tokens[9], BK_BracedInit);2584 2585 Tokens = annotate("#define FOO(typeName, realClass) \\\n"2586 " {#typeName, foo<Foo>(new foo<realClass>(#typeName))}");2587 ASSERT_EQ(Tokens.size(), 29u) << Tokens;2588 EXPECT_BRACE_KIND(Tokens[8], BK_BracedInit);2589 EXPECT_BRACE_KIND(Tokens[27], BK_BracedInit);2590}2591 2592TEST_F(TokenAnnotatorTest, UnderstandsAttributeMacros) {2593 // '__attribute__' has special handling.2594 auto Tokens = annotate("__attribute__((X)) void Foo(void);");2595 ASSERT_EQ(Tokens.size(), 13u) << Tokens;2596 EXPECT_TOKEN(Tokens[0], tok::kw___attribute, TT_Unknown);2597 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_AttributeLParen);2598 EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_AttributeRParen);2599 2600 // Generic macro has no special handling in this location.2601 Tokens = annotate("A(X) void Foo(void);");2602 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2603 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);2604 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_Unknown);2605 2606 // Add a custom AttributeMacro. Test that it has the same behavior.2607 FormatStyle Style = getLLVMStyle();2608 Style.AttributeMacros.push_back("A");2609 2610 // An "AttributeMacro" gets annotated like '__attribute__'.2611 Tokens = annotate("A(X) void Foo(void);", Style);2612 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2613 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_AttributeMacro);2614 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_AttributeLParen);2615 EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_AttributeRParen);2616}2617 2618TEST_F(TokenAnnotatorTest, UnderstandsAttributeMacrosOnObjCDecl) {2619 // '__attribute__' has special handling.2620 auto Tokens = annotate("__attribute__((X)) @interface Foo");2621 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2622 EXPECT_TOKEN(Tokens[0], tok::kw___attribute, TT_Unknown);2623 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_AttributeLParen);2624 EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_AttributeRParen);2625 2626 // Generic macro has no special handling in this location.2627 Tokens = annotate("A(X) @interface Foo");2628 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2629 // Note: Don't check token-type as a random token in this position is hard to2630 // reason about.2631 EXPECT_TOKEN_KIND(Tokens[0], tok::identifier);2632 EXPECT_TOKEN_KIND(Tokens[1], tok::l_paren);2633 2634 // Add a custom AttributeMacro. Test that it has the same behavior.2635 FormatStyle Style = getLLVMStyle();2636 Style.AttributeMacros.push_back("A");2637 2638 // An "AttributeMacro" gets annotated like '__attribute__'.2639 Tokens = annotate("A(X) @interface Foo", Style);2640 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2641 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_AttributeMacro);2642 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_AttributeLParen);2643 EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_AttributeRParen);2644}2645 2646TEST_F(TokenAnnotatorTest, UnderstandsAttributeMacrosOnObjCMethodDecl) {2647 // '__attribute__' has special handling.2648 auto Tokens = annotate("- (id)init __attribute__((X));");2649 ASSERT_EQ(Tokens.size(), 13u) << Tokens;2650 EXPECT_TOKEN(Tokens[5], tok::kw___attribute, TT_Unknown);2651 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_AttributeLParen);2652 EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_AttributeRParen);2653 2654 // Generic macro has no special handling in this location.2655 Tokens = annotate("- (id)init A(X);");2656 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2657 // Note: Don't check token-type as a random token in this position is hard to2658 // reason about.2659 EXPECT_TOKEN_KIND(Tokens[5], tok::identifier);2660 EXPECT_TOKEN_KIND(Tokens[6], tok::l_paren);2661 2662 // Add a custom AttributeMacro. Test that it has the same behavior.2663 FormatStyle Style = getLLVMStyle();2664 Style.AttributeMacros.push_back("A");2665 2666 // An "AttributeMacro" gets annotated like '__attribute__'.2667 Tokens = annotate("- (id)init A(X);", Style);2668 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2669 EXPECT_TOKEN(Tokens[5], tok::identifier, TT_AttributeMacro);2670 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_AttributeLParen);2671 EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_AttributeRParen);2672}2673 2674TEST_F(TokenAnnotatorTest, UnderstandsAttributeMacrosOnObjCProperty) {2675 // '__attribute__' has special handling.2676 auto Tokens = annotate("@property(weak) id delegate __attribute__((X));");2677 ASSERT_EQ(Tokens.size(), 15u) << Tokens;2678 EXPECT_TOKEN(Tokens[7], tok::kw___attribute, TT_Unknown);2679 EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_AttributeLParen);2680 EXPECT_TOKEN(Tokens[12], tok::r_paren, TT_AttributeRParen);2681 2682 // Generic macro has no special handling in this location.2683 Tokens = annotate("@property(weak) id delegate A(X);");2684 ASSERT_EQ(Tokens.size(), 13u) << Tokens;2685 // Note: Don't check token-type as a random token in this position is hard to2686 // reason about.2687 EXPECT_TOKEN_KIND(Tokens[7], tok::identifier);2688 EXPECT_TOKEN_KIND(Tokens[8], tok::l_paren);2689 2690 // Add a custom AttributeMacro. Test that it has the same behavior.2691 FormatStyle Style = getLLVMStyle();2692 Style.AttributeMacros.push_back("A");2693 2694 // An "AttributeMacro" gets annotated like '__attribute__'.2695 Tokens = annotate("@property(weak) id delegate A(X);", Style);2696 ASSERT_EQ(Tokens.size(), 13u) << Tokens;2697 EXPECT_TOKEN(Tokens[7], tok::identifier, TT_AttributeMacro);2698 EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_AttributeLParen);2699 EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_AttributeRParen);2700}2701 2702TEST_F(TokenAnnotatorTest, UnderstandsVerilogOperators) {2703 auto Annotate = [this](StringRef Code) {2704 return annotate(Code, getLLVMStyle(FormatStyle::LK_Verilog));2705 };2706 // Test that unary operators get labeled as such and that operators like '++'2707 // don't get split.2708 tok::TokenKind Unary[] = {tok::plus, tok::minus, tok::exclaim,2709 tok::tilde, tok::amp, tok::pipe,2710 tok::caret, tok::plusplus, tok::minusminus};2711 for (auto Kind : Unary) {2712 auto Tokens =2713 Annotate(std::string("x = ") + tok::getPunctuatorSpelling(Kind) + "x;");2714 ASSERT_EQ(Tokens.size(), 6u) << Tokens;2715 EXPECT_TOKEN(Tokens[2], Kind, TT_UnaryOperator);2716 }2717 // Operators formed by joining two operators like '^~'. For some of these2718 // joined operators, we don't have a separate type, so we only test for their2719 // precedence.2720 std::pair<prec::Level, std::string> JoinedBinary[] = {2721 {prec::Comma, "->"}, {prec::Comma, "<->"},2722 {prec::Comma, "#-#"}, {prec::Comma, "#=#"},2723 {prec::Assignment, "+="}, {prec::Assignment, "-="},2724 {prec::Assignment, "*="}, {prec::Assignment, "/="},2725 {prec::Assignment, "%="}, {prec::Assignment, "&="},2726 {prec::Assignment, "^="}, {prec::Assignment, "<<="},2727 {prec::Assignment, ">>="}, {prec::Assignment, "<<<="},2728 {prec::Assignment, ">>>="}, {prec::LogicalOr, "||"},2729 {prec::LogicalAnd, "&&"}, {prec::Equality, "=="},2730 {prec::Equality, "!="}, {prec::Equality, "==="},2731 {prec::Equality, "!=="}, {prec::Equality, "==?"},2732 {prec::Equality, "!=?"}, {prec::ExclusiveOr, "~^"},2733 {prec::ExclusiveOr, "^~"},2734 };2735 for (auto Operator : JoinedBinary) {2736 auto Tokens = Annotate(std::string("x = x ") + Operator.second + " x;");2737 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2738 EXPECT_TOKEN_TYPE(Tokens[3], TT_BinaryOperator);2739 EXPECT_TOKEN_PRECEDENCE(Tokens[3], Operator.first);2740 }2741 // '~^' and '^~' can be unary as well as binary operators.2742 auto Tokens = Annotate("x = ~^x;");2743 ASSERT_EQ(Tokens.size(), 6u) << Tokens;2744 EXPECT_TOKEN_TYPE(Tokens[2], TT_UnaryOperator);2745 Tokens = Annotate("x = ^~x;");2746 ASSERT_EQ(Tokens.size(), 6u) << Tokens;2747 EXPECT_TOKEN_TYPE(Tokens[2], TT_UnaryOperator);2748 // The unary operators '~&' and '~|' can only be unary operators. The current2749 // implementation treats each of them as separate unary '~' and '&' or '|'2750 // operators, which is enough for formatting purposes. In FormatTestVerilog,2751 // there is a test that there is no space in between. And even if a new line2752 // is inserted between the '~' and '|', the semantic meaning is the same as2753 // the joined operator, so the CanBreakBefore property doesn't need to be2754 // false for the second operator.2755 Tokens = Annotate("x = ~&x;");2756 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2757 EXPECT_TOKEN(Tokens[2], tok::tilde, TT_UnaryOperator);2758 EXPECT_TOKEN(Tokens[3], tok::amp, TT_UnaryOperator);2759 Tokens = Annotate("x = ~|x;");2760 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2761 EXPECT_TOKEN(Tokens[2], tok::tilde, TT_UnaryOperator);2762 EXPECT_TOKEN(Tokens[3], tok::pipe, TT_UnaryOperator);2763 // Test for block label colons.2764 Tokens = Annotate("begin : x\n"2765 "end : x");2766 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2767 EXPECT_TOKEN(Tokens[1], tok::colon, TT_VerilogBlockLabelColon);2768 EXPECT_TOKEN(Tokens[4], tok::colon, TT_VerilogBlockLabelColon);2769 // Test that the dimension colon is annotated correctly.2770 Tokens = Annotate("var [1 : 0] x;");2771 ASSERT_EQ(Tokens.size(), 9u) << Tokens;2772 EXPECT_TOKEN(Tokens[3], tok::colon, TT_BitFieldColon);2773 Tokens = Annotate("extern function [1 : 0] x;");2774 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2775 EXPECT_TOKEN(Tokens[4], tok::colon, TT_BitFieldColon);2776 Tokens = Annotate("module test\n"2777 " (input wire [7 : 0] a[7 : 0]);\n"2778 "endmodule");2779 ASSERT_EQ(Tokens.size(), 20u) << Tokens;2780 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_VerilogDimensionedTypeName);2781 EXPECT_TOKEN(Tokens[7], tok::colon, TT_BitFieldColon);2782 EXPECT_TOKEN(Tokens[13], tok::colon, TT_BitFieldColon);2783 // Test case labels and ternary operators.2784 Tokens = Annotate("case (x)\n"2785 " x:\n"2786 " x;\n"2787 "endcase");2788 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2789 EXPECT_TOKEN(Tokens[5], tok::colon, TT_CaseLabelColon);2790 Tokens = Annotate("case (x)\n"2791 " x ? x : x:\n"2792 " x;\n"2793 "endcase");2794 ASSERT_EQ(Tokens.size(), 14u) << Tokens;2795 EXPECT_TOKEN(Tokens[5], tok::question, TT_ConditionalExpr);2796 EXPECT_TOKEN(Tokens[7], tok::colon, TT_ConditionalExpr);2797 EXPECT_TOKEN(Tokens[9], tok::colon, TT_CaseLabelColon);2798 // Non-blocking assignments.2799 Tokens = Annotate("a <= b;");2800 ASSERT_EQ(Tokens.size(), 5u) << Tokens;2801 EXPECT_TOKEN(Tokens[1], tok::lessequal, TT_BinaryOperator);2802 EXPECT_TOKEN_PRECEDENCE(Tokens[1], prec::Assignment);2803 Tokens = Annotate("if (a <= b) break;");2804 ASSERT_EQ(Tokens.size(), 9u) << Tokens;2805 EXPECT_TOKEN(Tokens[3], tok::lessequal, TT_BinaryOperator);2806 EXPECT_TOKEN_PRECEDENCE(Tokens[3], prec::Relational);2807 Tokens = Annotate("a <= b <= a;");2808 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2809 EXPECT_TOKEN(Tokens[1], tok::lessequal, TT_BinaryOperator);2810 EXPECT_TOKEN_PRECEDENCE(Tokens[1], prec::Assignment);2811 EXPECT_TOKEN(Tokens[3], tok::lessequal, TT_BinaryOperator);2812 EXPECT_TOKEN_PRECEDENCE(Tokens[3], prec::Relational);2813 2814 // Port lists in module instantiation.2815 Tokens = Annotate("module_x instance_1(port_1), instance_2(port_2);");2816 ASSERT_EQ(Tokens.size(), 12u) << Tokens;2817 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_VerilogInstancePortLParen);2818 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_VerilogInstancePortLParen);2819 Tokens = Annotate("module_x #(parameter) instance_1(port_1), "2820 "instance_2(port_2);");2821 ASSERT_EQ(Tokens.size(), 16u) << Tokens;2822 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_VerilogInstancePortLParen);2823 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_VerilogInstancePortLParen);2824 EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_VerilogInstancePortLParen);2825 2826 // Condition parentheses.2827 Tokens = Annotate("assert (x);");2828 ASSERT_EQ(Tokens.size(), 6u) << Tokens;2829 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ConditionLParen);2830 Tokens = Annotate("assert #0 (x);");2831 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2832 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_ConditionLParen);2833 Tokens = Annotate("assert final (x);");2834 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2835 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_ConditionLParen);2836 Tokens = Annotate("foreach (x[x]) continue;");2837 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2838 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ConditionLParen);2839 Tokens = Annotate("repeat (x[x]) continue;");2840 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2841 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ConditionLParen);2842 Tokens = Annotate("case (x) endcase;");2843 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2844 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ConditionLParen);2845 2846 // Sensitivity list. The TT_Unknown type is clearly not binding for the2847 // future, please adapt if those tokens get annotated. This test is only here2848 // to prevent the comma from being annotated as TT_VerilogInstancePortComma.2849 Tokens = Annotate("always @(posedge x, posedge y);");2850 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2851 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_Unknown);2852 EXPECT_TOKEN(Tokens[5], tok::comma, TT_Unknown);2853 EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_Unknown);2854 2855 // String literals in concatenation.2856 Tokens = Annotate("x = {\"\"};");2857 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2858 EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_StringInConcatenation);2859 Tokens = Annotate("x = {\"\", \"\"};");2860 ASSERT_EQ(Tokens.size(), 9u) << Tokens;2861 EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_StringInConcatenation);2862 EXPECT_TOKEN(Tokens[5], tok::string_literal, TT_StringInConcatenation);2863 Tokens = Annotate("x = '{{\"\"}};");2864 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2865 EXPECT_TOKEN(Tokens[5], tok::string_literal, TT_StringInConcatenation);2866 // Cases where the string should not be annotated that type. Fix the2867 // `TT_Unknown` if needed in the future.2868 Tokens = Annotate("x = {\"\" == \"\"};");2869 ASSERT_EQ(Tokens.size(), 9u) << Tokens;2870 EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_Unknown);2871 EXPECT_TOKEN(Tokens[5], tok::string_literal, TT_Unknown);2872 Tokens = Annotate("x = {(\"\")};");2873 ASSERT_EQ(Tokens.size(), 9u) << Tokens;2874 EXPECT_TOKEN(Tokens[4], tok::string_literal, TT_Unknown);2875 Tokens = Annotate("x = '{\"\"};");2876 ASSERT_EQ(Tokens.size(), 8u) << Tokens;2877 EXPECT_TOKEN(Tokens[4], tok::string_literal, TT_Unknown);2878 2879 // Module headers.2880 Tokens = Annotate("module x();\n"2881 "endmodule");2882 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2883 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_VerilogMultiLineListLParen);2884 Tokens = Annotate("function automatic `x x();\n"2885 "endmodule");2886 ASSERT_EQ(Tokens.size(), 10u) << Tokens;2887 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_VerilogMultiLineListLParen);2888 Tokens = Annotate("function automatic x``x x();\n"2889 "endmodule");2890 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2891 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_VerilogMultiLineListLParen);2892 Tokens = Annotate("function automatic x::x x();\n"2893 "endmodule");2894 ASSERT_EQ(Tokens.size(), 11u) << Tokens;2895 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_VerilogMultiLineListLParen);2896 2897 // Escaped identifiers.2898 Tokens = Annotate(R"(\busa+index)");2899 ASSERT_EQ(Tokens.size(), 2u) << Tokens;2900 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);2901 Tokens = Annotate(R"(\busa+index ;)");2902 ASSERT_EQ(Tokens.size(), 3u) << Tokens;2903 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);2904 EXPECT_EQ(Tokens[0]->TokenText, R"(\busa+index)");2905 EXPECT_TOKEN(Tokens[1], tok::semi, TT_Unknown);2906 Tokens = Annotate(R"(\busa+index2907;)");2908 ASSERT_EQ(Tokens.size(), 3u) << Tokens;2909 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);2910 EXPECT_TOKEN(Tokens[1], tok::semi, TT_Unknown);2911 // The escaped identifier can be broken by an escaped newline. The result is2912 // still 1 identifier.2913 Tokens = Annotate(R"(\busa+index\2914+2915;)");2916 ASSERT_EQ(Tokens.size(), 3u) << Tokens;2917 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);2918 EXPECT_EQ(Tokens[0]->TokenText, R"(\busa+index\2919+)");2920 EXPECT_TOKEN(Tokens[1], tok::semi, TT_Unknown);2921 // An escaped newline should not be treated as an escaped identifier.2922 Tokens = Annotate("\\\n");2923 ASSERT_EQ(Tokens.size(), 1u) << Tokens;2924 EXPECT_TOKEN(Tokens[0], tok::eof, TT_Unknown);2925 // Macros.2926 Tokens = Annotate("`define x x``x");2927 ASSERT_EQ(Tokens.size(), 7u) << Tokens;2928 EXPECT_TOKEN(Tokens[0], tok::hash, TT_Unknown);2929 EXPECT_TOKEN(Tokens[4], tok::hashhash, TT_Unknown);2930}2931 2932TEST_F(TokenAnnotatorTest, UnderstandTableGenTokens) {2933 auto Style = getLLVMStyle(FormatStyle::LK_TableGen);2934 ASSERT_TRUE(Style.isTableGen());2935 2936 TestLexer Lexer(Allocator, Buffers, Style);2937 AdditionalKeywords Keywords(Lexer.IdentTable);2938 auto Annotate = [&Lexer](StringRef Code) { return Lexer.annotate(Code); };2939 2940 // Additional keywords representation test.2941 auto Tokens = Annotate("def foo : Bar<1>;");2942 ASSERT_TRUE(Keywords.isTableGenKeyword(*Tokens[0]));2943 ASSERT_TRUE(Keywords.isTableGenDefinition(*Tokens[0]));2944 ASSERT_TRUE(Tokens[0]->is(Keywords.kw_def));2945 ASSERT_TRUE(Tokens[1]->is(TT_StartOfName));2946 2947 // Code, the multiline string token.2948 Tokens = Annotate("[{ code is multiline string }]");2949 ASSERT_EQ(Tokens.size(), 2u) << Tokens;2950 EXPECT_TOKEN(Tokens[0], tok::string_literal, TT_TableGenMultiLineString);2951 EXPECT_FALSE(Tokens[0]->IsMultiline);2952 // Case with multiple lines.2953 Tokens = Annotate("[{ It can break\n"2954 " across lines and the line breaks\n"2955 " are retained in \n"2956 " the string. }]");2957 ASSERT_EQ(Tokens.size(), 2u) << Tokens;2958 EXPECT_TOKEN(Tokens[0], tok::string_literal, TT_TableGenMultiLineString);2959 EXPECT_EQ(Tokens[0]->ColumnWidth, sizeof("[{ It can break\n") - 1);2960 EXPECT_TRUE(Tokens[0]->IsMultiline);2961 EXPECT_EQ(Tokens[0]->LastLineColumnWidth, sizeof(" the string. }]") - 1);2962 2963 // Numeric literals.2964 Tokens = Annotate("1234");2965 EXPECT_TOKEN(Tokens[0], tok::numeric_constant, TT_Unknown);2966 Tokens = Annotate("-1");2967 EXPECT_TOKEN(Tokens[0], tok::numeric_constant, TT_Unknown);2968 Tokens = Annotate("+1234");2969 EXPECT_TOKEN(Tokens[0], tok::numeric_constant, TT_Unknown);2970 Tokens = Annotate("0b0110");2971 EXPECT_TOKEN(Tokens[0], tok::numeric_constant, TT_Unknown);2972 Tokens = Annotate("0x1abC");2973 EXPECT_TOKEN(Tokens[0], tok::numeric_constant, TT_Unknown);2974 2975 // Identifier tokens. In TableGen, identifiers can begin with a number.2976 // In ambiguous cases, the lexer tries to lex it as a number.2977 // Even if the try fails, it does not fall back to identifier lexing and2978 // regard as an error.2979 // The ambiguity is not documented. The result of those tests are based on the2980 // implementation of llvm::TGLexer::LexToken.2981 // This is invalid syntax of number, but not an identifier.2982 Tokens = Annotate("0x1234x");2983 EXPECT_TOKEN(Tokens[0], tok::numeric_constant, TT_Unknown);2984 Tokens = Annotate("identifier");2985 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);2986 // Identifier beginning with a number.2987 Tokens = Annotate("0x");2988 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);2989 Tokens = Annotate("2dVector");2990 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);2991 Tokens = Annotate("01234Vector");2992 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);2993 2994 // Structured statements.2995 Tokens = Annotate("class Foo {}");2996 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_StartOfName);2997 EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_FunctionLBrace);2998 Tokens = Annotate("def Def: Foo {}");2999 EXPECT_TOKEN(Tokens[2], tok::colon, TT_InheritanceColon);3000 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_FunctionLBrace);3001 Tokens = Annotate("if cond then {} else {}");3002 EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_ControlStatementLBrace);3003 EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_ElseLBrace);3004 Tokens = Annotate("defset Foo Def2 = {}");3005 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_FunctionLBrace);3006 3007 // Bang Operators.3008 Tokens = Annotate("!foreach");3009 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_TableGenBangOperator);3010 Tokens = Annotate("!if");3011 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_TableGenBangOperator);3012 Tokens = Annotate("!cond");3013 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_TableGenCondOperator);3014 3015 // The paste operator should not be treated as a preprocessor directive even3016 // if it is on a separate line.3017 Tokens = Annotate("def x\n"3018 "#embed {}");3019 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3020 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_StartOfName);3021 EXPECT_EQ(Tokens[1]->Next, Tokens[2]);3022 Tokens = Annotate("def x\n"3023 "#define x\n"3024 "#embed {}");3025 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3026 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_StartOfName);3027 EXPECT_EQ(Tokens[1]->Next, Tokens[5]);3028 Tokens = Annotate("def x\n"3029 "#ifdef x\n"3030 "#else\n"3031 "#endif\n"3032 "#embed {}");3033 ASSERT_EQ(Tokens.size(), 14u) << Tokens;3034 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_StartOfName);3035 EXPECT_EQ(Tokens[1]->Next, Tokens[9]);3036 3037 auto AnnotateValue = [this, &Style](StringRef Code) {3038 // Values are annotated only in specific context.3039 auto Result = annotate(("def X { let V = " + Code + "; }").str(), Style);3040 return decltype(Result){Result.begin() + 6, Result.end() - 3};3041 };3042 // Both of bang/cond operators.3043 Tokens = AnnotateValue("!cond(!eq(x, 0): 1, true: x)");3044 ASSERT_EQ(Tokens.size(), 15u) << Tokens;3045 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_TableGenCondOperator);3046 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_TableGenBangOperator);3047 EXPECT_TOKEN(Tokens[8], tok::colon, TT_TableGenCondOperatorColon);3048 EXPECT_TOKEN(Tokens[10], tok::comma, TT_TableGenCondOperatorComma);3049 EXPECT_TOKEN(Tokens[12], tok::colon, TT_TableGenCondOperatorColon);3050 // DAGArg values with operator identifier3051 Tokens = AnnotateValue("(ins type1:$src1, type2:$src2)");3052 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3053 EXPECT_TOKEN(Tokens[0], tok::l_paren, TT_TableGenDAGArgOpener);3054 EXPECT_TOKEN(Tokens[3], tok::colon, TT_TableGenDAGArgListColon);3055 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_Unknown); // $src13056 EXPECT_TOKEN(Tokens[5], tok::comma, TT_TableGenDAGArgListComma);3057 EXPECT_TOKEN(Tokens[7], tok::colon, TT_TableGenDAGArgListColon);3058 EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_TableGenDAGArgCloser);3059 // List literal3060 Tokens = AnnotateValue("[1, 2, 3]");3061 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3062 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_TableGenListOpener);3063 EXPECT_TOKEN(Tokens[6], tok::r_square, TT_TableGenListCloser);3064 // Suffixes of values3065 Tokens = AnnotateValue("valid.field");3066 ASSERT_EQ(Tokens.size(), 3u) << Tokens;3067 EXPECT_TOKEN(Tokens[1], tok::period, TT_TableGenValueSuffix);3068 // Code3069 Tokens = AnnotateValue("[{ code is multiline string }]");3070 ASSERT_EQ(Tokens.size(), 1u) << Tokens;3071 EXPECT_TOKEN(Tokens[0], tok::string_literal, TT_TableGenMultiLineString);3072 3073 // The definition3074 Tokens = annotate("def Def : Parent<Child> {}", Style);3075 ASSERT_EQ(Tokens.size(), 10u) << Tokens; // This contains eof.3076 // We use inheritance colon and function brace. They are enough.3077 EXPECT_TOKEN(Tokens[2], tok::colon, TT_InheritanceColon);3078 EXPECT_TOKEN(Tokens[4], tok::less, TT_TemplateOpener);3079 EXPECT_TOKEN(Tokens[6], tok::greater, TT_TemplateCloser);3080 EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_FunctionLBrace);3081 3082 // DAGArg breaking options. They use different token types depending on what3083 // is specified.3084 Style.TableGenBreakInsideDAGArg = FormatStyle::DAS_BreakElements;3085 3086 // When TableGenBreakInsideDAGArg is DAS_BreakElements and3087 // TableGenBreakingDAGArgOperators is not specified, it makes all the DAGArg3088 // elements to have line break.3089 Tokens = AnnotateValue("(ins type1:$src1, type2:$src2)");3090 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3091 EXPECT_TOKEN(Tokens[0], tok::l_paren, TT_TableGenDAGArgOpenerToBreak);3092 EXPECT_TOKEN(Tokens[1], tok::identifier,3093 TT_TableGenDAGArgOperatorID); // ins3094 EXPECT_TOKEN(Tokens[5], tok::comma, TT_TableGenDAGArgListCommaToBreak);3095 EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_TableGenDAGArgCloser);3096 3097 Tokens = AnnotateValue("(other type1:$src1, type2:$src2)");3098 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3099 EXPECT_TOKEN(Tokens[0], tok::l_paren, TT_TableGenDAGArgOpenerToBreak);3100 EXPECT_TOKEN(Tokens[1], tok::identifier,3101 TT_TableGenDAGArgOperatorID); // other3102 EXPECT_TOKEN(Tokens[5], tok::comma, TT_TableGenDAGArgListCommaToBreak);3103 EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_TableGenDAGArgCloser);3104 3105 // For non-identifier operators, breaks after the operator.3106 Tokens = AnnotateValue("(!cast<Type>(\"Name\") type1:$src1, type2:$src2)");3107 ASSERT_EQ(Tokens.size(), 16u) << Tokens;3108 EXPECT_TOKEN(Tokens[0], tok::l_paren, TT_TableGenDAGArgOpenerToBreak);3109 EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_TableGenDAGArgOperatorToBreak);3110 EXPECT_TOKEN(Tokens[11], tok::comma, TT_TableGenDAGArgListCommaToBreak);3111 EXPECT_TOKEN(Tokens[15], tok::r_paren, TT_TableGenDAGArgCloser);3112 3113 Style.TableGenBreakInsideDAGArg = FormatStyle::DAS_BreakAll;3114 3115 // When TableGenBreakInsideDAGArg is DAS_BreakAll and3116 // TableGenBreakingDAGArgOperators is not specified, it makes all the DAGArg3117 // to have line break inside it.3118 Tokens = AnnotateValue("(ins type1:$src1, type2:$src2)");3119 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3120 EXPECT_TOKEN(Tokens[0], tok::l_paren, TT_TableGenDAGArgOpenerToBreak);3121 EXPECT_TOKEN(Tokens[1], tok::identifier,3122 TT_TableGenDAGArgOperatorToBreak); // ins3123 EXPECT_TOKEN(Tokens[5], tok::comma, TT_TableGenDAGArgListCommaToBreak);3124 EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_TableGenDAGArgCloser);3125 3126 Tokens = AnnotateValue("(other type1:$src1, type2:$src2)");3127 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3128 EXPECT_TOKEN(Tokens[0], tok::l_paren, TT_TableGenDAGArgOpenerToBreak);3129 EXPECT_TOKEN(Tokens[1], tok::identifier,3130 TT_TableGenDAGArgOperatorToBreak); // other3131 EXPECT_TOKEN(Tokens[5], tok::comma, TT_TableGenDAGArgListCommaToBreak);3132 EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_TableGenDAGArgCloser);3133 3134 // If TableGenBreakingDAGArgOperators is specified, it is limited to the3135 // specified operators.3136 Style.TableGenBreakingDAGArgOperators = {"ins", "outs"};3137 Tokens = AnnotateValue("(ins type1:$src1, type2:$src2)");3138 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3139 EXPECT_TOKEN(Tokens[0], tok::l_paren, TT_TableGenDAGArgOpenerToBreak);3140 EXPECT_TOKEN(Tokens[1], tok::identifier,3141 TT_TableGenDAGArgOperatorToBreak); // ins3142 EXPECT_TOKEN(Tokens[5], tok::comma, TT_TableGenDAGArgListCommaToBreak);3143 EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_TableGenDAGArgCloser);3144 3145 Tokens = AnnotateValue("(other type1:$src1, type2:$src2)");3146 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3147 EXPECT_TOKEN(Tokens[0], tok::l_paren, TT_TableGenDAGArgOpener);3148 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_Unknown); // other3149 EXPECT_TOKEN(Tokens[5], tok::comma, TT_TableGenDAGArgListComma);3150 EXPECT_TOKEN(Tokens[9], tok::r_paren, TT_TableGenDAGArgCloser);3151 3152 // If TableGenBreakingDAGArgOperators is enabled, it uses3153 // TT_TableGenDAGArgListColonToAlign to annotate the colon to align.3154 Style.AlignConsecutiveTableGenBreakingDAGArgColons.Enabled = true;3155 Tokens = AnnotateValue("(ins type1:$src1, type2:$src2)");3156 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3157 EXPECT_TOKEN(Tokens[1], tok::identifier,3158 TT_TableGenDAGArgOperatorToBreak); // ins3159 EXPECT_TOKEN(Tokens[3], tok::colon, TT_TableGenDAGArgListColonToAlign);3160 EXPECT_TOKEN(Tokens[7], tok::colon, TT_TableGenDAGArgListColonToAlign);3161 3162 Tokens = AnnotateValue("(other type1:$src1, type2:$src2)");3163 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3164 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_Unknown); // other3165 EXPECT_TOKEN(Tokens[3], tok::colon, TT_TableGenDAGArgListColon);3166 EXPECT_TOKEN(Tokens[7], tok::colon, TT_TableGenDAGArgListColon);3167}3168 3169TEST_F(TokenAnnotatorTest, UnderstandConstructors) {3170 auto Tokens = annotate("Class::Class() : BaseClass(), Member() {}");3171 3172 // The TT_Unknown is clearly not binding for the future, please adapt if those3173 // tokens get annotated.3174 ASSERT_EQ(Tokens.size(), 16u) << Tokens;3175 EXPECT_TOKEN(Tokens[5], tok::colon, TT_CtorInitializerColon);3176 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);3177 EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_Unknown);3178 EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_Unknown);3179 EXPECT_TOKEN(Tokens[9], tok::comma, TT_CtorInitializerComma);3180 EXPECT_TOKEN(Tokens[10], tok::identifier, TT_Unknown);3181 EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_Unknown);3182 EXPECT_TOKEN(Tokens[12], tok::r_paren, TT_Unknown);3183 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_FunctionLBrace);3184 EXPECT_BRACE_KIND(Tokens[13], BK_Block);3185 3186 Tokens = annotate("Class::Class() : BaseClass{}, Member{} {}");3187 ASSERT_EQ(Tokens.size(), 16u) << Tokens;3188 EXPECT_TOKEN(Tokens[5], tok::colon, TT_CtorInitializerColon);3189 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);3190 EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_Unknown);3191 EXPECT_TOKEN(Tokens[8], tok::r_brace, TT_Unknown);3192 EXPECT_TOKEN(Tokens[9], tok::comma, TT_CtorInitializerComma);3193 EXPECT_TOKEN(Tokens[10], tok::identifier, TT_Unknown);3194 EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_Unknown);3195 EXPECT_TOKEN(Tokens[12], tok::r_brace, TT_Unknown);3196 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_FunctionLBrace);3197 EXPECT_BRACE_KIND(Tokens[13], BK_Block);3198 3199 Tokens = annotate("class Class {\n"3200 " Class() : BaseClass() {\n"3201 "#if 0\n"3202 " // comment\n"3203 "#endif\n"3204 " }\n"3205 " Class f();\n"3206 "}");3207 ASSERT_EQ(Tokens.size(), 25u) << Tokens;3208 EXPECT_TOKEN(Tokens[6], tok::colon, TT_CtorInitializerColon);3209 EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_FunctionLBrace);3210 EXPECT_BRACE_KIND(Tokens[10], BK_Block);3211}3212 3213TEST_F(TokenAnnotatorTest, UnderstandsConditionParens) {3214 auto Tokens = annotate("if (x) {}");3215 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3216 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ConditionLParen);3217 Tokens = annotate("if constexpr (x) {}");3218 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3219 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_ConditionLParen);3220 Tokens = annotate("if CONSTEXPR (x) {}");3221 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3222 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_ConditionLParen);3223 Tokens = annotate("if (x) {} else if (x) {}");3224 ASSERT_EQ(Tokens.size(), 14u) << Tokens;3225 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ConditionLParen);3226 EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_ConditionLParen);3227}3228 3229TEST_F(TokenAnnotatorTest, CSharpNullableTypes) {3230 FormatStyle Style = getGoogleStyle(FormatStyle::LK_CSharp);3231 3232 auto Tokens = annotate("int? a;", Style);3233 ASSERT_EQ(Tokens.size(), 5u) << Tokens;3234 EXPECT_TOKEN(Tokens[1], tok::question, TT_CSharpNullable);3235 3236 Tokens = annotate("int? a = 1;", Style);3237 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3238 EXPECT_TOKEN(Tokens[1], tok::question, TT_CSharpNullable);3239 3240 Tokens = annotate("int?)", Style);3241 ASSERT_EQ(Tokens.size(), 4u) << Tokens;3242 EXPECT_TOKEN(Tokens[1], tok::question, TT_CSharpNullable);3243 3244 Tokens = annotate("int?>", Style);3245 ASSERT_EQ(Tokens.size(), 4u) << Tokens;3246 EXPECT_TOKEN(Tokens[1], tok::question, TT_CSharpNullable);3247 3248 Tokens = annotate("{\n"3249 " int? a;\n"3250 " if (b is int?)\n"3251 " f();\n"3252 " var foo = A<Foo?>();\n"3253 "}",3254 Style);3255 ASSERT_EQ(Tokens.size(), 29u) << Tokens;3256 EXPECT_TOKEN(Tokens[2], tok::question, TT_CSharpNullable);3257 EXPECT_TOKEN(Tokens[10], tok::question, TT_CSharpNullable);3258 EXPECT_TOKEN(Tokens[20], tok::less, TT_TemplateOpener);3259 EXPECT_TOKEN(Tokens[22], tok::question, TT_CSharpNullable);3260 3261 Tokens = annotate("cond? id : id2", Style);3262 ASSERT_EQ(Tokens.size(), 6u) << Tokens;3263 EXPECT_TOKEN(Tokens[1], tok::question, TT_ConditionalExpr);3264 3265 Tokens = annotate("cond ? cond2 ? : id1 : id2", Style);3266 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3267 EXPECT_TOKEN(Tokens[1], tok::question, TT_ConditionalExpr);3268}3269 3270TEST_F(TokenAnnotatorTest, CSharpGenericTypeConstraint) {3271 auto Tokens = annotate("namespace A {\n"3272 " delegate T MyDelegate<T>()\n"3273 " where T : new();\n"3274 "}",3275 getGoogleStyle(FormatStyle::LK_CSharp));3276 ASSERT_EQ(Tokens.size(), 20u) << Tokens;3277 EXPECT_TOKEN(Tokens[18], tok::r_brace, TT_NamespaceRBrace);3278}3279 3280TEST_F(TokenAnnotatorTest, CSharpNewModifier) {3281 auto Tokens = annotate("new public class NestedC {\n"3282 " public int x = 100;\n"3283 "}",3284 getGoogleStyle(FormatStyle::LK_CSharp));3285 ASSERT_EQ(Tokens.size(), 13u) << Tokens;3286 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_ClassHeadName);3287 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_ClassLBrace);3288 EXPECT_TOKEN(Tokens[11], tok::r_brace, TT_ClassRBrace);3289}3290 3291TEST_F(TokenAnnotatorTest, UnderstandsLabels) {3292 auto Tokens = annotate("{ x: break; }");3293 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3294 EXPECT_TOKEN(Tokens[2], tok::colon, TT_GotoLabelColon);3295 3296 Tokens = annotate("{ case x: break; }");3297 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3298 EXPECT_TOKEN(Tokens[3], tok::colon, TT_CaseLabelColon);3299 3300 Tokens = annotate("{ x: { break; } }");3301 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3302 EXPECT_TOKEN(Tokens[2], tok::colon, TT_GotoLabelColon);3303 3304 Tokens = annotate("{ case x: { break; } }");3305 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3306 EXPECT_TOKEN(Tokens[3], tok::colon, TT_CaseLabelColon);3307 3308 Tokens = annotate("#define FOO label:");3309 ASSERT_EQ(Tokens.size(), 6u) << Tokens;3310 EXPECT_TOKEN(Tokens[4], tok::colon, TT_GotoLabelColon);3311 3312 Tokens = annotate("#define FOO \\\n"3313 "label: \\\n"3314 " break;");3315 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3316 EXPECT_TOKEN(Tokens[4], tok::colon, TT_GotoLabelColon);3317}3318 3319TEST_F(TokenAnnotatorTest, UnderstandsNestedBlocks) {3320 // The closing braces are not annotated. It doesn't seem to cause a problem.3321 // So we only test for the opening braces.3322 auto Tokens = annotate("{\n"3323 " {\n"3324 " { int a = 0; }\n"3325 " }\n"3326 " {}\n"3327 "}");3328 ASSERT_EQ(Tokens.size(), 14u) << Tokens;3329 EXPECT_BRACE_KIND(Tokens[0], BK_Block);3330 EXPECT_BRACE_KIND(Tokens[1], BK_Block);3331 EXPECT_BRACE_KIND(Tokens[2], BK_Block);3332 EXPECT_BRACE_KIND(Tokens[10], BK_Block);3333}3334 3335TEST_F(TokenAnnotatorTest, UnderstandDesignatedInitializers) {3336 auto Tokens = annotate("SomeStruct { .a = 1 };");3337 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3338 EXPECT_BRACE_KIND(Tokens[1], BK_BracedInit);3339 EXPECT_TOKEN(Tokens[2], tok::period, TT_DesignatedInitializerPeriod);3340 3341 Tokens = annotate("SomeStruct { .a = 1, .b = 2 };");3342 ASSERT_EQ(Tokens.size(), 14u) << Tokens;3343 EXPECT_BRACE_KIND(Tokens[1], BK_BracedInit);3344 EXPECT_TOKEN(Tokens[2], tok::period, TT_DesignatedInitializerPeriod);3345 EXPECT_TOKEN(Tokens[7], tok::period, TT_DesignatedInitializerPeriod);3346 3347 Tokens = annotate("SomeStruct {\n"3348 "#ifdef FOO\n"3349 " .a = 1,\n"3350 "#endif\n"3351 " .b = 2\n"3352 "};");3353 ASSERT_EQ(Tokens.size(), 19u) << Tokens;3354 EXPECT_BRACE_KIND(Tokens[1], BK_BracedInit);3355 EXPECT_TOKEN(Tokens[5], tok::period, TT_DesignatedInitializerPeriod);3356 EXPECT_TOKEN(Tokens[12], tok::period, TT_DesignatedInitializerPeriod);3357 3358 Tokens = annotate("SomeStruct {\n"3359 "#if defined FOO\n"3360 " .a = 1,\n"3361 "#endif\n"3362 " .b = 2\n"3363 "};");3364 ASSERT_EQ(Tokens.size(), 20u) << Tokens;3365 EXPECT_BRACE_KIND(Tokens[1], BK_BracedInit);3366 EXPECT_TOKEN(Tokens[6], tok::period, TT_DesignatedInitializerPeriod);3367 EXPECT_TOKEN(Tokens[13], tok::period, TT_DesignatedInitializerPeriod);3368 3369 Tokens = annotate("Foo foo[] = {[0]{}};");3370 ASSERT_EQ(Tokens.size(), 14u) << Tokens;3371 EXPECT_TOKEN(Tokens[6], tok::l_square, TT_DesignatedInitializerLSquare);3372 EXPECT_BRACE_KIND(Tokens[9], BK_BracedInit);3373 3374 Tokens = annotate("Foo foo[] = {[0] = 1, [1] = 2};");3375 ASSERT_EQ(Tokens.size(), 20u) << Tokens;3376 EXPECT_TOKEN(Tokens[6], tok::l_square, TT_DesignatedInitializerLSquare);3377 EXPECT_TOKEN(Tokens[12], tok::l_square, TT_DesignatedInitializerLSquare);3378}3379 3380TEST_F(TokenAnnotatorTest, UnderstandsJavaScript) {3381 auto Annotate = [this](StringRef Code) {3382 return annotate(Code, getLLVMStyle(FormatStyle::LK_JavaScript));3383 };3384 3385 // Dictionary.3386 auto Tokens = Annotate("var x = {'x' : 1, 'y' : 2};");3387 ASSERT_EQ(Tokens.size(), 14u) << Tokens;3388 EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_DictLiteral);3389 EXPECT_TOKEN(Tokens[4], tok::string_literal, TT_SelectorName);3390 EXPECT_TOKEN(Tokens[5], tok::colon, TT_DictLiteral);3391 EXPECT_TOKEN(Tokens[8], tok::string_literal, TT_SelectorName);3392 EXPECT_TOKEN(Tokens[9], tok::colon, TT_DictLiteral);3393 // Change when we need to annotate these.3394 EXPECT_BRACE_KIND(Tokens[3], BK_Unknown);3395 EXPECT_BRACE_KIND(Tokens[11], BK_Unknown);3396 EXPECT_TOKEN(Tokens[11], tok::r_brace, TT_Unknown);3397}3398 3399TEST_F(TokenAnnotatorTest, UnderstandsAttributes) {3400 auto Tokens = annotate("bool foo __attribute__((unused));");3401 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3402 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_StartOfName);3403 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_AttributeLParen);3404 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_Unknown);3405 EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_Unknown);3406 EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_AttributeRParen);3407 3408 Tokens = annotate("bool foo __declspec(dllimport);");3409 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3410 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_AttributeLParen);3411 EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_AttributeRParen);3412 3413 Tokens = annotate("bool __attribute__((unused)) foo;");3414 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3415 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_AttributeLParen);3416 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_Unknown);3417 EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_Unknown);3418 EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_AttributeRParen);3419 EXPECT_TOKEN(Tokens[7], tok::identifier, TT_StartOfName);3420 3421 Tokens = annotate("void __attribute__((x)) Foo();");3422 ASSERT_EQ(Tokens.size(), 12u) << Tokens;3423 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_AttributeLParen);3424 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_Unknown);3425 EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_Unknown);3426 EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_AttributeRParen);3427 EXPECT_TOKEN(Tokens[7], tok::identifier, TT_FunctionDeclarationName);3428 EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_FunctionDeclarationLParen);3429 3430 FormatStyle Style = getLLVMStyle();3431 Style.AttributeMacros.push_back("FOO");3432 Tokens = annotate("bool foo FOO(unused);", Style);3433 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3434 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_AttributeMacro);3435 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_AttributeLParen);3436 EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_AttributeRParen);3437}3438 3439TEST_F(TokenAnnotatorTest, UnderstandsNullabilityAttributeMacros) {3440 // Under Google style, handles the Abseil macro aliases for the Clang3441 // nullability annotations.3442 auto Style = getGoogleStyle(FormatStyle::LK_Cpp);3443 auto Tokens = annotate("x = (foo* absl_nullable)*v;", Style);3444 ASSERT_EQ(Tokens.size(), 11u) << Tokens;3445 EXPECT_TOKEN(Tokens[4], tok::star, TT_PointerOrReference);3446 EXPECT_TOKEN(Tokens[5], tok::identifier, TT_AttributeMacro);3447 EXPECT_TOKEN(Tokens[7], tok::star, TT_UnaryOperator);3448 3449 Tokens = annotate("x = (foo* absl_nonnull)*v;", Style);3450 ASSERT_EQ(Tokens.size(), 11u) << Tokens;3451 EXPECT_TOKEN(Tokens[4], tok::star, TT_PointerOrReference);3452 EXPECT_TOKEN(Tokens[5], tok::identifier, TT_AttributeMacro);3453 EXPECT_TOKEN(Tokens[7], tok::star, TT_UnaryOperator);3454 3455 Tokens = annotate("x = (foo* absl_nullability_unknown)*v;", Style);3456 ASSERT_EQ(Tokens.size(), 11u) << Tokens;3457 EXPECT_TOKEN(Tokens[4], tok::star, TT_PointerOrReference);3458 EXPECT_TOKEN(Tokens[5], tok::identifier, TT_AttributeMacro);3459 EXPECT_TOKEN(Tokens[7], tok::star, TT_UnaryOperator);3460}3461 3462TEST_F(TokenAnnotatorTest, UnderstandsControlStatements) {3463 auto Tokens = annotate("while (true) {}");3464 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3465 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_ControlStatementLBrace);3466 EXPECT_TOKEN(Tokens[5], tok::r_brace, TT_ControlStatementRBrace);3467 3468 Tokens = annotate("for (;;) {}");3469 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3470 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_ControlStatementLBrace);3471 EXPECT_TOKEN(Tokens[6], tok::r_brace, TT_ControlStatementRBrace);3472 3473 Tokens = annotate("do {} while (true);");3474 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3475 EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_ControlStatementLBrace);3476 EXPECT_TOKEN(Tokens[2], tok::r_brace, TT_ControlStatementRBrace);3477 3478 Tokens = annotate("if (true) {} else if (false) {} else {}");3479 ASSERT_EQ(Tokens.size(), 17u) << Tokens;3480 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_ControlStatementLBrace);3481 EXPECT_TOKEN(Tokens[5], tok::r_brace, TT_ControlStatementRBrace);3482 EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_ControlStatementLBrace);3483 EXPECT_TOKEN(Tokens[12], tok::r_brace, TT_ControlStatementRBrace);3484 EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_ElseLBrace);3485 EXPECT_TOKEN(Tokens[15], tok::r_brace, TT_ElseRBrace);3486 3487 Tokens = annotate("switch (foo) {}");3488 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3489 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_ControlStatementLBrace);3490 EXPECT_TOKEN(Tokens[5], tok::r_brace, TT_ControlStatementRBrace);3491}3492 3493TEST_F(TokenAnnotatorTest, UnderstandsDoWhile) {3494 auto Tokens = annotate("do { ++i; } while ( i > 5 );");3495 ASSERT_EQ(Tokens.size(), 14u) << Tokens;3496 EXPECT_TOKEN(Tokens[6], tok::kw_while, TT_DoWhile);3497 3498 Tokens = annotate("do ++i; while ( i > 5 );");3499 ASSERT_EQ(Tokens.size(), 12u) << Tokens;3500 EXPECT_TOKEN(Tokens[4], tok::kw_while, TT_DoWhile);3501}3502 3503TEST_F(TokenAnnotatorTest, StartOfName) {3504 auto Tokens = annotate("#pragma clang diagnostic push");3505 ASSERT_EQ(Tokens.size(), 6u) << Tokens;3506 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_Unknown);3507 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown);3508 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_Unknown);3509 3510 Tokens = annotate("#pragma clang diagnostic ignored \"-Wzero-length-array\"");3511 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3512 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_Unknown);3513 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown);3514 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_Unknown);3515 3516 Tokens = annotate("#define FOO Foo foo");3517 ASSERT_EQ(Tokens.size(), 6u) << Tokens;3518 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_Unknown);3519 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown);3520 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_StartOfName);3521 3522 Tokens = annotate("@interface NSCoder (TestCoder)");3523 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3524 EXPECT_TOKEN(Tokens[0], tok::at, TT_ObjCDecl);3525 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_StartOfName);3526 3527 Tokens = annotate("class FOO BAR C {};");3528 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3529 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_Unknown); // Not StartOfName3530 3531 Tokens = annotate("int* ::foo::bar;");3532 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3533 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_StartOfName);3534 3535 auto Style = getLLVMStyle();3536 Style.StatementAttributeLikeMacros.push_back("emit");3537 Tokens = annotate("emit foo = 0;", Style);3538 ASSERT_EQ(Tokens.size(), 6u) << Tokens;3539 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_StatementAttributeLikeMacro);3540 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_Unknown);3541}3542 3543TEST_F(TokenAnnotatorTest, BraceKind) {3544 auto Tokens = annotate("void f() {};");3545 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3546 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);3547 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);3548 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_FunctionLBrace);3549 EXPECT_BRACE_KIND(Tokens[4], BK_Block);3550 EXPECT_BRACE_KIND(Tokens[5], BK_Block);3551 3552 Tokens = annotate("class Foo<int> f() {}");3553 ASSERT_EQ(Tokens.size(), 11u) << Tokens;3554 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_Unknown);3555 EXPECT_TOKEN(Tokens[5], tok::identifier, TT_FunctionDeclarationName);3556 EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_FunctionDeclarationLParen);3557 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_FunctionLBrace);3558 EXPECT_BRACE_KIND(Tokens[8], BK_Block);3559 EXPECT_BRACE_KIND(Tokens[9], BK_Block);3560 3561 Tokens = annotate("template <typename T> class Foo<T> f() {}");3562 ASSERT_EQ(Tokens.size(), 16u) << Tokens;3563 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);3564 EXPECT_TOKEN(Tokens[10], tok::identifier, TT_FunctionDeclarationName);3565 EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_FunctionDeclarationLParen);3566 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_FunctionLBrace);3567 EXPECT_BRACE_KIND(Tokens[13], BK_Block);3568 EXPECT_BRACE_KIND(Tokens[14], BK_Block);3569 3570 Tokens = annotate("void f() override {};");3571 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3572 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);3573 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);3574 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_FunctionLBrace);3575 EXPECT_BRACE_KIND(Tokens[5], BK_Block);3576 EXPECT_BRACE_KIND(Tokens[6], BK_Block);3577 3578 Tokens = annotate("void f() noexcept(false) {};");3579 ASSERT_EQ(Tokens.size(), 12u) << Tokens;3580 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);3581 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);3582 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_FunctionLBrace);3583 EXPECT_BRACE_KIND(Tokens[8], BK_Block);3584 EXPECT_BRACE_KIND(Tokens[9], BK_Block);3585 3586 Tokens = annotate("auto f() -> void {};");3587 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3588 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);3589 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);3590 EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_FunctionLBrace);3591 EXPECT_BRACE_KIND(Tokens[6], BK_Block);3592 EXPECT_BRACE_KIND(Tokens[7], BK_Block);3593 3594 Tokens = annotate("void f() { /**/ };");3595 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3596 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);3597 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);3598 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_FunctionLBrace);3599 EXPECT_BRACE_KIND(Tokens[4], BK_Block);3600 EXPECT_BRACE_KIND(Tokens[6], BK_Block);3601 3602 Tokens = annotate("void f() { //\n"3603 "};");3604 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3605 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);3606 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);3607 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_FunctionLBrace);3608 EXPECT_BRACE_KIND(Tokens[4], BK_Block);3609 EXPECT_BRACE_KIND(Tokens[6], BK_Block);3610 3611 Tokens = annotate("void f() {\n"3612 " //\n"3613 "};");3614 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3615 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);3616 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);3617 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_FunctionLBrace);3618 EXPECT_BRACE_KIND(Tokens[4], BK_Block);3619 EXPECT_BRACE_KIND(Tokens[6], BK_Block);3620 3621 Tokens = annotate("struct Foo {\n"3622 " Foo() {};\n"3623 " ~Foo() {};\n"3624 "};");3625 ASSERT_EQ(Tokens.size(), 19u) << Tokens;3626 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_CtorDtorDeclName);3627 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_FunctionDeclarationLParen);3628 EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_FunctionLBrace);3629 EXPECT_BRACE_KIND(Tokens[6], BK_Block);3630 EXPECT_BRACE_KIND(Tokens[7], BK_Block);3631 EXPECT_TOKEN(Tokens[10], tok::identifier, TT_CtorDtorDeclName);3632 EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_FunctionDeclarationLParen);3633 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_FunctionLBrace);3634 EXPECT_BRACE_KIND(Tokens[13], BK_Block);3635 EXPECT_BRACE_KIND(Tokens[14], BK_Block);3636 3637 Tokens = annotate("{\n"3638 " char *a[] = {\n"3639 " /* abc */ \"abc\",\n"3640 "#if FOO\n"3641 " /* xyz */ \"xyz\",\n"3642 "#endif\n"3643 " /* last */ \"last\"};\n"3644 "}");3645 ASSERT_EQ(Tokens.size(), 25u) << Tokens;3646 EXPECT_BRACE_KIND(Tokens[0], BK_Block);3647 EXPECT_BRACE_KIND(Tokens[7], BK_BracedInit);3648 EXPECT_BRACE_KIND(Tokens[21], BK_BracedInit);3649 3650 Tokens =3651 annotate("#define SCOP_STAT(NAME, DESC) \\\n"3652 " {\"polly\", #NAME, \"Number of rejected regions: \" DESC}");3653 ASSERT_EQ(Tokens.size(), 18u) << Tokens;3654 EXPECT_BRACE_KIND(Tokens[8], BK_BracedInit);3655 EXPECT_BRACE_KIND(Tokens[16], BK_BracedInit);3656 3657 Tokens = annotate("struct {};");3658 ASSERT_EQ(Tokens.size(), 5u) << Tokens;3659 EXPECT_BRACE_KIND(Tokens[1], BK_Block);3660 EXPECT_BRACE_KIND(Tokens[2], BK_Block);3661 3662 Tokens = annotate("struct : Base {};");3663 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3664 EXPECT_BRACE_KIND(Tokens[3], BK_Block);3665 EXPECT_BRACE_KIND(Tokens[4], BK_Block);3666 3667 Tokens = annotate("struct Foo {};");3668 ASSERT_EQ(Tokens.size(), 6u) << Tokens;3669 EXPECT_BRACE_KIND(Tokens[2], BK_Block);3670 EXPECT_BRACE_KIND(Tokens[3], BK_Block);3671 3672 Tokens = annotate("struct ::Foo {};");3673 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3674 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_ClassHeadName);3675 EXPECT_BRACE_KIND(Tokens[3], BK_Block);3676 EXPECT_BRACE_KIND(Tokens[4], BK_Block);3677 3678 Tokens = annotate("struct NS::Foo {};");3679 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3680 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_Unknown);3681 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_ClassHeadName);3682 EXPECT_BRACE_KIND(Tokens[4], BK_Block);3683 EXPECT_BRACE_KIND(Tokens[5], BK_Block);3684 3685 Tokens = annotate("struct Foo<int> {};");3686 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3687 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName);3688 EXPECT_BRACE_KIND(Tokens[5], BK_Block);3689 EXPECT_BRACE_KIND(Tokens[6], BK_Block);3690 3691 Tokens = annotate("struct Foo<int>::Bar {};");3692 ASSERT_EQ(Tokens.size(), 11u) << Tokens;3693 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_Unknown);3694 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_ClassHeadName);3695 EXPECT_BRACE_KIND(Tokens[7], BK_Block);3696 EXPECT_BRACE_KIND(Tokens[8], BK_Block);3697 3698 Tokens = annotate("struct Foo<int> : Base {};");3699 ASSERT_EQ(Tokens.size(), 11u) << Tokens;3700 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName);3701 EXPECT_BRACE_KIND(Tokens[7], BK_Block);3702 EXPECT_BRACE_KIND(Tokens[8], BK_Block);3703 3704 Tokens = annotate("struct Foo<int> : Base::Bar {};");3705 ASSERT_EQ(Tokens.size(), 13u) << Tokens;3706 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName);3707 EXPECT_TOKEN(Tokens[8], tok::identifier, TT_Unknown); // Not TT_ClassHeadName.3708 EXPECT_BRACE_KIND(Tokens[9], BK_Block);3709 EXPECT_BRACE_KIND(Tokens[10], BK_Block);3710 3711 Tokens = annotate("struct Foo final {};");3712 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3713 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_ClassHeadName);3714 EXPECT_BRACE_KIND(Tokens[3], BK_Block);3715 EXPECT_BRACE_KIND(Tokens[4], BK_Block);3716 3717 Tokens = annotate("struct [[foo]] [[bar]] Foo final : Base1, Base2 {};");3718 ASSERT_EQ(Tokens.size(), 21u) << Tokens;3719 EXPECT_TOKEN(Tokens[11], tok::identifier, TT_ClassHeadName);3720 EXPECT_BRACE_KIND(Tokens[17], BK_Block);3721 EXPECT_BRACE_KIND(Tokens[18], BK_Block);3722 3723 Tokens = annotate("struct Foo x{};");3724 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3725 EXPECT_BRACE_KIND(Tokens[3], BK_BracedInit);3726 EXPECT_BRACE_KIND(Tokens[4], BK_BracedInit);3727 3728 Tokens = annotate("struct ::Foo x{};");3729 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3730 EXPECT_BRACE_KIND(Tokens[4], BK_BracedInit);3731 EXPECT_BRACE_KIND(Tokens[5], BK_BracedInit);3732 3733 Tokens = annotate("struct NS::Foo x{};");3734 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3735 EXPECT_BRACE_KIND(Tokens[5], BK_BracedInit);3736 EXPECT_BRACE_KIND(Tokens[6], BK_BracedInit);3737 3738 Tokens = annotate("struct Foo<int> x{};");3739 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3740 EXPECT_BRACE_KIND(Tokens[6], BK_BracedInit);3741 EXPECT_BRACE_KIND(Tokens[7], BK_BracedInit);3742 3743 Tokens = annotate("#ifdef DEBUG_ENABLED\n"3744 "#else\n"3745 "#endif\n"3746 "class RenderingServer : Object {\n"3747 "#ifndef DISABLE_DEPRECATED\n"3748 " enum Features {\n"3749 " FEATURE_SHADERS,\n"3750 " FEATURE_MULTITHREADED,\n"3751 " };\n"3752 "#endif\n"3753 "};");3754 ASSERT_EQ(Tokens.size(), 29u) << Tokens;3755 EXPECT_TOKEN(Tokens[8], tok::identifier, TT_ClassHeadName);3756 EXPECT_BRACE_KIND(Tokens[11], BK_Block);3757 EXPECT_BRACE_KIND(Tokens[17], BK_Block);3758 EXPECT_BRACE_KIND(Tokens[22], BK_Block);3759 EXPECT_BRACE_KIND(Tokens[26], BK_Block);3760 3761 Tokens = annotate("{\n"3762 "#define M(x) \\\n"3763 " return {#x};\n"3764 "}");3765 ASSERT_EQ(Tokens.size(), 15u) << Tokens;3766 EXPECT_TOKEN(Tokens[0], tok::l_brace, TT_BlockLBrace);3767 EXPECT_BRACE_KIND(Tokens[0], BK_Block);3768 EXPECT_BRACE_KIND(Tokens[8], BK_BracedInit);3769 EXPECT_BRACE_KIND(Tokens[11], BK_BracedInit);3770 EXPECT_BRACE_KIND(Tokens[13], BK_Block);3771 3772 Tokens = annotate("{\n"3773 " {\n"3774 "#define GEN_ID(_x) char *_x{#_x}\n"3775 " GEN_ID(one);\n"3776 " }\n"3777 "}");3778 ASSERT_EQ(Tokens.size(), 23u) << Tokens;3779 EXPECT_TOKEN(Tokens[0], tok::l_brace, TT_BlockLBrace);3780 EXPECT_BRACE_KIND(Tokens[0], BK_Block);3781 EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_BlockLBrace);3782 EXPECT_BRACE_KIND(Tokens[1], BK_Block);3783 EXPECT_BRACE_KIND(Tokens[11], BK_BracedInit);3784 EXPECT_BRACE_KIND(Tokens[14], BK_BracedInit);3785 EXPECT_BRACE_KIND(Tokens[20], BK_Block);3786 EXPECT_BRACE_KIND(Tokens[21], BK_Block);3787 3788 Tokens = annotate("{\n"3789 "#define FOO \\\n"3790 " { \\\n"3791 " case bar: { \\\n"3792 " break; \\\n"3793 " } \\\n"3794 " }\n"3795 "}");3796 ASSERT_EQ(Tokens.size(), 15u) << Tokens;3797 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_BlockLBrace);3798 EXPECT_BRACE_KIND(Tokens[4], BK_Block);3799 EXPECT_TOKEN(Tokens[7], tok::colon, TT_CaseLabelColon);3800 EXPECT_BRACE_KIND(Tokens[8], BK_Block);3801 EXPECT_BRACE_KIND(Tokens[11], BK_Block);3802 EXPECT_BRACE_KIND(Tokens[12], BK_Block);3803 3804 Tokens = annotate("class foo {\n"3805 " foo() {}\n"3806 "#if defined(_MSC_VER__clang____GNUC__FOO_) || \\\n"3807 " (defined(__GNUC__) && defined(FOO))\n"3808 " foo() {}\n"3809 "#endif\n"3810 "};");3811 ASSERT_EQ(Tokens.size(), 36u) << Tokens;3812 EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_FunctionLBrace);3813 EXPECT_BRACE_KIND(Tokens[7], BK_Block);3814 EXPECT_TOKEN(Tokens[26], tok::identifier, TT_CtorDtorDeclName);3815 EXPECT_TOKEN(Tokens[27], tok::l_paren, TT_FunctionDeclarationLParen);3816 3817 Tokens = annotate("a = class extends goog.a {};",3818 getGoogleStyle(FormatStyle::LK_JavaScript));3819 ASSERT_EQ(Tokens.size(), 11u) << Tokens;3820 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown);3821 EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_ClassLBrace);3822 EXPECT_BRACE_KIND(Tokens[7], BK_Block);3823 EXPECT_TOKEN(Tokens[8], tok::r_brace, TT_ClassRBrace);3824 EXPECT_BRACE_KIND(Tokens[8], BK_Block);3825 3826 Tokens = annotate("a = class Foo extends goog.a {};",3827 getGoogleStyle(FormatStyle::LK_JavaScript));3828 ASSERT_EQ(Tokens.size(), 12u) << Tokens;3829 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_ClassHeadName);3830 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_Unknown); // Not TT_StartOfName3831 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_ClassLBrace);3832 EXPECT_BRACE_KIND(Tokens[8], BK_Block);3833 EXPECT_TOKEN(Tokens[9], tok::r_brace, TT_ClassRBrace);3834 EXPECT_BRACE_KIND(Tokens[9], BK_Block);3835 3836 Tokens = annotate("#define FOO(X) \\\n"3837 " struct X##_tag_ {};");3838 ASSERT_EQ(Tokens.size(), 14u) << Tokens;3839 EXPECT_TOKEN(Tokens[7], tok::identifier, TT_Unknown);3840 EXPECT_TOKEN(Tokens[9], tok::identifier, TT_ClassHeadName);3841 EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_StructLBrace);3842 EXPECT_BRACE_KIND(Tokens[10], BK_Block);3843 EXPECT_TOKEN(Tokens[11], tok::r_brace, TT_StructRBrace);3844 EXPECT_BRACE_KIND(Tokens[11], BK_Block);3845 3846 Tokens = annotate("#define MACRO \\\n"3847 " struct hash<type> { \\\n"3848 " void f() { return; } \\\n"3849 " };");3850 ASSERT_EQ(Tokens.size(), 20u) << Tokens;3851 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_ClassHeadName);3852 EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_StructLBrace);3853 EXPECT_BRACE_KIND(Tokens[8], BK_Block);3854 EXPECT_TOKEN(Tokens[10], tok::identifier, TT_FunctionDeclarationName);3855 EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_FunctionDeclarationLParen);3856 EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_FunctionLBrace);3857 EXPECT_BRACE_KIND(Tokens[13], BK_Block);3858 EXPECT_BRACE_KIND(Tokens[16], BK_Block);3859 EXPECT_TOKEN(Tokens[17], tok::r_brace, TT_StructRBrace);3860 EXPECT_BRACE_KIND(Tokens[17], BK_Block);3861 3862 Tokens = annotate("#define MEMBER(NAME) NAME{\"\"}");3863 ASSERT_EQ(Tokens.size(), 11u) << Tokens;3864 EXPECT_BRACE_KIND(Tokens[7], BK_BracedInit);3865 EXPECT_BRACE_KIND(Tokens[9], BK_BracedInit);3866 3867 Tokens = annotate("return lhs ^ Byte{rhs};");3868 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3869 EXPECT_BRACE_KIND(Tokens[4], BK_BracedInit);3870 EXPECT_BRACE_KIND(Tokens[6], BK_BracedInit);3871 3872 Tokens = annotate("auto f1{&T::operator()};");3873 ASSERT_EQ(Tokens.size(), 12u) << Tokens;3874 EXPECT_BRACE_KIND(Tokens[2], BK_BracedInit);3875 // Not TT_FunctionDeclarationName.3876 EXPECT_TOKEN(Tokens[6], tok::kw_operator, TT_Unknown);3877 EXPECT_BRACE_KIND(Tokens[9], BK_BracedInit);3878}3879 3880TEST_F(TokenAnnotatorTest, UnderstandsElaboratedTypeSpecifier) {3881 auto Tokens = annotate("auto foo() -> enum En {}");3882 ASSERT_EQ(Tokens.size(), 10u) << Tokens;3883 EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_FunctionLBrace);3884}3885 3886TEST_F(TokenAnnotatorTest, BlockLBrace) {3887 auto Tokens = annotate("{\n"3888 " {\n"3889 " foo();\n"3890 " }\n"3891 "}");3892 ASSERT_EQ(Tokens.size(), 9u) << Tokens;3893 EXPECT_TOKEN(Tokens[0], tok::l_brace, TT_BlockLBrace);3894 EXPECT_BRACE_KIND(Tokens[0], BK_Block);3895 EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_BlockLBrace);3896 EXPECT_BRACE_KIND(Tokens[1], BK_Block);3897 3898 Tokens = annotate("void bar() {\n"3899 " {\n"3900 " foo();\n"3901 " }\n"3902 "}");3903 ASSERT_EQ(Tokens.size(), 13u) << Tokens;3904 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_FunctionLBrace);3905 EXPECT_BRACE_KIND(Tokens[4], BK_Block);3906 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_BlockLBrace);3907 EXPECT_BRACE_KIND(Tokens[5], BK_Block);3908 3909 Tokens = annotate("[foo bar:{{0, 1}} baz:baz];",3910 getLLVMStyle(FormatStyle::LK_ObjC));3911 ASSERT_EQ(Tokens.size(), 17u) << Tokens;3912 EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_Unknown); // Not TT_BlockLBrace.3913 EXPECT_BRACE_KIND(Tokens[4], BK_Unknown); // Not BK_Block.3914 EXPECT_BRACE_KIND(Tokens[5], BK_BracedInit);3915 EXPECT_BRACE_KIND(Tokens[9], BK_Unknown); // Not BK_Block.3916 EXPECT_BRACE_KIND(Tokens[10], BK_Unknown); // Not BK_Block.3917}3918 3919TEST_F(TokenAnnotatorTest, SwitchExpression) {3920 auto Style = getLLVMStyle(FormatStyle::LK_Java);3921 auto Tokens = annotate("i = switch (day) {\n"3922 " case THURSDAY, SATURDAY -> 8;\n"3923 " case WEDNESDAY -> 9;\n"3924 " default -> 1;\n"3925 "};",3926 Style);3927 ASSERT_EQ(Tokens.size(), 26u) << Tokens;3928 EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_SwitchExpressionLBrace);3929 EXPECT_TOKEN(Tokens[7], tok::kw_case, TT_SwitchExpressionLabel);3930 EXPECT_TOKEN(Tokens[11], tok::arrow, TT_CaseLabelArrow);3931 EXPECT_TOKEN(Tokens[14], tok::kw_case, TT_SwitchExpressionLabel);3932 EXPECT_TOKEN(Tokens[16], tok::arrow, TT_CaseLabelArrow);3933 EXPECT_TOKEN(Tokens[19], tok::kw_default, TT_SwitchExpressionLabel);3934 EXPECT_TOKEN(Tokens[20], tok::arrow, TT_CaseLabelArrow);3935}3936 3937TEST_F(TokenAnnotatorTest, JavaRecord) {3938 auto Tokens = annotate("public record MyRecord() {}",3939 getLLVMStyle(FormatStyle::LK_Java));3940 ASSERT_EQ(Tokens.size(), 8u) << Tokens;3941 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_ClassHeadName);3942 // Not TT_FunctionDeclarationLParen.3943 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_Unknown);3944 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_RecordLBrace);3945 EXPECT_TOKEN(Tokens[6], tok::r_brace, TT_RecordRBrace);3946}3947 3948TEST_F(TokenAnnotatorTest, CppAltOperatorKeywords) {3949 auto Tokens = annotate("a = b and c;");3950 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3951 EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_BinaryOperator);3952 3953 Tokens = annotate("a = b and_eq c;");3954 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3955 EXPECT_TOKEN(Tokens[3], tok::ampequal, TT_BinaryOperator);3956 3957 Tokens = annotate("a = b bitand c;");3958 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3959 EXPECT_TOKEN(Tokens[3], tok::amp, TT_BinaryOperator);3960 3961 Tokens = annotate("a = b bitor c;");3962 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3963 EXPECT_TOKEN(Tokens[3], tok::pipe, TT_BinaryOperator);3964 3965 Tokens = annotate("a = b compl c;");3966 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3967 EXPECT_TOKEN(Tokens[3], tok::tilde, TT_UnaryOperator);3968 3969 Tokens = annotate("a = b not c;");3970 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3971 EXPECT_TOKEN(Tokens[3], tok::exclaim, TT_UnaryOperator);3972 3973 Tokens = annotate("a = b not_eq c;");3974 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3975 EXPECT_TOKEN(Tokens[3], tok::exclaimequal, TT_BinaryOperator);3976 3977 Tokens = annotate("a = b or c;");3978 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3979 EXPECT_TOKEN(Tokens[3], tok::pipepipe, TT_BinaryOperator);3980 3981 Tokens = annotate("return segment < *this or *this < segment;");3982 ASSERT_EQ(Tokens.size(), 12u) << Tokens;3983 EXPECT_TOKEN(Tokens[5], tok::pipepipe, TT_BinaryOperator);3984 EXPECT_TOKEN(Tokens[6], tok::star, TT_UnaryOperator);3985 3986 Tokens = annotate("a = b or_eq c;");3987 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3988 EXPECT_TOKEN(Tokens[3], tok::pipeequal, TT_BinaryOperator);3989 3990 Tokens = annotate("a = b xor c;");3991 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3992 EXPECT_TOKEN(Tokens[3], tok::caret, TT_BinaryOperator);3993 3994 Tokens = annotate("a = b xor_eq c;");3995 ASSERT_EQ(Tokens.size(), 7u) << Tokens;3996 EXPECT_TOKEN(Tokens[3], tok::caretequal, TT_BinaryOperator);3997 3998 const auto StyleC = getLLVMStyle(FormatStyle::LK_C);3999 4000 Tokens = annotate("xor = foo;", StyleC);4001 ASSERT_EQ(Tokens.size(), 5u) << Tokens;4002 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);4003 4004 Tokens = annotate("int xor = foo;", StyleC);4005 ASSERT_EQ(Tokens.size(), 6u) << Tokens;4006 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_StartOfName);4007}4008 4009TEST_F(TokenAnnotatorTest, CppOnlyKeywordInC) {4010 auto Tokens = annotate("int maximized = new & STATE_MAXIMIZED;",4011 getLLVMStyle(FormatStyle::LK_C));4012 ASSERT_EQ(Tokens.size(), 8u) << Tokens;4013 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown); // Not tok::kw_new4014 EXPECT_TOKEN(Tokens[4], tok::amp, TT_BinaryOperator);4015 EXPECT_TOKEN(Tokens[3], tok::identifier, TT_Unknown); // Not TT_StartOfName4016}4017 4018TEST_F(TokenAnnotatorTest, FunctionTryBlock) {4019 auto Tokens =4020 annotate("Foo::Foo(int x, int y) try\n"4021 " : foo{[] -> std::string { return {}; }(), x}, bar{y} {\n"4022 "} catch (...) {\n"4023 "}");4024 ASSERT_EQ(Tokens.size(), 45u) << Tokens;4025 EXPECT_TOKEN(Tokens[2], tok::identifier, TT_CtorDtorDeclName);4026 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_FunctionDeclarationLParen);4027 EXPECT_TOKEN(Tokens[11], tok::colon, TT_CtorInitializerColon);4028 EXPECT_TOKEN(Tokens[14], tok::l_square, TT_LambdaLSquare);4029 EXPECT_TOKEN(Tokens[16], tok::arrow, TT_LambdaArrow);4030 EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);4031 EXPECT_TOKEN(Tokens[31], tok::comma, TT_CtorInitializerComma);4032 EXPECT_TOKEN(Tokens[36], tok::l_brace, TT_FunctionLBrace);4033}4034 4035TEST_F(TokenAnnotatorTest, TypenameMacro) {4036 auto Style = getLLVMStyle();4037 Style.TypenameMacros.push_back("STRUCT");4038 4039 auto Tokens = annotate("STRUCT(T, B) { int i; };", Style);4040 ASSERT_EQ(Tokens.size(), 13u) << Tokens;4041 EXPECT_TOKEN(Tokens[0], tok::identifier, TT_TypenameMacro);4042 EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_TypeDeclarationParen);4043 EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_TypeDeclarationParen);4044 EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_Unknown);4045}4046 4047TEST_F(TokenAnnotatorTest, GNULanguageStandard) {4048 auto Style = getGNUStyle();4049 EXPECT_EQ(Style.Standard, FormatStyle::LS_Latest);4050 4051 auto Tokens = annotate("return 1 <=> 2;", Style);4052 ASSERT_EQ(Tokens.size(), 6u) << Tokens;4053 EXPECT_TOKEN(Tokens[2], tok::spaceship, TT_BinaryOperator);4054}4055 4056TEST_F(TokenAnnotatorTest, SplitPenalty) {4057 auto Style = getLLVMStyle();4058 Style.ColumnLimit = 20;4059 4060 auto Tokens = annotate("class foo {\n"4061 " auto bar()\n"4062 " -> bool;\n"4063 "};",4064 Style);4065 ASSERT_EQ(Tokens.size(), 13u) << Tokens;4066 EXPECT_TOKEN(Tokens[7], tok::arrow, TT_TrailingReturnArrow);4067 EXPECT_SPLIT_PENALTY(Tokens[7], 23u);4068}4069 4070TEST_F(TokenAnnotatorTest, TemplateName) {4071 constexpr StringRef Code("return Foo < A || B > (C ^ D);");4072 4073 auto Tokens = annotate(Code);4074 ASSERT_EQ(Tokens.size(), 14u) << Tokens;4075 EXPECT_TOKEN(Tokens[2], tok::less, TT_BinaryOperator);4076 EXPECT_TOKEN(Tokens[6], tok::greater, TT_BinaryOperator);4077 4078 auto Style = getLLVMStyle();4079 Style.TemplateNames.push_back("Foo");4080 4081 Tokens = annotate(Code, Style);4082 EXPECT_TOKEN(Tokens[1], tok::identifier, TT_TemplateName);4083 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);4084 EXPECT_TOKEN(Tokens[6], tok::greater, TT_TemplateCloser);4085}4086 4087TEST_F(TokenAnnotatorTest, TemplateInstantiation) {4088 auto Tokens = annotate("return FixedInt<N | M>();");4089 ASSERT_EQ(Tokens.size(), 11u) << Tokens;4090 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);4091 EXPECT_TOKEN(Tokens[6], tok::greater, TT_TemplateCloser);4092 4093 Tokens = annotate("return FixedInt<N | M>(foo);");4094 ASSERT_EQ(Tokens.size(), 12u) << Tokens;4095 EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);4096 EXPECT_TOKEN(Tokens[6], tok::greater, TT_TemplateCloser);4097 4098 Tokens = annotate("return std::conditional_t<T::value == U::value, T, U>{};");4099 ASSERT_EQ(Tokens.size(), 21u) << Tokens;4100 EXPECT_TOKEN(Tokens[4], tok::less, TT_TemplateOpener);4101 EXPECT_TOKEN(Tokens[16], tok::greater, TT_TemplateCloser);4102 4103 Tokens =4104 annotate("auto x{std::conditional_t<T::value == U::value, T, U>{}};");4105 ASSERT_EQ(Tokens.size(), 24u) << Tokens;4106 EXPECT_TOKEN(Tokens[6], tok::less, TT_TemplateOpener);4107 EXPECT_TOKEN(Tokens[18], tok::greater, TT_TemplateCloser);4108 4109 Tokens = annotate(4110 "std::uint16_t kMTU = std::conditional<\n"4111 " kTypeKind == KindA,\n"4112 " std::integral_constant<std::uint16_t, kIoSockMtu>>::type::value;");4113 ASSERT_EQ(Tokens.size(), 30u) << Tokens;4114 EXPECT_TOKEN(Tokens[8], tok::less, TT_TemplateOpener);4115 EXPECT_TOKEN(Tokens[16], tok::less, TT_TemplateOpener);4116 EXPECT_TOKEN(Tokens[22], tok::greater, TT_TemplateCloser);4117 EXPECT_TOKEN(Tokens[23], tok::greater, TT_TemplateCloser);4118}4119 4120TEST_F(TokenAnnotatorTest, VariableTemplate) {4121 auto Style = getLLVMStyle();4122 Style.VariableTemplates.push_back("a");4123 4124 auto Tokens = annotate("auto t3 = (a<int>) + b;", Style);4125 ASSERT_EQ(Tokens.size(), 13u) << Tokens;4126 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_VariableTemplate);4127 EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener);4128 EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);4129 EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_Unknown); // Not TT_CastRParen4130 EXPECT_TOKEN(Tokens[9], tok::plus, TT_BinaryOperator);4131}4132 4133TEST_F(TokenAnnotatorTest, SwitchInMacroArgument) {4134 auto Tokens = annotate("FOOBAR(switch);\n"4135 "void f() {}");4136 ASSERT_EQ(Tokens.size(), 12u) << Tokens;4137 EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_FunctionLBrace);4138}4139 4140TEST_F(TokenAnnotatorTest, AfterPPDirective) {4141 auto Tokens = annotate("#error -- My error message");4142 4143 ASSERT_EQ(Tokens.size(), 7u) << Tokens;4144 EXPECT_TOKEN(Tokens[2], tok::minusminus, TT_AfterPPDirective);4145}4146 4147TEST_F(TokenAnnotatorTest, UserDefinedConversionFunction) {4148 auto Tokens = annotate("operator int(void);");4149 ASSERT_EQ(Tokens.size(), 7u) << Tokens;4150 EXPECT_TOKEN(Tokens[0], tok::kw_operator, TT_FunctionDeclarationName);4151 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);4152 4153 Tokens = annotate("explicit operator int *();");4154 ASSERT_EQ(Tokens.size(), 8u) << Tokens;4155 EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName);4156 EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);4157 EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_FunctionDeclarationLParen);4158 4159 Tokens = annotate("operator int &();");4160 ASSERT_EQ(Tokens.size(), 7u) << Tokens;4161 EXPECT_TOKEN(Tokens[0], tok::kw_operator, TT_FunctionDeclarationName);4162 EXPECT_TOKEN(Tokens[2], tok::amp, TT_PointerOrReference);4163 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_FunctionDeclarationLParen);4164 4165 Tokens = annotate("operator auto() const { return 2; }");4166 ASSERT_EQ(Tokens.size(), 11u) << Tokens;4167 EXPECT_TOKEN(Tokens[0], tok::kw_operator, TT_FunctionDeclarationName);4168 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);4169 EXPECT_TOKEN(Tokens[4], tok::kw_const, TT_TrailingAnnotation);4170 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_FunctionLBrace);4171 4172 Tokens = annotate("operator decltype(auto)() const;");4173 ASSERT_EQ(Tokens.size(), 10u) << Tokens;4174 EXPECT_TOKEN(Tokens[0], tok::kw_operator, TT_FunctionDeclarationName);4175 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_TypeDeclarationParen);4176 EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_TypeDeclarationParen);4177 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_FunctionDeclarationLParen);4178 EXPECT_TOKEN(Tokens[7], tok::kw_const, TT_TrailingAnnotation);4179 4180 Tokens = annotate("virtual operator Foo() = 0;");4181 ASSERT_EQ(Tokens.size(), 9u) << Tokens;4182 EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName);4183 EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_FunctionDeclarationLParen);4184 4185 Tokens = annotate("operator Foo() override { return Foo(); }");4186 ASSERT_EQ(Tokens.size(), 13u) << Tokens;4187 EXPECT_TOKEN(Tokens[0], tok::kw_operator, TT_FunctionDeclarationName);4188 EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_FunctionDeclarationLParen);4189 EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_FunctionLBrace);4190 4191 Tokens = annotate("friend Bar::operator Foo();");4192 ASSERT_EQ(Tokens.size(), 9u) << Tokens;4193 EXPECT_TOKEN(Tokens[3], tok::kw_operator, TT_FunctionDeclarationName);4194 EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_FunctionDeclarationLParen);4195}4196 4197TEST_F(TokenAnnotatorTest, UTF8StringLiteral) {4198 auto Tokens = annotate("return u8\"foo\";", getLLVMStyle(FormatStyle::LK_C));4199 ASSERT_EQ(Tokens.size(), 4u) << Tokens;4200 EXPECT_TOKEN(Tokens[1], tok::utf8_string_literal, TT_Unknown);4201}4202 4203TEST_F(TokenAnnotatorTest, C23DigitSeparator) {4204 auto Tokens = annotate("return 1'000;", getLLVMStyle(FormatStyle::LK_C));4205 ASSERT_EQ(Tokens.size(), 4u) << Tokens;4206 EXPECT_EQ(Tokens[1]->TokenText, "1'000");4207 EXPECT_TOKEN(Tokens[2], tok::semi, TT_Unknown);4208}4209 4210TEST_F(TokenAnnotatorTest, IdentifierPackage) {4211 auto Tokens = annotate("auto package;");4212 ASSERT_EQ(Tokens.size(), 4u) << Tokens;4213 EXPECT_FALSE(Tokens[0]->isObjCAccessSpecifier());4214}4215 4216TEST_F(TokenAnnotatorTest, UserDefinedLiteral) {4217 auto Tokens = annotate("auto dollars = 2_$;");4218 ASSERT_EQ(Tokens.size(), 6u) << Tokens;4219 EXPECT_EQ(Tokens[3]->TokenText, "2_$");4220}4221 4222TEST_F(TokenAnnotatorTest, EnumColonInTypedef) {4223 auto Tokens = annotate("typedef enum : int {} foo;");4224 ASSERT_EQ(Tokens.size(), 9u) << Tokens;4225 EXPECT_TOKEN(Tokens[2], tok::colon, TT_Unknown); // Not TT_InheritanceColon.4226}4227 4228TEST_F(TokenAnnotatorTest, BitFieldColon) {4229 auto Tokens = annotate("class C {\n"4230 " int f : SIZE;\n"4231 "};");4232 ASSERT_EQ(Tokens.size(), 11u) << Tokens;4233 EXPECT_TOKEN(Tokens[5], tok::colon, TT_BitFieldColon);4234}4235 4236TEST_F(TokenAnnotatorTest, JsonCodeInRawString) {4237 auto Tokens = annotate("{\n"4238 " \"foo\": \"bar\",\n"4239 " \"str\": \"test\"\n"4240 "}",4241 getLLVMStyle(FormatStyle::LK_Json));4242 ASSERT_EQ(Tokens.size(), 10u) << Tokens;4243 EXPECT_TOKEN(Tokens[0], tok::l_brace, TT_DictLiteral);4244 EXPECT_TOKEN(Tokens[1], tok::string_literal, TT_SelectorName);4245 EXPECT_TOKEN(Tokens[2], tok::colon, TT_DictLiteral);4246 EXPECT_TOKEN(Tokens[5], tok::string_literal, TT_SelectorName);4247 EXPECT_TOKEN(Tokens[6], tok::colon, TT_DictLiteral);4248}4249 4250TEST_F(TokenAnnotatorTest, LineCommentTrailingBackslash) {4251 auto Tokens = annotate("// a \\\n"4252 "// b");4253 ASSERT_EQ(Tokens.size(), 3u) << Tokens;4254 EXPECT_TOKEN(Tokens[1], tok::comment, TT_LineComment);4255}4256 4257TEST_F(TokenAnnotatorTest, ArrowAfterSubscript) {4258 auto Tokens =4259 annotate("return (getStructType()->getElements())[eIdx]->getName();");4260 ASSERT_EQ(Tokens.size(), 19u) << Tokens;4261 // Not TT_LambdaArrow.4262 EXPECT_TOKEN(Tokens[13], tok::arrow, TT_Unknown);4263}4264 4265TEST_F(TokenAnnotatorTest, QtProperty) {4266 auto Style = getLLVMStyle();4267 Style.AllowBreakBeforeQtProperty = true;4268 4269 auto Tokens = annotate(4270 "Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)",4271 Style);4272 ASSERT_EQ(Tokens.size(), 12u) << Tokens;4273 EXPECT_TOKEN(Tokens[4], tok::identifier, TT_QtProperty);4274 EXPECT_TOKEN(Tokens[6], tok::identifier, TT_QtProperty);4275 EXPECT_TOKEN(Tokens[8], tok::identifier, TT_QtProperty);4276 4277 Tokens = annotate(4278 "struct S {\n"4279 " Q_OBJECT Q_PROPERTY(int value READ value WRITE setValue NOTIFY foo)\n"4280 "};",4281 Style);4282 ASSERT_EQ(Tokens.size(), 18u) << Tokens;4283 EXPECT_TOKEN(Tokens[8], tok::identifier, TT_QtProperty);4284 EXPECT_TOKEN(Tokens[10], tok::identifier, TT_QtProperty);4285 EXPECT_TOKEN(Tokens[12], tok::identifier, TT_QtProperty);4286}4287 4288TEST_F(TokenAnnotatorTest, AttributeSquares) {4289 auto Tokens = annotate("[[maybe_unused]] const int i;");4290 ASSERT_EQ(Tokens.size(), 10u) << Tokens;4291 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_AttributeLSquare);4292 EXPECT_TOKEN(Tokens[1], tok::l_square, TT_Unknown);4293 EXPECT_TOKEN(Tokens[3], tok::r_square, TT_Unknown);4294 EXPECT_TOKEN(Tokens[4], tok::r_square, TT_AttributeRSquare);4295 EXPECT_TRUE(Tokens[4]->EndsCppAttributeGroup);4296 4297 Tokens = annotate("[[foo([[]])]] [[maybe_unused]] int j;");4298 ASSERT_EQ(Tokens.size(), 20u) << Tokens;4299 EXPECT_TOKEN(Tokens[0], tok::l_square, TT_AttributeLSquare);4300 EXPECT_TOKEN(Tokens[1], tok::l_square, TT_Unknown);4301 EXPECT_TOKEN(Tokens[9], tok::r_square, TT_Unknown);4302 EXPECT_TOKEN(Tokens[10], tok::r_square, TT_AttributeRSquare);4303 EXPECT_FALSE(Tokens[10]->EndsCppAttributeGroup);4304 EXPECT_TOKEN(Tokens[11], tok::l_square, TT_AttributeLSquare);4305 EXPECT_TOKEN(Tokens[12], tok::l_square, TT_Unknown);4306 EXPECT_TOKEN(Tokens[14], tok::r_square, TT_Unknown);4307 EXPECT_TOKEN(Tokens[15], tok::r_square, TT_AttributeRSquare);4308 EXPECT_TRUE(Tokens[15]->EndsCppAttributeGroup);4309}4310 4311} // namespace4312} // namespace format4313} // namespace clang4314