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