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