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