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