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