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