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