1 //===-- CodeCompleteTests.cpp -----------------------------------*- C++ -*-===// 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "Annotations.h" 10 #include "ClangdServer.h" 11 #include "CodeComplete.h" 12 #include "Compiler.h" 13 #include "Matchers.h" 14 #include "Protocol.h" 15 #include "Quality.h" 16 #include "SourceCode.h" 17 #include "SyncAPI.h" 18 #include "TestFS.h" 19 #include "TestIndex.h" 20 #include "TestTU.h" 21 #include "Threading.h" 22 #include "index/Index.h" 23 #include "index/MemIndex.h" 24 #include "clang/Sema/CodeCompleteConsumer.h" 25 #include "clang/Tooling/CompilationDatabase.h" 26 #include "llvm/Support/Error.h" 27 #include "llvm/Support/Path.h" 28 #include "llvm/Testing/Support/Error.h" 29 #include "gmock/gmock.h" 30 #include "gtest/gtest.h" 31 #include <condition_variable> 32 #include <functional> 33 #include <mutex> 34 #include <vector> 35 36 namespace clang { 37 namespace clangd { 38 39 namespace { 40 using ::llvm::Failed; 41 using ::testing::AllOf; 42 using ::testing::Contains; 43 using ::testing::ElementsAre; 44 using ::testing::Field; 45 using ::testing::HasSubstr; 46 using ::testing::IsEmpty; 47 using ::testing::Not; 48 using ::testing::UnorderedElementsAre; 49 50 // GMock helpers for matching completion items. 51 MATCHER_P(Named, Name, "") { return arg.Name == Name; } 52 MATCHER_P(NameStartsWith, Prefix, "") { 53 return llvm::StringRef(arg.Name).startswith(Prefix); 54 } 55 MATCHER_P(Scope, S, "") { return arg.Scope == S; } 56 MATCHER_P(Qualifier, Q, "") { return arg.RequiredQualifier == Q; } 57 MATCHER_P(Labeled, Label, "") { 58 return arg.RequiredQualifier + arg.Name + arg.Signature == Label; 59 } 60 MATCHER_P(SigHelpLabeled, Label, "") { return arg.label == Label; } 61 MATCHER_P(Kind, K, "") { return arg.Kind == K; } 62 MATCHER_P(Doc, D, "") { return arg.Documentation == D; } 63 MATCHER_P(ReturnType, D, "") { return arg.ReturnType == D; } 64 MATCHER_P(HasInclude, IncludeHeader, "") { 65 return !arg.Includes.empty() && arg.Includes[0].Header == IncludeHeader; 66 } 67 MATCHER_P(InsertInclude, IncludeHeader, "") { 68 return !arg.Includes.empty() && arg.Includes[0].Header == IncludeHeader && 69 bool(arg.Includes[0].Insertion); 70 } 71 MATCHER(InsertInclude, "") { 72 return !arg.Includes.empty() && bool(arg.Includes[0].Insertion); 73 } 74 MATCHER_P(SnippetSuffix, Text, "") { return arg.SnippetSuffix == Text; } 75 MATCHER_P(Origin, OriginSet, "") { return arg.Origin == OriginSet; } 76 MATCHER_P(Signature, S, "") { return arg.Signature == S; } 77 78 // Shorthand for Contains(Named(Name)). 79 Matcher<const std::vector<CodeCompletion> &> Has(std::string Name) { 80 return Contains(Named(std::move(Name))); 81 } 82 Matcher<const std::vector<CodeCompletion> &> Has(std::string Name, 83 CompletionItemKind K) { 84 return Contains(AllOf(Named(std::move(Name)), Kind(K))); 85 } 86 MATCHER(IsDocumented, "") { return !arg.Documentation.empty(); } 87 MATCHER(Deprecated, "") { return arg.Deprecated; } 88 89 std::unique_ptr<SymbolIndex> memIndex(std::vector<Symbol> Symbols) { 90 SymbolSlab::Builder Slab; 91 for (const auto &Sym : Symbols) 92 Slab.insert(Sym); 93 return MemIndex::build(std::move(Slab).build(), RefSlab(), RelationSlab()); 94 } 95 96 // Runs code completion. 97 // If IndexSymbols is non-empty, an index will be built and passed to opts. 98 CodeCompleteResult completions(const TestTU &TU, Position Point, 99 std::vector<Symbol> IndexSymbols = {}, 100 clangd::CodeCompleteOptions Opts = {}) { 101 std::unique_ptr<SymbolIndex> OverrideIndex; 102 if (!IndexSymbols.empty()) { 103 assert(!Opts.Index && "both Index and IndexSymbols given!"); 104 OverrideIndex = memIndex(std::move(IndexSymbols)); 105 Opts.Index = OverrideIndex.get(); 106 } 107 108 auto Inputs = TU.inputs(); 109 IgnoreDiagnostics Diags; 110 auto CI = buildCompilerInvocation(Inputs, Diags); 111 if (!CI) { 112 ADD_FAILURE() << "Couldn't build CompilerInvocation"; 113 return {}; 114 } 115 auto Preamble = 116 buildPreamble(testPath(TU.Filename), *CI, /*OldPreamble=*/nullptr, Inputs, 117 /*InMemory=*/true, /*Callback=*/nullptr); 118 return codeComplete(testPath(TU.Filename), Inputs.CompileCommand, 119 Preamble.get(), TU.Code, Point, Inputs.FS, Opts); 120 } 121 122 // Runs code completion. 123 CodeCompleteResult completions(llvm::StringRef Text, 124 std::vector<Symbol> IndexSymbols = {}, 125 clangd::CodeCompleteOptions Opts = {}, 126 PathRef FilePath = "foo.cpp") { 127 Annotations Test(Text); 128 auto TU = TestTU::withCode(Test.code()); 129 // To make sure our tests for completiopns inside templates work on Windows. 130 TU.Filename = FilePath.str(); 131 return completions(TU, Test.point(), std::move(IndexSymbols), 132 std::move(Opts)); 133 } 134 135 // Runs code completion without the clang parser. 136 CodeCompleteResult completionsNoCompile(llvm::StringRef Text, 137 std::vector<Symbol> IndexSymbols = {}, 138 clangd::CodeCompleteOptions Opts = {}, 139 PathRef FilePath = "foo.cpp") { 140 std::unique_ptr<SymbolIndex> OverrideIndex; 141 if (!IndexSymbols.empty()) { 142 assert(!Opts.Index && "both Index and IndexSymbols given!"); 143 OverrideIndex = memIndex(std::move(IndexSymbols)); 144 Opts.Index = OverrideIndex.get(); 145 } 146 147 MockFSProvider FS; 148 Annotations Test(Text); 149 return codeComplete(FilePath, tooling::CompileCommand(), /*Preamble=*/nullptr, 150 Test.code(), Test.point(), FS.getFileSystem(), Opts); 151 } 152 153 Symbol withReferences(int N, Symbol S) { 154 S.References = N; 155 return S; 156 } 157 158 TEST(CompletionTest, Limit) { 159 clangd::CodeCompleteOptions Opts; 160 Opts.Limit = 2; 161 auto Results = completions(R"cpp( 162 struct ClassWithMembers { 163 int AAA(); 164 int BBB(); 165 int CCC(); 166 }; 167 168 int main() { ClassWithMembers().^ } 169 )cpp", 170 /*IndexSymbols=*/{}, Opts); 171 172 EXPECT_TRUE(Results.HasMore); 173 EXPECT_THAT(Results.Completions, ElementsAre(Named("AAA"), Named("BBB"))); 174 } 175 176 TEST(CompletionTest, Filter) { 177 std::string Body = R"cpp( 178 #define MotorCar 179 int Car; 180 struct S { 181 int FooBar; 182 int FooBaz; 183 int Qux; 184 }; 185 )cpp"; 186 187 // Only items matching the fuzzy query are returned. 188 EXPECT_THAT(completions(Body + "int main() { S().Foba^ }").Completions, 189 AllOf(Has("FooBar"), Has("FooBaz"), Not(Has("Qux")))); 190 191 // Macros require prefix match. 192 EXPECT_THAT(completions(Body + "int main() { C^ }").Completions, 193 AllOf(Has("Car"), Not(Has("MotorCar")))); 194 } 195 196 void testAfterDotCompletion(clangd::CodeCompleteOptions Opts) { 197 auto Results = completions( 198 R"cpp( 199 int global_var; 200 201 int global_func(); 202 203 // Make sure this is not in preamble. 204 #define MACRO X 205 206 struct GlobalClass {}; 207 208 struct ClassWithMembers { 209 /// Doc for method. 210 int method(); 211 212 int field; 213 private: 214 int private_field; 215 }; 216 217 int test() { 218 struct LocalClass {}; 219 220 /// Doc for local_var. 221 int local_var; 222 223 ClassWithMembers().^ 224 } 225 )cpp", 226 {cls("IndexClass"), var("index_var"), func("index_func")}, Opts); 227 228 EXPECT_TRUE(Results.RanParser); 229 // Class members. The only items that must be present in after-dot 230 // completion. 231 EXPECT_THAT(Results.Completions, 232 AllOf(Has("method"), Has("field"), Not(Has("ClassWithMembers")), 233 Not(Has("operator=")), Not(Has("~ClassWithMembers")))); 234 EXPECT_IFF(Opts.IncludeIneligibleResults, Results.Completions, 235 Has("private_field")); 236 // Global items. 237 EXPECT_THAT( 238 Results.Completions, 239 Not(AnyOf(Has("global_var"), Has("index_var"), Has("global_func"), 240 Has("global_func()"), Has("index_func"), Has("GlobalClass"), 241 Has("IndexClass"), Has("MACRO"), Has("LocalClass")))); 242 // There should be no code patterns (aka snippets) in after-dot 243 // completion. At least there aren't any we're aware of. 244 EXPECT_THAT(Results.Completions, 245 Not(Contains(Kind(CompletionItemKind::Snippet)))); 246 // Check documentation. 247 EXPECT_IFF(Opts.IncludeComments, Results.Completions, 248 Contains(IsDocumented())); 249 } 250 251 void testGlobalScopeCompletion(clangd::CodeCompleteOptions Opts) { 252 auto Results = completions( 253 R"cpp( 254 int global_var; 255 int global_func(); 256 257 // Make sure this is not in preamble. 258 #define MACRO X 259 260 struct GlobalClass {}; 261 262 struct ClassWithMembers { 263 /// Doc for method. 264 int method(); 265 }; 266 267 int test() { 268 struct LocalClass {}; 269 270 /// Doc for local_var. 271 int local_var; 272 273 ^ 274 } 275 )cpp", 276 {cls("IndexClass"), var("index_var"), func("index_func")}, Opts); 277 278 EXPECT_TRUE(Results.RanParser); 279 // Class members. Should never be present in global completions. 280 EXPECT_THAT(Results.Completions, 281 Not(AnyOf(Has("method"), Has("method()"), Has("field")))); 282 // Global items. 283 EXPECT_THAT(Results.Completions, 284 AllOf(Has("global_var"), Has("index_var"), Has("global_func"), 285 Has("index_func" /* our fake symbol doesn't include () */), 286 Has("GlobalClass"), Has("IndexClass"))); 287 // A macro. 288 EXPECT_IFF(Opts.IncludeMacros, Results.Completions, Has("MACRO")); 289 // Local items. Must be present always. 290 EXPECT_THAT(Results.Completions, 291 AllOf(Has("local_var"), Has("LocalClass"), 292 Contains(Kind(CompletionItemKind::Snippet)))); 293 // Check documentation. 294 EXPECT_IFF(Opts.IncludeComments, Results.Completions, 295 Contains(IsDocumented())); 296 } 297 298 TEST(CompletionTest, CompletionOptions) { 299 auto Test = [&](const clangd::CodeCompleteOptions &Opts) { 300 testAfterDotCompletion(Opts); 301 testGlobalScopeCompletion(Opts); 302 }; 303 // We used to test every combination of options, but that got too slow (2^N). 304 auto Flags = { 305 &clangd::CodeCompleteOptions::IncludeMacros, 306 &clangd::CodeCompleteOptions::IncludeComments, 307 &clangd::CodeCompleteOptions::IncludeCodePatterns, 308 &clangd::CodeCompleteOptions::IncludeIneligibleResults, 309 }; 310 // Test default options. 311 Test({}); 312 // Test with one flag flipped. 313 for (auto &F : Flags) { 314 clangd::CodeCompleteOptions O; 315 O.*F ^= true; 316 Test(O); 317 } 318 } 319 320 TEST(CompletionTest, Accessible) { 321 auto Internal = completions(R"cpp( 322 class Foo { 323 public: void pub(); 324 protected: void prot(); 325 private: void priv(); 326 }; 327 void Foo::pub() { this->^ } 328 )cpp"); 329 EXPECT_THAT(Internal.Completions, 330 AllOf(Has("priv"), Has("prot"), Has("pub"))); 331 332 auto External = completions(R"cpp( 333 class Foo { 334 public: void pub(); 335 protected: void prot(); 336 private: void priv(); 337 }; 338 void test() { 339 Foo F; 340 F.^ 341 } 342 )cpp"); 343 EXPECT_THAT(External.Completions, 344 AllOf(Has("pub"), Not(Has("prot")), Not(Has("priv")))); 345 } 346 347 TEST(CompletionTest, Qualifiers) { 348 auto Results = completions(R"cpp( 349 class Foo { 350 public: int foo() const; 351 int bar() const; 352 }; 353 class Bar : public Foo { 354 int foo() const; 355 }; 356 void test() { Bar().^ } 357 )cpp"); 358 EXPECT_THAT(Results.Completions, 359 Contains(AllOf(Qualifier(""), Named("bar")))); 360 // Hidden members are not shown. 361 EXPECT_THAT(Results.Completions, 362 Not(Contains(AllOf(Qualifier("Foo::"), Named("foo"))))); 363 // Private members are not shown. 364 EXPECT_THAT(Results.Completions, 365 Not(Contains(AllOf(Qualifier(""), Named("foo"))))); 366 } 367 368 TEST(CompletionTest, InjectedTypename) { 369 // These are suppressed when accessed as a member... 370 EXPECT_THAT(completions("struct X{}; void foo(){ X().^ }").Completions, 371 Not(Has("X"))); 372 EXPECT_THAT(completions("struct X{ void foo(){ this->^ } };").Completions, 373 Not(Has("X"))); 374 // ...but accessible in other, more useful cases. 375 EXPECT_THAT(completions("struct X{ void foo(){ ^ } };").Completions, 376 Has("X")); 377 EXPECT_THAT( 378 completions("struct Y{}; struct X:Y{ void foo(){ ^ } };").Completions, 379 Has("Y")); 380 EXPECT_THAT( 381 completions( 382 "template<class> struct Y{}; struct X:Y<int>{ void foo(){ ^ } };") 383 .Completions, 384 Has("Y")); 385 // This case is marginal (`using X::X` is useful), we allow it for now. 386 EXPECT_THAT(completions("struct X{}; void foo(){ X::^ }").Completions, 387 Has("X")); 388 } 389 390 TEST(CompletionTest, SkipInjectedWhenUnqualified) { 391 EXPECT_THAT(completions("struct X { void f() { X^ }};").Completions, 392 ElementsAre(Named("X"), Named("~X"))); 393 } 394 395 TEST(CompletionTest, Snippets) { 396 clangd::CodeCompleteOptions Opts; 397 auto Results = completions( 398 R"cpp( 399 struct fake { 400 int a; 401 int f(int i, const float f) const; 402 }; 403 int main() { 404 fake f; 405 f.^ 406 } 407 )cpp", 408 /*IndexSymbols=*/{}, Opts); 409 EXPECT_THAT( 410 Results.Completions, 411 HasSubsequence(Named("a"), 412 SnippetSuffix("(${1:int i}, ${2:const float f})"))); 413 } 414 415 TEST(CompletionTest, NoSnippetsInUsings) { 416 clangd::CodeCompleteOptions Opts; 417 Opts.EnableSnippets = true; 418 auto Results = completions( 419 R"cpp( 420 namespace ns { 421 int func(int a, int b); 422 } 423 424 using ns::^; 425 )cpp", 426 /*IndexSymbols=*/{}, Opts); 427 EXPECT_THAT(Results.Completions, 428 ElementsAre(AllOf(Named("func"), Labeled("func(int a, int b)"), 429 SnippetSuffix("")))); 430 431 // Check index completions too. 432 auto Func = func("ns::func"); 433 Func.CompletionSnippetSuffix = "(${1:int a}, ${2: int b})"; 434 Func.Signature = "(int a, int b)"; 435 Func.ReturnType = "void"; 436 437 Results = completions(R"cpp( 438 namespace ns {} 439 using ns::^; 440 )cpp", 441 /*IndexSymbols=*/{Func}, Opts); 442 EXPECT_THAT(Results.Completions, 443 ElementsAre(AllOf(Named("func"), Labeled("func(int a, int b)"), 444 SnippetSuffix("")))); 445 446 // Check all-scopes completions too. 447 Opts.AllScopes = true; 448 Results = completions(R"cpp( 449 using ^; 450 )cpp", 451 /*IndexSymbols=*/{Func}, Opts); 452 EXPECT_THAT(Results.Completions, 453 Contains(AllOf(Named("func"), Labeled("ns::func(int a, int b)"), 454 SnippetSuffix("")))); 455 } 456 457 TEST(CompletionTest, Kinds) { 458 auto Results = completions( 459 R"cpp( 460 int variable; 461 struct Struct {}; 462 int function(); 463 // make sure MACRO is not included in preamble. 464 #define MACRO 10 465 int X = ^ 466 )cpp", 467 {func("indexFunction"), var("indexVariable"), cls("indexClass")}); 468 EXPECT_THAT(Results.Completions, 469 AllOf(Has("function", CompletionItemKind::Function), 470 Has("variable", CompletionItemKind::Variable), 471 Has("int", CompletionItemKind::Keyword), 472 Has("Struct", CompletionItemKind::Struct), 473 Has("MACRO", CompletionItemKind::Text), 474 Has("indexFunction", CompletionItemKind::Function), 475 Has("indexVariable", CompletionItemKind::Variable), 476 Has("indexClass", CompletionItemKind::Class))); 477 478 Results = completions("nam^"); 479 EXPECT_THAT(Results.Completions, 480 Has("namespace", CompletionItemKind::Snippet)); 481 482 // Members of anonymous unions are of kind 'field'. 483 Results = completions( 484 R"cpp( 485 struct X{ 486 union { 487 void *a; 488 }; 489 }; 490 auto u = X().^ 491 )cpp"); 492 EXPECT_THAT( 493 Results.Completions, 494 UnorderedElementsAre(AllOf(Named("a"), Kind(CompletionItemKind::Field)))); 495 496 // Completion kinds for templates should not be unknown. 497 Results = completions( 498 R"cpp( 499 template <class T> struct complete_class {}; 500 template <class T> void complete_function(); 501 template <class T> using complete_type_alias = int; 502 template <class T> int complete_variable = 10; 503 504 struct X { 505 template <class T> static int complete_static_member = 10; 506 507 static auto x = complete_^ 508 } 509 )cpp"); 510 EXPECT_THAT( 511 Results.Completions, 512 UnorderedElementsAre( 513 AllOf(Named("complete_class"), Kind(CompletionItemKind::Class)), 514 AllOf(Named("complete_function"), Kind(CompletionItemKind::Function)), 515 AllOf(Named("complete_type_alias"), 516 Kind(CompletionItemKind::Interface)), 517 AllOf(Named("complete_variable"), Kind(CompletionItemKind::Variable)), 518 AllOf(Named("complete_static_member"), 519 Kind(CompletionItemKind::Property)))); 520 521 Results = completions( 522 R"cpp( 523 enum Color { 524 Red 525 }; 526 Color u = ^ 527 )cpp"); 528 EXPECT_THAT(Results.Completions, 529 Contains( 530 AllOf(Named("Red"), Kind(CompletionItemKind::EnumMember)))); 531 } 532 533 TEST(CompletionTest, NoDuplicates) { 534 auto Results = completions( 535 R"cpp( 536 class Adapter { 537 }; 538 539 void f() { 540 Adapter^ 541 } 542 )cpp", 543 {cls("Adapter")}); 544 545 // Make sure there are no duplicate entries of 'Adapter'. 546 EXPECT_THAT(Results.Completions, ElementsAre(Named("Adapter"))); 547 } 548 549 TEST(CompletionTest, ScopedNoIndex) { 550 auto Results = completions( 551 R"cpp( 552 namespace fake { int BigBang, Babble, Box; }; 553 int main() { fake::ba^ } 554 ")cpp"); 555 // Babble is a better match than BigBang. Box doesn't match at all. 556 EXPECT_THAT(Results.Completions, 557 ElementsAre(Named("Babble"), Named("BigBang"))); 558 } 559 560 TEST(CompletionTest, Scoped) { 561 auto Results = completions( 562 R"cpp( 563 namespace fake { int Babble, Box; }; 564 int main() { fake::ba^ } 565 ")cpp", 566 {var("fake::BigBang")}); 567 EXPECT_THAT(Results.Completions, 568 ElementsAre(Named("Babble"), Named("BigBang"))); 569 } 570 571 TEST(CompletionTest, ScopedWithFilter) { 572 auto Results = completions( 573 R"cpp( 574 void f() { ns::x^ } 575 )cpp", 576 {cls("ns::XYZ"), func("ns::foo")}); 577 EXPECT_THAT(Results.Completions, UnorderedElementsAre(Named("XYZ"))); 578 } 579 580 TEST(CompletionTest, ReferencesAffectRanking) { 581 auto Results = completions("int main() { abs^ }", {ns("absl"), func("absb")}); 582 EXPECT_THAT(Results.Completions, 583 HasSubsequence(Named("absb"), Named("absl"))); 584 Results = completions("int main() { abs^ }", 585 {withReferences(10000, ns("absl")), func("absb")}); 586 EXPECT_THAT(Results.Completions, 587 HasSubsequence(Named("absl"), Named("absb"))); 588 } 589 590 TEST(CompletionTest, ContextWords) { 591 auto Results = completions(R"cpp( 592 enum class Color { RED, YELLOW, BLUE }; 593 594 // (blank lines so the definition above isn't "context") 595 596 // "It was a yellow car," he said. "Big yellow car, new." 597 auto Finish = Color::^ 598 )cpp"); 599 // Yellow would normally sort last (alphabetic). 600 // But the recent mention should bump it up. 601 ASSERT_THAT(Results.Completions, 602 HasSubsequence(Named("YELLOW"), Named("BLUE"))); 603 } 604 605 TEST(CompletionTest, GlobalQualified) { 606 auto Results = completions( 607 R"cpp( 608 void f() { ::^ } 609 )cpp", 610 {cls("XYZ")}); 611 EXPECT_THAT(Results.Completions, 612 AllOf(Has("XYZ", CompletionItemKind::Class), 613 Has("f", CompletionItemKind::Function))); 614 } 615 616 TEST(CompletionTest, FullyQualified) { 617 auto Results = completions( 618 R"cpp( 619 namespace ns { void bar(); } 620 void f() { ::ns::^ } 621 )cpp", 622 {cls("ns::XYZ")}); 623 EXPECT_THAT(Results.Completions, 624 AllOf(Has("XYZ", CompletionItemKind::Class), 625 Has("bar", CompletionItemKind::Function))); 626 } 627 628 TEST(CompletionTest, SemaIndexMerge) { 629 auto Results = completions( 630 R"cpp( 631 namespace ns { int local; void both(); } 632 void f() { ::ns::^ } 633 )cpp", 634 {func("ns::both"), cls("ns::Index")}); 635 // We get results from both index and sema, with no duplicates. 636 EXPECT_THAT(Results.Completions, 637 UnorderedElementsAre( 638 AllOf(Named("local"), Origin(SymbolOrigin::AST)), 639 AllOf(Named("Index"), Origin(SymbolOrigin::Static)), 640 AllOf(Named("both"), 641 Origin(SymbolOrigin::AST | SymbolOrigin::Static)))); 642 } 643 644 TEST(CompletionTest, SemaIndexMergeWithLimit) { 645 clangd::CodeCompleteOptions Opts; 646 Opts.Limit = 1; 647 auto Results = completions( 648 R"cpp( 649 namespace ns { int local; void both(); } 650 void f() { ::ns::^ } 651 )cpp", 652 {func("ns::both"), cls("ns::Index")}, Opts); 653 EXPECT_EQ(Results.Completions.size(), Opts.Limit); 654 EXPECT_TRUE(Results.HasMore); 655 } 656 657 TEST(CompletionTest, IncludeInsertionPreprocessorIntegrationTests) { 658 TestTU TU; 659 TU.ExtraArgs.push_back("-I" + testPath("sub")); 660 TU.AdditionalFiles["sub/bar.h"] = ""; 661 auto BarURI = URI::create(testPath("sub/bar.h")).toString(); 662 663 Symbol Sym = cls("ns::X"); 664 Sym.CanonicalDeclaration.FileURI = BarURI.c_str(); 665 Sym.IncludeHeaders.emplace_back(BarURI, 1); 666 // Shorten include path based on search directory and insert. 667 Annotations Test("int main() { ns::^ }"); 668 TU.Code = Test.code().str(); 669 auto Results = completions(TU, Test.point(), {Sym}); 670 EXPECT_THAT(Results.Completions, 671 ElementsAre(AllOf(Named("X"), InsertInclude("\"bar.h\"")))); 672 // Can be disabled via option. 673 CodeCompleteOptions NoInsertion; 674 NoInsertion.InsertIncludes = CodeCompleteOptions::NeverInsert; 675 Results = completions(TU, Test.point(), {Sym}, NoInsertion); 676 EXPECT_THAT(Results.Completions, 677 ElementsAre(AllOf(Named("X"), Not(InsertInclude())))); 678 // Duplicate based on inclusions in preamble. 679 Test = Annotations(R"cpp( 680 #include "sub/bar.h" // not shortest, so should only match resolved. 681 int main() { ns::^ } 682 )cpp"); 683 TU.Code = Test.code().str(); 684 Results = completions(TU, Test.point(), {Sym}); 685 EXPECT_THAT(Results.Completions, ElementsAre(AllOf(Named("X"), Labeled("X"), 686 Not(InsertInclude())))); 687 } 688 689 TEST(CompletionTest, NoIncludeInsertionWhenDeclFoundInFile) { 690 Symbol SymX = cls("ns::X"); 691 Symbol SymY = cls("ns::Y"); 692 std::string BarHeader = testPath("bar.h"); 693 auto BarURI = URI::create(BarHeader).toString(); 694 SymX.CanonicalDeclaration.FileURI = BarURI.c_str(); 695 SymY.CanonicalDeclaration.FileURI = BarURI.c_str(); 696 SymX.IncludeHeaders.emplace_back("<bar>", 1); 697 SymY.IncludeHeaders.emplace_back("<bar>", 1); 698 // Shorten include path based on search directory and insert. 699 auto Results = completions(R"cpp( 700 namespace ns { 701 class X; 702 class Y {}; 703 } 704 int main() { ns::^ } 705 )cpp", 706 {SymX, SymY}); 707 EXPECT_THAT(Results.Completions, 708 ElementsAre(AllOf(Named("X"), Not(InsertInclude())), 709 AllOf(Named("Y"), Not(InsertInclude())))); 710 } 711 712 TEST(CompletionTest, IndexSuppressesPreambleCompletions) { 713 Annotations Test(R"cpp( 714 #include "bar.h" 715 namespace ns { int local; } 716 void f() { ns::^; } 717 void f2() { ns::preamble().$2^; } 718 )cpp"); 719 auto TU = TestTU::withCode(Test.code()); 720 TU.AdditionalFiles["bar.h"] = 721 R"cpp(namespace ns { struct preamble { int member; }; })cpp"; 722 723 clangd::CodeCompleteOptions Opts = {}; 724 auto I = memIndex({var("ns::index")}); 725 Opts.Index = I.get(); 726 auto WithIndex = completions(TU, Test.point(), {}, Opts); 727 EXPECT_THAT(WithIndex.Completions, 728 UnorderedElementsAre(Named("local"), Named("index"))); 729 auto ClassFromPreamble = completions(TU, Test.point("2"), {}, Opts); 730 EXPECT_THAT(ClassFromPreamble.Completions, Contains(Named("member"))); 731 732 Opts.Index = nullptr; 733 auto WithoutIndex = completions(TU, Test.point(), {}, Opts); 734 EXPECT_THAT(WithoutIndex.Completions, 735 UnorderedElementsAre(Named("local"), Named("preamble"))); 736 } 737 738 // This verifies that we get normal preprocessor completions in the preamble. 739 // This is a regression test for an old bug: if we override the preamble and 740 // try to complete inside it, clang kicks our completion point just outside the 741 // preamble, resulting in always getting top-level completions. 742 TEST(CompletionTest, CompletionInPreamble) { 743 auto Results = completions(R"cpp( 744 #ifnd^ef FOO_H_ 745 #define BAR_H_ 746 #include <bar.h> 747 int foo() {} 748 #endif 749 )cpp") 750 .Completions; 751 EXPECT_THAT(Results, ElementsAre(Named("ifndef"))); 752 } 753 754 TEST(CompletionTest, DynamicIndexIncludeInsertion) { 755 MockFSProvider FS; 756 MockCompilationDatabase CDB; 757 ClangdServer::Options Opts = ClangdServer::optsForTest(); 758 Opts.BuildDynamicSymbolIndex = true; 759 ClangdServer Server(CDB, FS, Opts); 760 761 FS.Files[testPath("foo_header.h")] = R"cpp( 762 #pragma once 763 struct Foo { 764 // Member doc 765 int foo(); 766 }; 767 )cpp"; 768 const std::string FileContent(R"cpp( 769 #include "foo_header.h" 770 int Foo::foo() { 771 return 42; 772 } 773 )cpp"); 774 Server.addDocument(testPath("foo_impl.cpp"), FileContent); 775 // Wait for the dynamic index being built. 776 ASSERT_TRUE(Server.blockUntilIdleForTest()); 777 778 auto File = testPath("foo.cpp"); 779 Annotations Test("Foo^ foo;"); 780 runAddDocument(Server, File, Test.code()); 781 auto CompletionList = 782 llvm::cantFail(runCodeComplete(Server, File, Test.point(), {})); 783 784 EXPECT_THAT(CompletionList.Completions, 785 ElementsAre(AllOf(Named("Foo"), HasInclude("\"foo_header.h\""), 786 InsertInclude()))); 787 } 788 789 TEST(CompletionTest, DynamicIndexMultiFile) { 790 MockFSProvider FS; 791 MockCompilationDatabase CDB; 792 auto Opts = ClangdServer::optsForTest(); 793 Opts.BuildDynamicSymbolIndex = true; 794 ClangdServer Server(CDB, FS, Opts); 795 796 FS.Files[testPath("foo.h")] = R"cpp( 797 namespace ns { class XYZ {}; void foo(int x) {} } 798 )cpp"; 799 runAddDocument(Server, testPath("foo.cpp"), R"cpp( 800 #include "foo.h" 801 )cpp"); 802 803 auto File = testPath("bar.cpp"); 804 Annotations Test(R"cpp( 805 namespace ns { 806 class XXX {}; 807 /// Doooc 808 void fooooo() {} 809 } 810 void f() { ns::^ } 811 )cpp"); 812 runAddDocument(Server, File, Test.code()); 813 814 auto Results = cantFail(runCodeComplete(Server, File, Test.point(), {})); 815 // "XYZ" and "foo" are not included in the file being completed but are still 816 // visible through the index. 817 EXPECT_THAT(Results.Completions, Has("XYZ", CompletionItemKind::Class)); 818 EXPECT_THAT(Results.Completions, Has("foo", CompletionItemKind::Function)); 819 EXPECT_THAT(Results.Completions, Has("XXX", CompletionItemKind::Class)); 820 EXPECT_THAT(Results.Completions, 821 Contains((Named("fooooo"), Kind(CompletionItemKind::Function), 822 Doc("Doooc"), ReturnType("void")))); 823 } 824 825 TEST(CompletionTest, Documentation) { 826 auto Results = completions( 827 R"cpp( 828 // Non-doxygen comment. 829 int foo(); 830 /// Doxygen comment. 831 /// \param int a 832 int bar(int a); 833 /* Multi-line 834 block comment 835 */ 836 int baz(); 837 838 int x = ^ 839 )cpp"); 840 EXPECT_THAT(Results.Completions, 841 Contains(AllOf(Named("foo"), Doc("Non-doxygen comment.")))); 842 EXPECT_THAT( 843 Results.Completions, 844 Contains(AllOf(Named("bar"), Doc("Doxygen comment.\n\\param int a")))); 845 EXPECT_THAT(Results.Completions, 846 Contains(AllOf(Named("baz"), Doc("Multi-line\nblock comment")))); 847 } 848 849 TEST(CompletionTest, CommentsFromSystemHeaders) { 850 MockFSProvider FS; 851 MockCompilationDatabase CDB; 852 853 auto Opts = ClangdServer::optsForTest(); 854 Opts.BuildDynamicSymbolIndex = true; 855 856 ClangdServer Server(CDB, FS, Opts); 857 858 FS.Files[testPath("foo.h")] = R"cpp( 859 #pragma GCC system_header 860 861 // This comment should be retained! 862 int foo(); 863 )cpp"; 864 865 auto File = testPath("foo.cpp"); 866 Annotations Test(R"cpp( 867 #include "foo.h" 868 int x = foo^ 869 )cpp"); 870 runAddDocument(Server, File, Test.code()); 871 auto CompletionList = 872 llvm::cantFail(runCodeComplete(Server, File, Test.point(), {})); 873 874 EXPECT_THAT( 875 CompletionList.Completions, 876 Contains(AllOf(Named("foo"), Doc("This comment should be retained!")))); 877 } 878 879 TEST(CompletionTest, GlobalCompletionFiltering) { 880 881 Symbol Class = cls("XYZ"); 882 Class.Flags = static_cast<Symbol::SymbolFlag>( 883 Class.Flags & ~(Symbol::IndexedForCodeCompletion)); 884 Symbol Func = func("XYZ::foooo"); 885 Func.Flags = static_cast<Symbol::SymbolFlag>( 886 Func.Flags & ~(Symbol::IndexedForCodeCompletion)); 887 888 auto Results = completions(R"(// void f() { 889 XYZ::foooo^ 890 })", 891 {Class, Func}); 892 EXPECT_THAT(Results.Completions, IsEmpty()); 893 } 894 895 TEST(CodeCompleteTest, DisableTypoCorrection) { 896 auto Results = completions(R"cpp( 897 namespace clang { int v; } 898 void f() { clangd::^ 899 )cpp"); 900 EXPECT_TRUE(Results.Completions.empty()); 901 } 902 903 TEST(CodeCompleteTest, NoColonColonAtTheEnd) { 904 auto Results = completions(R"cpp( 905 namespace clang { } 906 void f() { 907 clan^ 908 } 909 )cpp"); 910 911 EXPECT_THAT(Results.Completions, Contains(Labeled("clang"))); 912 EXPECT_THAT(Results.Completions, Not(Contains(Labeled("clang::")))); 913 } 914 915 TEST(CompletionTest, BacktrackCrashes) { 916 // Sema calls code completion callbacks twice in these cases. 917 auto Results = completions(R"cpp( 918 namespace ns { 919 struct FooBarBaz {}; 920 } // namespace ns 921 922 int foo(ns::FooBar^ 923 )cpp"); 924 925 EXPECT_THAT(Results.Completions, ElementsAre(Labeled("FooBarBaz"))); 926 927 // Check we don't crash in that case too. 928 completions(R"cpp( 929 struct FooBarBaz {}; 930 void test() { 931 if (FooBarBaz * x^) {} 932 } 933 )cpp"); 934 } 935 936 TEST(CompletionTest, CompleteInMacroWithStringification) { 937 auto Results = completions(R"cpp( 938 void f(const char *, int x); 939 #define F(x) f(#x, x) 940 941 namespace ns { 942 int X; 943 int Y; 944 } // namespace ns 945 946 int f(int input_num) { 947 F(ns::^) 948 } 949 )cpp"); 950 951 EXPECT_THAT(Results.Completions, 952 UnorderedElementsAre(Named("X"), Named("Y"))); 953 } 954 955 TEST(CompletionTest, CompleteInMacroAndNamespaceWithStringification) { 956 auto Results = completions(R"cpp( 957 void f(const char *, int x); 958 #define F(x) f(#x, x) 959 960 namespace ns { 961 int X; 962 963 int f(int input_num) { 964 F(^) 965 } 966 } // namespace ns 967 )cpp"); 968 969 EXPECT_THAT(Results.Completions, Contains(Named("X"))); 970 } 971 972 TEST(CompletionTest, IgnoreCompleteInExcludedPPBranchWithRecoveryContext) { 973 auto Results = completions(R"cpp( 974 int bar(int param_in_bar) { 975 } 976 977 int foo(int param_in_foo) { 978 #if 0 979 // In recovery mode, "param_in_foo" will also be suggested among many other 980 // unrelated symbols; however, this is really a special case where this works. 981 // If the #if block is outside of the function, "param_in_foo" is still 982 // suggested, but "bar" and "foo" are missing. So the recovery mode doesn't 983 // really provide useful results in excluded branches. 984 par^ 985 #endif 986 } 987 )cpp"); 988 989 EXPECT_TRUE(Results.Completions.empty()); 990 } 991 992 TEST(CompletionTest, DefaultArgs) { 993 clangd::CodeCompleteOptions Opts; 994 std::string Context = R"cpp( 995 int X(int A = 0); 996 int Y(int A, int B = 0); 997 int Z(int A, int B = 0, int C = 0, int D = 0); 998 )cpp"; 999 EXPECT_THAT(completions(Context + "int y = X^", {}, Opts).Completions, 1000 UnorderedElementsAre(Labeled("X(int A = 0)"))); 1001 EXPECT_THAT(completions(Context + "int y = Y^", {}, Opts).Completions, 1002 UnorderedElementsAre(AllOf(Labeled("Y(int A, int B = 0)"), 1003 SnippetSuffix("(${1:int A})")))); 1004 EXPECT_THAT(completions(Context + "int y = Z^", {}, Opts).Completions, 1005 UnorderedElementsAre( 1006 AllOf(Labeled("Z(int A, int B = 0, int C = 0, int D = 0)"), 1007 SnippetSuffix("(${1:int A})")))); 1008 } 1009 1010 TEST(CompletionTest, NoCrashWithTemplateParamsAndPreferredTypes) { 1011 auto Completions = completions(R"cpp( 1012 template <template <class> class TT> int foo() { 1013 int a = ^ 1014 } 1015 )cpp") 1016 .Completions; 1017 EXPECT_THAT(Completions, Contains(Named("TT"))); 1018 } 1019 1020 TEST(CompletionTest, RecordCCResultCallback) { 1021 std::vector<CodeCompletion> RecordedCompletions; 1022 CodeCompleteOptions Opts; 1023 Opts.RecordCCResult = [&RecordedCompletions](const CodeCompletion &CC, 1024 const SymbolQualitySignals &, 1025 const SymbolRelevanceSignals &, 1026 float Score) { 1027 RecordedCompletions.push_back(CC); 1028 }; 1029 1030 completions("int xy1, xy2; int a = xy^", /*IndexSymbols=*/{}, Opts); 1031 EXPECT_THAT(RecordedCompletions, 1032 UnorderedElementsAre(Named("xy1"), Named("xy2"))); 1033 } 1034 1035 SignatureHelp signatures(llvm::StringRef Text, Position Point, 1036 std::vector<Symbol> IndexSymbols = {}) { 1037 std::unique_ptr<SymbolIndex> Index; 1038 if (!IndexSymbols.empty()) 1039 Index = memIndex(IndexSymbols); 1040 1041 auto TU = TestTU::withCode(Text); 1042 auto Inputs = TU.inputs(); 1043 IgnoreDiagnostics Diags; 1044 auto CI = buildCompilerInvocation(Inputs, Diags); 1045 if (!CI) { 1046 ADD_FAILURE() << "Couldn't build CompilerInvocation"; 1047 return {}; 1048 } 1049 auto Preamble = 1050 buildPreamble(testPath(TU.Filename), *CI, /*OldPreamble=*/nullptr, Inputs, 1051 /*InMemory=*/true, /*Callback=*/nullptr); 1052 if (!Preamble) { 1053 ADD_FAILURE() << "Couldn't build Preamble"; 1054 return {}; 1055 } 1056 return signatureHelp(testPath(TU.Filename), Inputs.CompileCommand, *Preamble, 1057 Text, Point, Inputs.FS, Index.get()); 1058 } 1059 1060 SignatureHelp signatures(llvm::StringRef Text, 1061 std::vector<Symbol> IndexSymbols = {}) { 1062 Annotations Test(Text); 1063 return signatures(Test.code(), Test.point(), std::move(IndexSymbols)); 1064 } 1065 1066 struct ExpectedParameter { 1067 std::string Text; 1068 std::pair<unsigned, unsigned> Offsets; 1069 }; 1070 MATCHER_P(ParamsAre, P, "") { 1071 if (P.size() != arg.parameters.size()) 1072 return false; 1073 for (unsigned I = 0; I < P.size(); ++I) { 1074 if (P[I].Text != arg.parameters[I].labelString || 1075 P[I].Offsets != arg.parameters[I].labelOffsets) 1076 return false; 1077 } 1078 return true; 1079 } 1080 MATCHER_P(SigDoc, Doc, "") { return arg.documentation == Doc; } 1081 1082 /// \p AnnotatedLabel is a signature label with ranges marking parameters, e.g. 1083 /// foo([[int p1]], [[double p2]]) -> void 1084 Matcher<SignatureInformation> Sig(llvm::StringRef AnnotatedLabel) { 1085 llvm::Annotations A(AnnotatedLabel); 1086 std::string Label = std::string(A.code()); 1087 std::vector<ExpectedParameter> Parameters; 1088 for (auto Range : A.ranges()) { 1089 Parameters.emplace_back(); 1090 1091 ExpectedParameter &P = Parameters.back(); 1092 P.Text = Label.substr(Range.Begin, Range.End - Range.Begin); 1093 P.Offsets.first = lspLength(llvm::StringRef(Label).substr(0, Range.Begin)); 1094 P.Offsets.second = lspLength(llvm::StringRef(Label).substr(1, Range.End)); 1095 } 1096 return AllOf(SigHelpLabeled(Label), ParamsAre(Parameters)); 1097 } 1098 1099 TEST(SignatureHelpTest, Overloads) { 1100 auto Results = signatures(R"cpp( 1101 void foo(int x, int y); 1102 void foo(int x, float y); 1103 void foo(float x, int y); 1104 void foo(float x, float y); 1105 void bar(int x, int y = 0); 1106 int main() { foo(^); } 1107 )cpp"); 1108 EXPECT_THAT(Results.signatures, 1109 UnorderedElementsAre(Sig("foo([[float x]], [[float y]]) -> void"), 1110 Sig("foo([[float x]], [[int y]]) -> void"), 1111 Sig("foo([[int x]], [[float y]]) -> void"), 1112 Sig("foo([[int x]], [[int y]]) -> void"))); 1113 // We always prefer the first signature. 1114 EXPECT_EQ(0, Results.activeSignature); 1115 EXPECT_EQ(0, Results.activeParameter); 1116 } 1117 1118 TEST(SignatureHelpTest, DefaultArgs) { 1119 auto Results = signatures(R"cpp( 1120 void bar(int x, int y = 0); 1121 void bar(float x = 0, int y = 42); 1122 int main() { bar(^ 1123 )cpp"); 1124 EXPECT_THAT(Results.signatures, 1125 UnorderedElementsAre( 1126 Sig("bar([[int x]], [[int y = 0]]) -> void"), 1127 Sig("bar([[float x = 0]], [[int y = 42]]) -> void"))); 1128 EXPECT_EQ(0, Results.activeSignature); 1129 EXPECT_EQ(0, Results.activeParameter); 1130 } 1131 1132 TEST(SignatureHelpTest, ActiveArg) { 1133 auto Results = signatures(R"cpp( 1134 int baz(int a, int b, int c); 1135 int main() { baz(baz(1,2,3), ^); } 1136 )cpp"); 1137 EXPECT_THAT(Results.signatures, 1138 ElementsAre(Sig("baz([[int a]], [[int b]], [[int c]]) -> int"))); 1139 EXPECT_EQ(0, Results.activeSignature); 1140 EXPECT_EQ(1, Results.activeParameter); 1141 } 1142 1143 TEST(SignatureHelpTest, OpeningParen) { 1144 llvm::StringLiteral Tests[] = {// Recursive function call. 1145 R"cpp( 1146 int foo(int a, int b, int c); 1147 int main() { 1148 foo(foo $p^( foo(10, 10, 10), ^ ))); 1149 })cpp", 1150 // Functional type cast. 1151 R"cpp( 1152 struct Foo { 1153 Foo(int a, int b, int c); 1154 }; 1155 int main() { 1156 Foo $p^( 10, ^ ); 1157 })cpp", 1158 // New expression. 1159 R"cpp( 1160 struct Foo { 1161 Foo(int a, int b, int c); 1162 }; 1163 int main() { 1164 new Foo $p^( 10, ^ ); 1165 })cpp", 1166 // Macro expansion. 1167 R"cpp( 1168 int foo(int a, int b, int c); 1169 #define FOO foo( 1170 1171 int main() { 1172 // Macro expansions. 1173 $p^FOO 10, ^ ); 1174 })cpp", 1175 // Macro arguments. 1176 R"cpp( 1177 int foo(int a, int b, int c); 1178 int main() { 1179 #define ID(X) X 1180 ID(foo $p^( foo(10), ^ )) 1181 })cpp"}; 1182 1183 for (auto Test : Tests) { 1184 Annotations Code(Test); 1185 EXPECT_EQ(signatures(Code.code(), Code.point()).argListStart, 1186 Code.point("p")) 1187 << "Test source:" << Test; 1188 } 1189 } 1190 1191 class IndexRequestCollector : public SymbolIndex { 1192 public: 1193 bool 1194 fuzzyFind(const FuzzyFindRequest &Req, 1195 llvm::function_ref<void(const Symbol &)> Callback) const override { 1196 std::unique_lock<std::mutex> Lock(Mut); 1197 Requests.push_back(Req); 1198 ReceivedRequestCV.notify_one(); 1199 return true; 1200 } 1201 1202 void lookup(const LookupRequest &, 1203 llvm::function_ref<void(const Symbol &)>) const override {} 1204 1205 bool refs(const RefsRequest &, 1206 llvm::function_ref<void(const Ref &)>) const override { 1207 return false; 1208 } 1209 1210 void relations(const RelationsRequest &, 1211 llvm::function_ref<void(const SymbolID &, const Symbol &)>) 1212 const override {} 1213 1214 // This is incorrect, but IndexRequestCollector is not an actual index and it 1215 // isn't used in production code. 1216 size_t estimateMemoryUsage() const override { return 0; } 1217 1218 const std::vector<FuzzyFindRequest> consumeRequests(size_t Num) const { 1219 std::unique_lock<std::mutex> Lock(Mut); 1220 EXPECT_TRUE(wait(Lock, ReceivedRequestCV, timeoutSeconds(30), 1221 [this, Num] { return Requests.size() == Num; })); 1222 auto Reqs = std::move(Requests); 1223 Requests = {}; 1224 return Reqs; 1225 } 1226 1227 private: 1228 // We need a mutex to handle async fuzzy find requests. 1229 mutable std::condition_variable ReceivedRequestCV; 1230 mutable std::mutex Mut; 1231 mutable std::vector<FuzzyFindRequest> Requests; 1232 }; 1233 1234 // Clients have to consume exactly Num requests. 1235 std::vector<FuzzyFindRequest> captureIndexRequests(llvm::StringRef Code, 1236 size_t Num = 1) { 1237 clangd::CodeCompleteOptions Opts; 1238 IndexRequestCollector Requests; 1239 Opts.Index = &Requests; 1240 completions(Code, {}, Opts); 1241 const auto Reqs = Requests.consumeRequests(Num); 1242 EXPECT_EQ(Reqs.size(), Num); 1243 return Reqs; 1244 } 1245 1246 TEST(CompletionTest, UnqualifiedIdQuery) { 1247 auto Requests = captureIndexRequests(R"cpp( 1248 namespace std {} 1249 using namespace std; 1250 namespace ns { 1251 void f() { 1252 vec^ 1253 } 1254 } 1255 )cpp"); 1256 1257 EXPECT_THAT(Requests, 1258 ElementsAre(Field(&FuzzyFindRequest::Scopes, 1259 UnorderedElementsAre("", "ns::", "std::")))); 1260 } 1261 1262 TEST(CompletionTest, EnclosingScopeComesFirst) { 1263 auto Requests = captureIndexRequests(R"cpp( 1264 namespace std {} 1265 using namespace std; 1266 namespace nx { 1267 namespace ns { 1268 namespace { 1269 void f() { 1270 vec^ 1271 } 1272 } 1273 } 1274 } 1275 )cpp"); 1276 1277 EXPECT_THAT(Requests, 1278 ElementsAre(Field( 1279 &FuzzyFindRequest::Scopes, 1280 UnorderedElementsAre("", "std::", "nx::ns::", "nx::")))); 1281 EXPECT_EQ(Requests[0].Scopes[0], "nx::ns::"); 1282 } 1283 1284 TEST(CompletionTest, ResolvedQualifiedIdQuery) { 1285 auto Requests = captureIndexRequests(R"cpp( 1286 namespace ns1 {} 1287 namespace ns2 {} // ignore 1288 namespace ns3 { namespace nns3 {} } 1289 namespace foo { 1290 using namespace ns1; 1291 using namespace ns3::nns3; 1292 } 1293 namespace ns { 1294 void f() { 1295 foo::^ 1296 } 1297 } 1298 )cpp"); 1299 1300 EXPECT_THAT(Requests, 1301 ElementsAre(Field( 1302 &FuzzyFindRequest::Scopes, 1303 UnorderedElementsAre("foo::", "ns1::", "ns3::nns3::")))); 1304 } 1305 1306 TEST(CompletionTest, UnresolvedQualifierIdQuery) { 1307 auto Requests = captureIndexRequests(R"cpp( 1308 namespace a {} 1309 using namespace a; 1310 namespace ns { 1311 void f() { 1312 bar::^ 1313 } 1314 } // namespace ns 1315 )cpp"); 1316 1317 EXPECT_THAT(Requests, 1318 ElementsAre(Field( 1319 &FuzzyFindRequest::Scopes, 1320 UnorderedElementsAre("a::bar::", "ns::bar::", "bar::")))); 1321 } 1322 1323 TEST(CompletionTest, UnresolvedNestedQualifierIdQuery) { 1324 auto Requests = captureIndexRequests(R"cpp( 1325 namespace a {} 1326 using namespace a; 1327 namespace ns { 1328 void f() { 1329 ::a::bar::^ 1330 } 1331 } // namespace ns 1332 )cpp"); 1333 1334 EXPECT_THAT(Requests, ElementsAre(Field(&FuzzyFindRequest::Scopes, 1335 UnorderedElementsAre("a::bar::")))); 1336 } 1337 1338 TEST(CompletionTest, EmptyQualifiedQuery) { 1339 auto Requests = captureIndexRequests(R"cpp( 1340 namespace ns { 1341 void f() { 1342 ^ 1343 } 1344 } // namespace ns 1345 )cpp"); 1346 1347 EXPECT_THAT(Requests, ElementsAre(Field(&FuzzyFindRequest::Scopes, 1348 UnorderedElementsAre("", "ns::")))); 1349 } 1350 1351 TEST(CompletionTest, GlobalQualifiedQuery) { 1352 auto Requests = captureIndexRequests(R"cpp( 1353 namespace ns { 1354 void f() { 1355 ::^ 1356 } 1357 } // namespace ns 1358 )cpp"); 1359 1360 EXPECT_THAT(Requests, ElementsAre(Field(&FuzzyFindRequest::Scopes, 1361 UnorderedElementsAre("")))); 1362 } 1363 1364 TEST(CompletionTest, NoDuplicatedQueryScopes) { 1365 auto Requests = captureIndexRequests(R"cpp( 1366 namespace {} 1367 1368 namespace na { 1369 namespace {} 1370 namespace nb { 1371 ^ 1372 } // namespace nb 1373 } // namespace na 1374 )cpp"); 1375 1376 EXPECT_THAT(Requests, 1377 ElementsAre(Field(&FuzzyFindRequest::Scopes, 1378 UnorderedElementsAre("na::", "na::nb::", "")))); 1379 } 1380 1381 TEST(CompletionTest, NoIndexCompletionsInsideClasses) { 1382 auto Completions = completions( 1383 R"cpp( 1384 struct Foo { 1385 int SomeNameOfField; 1386 typedef int SomeNameOfTypedefField; 1387 }; 1388 1389 Foo::^)cpp", 1390 {func("::SomeNameInTheIndex"), func("::Foo::SomeNameInTheIndex")}); 1391 1392 EXPECT_THAT(Completions.Completions, 1393 AllOf(Contains(Labeled("SomeNameOfField")), 1394 Contains(Labeled("SomeNameOfTypedefField")), 1395 Not(Contains(Labeled("SomeNameInTheIndex"))))); 1396 } 1397 1398 TEST(CompletionTest, NoIndexCompletionsInsideDependentCode) { 1399 { 1400 auto Completions = completions( 1401 R"cpp( 1402 template <class T> 1403 void foo() { 1404 T::^ 1405 } 1406 )cpp", 1407 {func("::SomeNameInTheIndex")}); 1408 1409 EXPECT_THAT(Completions.Completions, 1410 Not(Contains(Labeled("SomeNameInTheIndex")))); 1411 } 1412 1413 { 1414 auto Completions = completions( 1415 R"cpp( 1416 template <class T> 1417 void foo() { 1418 T::template Y<int>::^ 1419 } 1420 )cpp", 1421 {func("::SomeNameInTheIndex")}); 1422 1423 EXPECT_THAT(Completions.Completions, 1424 Not(Contains(Labeled("SomeNameInTheIndex")))); 1425 } 1426 1427 { 1428 auto Completions = completions( 1429 R"cpp( 1430 template <class T> 1431 void foo() { 1432 T::foo::^ 1433 } 1434 )cpp", 1435 {func("::SomeNameInTheIndex")}); 1436 1437 EXPECT_THAT(Completions.Completions, 1438 Not(Contains(Labeled("SomeNameInTheIndex")))); 1439 } 1440 } 1441 1442 TEST(CompletionTest, OverloadBundling) { 1443 clangd::CodeCompleteOptions Opts; 1444 Opts.BundleOverloads = true; 1445 1446 std::string Context = R"cpp( 1447 struct X { 1448 // Overload with int 1449 int a(int); 1450 // Overload with bool 1451 int a(bool); 1452 int b(float); 1453 }; 1454 int GFuncC(int); 1455 int GFuncD(int); 1456 )cpp"; 1457 1458 // Member completions are bundled. 1459 EXPECT_THAT(completions(Context + "int y = X().^", {}, Opts).Completions, 1460 UnorderedElementsAre(Labeled("a(…)"), Labeled("b(float)"))); 1461 1462 // Non-member completions are bundled, including index+sema. 1463 Symbol NoArgsGFunc = func("GFuncC"); 1464 EXPECT_THAT( 1465 completions(Context + "int y = GFunc^", {NoArgsGFunc}, Opts).Completions, 1466 UnorderedElementsAre(Labeled("GFuncC(…)"), Labeled("GFuncD(int)"))); 1467 1468 // Differences in header-to-insert suppress bundling. 1469 std::string DeclFile = URI::create(testPath("foo")).toString(); 1470 NoArgsGFunc.CanonicalDeclaration.FileURI = DeclFile.c_str(); 1471 NoArgsGFunc.IncludeHeaders.emplace_back("<foo>", 1); 1472 EXPECT_THAT( 1473 completions(Context + "int y = GFunc^", {NoArgsGFunc}, Opts).Completions, 1474 UnorderedElementsAre(AllOf(Named("GFuncC"), InsertInclude("<foo>")), 1475 Labeled("GFuncC(int)"), Labeled("GFuncD(int)"))); 1476 1477 // Examine a bundled completion in detail. 1478 auto A = 1479 completions(Context + "int y = X().a^", {}, Opts).Completions.front(); 1480 EXPECT_EQ(A.Name, "a"); 1481 EXPECT_EQ(A.Signature, "(…)"); 1482 EXPECT_EQ(A.BundleSize, 2u); 1483 EXPECT_EQ(A.Kind, CompletionItemKind::Method); 1484 EXPECT_EQ(A.ReturnType, "int"); // All overloads return int. 1485 // For now we just return one of the doc strings arbitrarily. 1486 EXPECT_THAT(A.Documentation, AnyOf(HasSubstr("Overload with int"), 1487 HasSubstr("Overload with bool"))); 1488 EXPECT_EQ(A.SnippetSuffix, "($0)"); 1489 } 1490 1491 TEST(CompletionTest, DocumentationFromChangedFileCrash) { 1492 MockFSProvider FS; 1493 auto FooH = testPath("foo.h"); 1494 auto FooCpp = testPath("foo.cpp"); 1495 FS.Files[FooH] = R"cpp( 1496 // this is my documentation comment. 1497 int func(); 1498 )cpp"; 1499 FS.Files[FooCpp] = ""; 1500 1501 MockCompilationDatabase CDB; 1502 ClangdServer Server(CDB, FS, ClangdServer::optsForTest()); 1503 1504 Annotations Source(R"cpp( 1505 #include "foo.h" 1506 int func() { 1507 // This makes sure we have func from header in the AST. 1508 } 1509 int a = fun^ 1510 )cpp"); 1511 Server.addDocument(FooCpp, Source.code(), "null", WantDiagnostics::Yes); 1512 // We need to wait for preamble to build. 1513 ASSERT_TRUE(Server.blockUntilIdleForTest()); 1514 1515 // Change the header file. Completion will reuse the old preamble! 1516 FS.Files[FooH] = R"cpp( 1517 int func(); 1518 )cpp"; 1519 1520 clangd::CodeCompleteOptions Opts; 1521 Opts.IncludeComments = true; 1522 CodeCompleteResult Completions = 1523 cantFail(runCodeComplete(Server, FooCpp, Source.point(), Opts)); 1524 // We shouldn't crash. Unfortunately, current workaround is to not produce 1525 // comments for symbols from headers. 1526 EXPECT_THAT(Completions.Completions, 1527 Contains(AllOf(Not(IsDocumented()), Named("func")))); 1528 } 1529 1530 TEST(CompletionTest, NonDocComments) { 1531 const char *Text = R"cpp( 1532 // We ignore namespace comments, for rationale see CodeCompletionStrings.h. 1533 namespace comments_ns { 1534 } 1535 1536 // ------------------ 1537 int comments_foo(); 1538 1539 // A comment and a decl are separated by newlines. 1540 // Therefore, the comment shouldn't show up as doc comment. 1541 1542 int comments_bar(); 1543 1544 // this comment should be in the results. 1545 int comments_baz(); 1546 1547 1548 template <class T> 1549 struct Struct { 1550 int comments_qux(); 1551 int comments_quux(); 1552 }; 1553 1554 1555 // This comment should not be there. 1556 1557 template <class T> 1558 int Struct<T>::comments_qux() { 1559 } 1560 1561 // This comment **should** be in results. 1562 template <class T> 1563 int Struct<T>::comments_quux() { 1564 int a = comments^; 1565 } 1566 )cpp"; 1567 1568 // We should not get any of those comments in completion. 1569 EXPECT_THAT( 1570 completions(Text).Completions, 1571 UnorderedElementsAre(AllOf(Not(IsDocumented()), Named("comments_foo")), 1572 AllOf(IsDocumented(), Named("comments_baz")), 1573 AllOf(IsDocumented(), Named("comments_quux")), 1574 AllOf(Not(IsDocumented()), Named("comments_ns")), 1575 // FIXME(ibiryukov): the following items should have 1576 // empty documentation, since they are separated from 1577 // a comment with an empty line. Unfortunately, I 1578 // couldn't make Sema tests pass if we ignore those. 1579 AllOf(IsDocumented(), Named("comments_bar")), 1580 AllOf(IsDocumented(), Named("comments_qux")))); 1581 } 1582 1583 TEST(CompletionTest, CompleteOnInvalidLine) { 1584 auto FooCpp = testPath("foo.cpp"); 1585 1586 MockCompilationDatabase CDB; 1587 MockFSProvider FS; 1588 FS.Files[FooCpp] = "// empty file"; 1589 1590 ClangdServer Server(CDB, FS, ClangdServer::optsForTest()); 1591 // Run completion outside the file range. 1592 Position Pos; 1593 Pos.line = 100; 1594 Pos.character = 0; 1595 EXPECT_THAT_EXPECTED( 1596 runCodeComplete(Server, FooCpp, Pos, clangd::CodeCompleteOptions()), 1597 Failed()); 1598 } 1599 1600 TEST(CompletionTest, QualifiedNames) { 1601 auto Results = completions( 1602 R"cpp( 1603 namespace ns { int local; void both(); } 1604 void f() { ::ns::^ } 1605 )cpp", 1606 {func("ns::both"), cls("ns::Index")}); 1607 // We get results from both index and sema, with no duplicates. 1608 EXPECT_THAT( 1609 Results.Completions, 1610 UnorderedElementsAre(Scope("ns::"), Scope("ns::"), Scope("ns::"))); 1611 } 1612 1613 TEST(CompletionTest, Render) { 1614 CodeCompletion C; 1615 C.Name = "x"; 1616 C.Signature = "(bool) const"; 1617 C.SnippetSuffix = "(${0:bool})"; 1618 C.ReturnType = "int"; 1619 C.RequiredQualifier = "Foo::"; 1620 C.Scope = "ns::Foo::"; 1621 C.Documentation = "This is x()."; 1622 C.Includes.emplace_back(); 1623 auto &Include = C.Includes.back(); 1624 Include.Header = "\"foo.h\""; 1625 C.Kind = CompletionItemKind::Method; 1626 C.Score.Total = 1.0; 1627 C.Score.ExcludingName = .5; 1628 C.Origin = SymbolOrigin::AST | SymbolOrigin::Static; 1629 1630 CodeCompleteOptions Opts; 1631 Opts.IncludeIndicator.Insert = "^"; 1632 Opts.IncludeIndicator.NoInsert = ""; 1633 Opts.EnableSnippets = false; 1634 1635 auto R = C.render(Opts); 1636 EXPECT_EQ(R.label, "Foo::x(bool) const"); 1637 EXPECT_EQ(R.insertText, "Foo::x"); 1638 EXPECT_EQ(R.insertTextFormat, InsertTextFormat::PlainText); 1639 EXPECT_EQ(R.filterText, "x"); 1640 EXPECT_EQ(R.detail, "int\n\"foo.h\""); 1641 EXPECT_EQ(R.documentation, "This is x()."); 1642 EXPECT_THAT(R.additionalTextEdits, IsEmpty()); 1643 EXPECT_EQ(R.sortText, sortText(1.0, "x")); 1644 EXPECT_FALSE(R.deprecated); 1645 EXPECT_EQ(R.score, .5f); 1646 1647 Opts.EnableSnippets = true; 1648 R = C.render(Opts); 1649 EXPECT_EQ(R.insertText, "Foo::x(${0:bool})"); 1650 EXPECT_EQ(R.insertTextFormat, InsertTextFormat::Snippet); 1651 1652 Include.Insertion.emplace(); 1653 R = C.render(Opts); 1654 EXPECT_EQ(R.label, "^Foo::x(bool) const"); 1655 EXPECT_THAT(R.additionalTextEdits, Not(IsEmpty())); 1656 1657 Opts.ShowOrigins = true; 1658 R = C.render(Opts); 1659 EXPECT_EQ(R.label, "^[AS]Foo::x(bool) const"); 1660 1661 C.BundleSize = 2; 1662 R = C.render(Opts); 1663 EXPECT_EQ(R.detail, "[2 overloads]\n\"foo.h\""); 1664 1665 C.Deprecated = true; 1666 R = C.render(Opts); 1667 EXPECT_TRUE(R.deprecated); 1668 } 1669 1670 TEST(CompletionTest, IgnoreRecoveryResults) { 1671 auto Results = completions( 1672 R"cpp( 1673 namespace ns { int NotRecovered() { return 0; } } 1674 void f() { 1675 // Sema enters recovery mode first and then normal mode. 1676 if (auto x = ns::NotRecover^) 1677 } 1678 )cpp"); 1679 EXPECT_THAT(Results.Completions, UnorderedElementsAre(Named("NotRecovered"))); 1680 } 1681 1682 TEST(CompletionTest, ScopeOfClassFieldInConstructorInitializer) { 1683 auto Results = completions( 1684 R"cpp( 1685 namespace ns { 1686 class X { public: X(); int x_; }; 1687 X::X() : x_^(0) {} 1688 } 1689 )cpp"); 1690 EXPECT_THAT(Results.Completions, 1691 UnorderedElementsAre(AllOf(Scope("ns::X::"), Named("x_")))); 1692 } 1693 1694 TEST(CompletionTest, CodeCompletionContext) { 1695 auto Results = completions( 1696 R"cpp( 1697 namespace ns { 1698 class X { public: X(); int x_; }; 1699 void f() { 1700 X x; 1701 x.^; 1702 } 1703 } 1704 )cpp"); 1705 1706 EXPECT_THAT(Results.Context, CodeCompletionContext::CCC_DotMemberAccess); 1707 } 1708 1709 TEST(CompletionTest, FixItForArrowToDot) { 1710 MockFSProvider FS; 1711 MockCompilationDatabase CDB; 1712 1713 CodeCompleteOptions Opts; 1714 Opts.IncludeFixIts = true; 1715 const char* Code = 1716 R"cpp( 1717 class Auxilary { 1718 public: 1719 void AuxFunction(); 1720 }; 1721 class ClassWithPtr { 1722 public: 1723 void MemberFunction(); 1724 Auxilary* operator->() const; 1725 Auxilary* Aux; 1726 }; 1727 void f() { 1728 ClassWithPtr x; 1729 x[[->]]^; 1730 } 1731 )cpp"; 1732 auto Results = completions(Code, {}, Opts); 1733 EXPECT_EQ(Results.Completions.size(), 3u); 1734 1735 TextEdit ReplacementEdit; 1736 ReplacementEdit.range = Annotations(Code).range(); 1737 ReplacementEdit.newText = "."; 1738 for (const auto &C : Results.Completions) { 1739 EXPECT_TRUE(C.FixIts.size() == 1u || C.Name == "AuxFunction"); 1740 if (!C.FixIts.empty()) { 1741 EXPECT_THAT(C.FixIts, ElementsAre(ReplacementEdit)); 1742 } 1743 } 1744 } 1745 1746 TEST(CompletionTest, FixItForDotToArrow) { 1747 CodeCompleteOptions Opts; 1748 Opts.IncludeFixIts = true; 1749 const char* Code = 1750 R"cpp( 1751 class Auxilary { 1752 public: 1753 void AuxFunction(); 1754 }; 1755 class ClassWithPtr { 1756 public: 1757 void MemberFunction(); 1758 Auxilary* operator->() const; 1759 Auxilary* Aux; 1760 }; 1761 void f() { 1762 ClassWithPtr x; 1763 x[[.]]^; 1764 } 1765 )cpp"; 1766 auto Results = completions(Code, {}, Opts); 1767 EXPECT_EQ(Results.Completions.size(), 3u); 1768 1769 TextEdit ReplacementEdit; 1770 ReplacementEdit.range = Annotations(Code).range(); 1771 ReplacementEdit.newText = "->"; 1772 for (const auto &C : Results.Completions) { 1773 EXPECT_TRUE(C.FixIts.empty() || C.Name == "AuxFunction"); 1774 if (!C.FixIts.empty()) { 1775 EXPECT_THAT(C.FixIts, ElementsAre(ReplacementEdit)); 1776 } 1777 } 1778 } 1779 1780 TEST(CompletionTest, RenderWithFixItMerged) { 1781 TextEdit FixIt; 1782 FixIt.range.end.character = 5; 1783 FixIt.newText = "->"; 1784 1785 CodeCompletion C; 1786 C.Name = "x"; 1787 C.RequiredQualifier = "Foo::"; 1788 C.FixIts = {FixIt}; 1789 C.CompletionTokenRange.start.character = 5; 1790 1791 CodeCompleteOptions Opts; 1792 Opts.IncludeFixIts = true; 1793 1794 auto R = C.render(Opts); 1795 EXPECT_TRUE(R.textEdit); 1796 EXPECT_EQ(R.textEdit->newText, "->Foo::x"); 1797 EXPECT_TRUE(R.additionalTextEdits.empty()); 1798 } 1799 1800 TEST(CompletionTest, RenderWithFixItNonMerged) { 1801 TextEdit FixIt; 1802 FixIt.range.end.character = 4; 1803 FixIt.newText = "->"; 1804 1805 CodeCompletion C; 1806 C.Name = "x"; 1807 C.RequiredQualifier = "Foo::"; 1808 C.FixIts = {FixIt}; 1809 C.CompletionTokenRange.start.character = 5; 1810 1811 CodeCompleteOptions Opts; 1812 Opts.IncludeFixIts = true; 1813 1814 auto R = C.render(Opts); 1815 EXPECT_TRUE(R.textEdit); 1816 EXPECT_EQ(R.textEdit->newText, "Foo::x"); 1817 EXPECT_THAT(R.additionalTextEdits, UnorderedElementsAre(FixIt)); 1818 } 1819 1820 TEST(CompletionTest, CompletionTokenRange) { 1821 MockFSProvider FS; 1822 MockCompilationDatabase CDB; 1823 TestTU TU; 1824 TU.AdditionalFiles["foo/abc/foo.h"] = ""; 1825 1826 constexpr const char *TestCodes[] = { 1827 R"cpp( 1828 class Auxilary { 1829 public: 1830 void AuxFunction(); 1831 }; 1832 void f() { 1833 Auxilary x; 1834 x.[[Aux]]^; 1835 } 1836 )cpp", 1837 R"cpp( 1838 class Auxilary { 1839 public: 1840 void AuxFunction(); 1841 }; 1842 void f() { 1843 Auxilary x; 1844 x.[[]]^; 1845 } 1846 )cpp", 1847 R"cpp( 1848 #include "foo/[[a^/]]foo.h" 1849 )cpp", 1850 R"cpp( 1851 #include "foo/abc/[[fo^o.h"]] 1852 )cpp", 1853 }; 1854 for (const auto &Text : TestCodes) { 1855 Annotations TestCode(Text); 1856 TU.Code = TestCode.code().str(); 1857 auto Results = completions(TU, TestCode.point()); 1858 if (Results.Completions.size() != 1) { 1859 ADD_FAILURE() << "Results.Completions.size() != 1" << Text; 1860 continue; 1861 } 1862 EXPECT_THAT(Results.Completions.front().CompletionTokenRange, 1863 TestCode.range()); 1864 } 1865 } 1866 1867 TEST(SignatureHelpTest, OverloadsOrdering) { 1868 const auto Results = signatures(R"cpp( 1869 void foo(int x); 1870 void foo(int x, float y); 1871 void foo(float x, int y); 1872 void foo(float x, float y); 1873 void foo(int x, int y = 0); 1874 int main() { foo(^); } 1875 )cpp"); 1876 EXPECT_THAT(Results.signatures, 1877 ElementsAre(Sig("foo([[int x]]) -> void"), 1878 Sig("foo([[int x]], [[int y = 0]]) -> void"), 1879 Sig("foo([[float x]], [[int y]]) -> void"), 1880 Sig("foo([[int x]], [[float y]]) -> void"), 1881 Sig("foo([[float x]], [[float y]]) -> void"))); 1882 // We always prefer the first signature. 1883 EXPECT_EQ(0, Results.activeSignature); 1884 EXPECT_EQ(0, Results.activeParameter); 1885 } 1886 1887 TEST(SignatureHelpTest, InstantiatedSignatures) { 1888 StringRef Sig0 = R"cpp( 1889 template <class T> 1890 void foo(T, T, T); 1891 1892 int main() { 1893 foo<int>(^); 1894 } 1895 )cpp"; 1896 1897 EXPECT_THAT(signatures(Sig0).signatures, 1898 ElementsAre(Sig("foo([[T]], [[T]], [[T]]) -> void"))); 1899 1900 StringRef Sig1 = R"cpp( 1901 template <class T> 1902 void foo(T, T, T); 1903 1904 int main() { 1905 foo(10, ^); 1906 })cpp"; 1907 1908 EXPECT_THAT(signatures(Sig1).signatures, 1909 ElementsAre(Sig("foo([[T]], [[T]], [[T]]) -> void"))); 1910 1911 StringRef Sig2 = R"cpp( 1912 template <class ...T> 1913 void foo(T...); 1914 1915 int main() { 1916 foo<int>(^); 1917 } 1918 )cpp"; 1919 1920 EXPECT_THAT(signatures(Sig2).signatures, 1921 ElementsAre(Sig("foo([[T...]]) -> void"))); 1922 1923 // It is debatable whether we should substitute the outer template parameter 1924 // ('T') in that case. Currently we don't substitute it in signature help, but 1925 // do substitute in code complete. 1926 // FIXME: make code complete and signature help consistent, figure out which 1927 // way is better. 1928 StringRef Sig3 = R"cpp( 1929 template <class T> 1930 struct X { 1931 template <class U> 1932 void foo(T, U); 1933 }; 1934 1935 int main() { 1936 X<int>().foo<double>(^) 1937 } 1938 )cpp"; 1939 1940 EXPECT_THAT(signatures(Sig3).signatures, 1941 ElementsAre(Sig("foo([[T]], [[U]]) -> void"))); 1942 } 1943 1944 TEST(SignatureHelpTest, IndexDocumentation) { 1945 Symbol Foo0 = sym("foo", index::SymbolKind::Function, "@F@\\0#"); 1946 Foo0.Documentation = "Doc from the index"; 1947 Symbol Foo1 = sym("foo", index::SymbolKind::Function, "@F@\\0#I#"); 1948 Foo1.Documentation = "Doc from the index"; 1949 Symbol Foo2 = sym("foo", index::SymbolKind::Function, "@F@\\0#I#I#"); 1950 1951 StringRef Sig0 = R"cpp( 1952 int foo(); 1953 int foo(double); 1954 1955 void test() { 1956 foo(^); 1957 } 1958 )cpp"; 1959 1960 EXPECT_THAT( 1961 signatures(Sig0, {Foo0}).signatures, 1962 ElementsAre(AllOf(Sig("foo() -> int"), SigDoc("Doc from the index")), 1963 AllOf(Sig("foo([[double]]) -> int"), SigDoc("")))); 1964 1965 StringRef Sig1 = R"cpp( 1966 int foo(); 1967 // Overriden doc from sema 1968 int foo(int); 1969 // Doc from sema 1970 int foo(int, int); 1971 1972 void test() { 1973 foo(^); 1974 } 1975 )cpp"; 1976 1977 EXPECT_THAT( 1978 signatures(Sig1, {Foo0, Foo1, Foo2}).signatures, 1979 ElementsAre( 1980 AllOf(Sig("foo() -> int"), SigDoc("Doc from the index")), 1981 AllOf(Sig("foo([[int]]) -> int"), SigDoc("Overriden doc from sema")), 1982 AllOf(Sig("foo([[int]], [[int]]) -> int"), SigDoc("Doc from sema")))); 1983 } 1984 1985 TEST(SignatureHelpTest, DynamicIndexDocumentation) { 1986 MockFSProvider FS; 1987 MockCompilationDatabase CDB; 1988 ClangdServer::Options Opts = ClangdServer::optsForTest(); 1989 Opts.BuildDynamicSymbolIndex = true; 1990 ClangdServer Server(CDB, FS, Opts); 1991 1992 FS.Files[testPath("foo.h")] = R"cpp( 1993 struct Foo { 1994 // Member doc 1995 int foo(); 1996 }; 1997 )cpp"; 1998 Annotations FileContent(R"cpp( 1999 #include "foo.h" 2000 void test() { 2001 Foo f; 2002 f.foo(^); 2003 } 2004 )cpp"); 2005 auto File = testPath("test.cpp"); 2006 Server.addDocument(File, FileContent.code()); 2007 // Wait for the dynamic index being built. 2008 ASSERT_TRUE(Server.blockUntilIdleForTest()); 2009 EXPECT_THAT( 2010 llvm::cantFail(runSignatureHelp(Server, File, FileContent.point())) 2011 .signatures, 2012 ElementsAre(AllOf(Sig("foo() -> int"), SigDoc("Member doc")))); 2013 } 2014 2015 TEST(CompletionTest, CompletionFunctionArgsDisabled) { 2016 CodeCompleteOptions Opts; 2017 Opts.EnableSnippets = true; 2018 Opts.EnableFunctionArgSnippets = false; 2019 2020 { 2021 auto Results = completions( 2022 R"cpp( 2023 void xfoo(); 2024 void xfoo(int x, int y); 2025 void f() { xfo^ })cpp", 2026 {}, Opts); 2027 EXPECT_THAT( 2028 Results.Completions, 2029 UnorderedElementsAre(AllOf(Named("xfoo"), SnippetSuffix("()")), 2030 AllOf(Named("xfoo"), SnippetSuffix("($0)")))); 2031 } 2032 { 2033 auto Results = completions( 2034 R"cpp( 2035 void xbar(); 2036 void f() { xba^ })cpp", 2037 {}, Opts); 2038 EXPECT_THAT(Results.Completions, UnorderedElementsAre(AllOf( 2039 Named("xbar"), SnippetSuffix("()")))); 2040 } 2041 { 2042 Opts.BundleOverloads = true; 2043 auto Results = completions( 2044 R"cpp( 2045 void xfoo(); 2046 void xfoo(int x, int y); 2047 void f() { xfo^ })cpp", 2048 {}, Opts); 2049 EXPECT_THAT( 2050 Results.Completions, 2051 UnorderedElementsAre(AllOf(Named("xfoo"), SnippetSuffix("($0)")))); 2052 } 2053 { 2054 auto Results = completions( 2055 R"cpp( 2056 template <class T, class U> 2057 void xfoo(int a, U b); 2058 void f() { xfo^ })cpp", 2059 {}, Opts); 2060 EXPECT_THAT( 2061 Results.Completions, 2062 UnorderedElementsAre(AllOf(Named("xfoo"), SnippetSuffix("<$1>($0)")))); 2063 } 2064 { 2065 auto Results = completions( 2066 R"cpp( 2067 template <class T> 2068 class foo_class{}; 2069 template <class T> 2070 using foo_alias = T**; 2071 void f() { foo_^ })cpp", 2072 {}, Opts); 2073 EXPECT_THAT( 2074 Results.Completions, 2075 UnorderedElementsAre(AllOf(Named("foo_class"), SnippetSuffix("<$0>")), 2076 AllOf(Named("foo_alias"), SnippetSuffix("<$0>")))); 2077 } 2078 } 2079 2080 TEST(CompletionTest, SuggestOverrides) { 2081 constexpr const char *const Text(R"cpp( 2082 class A { 2083 public: 2084 virtual void vfunc(bool param); 2085 virtual void vfunc(bool param, int p); 2086 void func(bool param); 2087 }; 2088 class B : public A { 2089 virtual void ttt(bool param) const; 2090 void vfunc(bool param, int p) override; 2091 }; 2092 class C : public B { 2093 public: 2094 void vfunc(bool param) override; 2095 ^ 2096 }; 2097 )cpp"); 2098 const auto Results = completions(Text); 2099 EXPECT_THAT( 2100 Results.Completions, 2101 AllOf(Contains(AllOf(Labeled("void vfunc(bool param, int p) override"), 2102 NameStartsWith("vfunc"))), 2103 Contains(AllOf(Labeled("void ttt(bool param) const override"), 2104 NameStartsWith("ttt"))), 2105 Not(Contains(Labeled("void vfunc(bool param) override"))))); 2106 } 2107 2108 TEST(CompletionTest, OverridesNonIdentName) { 2109 // Check the completions call does not crash. 2110 completions(R"cpp( 2111 struct Base { 2112 virtual ~Base() = 0; 2113 virtual operator int() = 0; 2114 virtual Base& operator+(Base&) = 0; 2115 }; 2116 2117 struct Derived : Base { 2118 ^ 2119 }; 2120 )cpp"); 2121 } 2122 2123 TEST(GuessCompletionPrefix, Filters) { 2124 for (llvm::StringRef Case : { 2125 "[[scope::]][[ident]]^", 2126 "[[]][[]]^", 2127 "\n[[]][[]]^", 2128 "[[]][[ab]]^", 2129 "x.[[]][[ab]]^", 2130 "x.[[]][[]]^", 2131 "[[x::]][[ab]]^", 2132 "[[x::]][[]]^", 2133 "[[::x::]][[ab]]^", 2134 "some text [[scope::more::]][[identif]]^ier", 2135 "some text [[scope::]][[mor]]^e::identifier", 2136 "weird case foo::[[::bar::]][[baz]]^", 2137 "/* [[]][[]]^ */", 2138 }) { 2139 Annotations F(Case); 2140 auto Offset = cantFail(positionToOffset(F.code(), F.point())); 2141 auto ToStringRef = [&](Range R) { 2142 return F.code().slice(cantFail(positionToOffset(F.code(), R.start)), 2143 cantFail(positionToOffset(F.code(), R.end))); 2144 }; 2145 auto WantQualifier = ToStringRef(F.ranges()[0]), 2146 WantName = ToStringRef(F.ranges()[1]); 2147 2148 auto Prefix = guessCompletionPrefix(F.code(), Offset); 2149 // Even when components are empty, check their offsets are correct. 2150 EXPECT_EQ(WantQualifier, Prefix.Qualifier) << Case; 2151 EXPECT_EQ(WantQualifier.begin(), Prefix.Qualifier.begin()) << Case; 2152 EXPECT_EQ(WantName, Prefix.Name) << Case; 2153 EXPECT_EQ(WantName.begin(), Prefix.Name.begin()) << Case; 2154 } 2155 } 2156 2157 TEST(CompletionTest, EnableSpeculativeIndexRequest) { 2158 MockFSProvider FS; 2159 MockCompilationDatabase CDB; 2160 ClangdServer Server(CDB, FS, ClangdServer::optsForTest()); 2161 2162 auto File = testPath("foo.cpp"); 2163 Annotations Test(R"cpp( 2164 namespace ns1 { int abc; } 2165 namespace ns2 { int abc; } 2166 void f() { ns1::ab$1^; ns1::ab$2^; } 2167 void f2() { ns2::ab$3^; } 2168 )cpp"); 2169 runAddDocument(Server, File, Test.code()); 2170 clangd::CodeCompleteOptions Opts = {}; 2171 2172 IndexRequestCollector Requests; 2173 Opts.Index = &Requests; 2174 Opts.SpeculativeIndexRequest = true; 2175 2176 auto CompleteAtPoint = [&](StringRef P) { 2177 cantFail(runCodeComplete(Server, File, Test.point(P), Opts)); 2178 }; 2179 2180 CompleteAtPoint("1"); 2181 auto Reqs1 = Requests.consumeRequests(1); 2182 ASSERT_EQ(Reqs1.size(), 1u); 2183 EXPECT_THAT(Reqs1[0].Scopes, UnorderedElementsAre("ns1::")); 2184 2185 CompleteAtPoint("2"); 2186 auto Reqs2 = Requests.consumeRequests(1); 2187 // Speculation succeeded. Used speculative index result. 2188 ASSERT_EQ(Reqs2.size(), 1u); 2189 EXPECT_EQ(Reqs2[0], Reqs1[0]); 2190 2191 CompleteAtPoint("3"); 2192 // Speculation failed. Sent speculative index request and the new index 2193 // request after sema. 2194 auto Reqs3 = Requests.consumeRequests(2); 2195 ASSERT_EQ(Reqs3.size(), 2u); 2196 } 2197 2198 TEST(CompletionTest, InsertTheMostPopularHeader) { 2199 std::string DeclFile = URI::create(testPath("foo")).toString(); 2200 Symbol Sym = func("Func"); 2201 Sym.CanonicalDeclaration.FileURI = DeclFile.c_str(); 2202 Sym.IncludeHeaders.emplace_back("\"foo.h\"", 2); 2203 Sym.IncludeHeaders.emplace_back("\"bar.h\"", 1000); 2204 2205 auto Results = completions("Fun^", {Sym}).Completions; 2206 assert(!Results.empty()); 2207 EXPECT_THAT(Results[0], AllOf(Named("Func"), InsertInclude("\"bar.h\""))); 2208 EXPECT_EQ(Results[0].Includes.size(), 2u); 2209 } 2210 2211 TEST(CompletionTest, NoInsertIncludeIfOnePresent) { 2212 Annotations Test(R"cpp( 2213 #include "foo.h" 2214 Fun^ 2215 )cpp"); 2216 auto TU = TestTU::withCode(Test.code()); 2217 TU.AdditionalFiles["foo.h"] = ""; 2218 2219 std::string DeclFile = URI::create(testPath("foo")).toString(); 2220 Symbol Sym = func("Func"); 2221 Sym.CanonicalDeclaration.FileURI = DeclFile.c_str(); 2222 Sym.IncludeHeaders.emplace_back("\"foo.h\"", 2); 2223 Sym.IncludeHeaders.emplace_back("\"bar.h\"", 1000); 2224 2225 EXPECT_THAT( 2226 completions(TU, Test.point(), {Sym}).Completions, 2227 UnorderedElementsAre( 2228 AllOf(Named("Func"), HasInclude("\"foo.h\""), Not(InsertInclude())))); 2229 } 2230 2231 TEST(CompletionTest, MergeMacrosFromIndexAndSema) { 2232 Symbol Sym; 2233 Sym.Name = "Clangd_Macro_Test"; 2234 Sym.ID = SymbolID("c:foo.cpp@8@macro@Clangd_Macro_Test"); 2235 Sym.SymInfo.Kind = index::SymbolKind::Macro; 2236 Sym.Flags |= Symbol::IndexedForCodeCompletion; 2237 EXPECT_THAT(completions("#define Clangd_Macro_Test\nClangd_Macro_T^", {Sym}) 2238 .Completions, 2239 UnorderedElementsAre(Named("Clangd_Macro_Test"))); 2240 } 2241 2242 TEST(CompletionTest, MacroFromPreamble) { 2243 Annotations Test(R"cpp(#define CLANGD_PREAMBLE_MAIN x 2244 2245 int x = 0; 2246 #define CLANGD_MAIN x 2247 void f() { CLANGD_^ } 2248 )cpp"); 2249 auto TU = TestTU::withCode(Test.code()); 2250 TU.HeaderCode = "#define CLANGD_PREAMBLE_HEADER x"; 2251 auto Results = completions(TU, Test.point(), {func("CLANGD_INDEX")}); 2252 // We should get results from the main file, including the preamble section. 2253 // However no results from included files (the index should cover them). 2254 EXPECT_THAT(Results.Completions, 2255 UnorderedElementsAre(Named("CLANGD_PREAMBLE_MAIN"), 2256 Named("CLANGD_MAIN"), 2257 Named("CLANGD_INDEX"))); 2258 } 2259 2260 TEST(CompletionTest, DeprecatedResults) { 2261 std::string Body = R"cpp( 2262 void TestClangd(); 2263 void TestClangc() __attribute__((deprecated("", ""))); 2264 )cpp"; 2265 2266 EXPECT_THAT( 2267 completions(Body + "int main() { TestClang^ }").Completions, 2268 UnorderedElementsAre(AllOf(Named("TestClangd"), Not(Deprecated())), 2269 AllOf(Named("TestClangc"), Deprecated()))); 2270 } 2271 2272 TEST(SignatureHelpTest, PartialSpec) { 2273 const auto Results = signatures(R"cpp( 2274 template <typename T> struct Foo {}; 2275 template <typename T> struct Foo<T*> { Foo(T); }; 2276 Foo<int*> F(^);)cpp"); 2277 EXPECT_THAT(Results.signatures, Contains(Sig("Foo([[T]])"))); 2278 EXPECT_EQ(0, Results.activeParameter); 2279 } 2280 2281 TEST(SignatureHelpTest, InsideArgument) { 2282 { 2283 const auto Results = signatures(R"cpp( 2284 void foo(int x); 2285 void foo(int x, int y); 2286 int main() { foo(1+^); } 2287 )cpp"); 2288 EXPECT_THAT(Results.signatures, 2289 ElementsAre(Sig("foo([[int x]]) -> void"), 2290 Sig("foo([[int x]], [[int y]]) -> void"))); 2291 EXPECT_EQ(0, Results.activeParameter); 2292 } 2293 { 2294 const auto Results = signatures(R"cpp( 2295 void foo(int x); 2296 void foo(int x, int y); 2297 int main() { foo(1^); } 2298 )cpp"); 2299 EXPECT_THAT(Results.signatures, 2300 ElementsAre(Sig("foo([[int x]]) -> void"), 2301 Sig("foo([[int x]], [[int y]]) -> void"))); 2302 EXPECT_EQ(0, Results.activeParameter); 2303 } 2304 { 2305 const auto Results = signatures(R"cpp( 2306 void foo(int x); 2307 void foo(int x, int y); 2308 int main() { foo(1^0); } 2309 )cpp"); 2310 EXPECT_THAT(Results.signatures, 2311 ElementsAre(Sig("foo([[int x]]) -> void"), 2312 Sig("foo([[int x]], [[int y]]) -> void"))); 2313 EXPECT_EQ(0, Results.activeParameter); 2314 } 2315 { 2316 const auto Results = signatures(R"cpp( 2317 void foo(int x); 2318 void foo(int x, int y); 2319 int bar(int x, int y); 2320 int main() { bar(foo(2, 3^)); } 2321 )cpp"); 2322 EXPECT_THAT(Results.signatures, 2323 ElementsAre(Sig("foo([[int x]], [[int y]]) -> void"))); 2324 EXPECT_EQ(1, Results.activeParameter); 2325 } 2326 } 2327 2328 TEST(SignatureHelpTest, ConstructorInitializeFields) { 2329 { 2330 const auto Results = signatures(R"cpp( 2331 struct A { 2332 A(int); 2333 }; 2334 struct B { 2335 B() : a_elem(^) {} 2336 A a_elem; 2337 }; 2338 )cpp"); 2339 EXPECT_THAT(Results.signatures, 2340 UnorderedElementsAre(Sig("A([[int]])"), Sig("A([[A &&]])"), 2341 Sig("A([[const A &]])"))); 2342 } 2343 { 2344 const auto Results = signatures(R"cpp( 2345 struct A { 2346 A(int); 2347 }; 2348 struct C { 2349 C(int); 2350 C(A); 2351 }; 2352 struct B { 2353 B() : c_elem(A(1^)) {} 2354 C c_elem; 2355 }; 2356 )cpp"); 2357 EXPECT_THAT(Results.signatures, 2358 UnorderedElementsAre(Sig("A([[int]])"), Sig("A([[A &&]])"), 2359 Sig("A([[const A &]])"))); 2360 } 2361 } 2362 2363 TEST(CompletionTest, IncludedCompletionKinds) { 2364 Annotations Test(R"cpp(#include "^")cpp"); 2365 auto TU = TestTU::withCode(Test.code()); 2366 TU.AdditionalFiles["sub/bar.h"] = ""; 2367 TU.ExtraArgs.push_back("-I" + testPath("sub")); 2368 2369 auto Results = completions(TU, Test.point()); 2370 EXPECT_THAT(Results.Completions, 2371 AllOf(Has("sub/", CompletionItemKind::Folder), 2372 Has("bar.h\"", CompletionItemKind::File))); 2373 } 2374 2375 TEST(CompletionTest, NoCrashAtNonAlphaIncludeHeader) { 2376 completions( 2377 R"cpp( 2378 #include "./^" 2379 )cpp"); 2380 } 2381 2382 TEST(CompletionTest, NoAllScopesCompletionWhenQualified) { 2383 clangd::CodeCompleteOptions Opts = {}; 2384 Opts.AllScopes = true; 2385 2386 auto Results = completions( 2387 R"cpp( 2388 void f() { na::Clangd^ } 2389 )cpp", 2390 {cls("na::ClangdA"), cls("nx::ClangdX"), cls("Clangd3")}, Opts); 2391 EXPECT_THAT(Results.Completions, 2392 UnorderedElementsAre( 2393 AllOf(Qualifier(""), Scope("na::"), Named("ClangdA")))); 2394 } 2395 2396 TEST(CompletionTest, AllScopesCompletion) { 2397 clangd::CodeCompleteOptions Opts = {}; 2398 Opts.AllScopes = true; 2399 2400 auto Results = completions( 2401 R"cpp( 2402 namespace na { 2403 void f() { Clangd^ } 2404 } 2405 )cpp", 2406 {cls("nx::Clangd1"), cls("ny::Clangd2"), cls("Clangd3"), 2407 cls("na::nb::Clangd4")}, 2408 Opts); 2409 EXPECT_THAT( 2410 Results.Completions, 2411 UnorderedElementsAre(AllOf(Qualifier("nx::"), Named("Clangd1")), 2412 AllOf(Qualifier("ny::"), Named("Clangd2")), 2413 AllOf(Qualifier(""), Scope(""), Named("Clangd3")), 2414 AllOf(Qualifier("nb::"), Named("Clangd4")))); 2415 } 2416 2417 TEST(CompletionTest, NoQualifierIfShadowed) { 2418 clangd::CodeCompleteOptions Opts = {}; 2419 Opts.AllScopes = true; 2420 2421 auto Results = completions(R"cpp( 2422 namespace nx { class Clangd1 {}; } 2423 using nx::Clangd1; 2424 void f() { Clangd^ } 2425 )cpp", 2426 {cls("nx::Clangd1"), cls("nx::Clangd2")}, Opts); 2427 // Although Clangd1 is from another namespace, Sema tells us it's in-scope and 2428 // needs no qualifier. 2429 EXPECT_THAT(Results.Completions, 2430 UnorderedElementsAre(AllOf(Qualifier(""), Named("Clangd1")), 2431 AllOf(Qualifier("nx::"), Named("Clangd2")))); 2432 } 2433 2434 TEST(CompletionTest, NoCompletionsForNewNames) { 2435 clangd::CodeCompleteOptions Opts; 2436 Opts.AllScopes = true; 2437 auto Results = completions(R"cpp( 2438 void f() { int n^ } 2439 )cpp", 2440 {cls("naber"), cls("nx::naber")}, Opts); 2441 EXPECT_THAT(Results.Completions, UnorderedElementsAre()); 2442 } 2443 2444 TEST(CompletionTest, Lambda) { 2445 clangd::CodeCompleteOptions Opts = {}; 2446 2447 auto Results = completions(R"cpp( 2448 void function() { 2449 auto Lambda = [](int a, const double &b) {return 1.f;}; 2450 Lam^ 2451 } 2452 )cpp", 2453 {}, Opts); 2454 2455 ASSERT_EQ(Results.Completions.size(), 1u); 2456 const auto &A = Results.Completions.front(); 2457 EXPECT_EQ(A.Name, "Lambda"); 2458 EXPECT_EQ(A.Signature, "(int a, const double &b) const"); 2459 EXPECT_EQ(A.Kind, CompletionItemKind::Variable); 2460 EXPECT_EQ(A.ReturnType, "float"); 2461 EXPECT_EQ(A.SnippetSuffix, "(${1:int a}, ${2:const double &b})"); 2462 } 2463 2464 TEST(CompletionTest, ObjectiveCMethodNoArguments) { 2465 auto Results = completions(R"objc( 2466 @interface Foo 2467 @property(nonatomic, setter=setXToIgnoreComplete:) int value; 2468 @end 2469 Foo *foo = [Foo new]; int y = [foo v^] 2470 )objc", 2471 /*IndexSymbols=*/{}, 2472 /*Opts=*/{}, "Foo.m"); 2473 2474 auto C = Results.Completions; 2475 EXPECT_THAT(C, ElementsAre(Named("value"))); 2476 EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method))); 2477 EXPECT_THAT(C, ElementsAre(ReturnType("int"))); 2478 EXPECT_THAT(C, ElementsAre(Signature(""))); 2479 EXPECT_THAT(C, ElementsAre(SnippetSuffix(""))); 2480 } 2481 2482 TEST(CompletionTest, ObjectiveCMethodOneArgument) { 2483 auto Results = completions(R"objc( 2484 @interface Foo 2485 - (int)valueForCharacter:(char)c; 2486 @end 2487 Foo *foo = [Foo new]; int y = [foo v^] 2488 )objc", 2489 /*IndexSymbols=*/{}, 2490 /*Opts=*/{}, "Foo.m"); 2491 2492 auto C = Results.Completions; 2493 EXPECT_THAT(C, ElementsAre(Named("valueForCharacter:"))); 2494 EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method))); 2495 EXPECT_THAT(C, ElementsAre(ReturnType("int"))); 2496 EXPECT_THAT(C, ElementsAre(Signature("(char)"))); 2497 EXPECT_THAT(C, ElementsAre(SnippetSuffix("${1:(char)}"))); 2498 } 2499 2500 TEST(CompletionTest, ObjectiveCMethodTwoArgumentsFromBeginning) { 2501 auto Results = completions(R"objc( 2502 @interface Foo 2503 + (id)fooWithValue:(int)value fooey:(unsigned int)fooey; 2504 @end 2505 id val = [Foo foo^] 2506 )objc", 2507 /*IndexSymbols=*/{}, 2508 /*Opts=*/{}, "Foo.m"); 2509 2510 auto C = Results.Completions; 2511 EXPECT_THAT(C, ElementsAre(Named("fooWithValue:"))); 2512 EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method))); 2513 EXPECT_THAT(C, ElementsAre(ReturnType("id"))); 2514 EXPECT_THAT(C, ElementsAre(Signature("(int) fooey:(unsigned int)"))); 2515 EXPECT_THAT( 2516 C, ElementsAre(SnippetSuffix("${1:(int)} fooey:${2:(unsigned int)}"))); 2517 } 2518 2519 TEST(CompletionTest, ObjectiveCMethodTwoArgumentsFromMiddle) { 2520 auto Results = completions(R"objc( 2521 @interface Foo 2522 + (id)fooWithValue:(int)value fooey:(unsigned int)fooey; 2523 @end 2524 id val = [Foo fooWithValue:10 f^] 2525 )objc", 2526 /*IndexSymbols=*/{}, 2527 /*Opts=*/{}, "Foo.m"); 2528 2529 auto C = Results.Completions; 2530 EXPECT_THAT(C, ElementsAre(Named("fooey:"))); 2531 EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method))); 2532 EXPECT_THAT(C, ElementsAre(ReturnType("id"))); 2533 EXPECT_THAT(C, ElementsAre(Signature("(unsigned int)"))); 2534 EXPECT_THAT(C, ElementsAre(SnippetSuffix("${1:(unsigned int)}"))); 2535 } 2536 2537 TEST(CompletionTest, CursorInSnippets) { 2538 clangd::CodeCompleteOptions Options; 2539 Options.EnableSnippets = true; 2540 auto Results = completions( 2541 R"cpp( 2542 void while_foo(int a, int b); 2543 void test() { 2544 whil^ 2545 })cpp", 2546 /*IndexSymbols=*/{}, Options); 2547 2548 // Last placeholder in code patterns should be $0 to put the cursor there. 2549 EXPECT_THAT(Results.Completions, 2550 Contains(AllOf( 2551 Named("while"), 2552 SnippetSuffix(" (${1:condition}) {\n${0:statements}\n}")))); 2553 // However, snippets for functions must *not* end with $0. 2554 EXPECT_THAT(Results.Completions, 2555 Contains(AllOf(Named("while_foo"), 2556 SnippetSuffix("(${1:int a}, ${2:int b})")))); 2557 } 2558 2559 TEST(CompletionTest, WorksWithNullType) { 2560 auto R = completions(R"cpp( 2561 int main() { 2562 for (auto [loopVar] : y ) { // y has to be unresolved. 2563 int z = loopV^; 2564 } 2565 } 2566 )cpp"); 2567 EXPECT_THAT(R.Completions, ElementsAre(Named("loopVar"))); 2568 } 2569 2570 TEST(CompletionTest, UsingDecl) { 2571 const char *Header(R"cpp( 2572 void foo(int); 2573 namespace std { 2574 using ::foo; 2575 })cpp"); 2576 const char *Source(R"cpp( 2577 void bar() { 2578 std::^; 2579 })cpp"); 2580 auto Index = TestTU::withHeaderCode(Header).index(); 2581 clangd::CodeCompleteOptions Opts; 2582 Opts.Index = Index.get(); 2583 Opts.AllScopes = true; 2584 auto R = completions(Source, {}, Opts); 2585 EXPECT_THAT(R.Completions, 2586 ElementsAre(AllOf(Scope("std::"), Named("foo"), 2587 Kind(CompletionItemKind::Reference)))); 2588 } 2589 2590 TEST(CompletionTest, ScopeIsUnresolved) { 2591 clangd::CodeCompleteOptions Opts = {}; 2592 Opts.AllScopes = true; 2593 2594 auto Results = completions(R"cpp( 2595 namespace a { 2596 void f() { b::X^ } 2597 } 2598 )cpp", 2599 {cls("a::b::XYZ")}, Opts); 2600 EXPECT_THAT(Results.Completions, 2601 UnorderedElementsAre(AllOf(Qualifier(""), Named("XYZ")))); 2602 } 2603 2604 TEST(CompletionTest, NestedScopeIsUnresolved) { 2605 clangd::CodeCompleteOptions Opts = {}; 2606 Opts.AllScopes = true; 2607 2608 auto Results = completions(R"cpp( 2609 namespace a { 2610 namespace b {} 2611 void f() { b::c::X^ } 2612 } 2613 )cpp", 2614 {cls("a::b::c::XYZ")}, Opts); 2615 EXPECT_THAT(Results.Completions, 2616 UnorderedElementsAre(AllOf(Qualifier(""), Named("XYZ")))); 2617 } 2618 2619 // Clang parser gets confused here and doesn't report the ns:: prefix. 2620 // Naive behavior is to insert it again. We examine the source and recover. 2621 TEST(CompletionTest, NamespaceDoubleInsertion) { 2622 clangd::CodeCompleteOptions Opts = {}; 2623 2624 auto Results = completions(R"cpp( 2625 namespace foo { 2626 namespace ns {} 2627 #define M(X) < X 2628 M(ns::ABC^ 2629 } 2630 )cpp", 2631 {cls("foo::ns::ABCDE")}, Opts); 2632 EXPECT_THAT(Results.Completions, 2633 UnorderedElementsAre(AllOf(Qualifier(""), Named("ABCDE")))); 2634 } 2635 2636 TEST(CompletionTest, DerivedMethodsAreAlwaysVisible) { 2637 // Despite the fact that base method matches the ref-qualifier better, 2638 // completion results should only include the derived method. 2639 auto Completions = completions(R"cpp( 2640 struct deque_base { 2641 float size(); 2642 double size() const; 2643 }; 2644 struct deque : deque_base { 2645 int size() const; 2646 }; 2647 2648 auto x = deque().^ 2649 )cpp") 2650 .Completions; 2651 EXPECT_THAT(Completions, 2652 ElementsAre(AllOf(ReturnType("int"), Named("size")))); 2653 } 2654 2655 TEST(CompletionTest, NoCrashWithIncompleteLambda) { 2656 auto Completions = completions("auto&& x = []{^").Completions; 2657 // The completion of x itself can cause a problem: in the code completion 2658 // callback, its type is not known, which affects the linkage calculation. 2659 // A bad linkage value gets cached, and subsequently updated. 2660 EXPECT_THAT(Completions, Contains(Named("x"))); 2661 2662 auto Signatures = signatures("auto x() { x(^").signatures; 2663 EXPECT_THAT(Signatures, Contains(Sig("x() -> auto"))); 2664 } 2665 2666 TEST(CompletionTest, DelayedTemplateParsing) { 2667 Annotations Test(R"cpp( 2668 int xxx; 2669 template <typename T> int foo() { return xx^; } 2670 )cpp"); 2671 auto TU = TestTU::withCode(Test.code()); 2672 // Even though delayed-template-parsing is on, we will disable it to provide 2673 // completion in templates. 2674 TU.ExtraArgs.push_back("-fdelayed-template-parsing"); 2675 2676 EXPECT_THAT(completions(TU, Test.point()).Completions, 2677 Contains(Named("xxx"))); 2678 } 2679 2680 TEST(CompletionTest, CompletionRange) { 2681 const char *WithRange = "auto x = [[abc]]^"; 2682 auto Completions = completions(WithRange); 2683 EXPECT_EQ(Completions.CompletionRange, Annotations(WithRange).range()); 2684 Completions = completionsNoCompile(WithRange); 2685 EXPECT_EQ(Completions.CompletionRange, Annotations(WithRange).range()); 2686 2687 const char *EmptyRange = "auto x = [[]]^"; 2688 Completions = completions(EmptyRange); 2689 EXPECT_EQ(Completions.CompletionRange, Annotations(EmptyRange).range()); 2690 Completions = completionsNoCompile(EmptyRange); 2691 EXPECT_EQ(Completions.CompletionRange, Annotations(EmptyRange).range()); 2692 2693 // Sema doesn't trigger at all here, while the no-sema completion runs 2694 // heuristics as normal and reports a range. It'd be nice to be consistent. 2695 const char *NoCompletion = "/* [[]]^ */"; 2696 Completions = completions(NoCompletion); 2697 EXPECT_EQ(Completions.CompletionRange, llvm::None); 2698 Completions = completionsNoCompile(NoCompletion); 2699 EXPECT_EQ(Completions.CompletionRange, Annotations(NoCompletion).range()); 2700 } 2701 2702 TEST(NoCompileCompletionTest, Basic) { 2703 auto Results = completionsNoCompile(R"cpp( 2704 void func() { 2705 int xyz; 2706 int abc; 2707 ^ 2708 } 2709 )cpp"); 2710 EXPECT_FALSE(Results.RanParser); 2711 EXPECT_THAT(Results.Completions, 2712 UnorderedElementsAre(Named("void"), Named("func"), Named("int"), 2713 Named("xyz"), Named("abc"))); 2714 } 2715 2716 TEST(NoCompileCompletionTest, WithFilter) { 2717 auto Results = completionsNoCompile(R"cpp( 2718 void func() { 2719 int sym1; 2720 int sym2; 2721 int xyz1; 2722 int xyz2; 2723 sy^ 2724 } 2725 )cpp"); 2726 EXPECT_THAT(Results.Completions, 2727 UnorderedElementsAre(Named("sym1"), Named("sym2"))); 2728 } 2729 2730 TEST(NoCompileCompletionTest, WithIndex) { 2731 std::vector<Symbol> Syms = {func("xxx"), func("a::xxx"), func("ns::b::xxx"), 2732 func("c::xxx"), func("ns::d::xxx")}; 2733 auto Results = completionsNoCompile( 2734 R"cpp( 2735 // Current-scopes, unqualified completion. 2736 using namespace a; 2737 namespace ns { 2738 using namespace b; 2739 void foo() { 2740 xx^ 2741 } 2742 } 2743 )cpp", 2744 Syms); 2745 EXPECT_THAT(Results.Completions, 2746 UnorderedElementsAre(AllOf(Qualifier(""), Scope("")), 2747 AllOf(Qualifier(""), Scope("a::")), 2748 AllOf(Qualifier(""), Scope("ns::b::")))); 2749 CodeCompleteOptions Opts; 2750 Opts.AllScopes = true; 2751 Results = completionsNoCompile( 2752 R"cpp( 2753 // All-scopes unqualified completion. 2754 using namespace a; 2755 namespace ns { 2756 using namespace b; 2757 void foo() { 2758 xx^ 2759 } 2760 } 2761 )cpp", 2762 Syms, Opts); 2763 EXPECT_THAT(Results.Completions, 2764 UnorderedElementsAre(AllOf(Qualifier(""), Scope("")), 2765 AllOf(Qualifier(""), Scope("a::")), 2766 AllOf(Qualifier(""), Scope("ns::b::")), 2767 AllOf(Qualifier("c::"), Scope("c::")), 2768 AllOf(Qualifier("d::"), Scope("ns::d::")))); 2769 Results = completionsNoCompile( 2770 R"cpp( 2771 // Qualified completion. 2772 using namespace a; 2773 namespace ns { 2774 using namespace b; 2775 void foo() { 2776 b::xx^ 2777 } 2778 } 2779 )cpp", 2780 Syms, Opts); 2781 EXPECT_THAT(Results.Completions, 2782 ElementsAre(AllOf(Qualifier(""), Scope("ns::b::")))); 2783 Results = completionsNoCompile( 2784 R"cpp( 2785 // Absolutely qualified completion. 2786 using namespace a; 2787 namespace ns { 2788 using namespace b; 2789 void foo() { 2790 ::a::xx^ 2791 } 2792 } 2793 )cpp", 2794 Syms, Opts); 2795 EXPECT_THAT(Results.Completions, 2796 ElementsAre(AllOf(Qualifier(""), Scope("a::")))); 2797 } 2798 2799 } // namespace 2800 } // namespace clangd 2801 } // namespace clang 2802