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