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