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