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