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