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