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(Named("foo"),
924               Doc("Annotation: custom_annotation\nNon-doxygen comment."))));
925   EXPECT_THAT(
926       Results.Completions,
927       Contains(AllOf(Named("bar"), Doc("Doxygen comment.\n\\param int a"))));
928   EXPECT_THAT(Results.Completions,
929               Contains(AllOf(Named("baz"), Doc("Multi-line block comment"))));
930 }
931 
932 TEST(CompletionTest, CommentsFromSystemHeaders) {
933   MockFS FS;
934   MockCompilationDatabase CDB;
935 
936   auto Opts = ClangdServer::optsForTest();
937   Opts.BuildDynamicSymbolIndex = true;
938 
939   ClangdServer Server(CDB, FS, Opts);
940 
941   FS.Files[testPath("foo.h")] = R"cpp(
942     #pragma GCC system_header
943 
944     // This comment should be retained!
945     int foo();
946   )cpp";
947 
948   auto File = testPath("foo.cpp");
949   Annotations Test(R"cpp(
950 #include "foo.h"
951 int x = foo^
952      )cpp");
953   runAddDocument(Server, File, Test.code());
954   auto CompletionList =
955       llvm::cantFail(runCodeComplete(Server, File, Test.point(), {}));
956 
957   EXPECT_THAT(
958       CompletionList.Completions,
959       Contains(AllOf(Named("foo"), Doc("This comment should be retained!"))));
960 }
961 
962 TEST(CompletionTest, GlobalCompletionFiltering) {
963 
964   Symbol Class = cls("XYZ");
965   Class.Flags = static_cast<Symbol::SymbolFlag>(
966       Class.Flags & ~(Symbol::IndexedForCodeCompletion));
967   Symbol Func = func("XYZ::foooo");
968   Func.Flags = static_cast<Symbol::SymbolFlag>(
969       Func.Flags & ~(Symbol::IndexedForCodeCompletion));
970 
971   auto Results = completions(R"(//      void f() {
972       XYZ::foooo^
973       })",
974                              {Class, Func});
975   EXPECT_THAT(Results.Completions, IsEmpty());
976 }
977 
978 TEST(CodeCompleteTest, DisableTypoCorrection) {
979   auto Results = completions(R"cpp(
980      namespace clang { int v; }
981      void f() { clangd::^
982   )cpp");
983   EXPECT_TRUE(Results.Completions.empty());
984 }
985 
986 TEST(CodeCompleteTest, NoColonColonAtTheEnd) {
987   auto Results = completions(R"cpp(
988     namespace clang { }
989     void f() {
990       clan^
991     }
992   )cpp");
993 
994   EXPECT_THAT(Results.Completions, Contains(Labeled("clang")));
995   EXPECT_THAT(Results.Completions, Not(Contains(Labeled("clang::"))));
996 }
997 
998 TEST(CompletionTest, BacktrackCrashes) {
999   // Sema calls code completion callbacks twice in these cases.
1000   auto Results = completions(R"cpp(
1001       namespace ns {
1002       struct FooBarBaz {};
1003       } // namespace ns
1004 
1005      int foo(ns::FooBar^
1006   )cpp");
1007 
1008   EXPECT_THAT(Results.Completions, ElementsAre(Labeled("FooBarBaz")));
1009 
1010   // Check we don't crash in that case too.
1011   completions(R"cpp(
1012     struct FooBarBaz {};
1013     void test() {
1014       if (FooBarBaz * x^) {}
1015     }
1016 )cpp");
1017 }
1018 
1019 TEST(CompletionTest, CompleteInMacroWithStringification) {
1020   auto Results = completions(R"cpp(
1021 void f(const char *, int x);
1022 #define F(x) f(#x, x)
1023 
1024 namespace ns {
1025 int X;
1026 int Y;
1027 }  // namespace ns
1028 
1029 int f(int input_num) {
1030   F(ns::^)
1031 }
1032 )cpp");
1033 
1034   EXPECT_THAT(Results.Completions,
1035               UnorderedElementsAre(Named("X"), Named("Y")));
1036 }
1037 
1038 TEST(CompletionTest, CompleteInMacroAndNamespaceWithStringification) {
1039   auto Results = completions(R"cpp(
1040 void f(const char *, int x);
1041 #define F(x) f(#x, x)
1042 
1043 namespace ns {
1044 int X;
1045 
1046 int f(int input_num) {
1047   F(^)
1048 }
1049 }  // namespace ns
1050 )cpp");
1051 
1052   EXPECT_THAT(Results.Completions, Contains(Named("X")));
1053 }
1054 
1055 TEST(CompletionTest, IgnoreCompleteInExcludedPPBranchWithRecoveryContext) {
1056   auto Results = completions(R"cpp(
1057     int bar(int param_in_bar) {
1058     }
1059 
1060     int foo(int param_in_foo) {
1061 #if 0
1062   // In recovery mode, "param_in_foo" will also be suggested among many other
1063   // unrelated symbols; however, this is really a special case where this works.
1064   // If the #if block is outside of the function, "param_in_foo" is still
1065   // suggested, but "bar" and "foo" are missing. So the recovery mode doesn't
1066   // really provide useful results in excluded branches.
1067   par^
1068 #endif
1069     }
1070 )cpp");
1071 
1072   EXPECT_TRUE(Results.Completions.empty());
1073 }
1074 
1075 TEST(CompletionTest, DefaultArgs) {
1076   clangd::CodeCompleteOptions Opts;
1077   std::string Context = R"cpp(
1078     int X(int A = 0);
1079     int Y(int A, int B = 0);
1080     int Z(int A, int B = 0, int C = 0, int D = 0);
1081   )cpp";
1082   EXPECT_THAT(completions(Context + "int y = X^", {}, Opts).Completions,
1083               UnorderedElementsAre(Labeled("X(int A = 0)")));
1084   EXPECT_THAT(completions(Context + "int y = Y^", {}, Opts).Completions,
1085               UnorderedElementsAre(AllOf(Labeled("Y(int A, int B = 0)"),
1086                                          SnippetSuffix("(${1:int A})"))));
1087   EXPECT_THAT(completions(Context + "int y = Z^", {}, Opts).Completions,
1088               UnorderedElementsAre(
1089                   AllOf(Labeled("Z(int A, int B = 0, int C = 0, int D = 0)"),
1090                         SnippetSuffix("(${1:int A})"))));
1091 }
1092 
1093 TEST(CompletionTest, NoCrashWithTemplateParamsAndPreferredTypes) {
1094   auto Completions = completions(R"cpp(
1095 template <template <class> class TT> int foo() {
1096   int a = ^
1097 }
1098 )cpp")
1099                          .Completions;
1100   EXPECT_THAT(Completions, Contains(Named("TT")));
1101 }
1102 
1103 TEST(CompletionTest, NestedTemplateHeuristics) {
1104   auto Completions = completions(R"cpp(
1105 struct Plain { int xxx; };
1106 template <typename T> class Templ { Plain ppp; };
1107 template <typename T> void foo(Templ<T> &t) {
1108   // Formally ppp has DependentTy, because Templ may be specialized.
1109   // However we sholud be able to see into it using the primary template.
1110   t.ppp.^
1111 }
1112 )cpp")
1113                          .Completions;
1114   EXPECT_THAT(Completions, Contains(Named("xxx")));
1115 }
1116 
1117 TEST(CompletionTest, RecordCCResultCallback) {
1118   std::vector<CodeCompletion> RecordedCompletions;
1119   CodeCompleteOptions Opts;
1120   Opts.RecordCCResult = [&RecordedCompletions](const CodeCompletion &CC,
1121                                                const SymbolQualitySignals &,
1122                                                const SymbolRelevanceSignals &,
1123                                                float Score) {
1124     RecordedCompletions.push_back(CC);
1125   };
1126 
1127   completions("int xy1, xy2; int a = xy^", /*IndexSymbols=*/{}, Opts);
1128   EXPECT_THAT(RecordedCompletions,
1129               UnorderedElementsAre(Named("xy1"), Named("xy2")));
1130 }
1131 
1132 TEST(CompletionTest, ASTSignals) {
1133   struct Completion {
1134     std::string Name;
1135     unsigned MainFileRefs;
1136     unsigned ScopeRefsInFile;
1137   };
1138   CodeCompleteOptions Opts;
1139   std::vector<Completion> RecordedCompletions;
1140   Opts.RecordCCResult = [&RecordedCompletions](const CodeCompletion &CC,
1141                                                const SymbolQualitySignals &,
1142                                                const SymbolRelevanceSignals &R,
1143                                                float Score) {
1144     RecordedCompletions.push_back({CC.Name, R.MainFileRefs, R.ScopeRefsInFile});
1145   };
1146   ASTSignals MainFileSignals;
1147   MainFileSignals.ReferencedSymbols[var("xy1").ID] = 3;
1148   MainFileSignals.ReferencedSymbols[var("xy2").ID] = 1;
1149   MainFileSignals.ReferencedSymbols[var("xyindex").ID] = 10;
1150   MainFileSignals.RelatedNamespaces["tar::"] = 5;
1151   MainFileSignals.RelatedNamespaces["bar::"] = 3;
1152   Opts.MainFileSignals = &MainFileSignals;
1153   Opts.AllScopes = true;
1154   completions(
1155       R"cpp(
1156       int xy1;
1157       int xy2;
1158       namespace bar {
1159       int xybar = 1;
1160       int a = xy^
1161       }
1162       )cpp",
1163       /*IndexSymbols=*/{var("xyindex"), var("tar::xytar"), var("bar::xybar")},
1164       Opts);
1165   EXPECT_THAT(RecordedCompletions,
1166               UnorderedElementsAre(
1167                   AllOf(Named("xy1"), MainFileRefs(3u), ScopeRefs(0u)),
1168                   AllOf(Named("xy2"), MainFileRefs(1u), ScopeRefs(0u)),
1169                   AllOf(Named("xyindex"), MainFileRefs(10u), ScopeRefs(0u)),
1170                   AllOf(Named("xytar"), MainFileRefs(0u), ScopeRefs(5u)),
1171                   AllOf(/*both from sema and index*/ Named("xybar"),
1172                         MainFileRefs(0u), ScopeRefs(3u))));
1173 }
1174 
1175 SignatureHelp
1176 signatures(llvm::StringRef Text, Position Point,
1177            std::vector<Symbol> IndexSymbols = {},
1178            MarkupKind DocumentationFormat = MarkupKind::PlainText) {
1179   std::unique_ptr<SymbolIndex> Index;
1180   if (!IndexSymbols.empty())
1181     Index = memIndex(IndexSymbols);
1182 
1183   auto TU = TestTU::withCode(Text);
1184   MockFS FS;
1185   auto Inputs = TU.inputs(FS);
1186   Inputs.Index = Index.get();
1187   IgnoreDiagnostics Diags;
1188   auto CI = buildCompilerInvocation(Inputs, Diags);
1189   if (!CI) {
1190     ADD_FAILURE() << "Couldn't build CompilerInvocation";
1191     return {};
1192   }
1193   auto Preamble = buildPreamble(testPath(TU.Filename), *CI, Inputs,
1194                                 /*InMemory=*/true, /*Callback=*/nullptr);
1195   if (!Preamble) {
1196     ADD_FAILURE() << "Couldn't build Preamble";
1197     return {};
1198   }
1199   return signatureHelp(testPath(TU.Filename), Point, *Preamble, Inputs,
1200                        DocumentationFormat);
1201 }
1202 
1203 SignatureHelp
1204 signatures(llvm::StringRef Text, std::vector<Symbol> IndexSymbols = {},
1205            MarkupKind DocumentationFormat = MarkupKind::PlainText) {
1206   Annotations Test(Text);
1207   return signatures(Test.code(), Test.point(), std::move(IndexSymbols),
1208                     DocumentationFormat);
1209 }
1210 
1211 struct ExpectedParameter {
1212   std::string Text;
1213   std::pair<unsigned, unsigned> Offsets;
1214 };
1215 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
1216                               const ExpectedParameter &P) {
1217   return OS << P.Text;
1218 }
1219 MATCHER_P(ParamsAre, P, "") {
1220   if (P.size() != arg.parameters.size())
1221     return false;
1222   for (unsigned I = 0; I < P.size(); ++I) {
1223     if (P[I].Text != arg.parameters[I].labelString ||
1224         P[I].Offsets != arg.parameters[I].labelOffsets)
1225       return false;
1226   }
1227   return true;
1228 }
1229 MATCHER_P(SigDoc, Doc, "") { return arg.documentation.value == Doc; }
1230 
1231 /// \p AnnotatedLabel is a signature label with ranges marking parameters, e.g.
1232 ///    foo([[int p1]], [[double p2]]) -> void
1233 Matcher<SignatureInformation> Sig(llvm::StringRef AnnotatedLabel) {
1234   llvm::Annotations A(AnnotatedLabel);
1235   std::string Label = std::string(A.code());
1236   std::vector<ExpectedParameter> Parameters;
1237   for (auto Range : A.ranges()) {
1238     Parameters.emplace_back();
1239 
1240     ExpectedParameter &P = Parameters.back();
1241     P.Text = Label.substr(Range.Begin, Range.End - Range.Begin);
1242     P.Offsets.first = lspLength(llvm::StringRef(Label).substr(0, Range.Begin));
1243     P.Offsets.second = lspLength(llvm::StringRef(Label).substr(1, Range.End));
1244   }
1245   return AllOf(SigHelpLabeled(Label), ParamsAre(Parameters));
1246 }
1247 
1248 TEST(SignatureHelpTest, Overloads) {
1249   auto Results = signatures(R"cpp(
1250     void foo(int x, int y);
1251     void foo(int x, float y);
1252     void foo(float x, int y);
1253     void foo(float x, float y);
1254     void bar(int x, int y = 0);
1255     int main() { foo(^); }
1256   )cpp");
1257   EXPECT_THAT(Results.signatures,
1258               UnorderedElementsAre(Sig("foo([[float x]], [[float y]]) -> void"),
1259                                    Sig("foo([[float x]], [[int y]]) -> void"),
1260                                    Sig("foo([[int x]], [[float y]]) -> void"),
1261                                    Sig("foo([[int x]], [[int y]]) -> void")));
1262   // We always prefer the first signature.
1263   EXPECT_EQ(0, Results.activeSignature);
1264   EXPECT_EQ(0, Results.activeParameter);
1265 }
1266 
1267 TEST(SignatureHelpTest, Constructors) {
1268   std::string Top = R"cpp(
1269     struct S {
1270       S(int);
1271       S(const S &) = delete;
1272     };
1273   )cpp";
1274 
1275   auto CheckParenInit = [&](std::string Init) {
1276     EXPECT_THAT(signatures(Top + Init).signatures,
1277                 UnorderedElementsAre(Sig("S([[int]])")))
1278         << Init;
1279   };
1280   CheckParenInit("S s(^);");
1281   CheckParenInit("auto s = S(^);");
1282   CheckParenInit("auto s = new S(^);");
1283 
1284   auto CheckBracedInit = [&](std::string Init) {
1285     EXPECT_THAT(signatures(Top + Init).signatures,
1286                 UnorderedElementsAre(Sig("S{[[int]]}")))
1287         << Init;
1288   };
1289   CheckBracedInit("S s{^};");
1290   CheckBracedInit("S s = {^};");
1291   CheckBracedInit("auto s = S{^};");
1292   // FIXME: doesn't work: no ExpectedType set in ParseCXXNewExpression.
1293   // CheckBracedInit("auto s = new S{^};");
1294   CheckBracedInit("int x(S); int i = x({^});");
1295 }
1296 
1297 TEST(SignatureHelpTest, Aggregates) {
1298   std::string Top = R"cpp(
1299     struct S {
1300       int a, b, c, d;
1301     };
1302   )cpp";
1303   auto AggregateSig = Sig("S{[[int a]], [[int b]], [[int c]], [[int d]]}");
1304   EXPECT_THAT(signatures(Top + "S s{^}").signatures,
1305               UnorderedElementsAre(AggregateSig, Sig("S{}"),
1306                                    Sig("S{[[const S &]]}"),
1307                                    Sig("S{[[S &&]]}")));
1308   EXPECT_THAT(signatures(Top + "S s{1,^}").signatures,
1309               ElementsAre(AggregateSig));
1310   EXPECT_EQ(signatures(Top + "S s{1,^}").activeParameter, 1);
1311   EXPECT_THAT(signatures(Top + "S s{.c=3,^}").signatures,
1312               ElementsAre(AggregateSig));
1313   EXPECT_EQ(signatures(Top + "S s{.c=3,^}").activeParameter, 3);
1314 }
1315 
1316 TEST(SignatureHelpTest, OverloadInitListRegression) {
1317   auto Results = signatures(R"cpp(
1318     struct A {int x;};
1319     struct B {B(A);};
1320     void f();
1321     int main() {
1322       B b({1});
1323       f(^);
1324     }
1325   )cpp");
1326   EXPECT_THAT(Results.signatures, UnorderedElementsAre(Sig("f() -> void")));
1327 }
1328 
1329 TEST(SignatureHelpTest, DefaultArgs) {
1330   auto Results = signatures(R"cpp(
1331     void bar(int x, int y = 0);
1332     void bar(float x = 0, int y = 42);
1333     int main() { bar(^
1334   )cpp");
1335   EXPECT_THAT(Results.signatures,
1336               UnorderedElementsAre(
1337                   Sig("bar([[int x]], [[int y = 0]]) -> void"),
1338                   Sig("bar([[float x = 0]], [[int y = 42]]) -> void")));
1339   EXPECT_EQ(0, Results.activeSignature);
1340   EXPECT_EQ(0, Results.activeParameter);
1341 }
1342 
1343 TEST(SignatureHelpTest, ActiveArg) {
1344   auto Results = signatures(R"cpp(
1345     int baz(int a, int b, int c);
1346     int main() { baz(baz(1,2,3), ^); }
1347   )cpp");
1348   EXPECT_THAT(Results.signatures,
1349               ElementsAre(Sig("baz([[int a]], [[int b]], [[int c]]) -> int")));
1350   EXPECT_EQ(0, Results.activeSignature);
1351   EXPECT_EQ(1, Results.activeParameter);
1352 }
1353 
1354 TEST(SignatureHelpTest, OpeningParen) {
1355   llvm::StringLiteral Tests[] = {
1356       // Recursive function call.
1357       R"cpp(
1358         int foo(int a, int b, int c);
1359         int main() {
1360           foo(foo $p^( foo(10, 10, 10), ^ )));
1361         })cpp",
1362       // Functional type cast.
1363       R"cpp(
1364         struct Foo {
1365           Foo(int a, int b, int c);
1366         };
1367         int main() {
1368           Foo $p^( 10, ^ );
1369         })cpp",
1370       // New expression.
1371       R"cpp(
1372         struct Foo {
1373           Foo(int a, int b, int c);
1374         };
1375         int main() {
1376           new Foo $p^( 10, ^ );
1377         })cpp",
1378       // Macro expansion.
1379       R"cpp(
1380         int foo(int a, int b, int c);
1381         #define FOO foo(
1382 
1383         int main() {
1384           // Macro expansions.
1385           $p^FOO 10, ^ );
1386         })cpp",
1387       // Macro arguments.
1388       R"cpp(
1389         int foo(int a, int b, int c);
1390         int main() {
1391         #define ID(X) X
1392           // FIXME: figure out why ID(foo (foo(10), )) doesn't work when preserving
1393           // the recovery expression.
1394           ID(foo $p^( 10, ^ ))
1395         })cpp",
1396       // Dependent args.
1397       R"cpp(
1398         int foo(int a, int b);
1399         template <typename T> void bar(T t) {
1400           foo$p^(t, ^t);
1401         })cpp",
1402       // Dependent args on templated func.
1403       R"cpp(
1404         template <typename T>
1405         int foo(T, T);
1406         template <typename T> void bar(T t) {
1407           foo$p^(t, ^t);
1408         })cpp",
1409       // Dependent args on member.
1410       R"cpp(
1411         struct Foo { int foo(int, int); };
1412         template <typename T> void bar(T t) {
1413           Foo f;
1414           f.foo$p^(t, ^t);
1415         })cpp",
1416       // Dependent args on templated member.
1417       R"cpp(
1418         struct Foo { template <typename T> int foo(T, T); };
1419         template <typename T> void bar(T t) {
1420           Foo f;
1421           f.foo$p^(t, ^t);
1422         })cpp",
1423   };
1424 
1425   for (auto Test : Tests) {
1426     Annotations Code(Test);
1427     EXPECT_EQ(signatures(Code.code(), Code.point()).argListStart,
1428               Code.point("p"))
1429         << "Test source:" << Test;
1430   }
1431 }
1432 
1433 TEST(SignatureHelpTest, StalePreamble) {
1434   TestTU TU;
1435   TU.Code = "";
1436   IgnoreDiagnostics Diags;
1437   MockFS FS;
1438   auto Inputs = TU.inputs(FS);
1439   auto CI = buildCompilerInvocation(Inputs, Diags);
1440   ASSERT_TRUE(CI);
1441   auto EmptyPreamble = buildPreamble(testPath(TU.Filename), *CI, Inputs,
1442                                      /*InMemory=*/true, /*Callback=*/nullptr);
1443   ASSERT_TRUE(EmptyPreamble);
1444 
1445   TU.AdditionalFiles["a.h"] = "int foo(int x);";
1446   const Annotations Test(R"cpp(
1447     #include "a.h"
1448     void bar() { foo(^2); })cpp");
1449   TU.Code = Test.code().str();
1450   auto Results =
1451       signatureHelp(testPath(TU.Filename), Test.point(), *EmptyPreamble,
1452                     TU.inputs(FS), MarkupKind::PlainText);
1453   EXPECT_THAT(Results.signatures, ElementsAre(Sig("foo([[int x]]) -> int")));
1454   EXPECT_EQ(0, Results.activeSignature);
1455   EXPECT_EQ(0, Results.activeParameter);
1456 }
1457 
1458 class IndexRequestCollector : public SymbolIndex {
1459 public:
1460   bool
1461   fuzzyFind(const FuzzyFindRequest &Req,
1462             llvm::function_ref<void(const Symbol &)> Callback) const override {
1463     std::unique_lock<std::mutex> Lock(Mut);
1464     Requests.push_back(Req);
1465     ReceivedRequestCV.notify_one();
1466     return true;
1467   }
1468 
1469   void lookup(const LookupRequest &,
1470               llvm::function_ref<void(const Symbol &)>) const override {}
1471 
1472   bool refs(const RefsRequest &,
1473             llvm::function_ref<void(const Ref &)>) const override {
1474     return false;
1475   }
1476 
1477   void relations(const RelationsRequest &,
1478                  llvm::function_ref<void(const SymbolID &, const Symbol &)>)
1479       const override {}
1480 
1481   llvm::unique_function<IndexContents(llvm::StringRef) const>
1482   indexedFiles() const override {
1483     return [](llvm::StringRef) { return IndexContents::None; };
1484   }
1485 
1486   // This is incorrect, but IndexRequestCollector is not an actual index and it
1487   // isn't used in production code.
1488   size_t estimateMemoryUsage() const override { return 0; }
1489 
1490   const std::vector<FuzzyFindRequest> consumeRequests(size_t Num) const {
1491     std::unique_lock<std::mutex> Lock(Mut);
1492     EXPECT_TRUE(wait(Lock, ReceivedRequestCV, timeoutSeconds(30),
1493                      [this, Num] { return Requests.size() == Num; }));
1494     auto Reqs = std::move(Requests);
1495     Requests = {};
1496     return Reqs;
1497   }
1498 
1499 private:
1500   // We need a mutex to handle async fuzzy find requests.
1501   mutable std::condition_variable ReceivedRequestCV;
1502   mutable std::mutex Mut;
1503   mutable std::vector<FuzzyFindRequest> Requests;
1504 };
1505 
1506 // Clients have to consume exactly Num requests.
1507 std::vector<FuzzyFindRequest> captureIndexRequests(llvm::StringRef Code,
1508                                                    size_t Num = 1) {
1509   clangd::CodeCompleteOptions Opts;
1510   IndexRequestCollector Requests;
1511   Opts.Index = &Requests;
1512   completions(Code, {}, Opts);
1513   const auto Reqs = Requests.consumeRequests(Num);
1514   EXPECT_EQ(Reqs.size(), Num);
1515   return Reqs;
1516 }
1517 
1518 TEST(CompletionTest, UnqualifiedIdQuery) {
1519   auto Requests = captureIndexRequests(R"cpp(
1520       namespace std {}
1521       using namespace std;
1522       namespace ns {
1523       void f() {
1524         vec^
1525       }
1526       }
1527   )cpp");
1528 
1529   EXPECT_THAT(Requests,
1530               ElementsAre(Field(&FuzzyFindRequest::Scopes,
1531                                 UnorderedElementsAre("", "ns::", "std::"))));
1532 }
1533 
1534 TEST(CompletionTest, EnclosingScopeComesFirst) {
1535   auto Requests = captureIndexRequests(R"cpp(
1536       namespace std {}
1537       using namespace std;
1538       namespace nx {
1539       namespace ns {
1540       namespace {
1541       void f() {
1542         vec^
1543       }
1544       }
1545       }
1546       }
1547   )cpp");
1548 
1549   EXPECT_THAT(Requests,
1550               ElementsAre(Field(
1551                   &FuzzyFindRequest::Scopes,
1552                   UnorderedElementsAre("", "std::", "nx::ns::", "nx::"))));
1553   EXPECT_EQ(Requests[0].Scopes[0], "nx::ns::");
1554 }
1555 
1556 TEST(CompletionTest, ResolvedQualifiedIdQuery) {
1557   auto Requests = captureIndexRequests(R"cpp(
1558       namespace ns1 {}
1559       namespace ns2 {} // ignore
1560       namespace ns3 { namespace nns3 {} }
1561       namespace foo {
1562       using namespace ns1;
1563       using namespace ns3::nns3;
1564       }
1565       namespace ns {
1566       void f() {
1567         foo::^
1568       }
1569       }
1570   )cpp");
1571 
1572   EXPECT_THAT(Requests,
1573               ElementsAre(Field(
1574                   &FuzzyFindRequest::Scopes,
1575                   UnorderedElementsAre("foo::", "ns1::", "ns3::nns3::"))));
1576 }
1577 
1578 TEST(CompletionTest, UnresolvedQualifierIdQuery) {
1579   auto Requests = captureIndexRequests(R"cpp(
1580       namespace a {}
1581       using namespace a;
1582       namespace ns {
1583       void f() {
1584       bar::^
1585       }
1586       } // namespace ns
1587   )cpp");
1588 
1589   EXPECT_THAT(Requests,
1590               ElementsAre(Field(
1591                   &FuzzyFindRequest::Scopes,
1592                   UnorderedElementsAre("a::bar::", "ns::bar::", "bar::"))));
1593 }
1594 
1595 TEST(CompletionTest, UnresolvedNestedQualifierIdQuery) {
1596   auto Requests = captureIndexRequests(R"cpp(
1597       namespace a {}
1598       using namespace a;
1599       namespace ns {
1600       void f() {
1601       ::a::bar::^
1602       }
1603       } // namespace ns
1604   )cpp");
1605 
1606   EXPECT_THAT(Requests, ElementsAre(Field(&FuzzyFindRequest::Scopes,
1607                                           UnorderedElementsAre("a::bar::"))));
1608 }
1609 
1610 TEST(CompletionTest, EmptyQualifiedQuery) {
1611   auto Requests = captureIndexRequests(R"cpp(
1612       namespace ns {
1613       void f() {
1614       ^
1615       }
1616       } // namespace ns
1617   )cpp");
1618 
1619   EXPECT_THAT(Requests, ElementsAre(Field(&FuzzyFindRequest::Scopes,
1620                                           UnorderedElementsAre("", "ns::"))));
1621 }
1622 
1623 TEST(CompletionTest, GlobalQualifiedQuery) {
1624   auto Requests = captureIndexRequests(R"cpp(
1625       namespace ns {
1626       void f() {
1627       ::^
1628       }
1629       } // namespace ns
1630   )cpp");
1631 
1632   EXPECT_THAT(Requests, ElementsAre(Field(&FuzzyFindRequest::Scopes,
1633                                           UnorderedElementsAre(""))));
1634 }
1635 
1636 TEST(CompletionTest, NoDuplicatedQueryScopes) {
1637   auto Requests = captureIndexRequests(R"cpp(
1638       namespace {}
1639 
1640       namespace na {
1641       namespace {}
1642       namespace nb {
1643       ^
1644       } // namespace nb
1645       } // namespace na
1646   )cpp");
1647 
1648   EXPECT_THAT(Requests,
1649               ElementsAre(Field(&FuzzyFindRequest::Scopes,
1650                                 UnorderedElementsAre("na::", "na::nb::", ""))));
1651 }
1652 
1653 TEST(CompletionTest, NoIndexCompletionsInsideClasses) {
1654   auto Completions = completions(
1655       R"cpp(
1656     struct Foo {
1657       int SomeNameOfField;
1658       typedef int SomeNameOfTypedefField;
1659     };
1660 
1661     Foo::^)cpp",
1662       {func("::SomeNameInTheIndex"), func("::Foo::SomeNameInTheIndex")});
1663 
1664   EXPECT_THAT(Completions.Completions,
1665               AllOf(Contains(Labeled("SomeNameOfField")),
1666                     Contains(Labeled("SomeNameOfTypedefField")),
1667                     Not(Contains(Labeled("SomeNameInTheIndex")))));
1668 }
1669 
1670 TEST(CompletionTest, NoIndexCompletionsInsideDependentCode) {
1671   {
1672     auto Completions = completions(
1673         R"cpp(
1674       template <class T>
1675       void foo() {
1676         T::^
1677       }
1678       )cpp",
1679         {func("::SomeNameInTheIndex")});
1680 
1681     EXPECT_THAT(Completions.Completions,
1682                 Not(Contains(Labeled("SomeNameInTheIndex"))));
1683   }
1684 
1685   {
1686     auto Completions = completions(
1687         R"cpp(
1688       template <class T>
1689       void foo() {
1690         T::template Y<int>::^
1691       }
1692       )cpp",
1693         {func("::SomeNameInTheIndex")});
1694 
1695     EXPECT_THAT(Completions.Completions,
1696                 Not(Contains(Labeled("SomeNameInTheIndex"))));
1697   }
1698 
1699   {
1700     auto Completions = completions(
1701         R"cpp(
1702       template <class T>
1703       void foo() {
1704         T::foo::^
1705       }
1706       )cpp",
1707         {func("::SomeNameInTheIndex")});
1708 
1709     EXPECT_THAT(Completions.Completions,
1710                 Not(Contains(Labeled("SomeNameInTheIndex"))));
1711   }
1712 }
1713 
1714 TEST(CompletionTest, OverloadBundling) {
1715   clangd::CodeCompleteOptions Opts;
1716   Opts.BundleOverloads = true;
1717 
1718   std::string Context = R"cpp(
1719     struct X {
1720       // Overload with int
1721       int a(int) __attribute__((deprecated("", "")));
1722       // Overload with bool
1723       int a(bool);
1724       int b(float);
1725 
1726       X(int);
1727       X(float);
1728     };
1729     int GFuncC(int);
1730     int GFuncD(int);
1731   )cpp";
1732 
1733   // Member completions are bundled.
1734   EXPECT_THAT(completions(Context + "int y = X().^", {}, Opts).Completions,
1735               UnorderedElementsAre(Labeled("a(…)"), Labeled("b(float)")));
1736 
1737   // Constructor completions are bundled.
1738   EXPECT_THAT(completions(Context + "X z = X^", {}, Opts).Completions,
1739               UnorderedElementsAre(Labeled("X"), Labeled("X(…)")));
1740 
1741   // Non-member completions are bundled, including index+sema.
1742   Symbol NoArgsGFunc = func("GFuncC");
1743   EXPECT_THAT(
1744       completions(Context + "int y = GFunc^", {NoArgsGFunc}, Opts).Completions,
1745       UnorderedElementsAre(Labeled("GFuncC(…)"), Labeled("GFuncD(int)")));
1746 
1747   // Differences in header-to-insert suppress bundling.
1748   std::string DeclFile = URI::create(testPath("foo")).toString();
1749   NoArgsGFunc.CanonicalDeclaration.FileURI = DeclFile.c_str();
1750   NoArgsGFunc.IncludeHeaders.emplace_back("<foo>", 1);
1751   EXPECT_THAT(
1752       completions(Context + "int y = GFunc^", {NoArgsGFunc}, Opts).Completions,
1753       UnorderedElementsAre(AllOf(Named("GFuncC"), InsertInclude("<foo>")),
1754                            Labeled("GFuncC(int)"), Labeled("GFuncD(int)")));
1755 
1756   // Examine a bundled completion in detail.
1757   auto A =
1758       completions(Context + "int y = X().a^", {}, Opts).Completions.front();
1759   EXPECT_EQ(A.Name, "a");
1760   EXPECT_EQ(A.Signature, "(…)");
1761   EXPECT_EQ(A.BundleSize, 2u);
1762   EXPECT_EQ(A.Kind, CompletionItemKind::Method);
1763   EXPECT_EQ(A.ReturnType, "int"); // All overloads return int.
1764   // For now we just return one of the doc strings arbitrarily.
1765   ASSERT_TRUE(A.Documentation);
1766   ASSERT_FALSE(A.Deprecated); // Not all overloads deprecated.
1767   EXPECT_THAT(
1768       A.Documentation->asPlainText(),
1769       AnyOf(HasSubstr("Overload with int"), HasSubstr("Overload with bool")));
1770   EXPECT_EQ(A.SnippetSuffix, "($0)");
1771 }
1772 
1773 TEST(CompletionTest, OverloadBundlingSameFileDifferentURI) {
1774   clangd::CodeCompleteOptions Opts;
1775   Opts.BundleOverloads = true;
1776 
1777   Symbol SymX = sym("ns::X", index::SymbolKind::Function, "@F@\\0#");
1778   Symbol SymY = sym("ns::X", index::SymbolKind::Function, "@F@\\0#I#");
1779   std::string BarHeader = testPath("bar.h");
1780   auto BarURI = URI::create(BarHeader).toString();
1781   SymX.CanonicalDeclaration.FileURI = BarURI.c_str();
1782   SymY.CanonicalDeclaration.FileURI = BarURI.c_str();
1783   // The include header is different, but really it's the same file.
1784   SymX.IncludeHeaders.emplace_back("\"bar.h\"", 1);
1785   SymY.IncludeHeaders.emplace_back(BarURI.c_str(), 1);
1786 
1787   auto Results = completions("void f() { ::ns::^ }", {SymX, SymY}, Opts);
1788   // Expect both results are bundled, despite the different-but-same
1789   // IncludeHeader.
1790   ASSERT_EQ(1u, Results.Completions.size());
1791   const auto &R = Results.Completions.front();
1792   EXPECT_EQ("X", R.Name);
1793   EXPECT_EQ(2u, R.BundleSize);
1794 }
1795 
1796 TEST(CompletionTest, DocumentationFromChangedFileCrash) {
1797   MockFS FS;
1798   auto FooH = testPath("foo.h");
1799   auto FooCpp = testPath("foo.cpp");
1800   FS.Files[FooH] = R"cpp(
1801     // this is my documentation comment.
1802     int func();
1803   )cpp";
1804   FS.Files[FooCpp] = "";
1805 
1806   MockCompilationDatabase CDB;
1807   ClangdServer Server(CDB, FS, ClangdServer::optsForTest());
1808 
1809   Annotations Source(R"cpp(
1810     #include "foo.h"
1811     int func() {
1812       // This makes sure we have func from header in the AST.
1813     }
1814     int a = fun^
1815   )cpp");
1816   Server.addDocument(FooCpp, Source.code(), "null", WantDiagnostics::Yes);
1817   // We need to wait for preamble to build.
1818   ASSERT_TRUE(Server.blockUntilIdleForTest());
1819 
1820   // Change the header file. Completion will reuse the old preamble!
1821   FS.Files[FooH] = R"cpp(
1822     int func();
1823   )cpp";
1824 
1825   clangd::CodeCompleteOptions Opts;
1826   CodeCompleteResult Completions =
1827       cantFail(runCodeComplete(Server, FooCpp, Source.point(), Opts));
1828   // We shouldn't crash. Unfortunately, current workaround is to not produce
1829   // comments for symbols from headers.
1830   EXPECT_THAT(Completions.Completions,
1831               Contains(AllOf(Not(IsDocumented()), Named("func"))));
1832 }
1833 
1834 TEST(CompletionTest, NonDocComments) {
1835   const char *Text = R"cpp(
1836     // We ignore namespace comments, for rationale see CodeCompletionStrings.h.
1837     namespace comments_ns {
1838     }
1839 
1840     // ------------------
1841     int comments_foo();
1842 
1843     // A comment and a decl are separated by newlines.
1844     // Therefore, the comment shouldn't show up as doc comment.
1845 
1846     int comments_bar();
1847 
1848     // this comment should be in the results.
1849     int comments_baz();
1850 
1851 
1852     template <class T>
1853     struct Struct {
1854       int comments_qux();
1855       int comments_quux();
1856     };
1857 
1858 
1859     // This comment should not be there.
1860 
1861     template <class T>
1862     int Struct<T>::comments_qux() {
1863     }
1864 
1865     // This comment **should** be in results.
1866     template <class T>
1867     int Struct<T>::comments_quux() {
1868       int a = comments^;
1869     }
1870   )cpp";
1871 
1872   // We should not get any of those comments in completion.
1873   EXPECT_THAT(
1874       completions(Text).Completions,
1875       UnorderedElementsAre(AllOf(Not(IsDocumented()), Named("comments_foo")),
1876                            AllOf(IsDocumented(), Named("comments_baz")),
1877                            AllOf(IsDocumented(), Named("comments_quux")),
1878                            AllOf(Not(IsDocumented()), Named("comments_ns")),
1879                            // FIXME(ibiryukov): the following items should have
1880                            // empty documentation, since they are separated from
1881                            // a comment with an empty line. Unfortunately, I
1882                            // couldn't make Sema tests pass if we ignore those.
1883                            AllOf(IsDocumented(), Named("comments_bar")),
1884                            AllOf(IsDocumented(), Named("comments_qux"))));
1885 }
1886 
1887 TEST(CompletionTest, CompleteOnInvalidLine) {
1888   auto FooCpp = testPath("foo.cpp");
1889 
1890   MockCompilationDatabase CDB;
1891   MockFS FS;
1892   FS.Files[FooCpp] = "// empty file";
1893 
1894   ClangdServer Server(CDB, FS, ClangdServer::optsForTest());
1895   // Run completion outside the file range.
1896   Position Pos;
1897   Pos.line = 100;
1898   Pos.character = 0;
1899   EXPECT_THAT_EXPECTED(
1900       runCodeComplete(Server, FooCpp, Pos, clangd::CodeCompleteOptions()),
1901       Failed());
1902 }
1903 
1904 TEST(CompletionTest, QualifiedNames) {
1905   auto Results = completions(
1906       R"cpp(
1907           namespace ns { int local; void both(); }
1908           void f() { ::ns::^ }
1909       )cpp",
1910       {func("ns::both"), cls("ns::Index")});
1911   // We get results from both index and sema, with no duplicates.
1912   EXPECT_THAT(
1913       Results.Completions,
1914       UnorderedElementsAre(Scope("ns::"), Scope("ns::"), Scope("ns::")));
1915 }
1916 
1917 TEST(CompletionTest, Render) {
1918   CodeCompletion C;
1919   C.Name = "x";
1920   C.Signature = "(bool) const";
1921   C.SnippetSuffix = "(${0:bool})";
1922   C.ReturnType = "int";
1923   C.RequiredQualifier = "Foo::";
1924   C.Scope = "ns::Foo::";
1925   C.Documentation.emplace();
1926   C.Documentation->addParagraph().appendText("This is ").appendCode("x()");
1927   C.Includes.emplace_back();
1928   auto &Include = C.Includes.back();
1929   Include.Header = "\"foo.h\"";
1930   C.Kind = CompletionItemKind::Method;
1931   C.Score.Total = 1.0;
1932   C.Score.ExcludingName = .5;
1933   C.Origin = SymbolOrigin::AST | SymbolOrigin::Static;
1934 
1935   CodeCompleteOptions Opts;
1936   Opts.IncludeIndicator.Insert = "^";
1937   Opts.IncludeIndicator.NoInsert = "";
1938   Opts.EnableSnippets = false;
1939 
1940   auto R = C.render(Opts);
1941   EXPECT_EQ(R.label, "Foo::x(bool) const");
1942   EXPECT_EQ(R.insertText, "Foo::x");
1943   EXPECT_EQ(R.insertTextFormat, InsertTextFormat::PlainText);
1944   EXPECT_EQ(R.filterText, "x");
1945   EXPECT_EQ(R.detail, "int");
1946   EXPECT_EQ(R.documentation->value, "From \"foo.h\"\nThis is x()");
1947   EXPECT_THAT(R.additionalTextEdits, IsEmpty());
1948   EXPECT_EQ(R.sortText, sortText(1.0, "x"));
1949   EXPECT_FALSE(R.deprecated);
1950   EXPECT_EQ(R.score, .5f);
1951 
1952   Opts.EnableSnippets = true;
1953   R = C.render(Opts);
1954   EXPECT_EQ(R.insertText, "Foo::x(${0:bool})");
1955   EXPECT_EQ(R.insertTextFormat, InsertTextFormat::Snippet);
1956 
1957   C.SnippetSuffix = "";
1958   R = C.render(Opts);
1959   EXPECT_EQ(R.insertText, "Foo::x");
1960   EXPECT_EQ(R.insertTextFormat, InsertTextFormat::PlainText);
1961 
1962   Include.Insertion.emplace();
1963   R = C.render(Opts);
1964   EXPECT_EQ(R.label, "^Foo::x(bool) const");
1965   EXPECT_THAT(R.additionalTextEdits, Not(IsEmpty()));
1966 
1967   Opts.ShowOrigins = true;
1968   R = C.render(Opts);
1969   EXPECT_EQ(R.label, "^[AS]Foo::x(bool) const");
1970 
1971   C.BundleSize = 2;
1972   R = C.render(Opts);
1973   EXPECT_EQ(R.detail, "[2 overloads]");
1974   EXPECT_EQ(R.documentation->value, "From \"foo.h\"\nThis is x()");
1975 
1976   C.Deprecated = true;
1977   R = C.render(Opts);
1978   EXPECT_TRUE(R.deprecated);
1979 
1980   Opts.DocumentationFormat = MarkupKind::Markdown;
1981   R = C.render(Opts);
1982   EXPECT_EQ(R.documentation->value, "From `\"foo.h\"`  \nThis is `x()`");
1983 }
1984 
1985 TEST(CompletionTest, IgnoreRecoveryResults) {
1986   auto Results = completions(
1987       R"cpp(
1988           namespace ns { int NotRecovered() { return 0; } }
1989           void f() {
1990             // Sema enters recovery mode first and then normal mode.
1991             if (auto x = ns::NotRecover^)
1992           }
1993       )cpp");
1994   EXPECT_THAT(Results.Completions, UnorderedElementsAre(Named("NotRecovered")));
1995 }
1996 
1997 TEST(CompletionTest, ScopeOfClassFieldInConstructorInitializer) {
1998   auto Results = completions(
1999       R"cpp(
2000         namespace ns {
2001           class X { public: X(); int x_; };
2002           X::X() : x_^(0) {}
2003         }
2004       )cpp");
2005   EXPECT_THAT(Results.Completions,
2006               UnorderedElementsAre(AllOf(Scope("ns::X::"), Named("x_"))));
2007 }
2008 
2009 // Like other class members, constructor init lists have to parse what's below,
2010 // after the completion point.
2011 // But recovering from an incomplete constructor init list is particularly
2012 // tricky because the bulk of the list is not surrounded by brackets.
2013 TEST(CompletionTest, ConstructorInitListIncomplete) {
2014   auto Results = completions(
2015       R"cpp(
2016         namespace ns {
2017           struct X {
2018             X() : x^
2019             int xyz_;
2020           };
2021         }
2022       )cpp");
2023   EXPECT_THAT(Results.Completions, ElementsAre(Named("xyz_")));
2024 
2025   Results = completions(
2026       R"cpp(
2027         int foo();
2028 
2029         namespace ns {
2030           struct X {
2031             X() : xyz_(fo^
2032             int xyz_;
2033           };
2034         }
2035       )cpp");
2036   EXPECT_THAT(Results.Completions, ElementsAre(Named("foo")));
2037 }
2038 
2039 TEST(CompletionTest, CodeCompletionContext) {
2040   auto Results = completions(
2041       R"cpp(
2042         namespace ns {
2043           class X { public: X(); int x_; };
2044           void f() {
2045             X x;
2046             x.^;
2047           }
2048         }
2049       )cpp");
2050 
2051   EXPECT_THAT(Results.Context, CodeCompletionContext::CCC_DotMemberAccess);
2052 }
2053 
2054 TEST(CompletionTest, FixItForArrowToDot) {
2055   MockFS FS;
2056   MockCompilationDatabase CDB;
2057 
2058   CodeCompleteOptions Opts;
2059   Opts.IncludeFixIts = true;
2060   const char *Code =
2061       R"cpp(
2062         class Auxilary {
2063          public:
2064           void AuxFunction();
2065         };
2066         class ClassWithPtr {
2067          public:
2068           void MemberFunction();
2069           Auxilary* operator->() const;
2070           Auxilary* Aux;
2071         };
2072         void f() {
2073           ClassWithPtr x;
2074           x[[->]]^;
2075         }
2076       )cpp";
2077   auto Results = completions(Code, {}, Opts);
2078   EXPECT_EQ(Results.Completions.size(), 3u);
2079 
2080   TextEdit ReplacementEdit;
2081   ReplacementEdit.range = Annotations(Code).range();
2082   ReplacementEdit.newText = ".";
2083   for (const auto &C : Results.Completions) {
2084     EXPECT_TRUE(C.FixIts.size() == 1u || C.Name == "AuxFunction");
2085     if (!C.FixIts.empty()) {
2086       EXPECT_THAT(C.FixIts, ElementsAre(ReplacementEdit));
2087     }
2088   }
2089 }
2090 
2091 TEST(CompletionTest, FixItForDotToArrow) {
2092   CodeCompleteOptions Opts;
2093   Opts.IncludeFixIts = true;
2094   const char *Code =
2095       R"cpp(
2096         class Auxilary {
2097          public:
2098           void AuxFunction();
2099         };
2100         class ClassWithPtr {
2101          public:
2102           void MemberFunction();
2103           Auxilary* operator->() const;
2104           Auxilary* Aux;
2105         };
2106         void f() {
2107           ClassWithPtr x;
2108           x[[.]]^;
2109         }
2110       )cpp";
2111   auto Results = completions(Code, {}, Opts);
2112   EXPECT_EQ(Results.Completions.size(), 3u);
2113 
2114   TextEdit ReplacementEdit;
2115   ReplacementEdit.range = Annotations(Code).range();
2116   ReplacementEdit.newText = "->";
2117   for (const auto &C : Results.Completions) {
2118     EXPECT_TRUE(C.FixIts.empty() || C.Name == "AuxFunction");
2119     if (!C.FixIts.empty()) {
2120       EXPECT_THAT(C.FixIts, ElementsAre(ReplacementEdit));
2121     }
2122   }
2123 }
2124 
2125 TEST(CompletionTest, RenderWithFixItMerged) {
2126   TextEdit FixIt;
2127   FixIt.range.end.character = 5;
2128   FixIt.newText = "->";
2129 
2130   CodeCompletion C;
2131   C.Name = "x";
2132   C.RequiredQualifier = "Foo::";
2133   C.FixIts = {FixIt};
2134   C.CompletionTokenRange.start.character = 5;
2135 
2136   CodeCompleteOptions Opts;
2137   Opts.IncludeFixIts = true;
2138 
2139   auto R = C.render(Opts);
2140   EXPECT_TRUE(R.textEdit);
2141   EXPECT_EQ(R.textEdit->newText, "->Foo::x");
2142   EXPECT_TRUE(R.additionalTextEdits.empty());
2143 }
2144 
2145 TEST(CompletionTest, RenderWithFixItNonMerged) {
2146   TextEdit FixIt;
2147   FixIt.range.end.character = 4;
2148   FixIt.newText = "->";
2149 
2150   CodeCompletion C;
2151   C.Name = "x";
2152   C.RequiredQualifier = "Foo::";
2153   C.FixIts = {FixIt};
2154   C.CompletionTokenRange.start.character = 5;
2155 
2156   CodeCompleteOptions Opts;
2157   Opts.IncludeFixIts = true;
2158 
2159   auto R = C.render(Opts);
2160   EXPECT_TRUE(R.textEdit);
2161   EXPECT_EQ(R.textEdit->newText, "Foo::x");
2162   EXPECT_THAT(R.additionalTextEdits, UnorderedElementsAre(FixIt));
2163 }
2164 
2165 TEST(CompletionTest, CompletionTokenRange) {
2166   MockFS FS;
2167   MockCompilationDatabase CDB;
2168   TestTU TU;
2169   TU.AdditionalFiles["foo/abc/foo.h"] = "";
2170 
2171   constexpr const char *TestCodes[] = {
2172       R"cpp(
2173         class Auxilary {
2174          public:
2175           void AuxFunction();
2176         };
2177         void f() {
2178           Auxilary x;
2179           x.[[Aux]]^;
2180         }
2181       )cpp",
2182       R"cpp(
2183         class Auxilary {
2184          public:
2185           void AuxFunction();
2186         };
2187         void f() {
2188           Auxilary x;
2189           x.[[]]^;
2190         }
2191       )cpp",
2192       R"cpp(
2193         #include "foo/[[a^/]]foo.h"
2194       )cpp",
2195       R"cpp(
2196         #include "foo/abc/[[fo^o.h"]]
2197       )cpp",
2198   };
2199   for (const auto &Text : TestCodes) {
2200     Annotations TestCode(Text);
2201     TU.Code = TestCode.code().str();
2202     auto Results = completions(TU, TestCode.point());
2203     if (Results.Completions.size() != 1) {
2204       ADD_FAILURE() << "Results.Completions.size() != 1" << Text;
2205       continue;
2206     }
2207     EXPECT_THAT(Results.Completions.front().CompletionTokenRange,
2208                 TestCode.range());
2209   }
2210 }
2211 
2212 TEST(SignatureHelpTest, OverloadsOrdering) {
2213   const auto Results = signatures(R"cpp(
2214     void foo(int x);
2215     void foo(int x, float y);
2216     void foo(float x, int y);
2217     void foo(float x, float y);
2218     void foo(int x, int y = 0);
2219     int main() { foo(^); }
2220   )cpp");
2221   EXPECT_THAT(Results.signatures,
2222               ElementsAre(Sig("foo([[int x]]) -> void"),
2223                           Sig("foo([[int x]], [[int y = 0]]) -> void"),
2224                           Sig("foo([[float x]], [[int y]]) -> void"),
2225                           Sig("foo([[int x]], [[float y]]) -> void"),
2226                           Sig("foo([[float x]], [[float y]]) -> void")));
2227   // We always prefer the first signature.
2228   EXPECT_EQ(0, Results.activeSignature);
2229   EXPECT_EQ(0, Results.activeParameter);
2230 }
2231 
2232 TEST(SignatureHelpTest, InstantiatedSignatures) {
2233   StringRef Sig0 = R"cpp(
2234     template <class T>
2235     void foo(T, T, T);
2236 
2237     int main() {
2238       foo<int>(^);
2239     }
2240   )cpp";
2241 
2242   EXPECT_THAT(signatures(Sig0).signatures,
2243               ElementsAre(Sig("foo([[T]], [[T]], [[T]]) -> void")));
2244 
2245   StringRef Sig1 = R"cpp(
2246     template <class T>
2247     void foo(T, T, T);
2248 
2249     int main() {
2250       foo(10, ^);
2251     })cpp";
2252 
2253   EXPECT_THAT(signatures(Sig1).signatures,
2254               ElementsAre(Sig("foo([[T]], [[T]], [[T]]) -> void")));
2255 
2256   StringRef Sig2 = R"cpp(
2257     template <class ...T>
2258     void foo(T...);
2259 
2260     int main() {
2261       foo<int>(^);
2262     }
2263   )cpp";
2264 
2265   EXPECT_THAT(signatures(Sig2).signatures,
2266               ElementsAre(Sig("foo([[T...]]) -> void")));
2267 
2268   // It is debatable whether we should substitute the outer template parameter
2269   // ('T') in that case. Currently we don't substitute it in signature help, but
2270   // do substitute in code complete.
2271   // FIXME: make code complete and signature help consistent, figure out which
2272   // way is better.
2273   StringRef Sig3 = R"cpp(
2274     template <class T>
2275     struct X {
2276       template <class U>
2277       void foo(T, U);
2278     };
2279 
2280     int main() {
2281       X<int>().foo<double>(^)
2282     }
2283   )cpp";
2284 
2285   EXPECT_THAT(signatures(Sig3).signatures,
2286               ElementsAre(Sig("foo([[T]], [[U]]) -> void")));
2287 }
2288 
2289 TEST(SignatureHelpTest, IndexDocumentation) {
2290   Symbol Foo0 = sym("foo", index::SymbolKind::Function, "@F@\\0#");
2291   Foo0.Documentation = "Doc from the index";
2292   Symbol Foo1 = sym("foo", index::SymbolKind::Function, "@F@\\0#I#");
2293   Foo1.Documentation = "Doc from the index";
2294   Symbol Foo2 = sym("foo", index::SymbolKind::Function, "@F@\\0#I#I#");
2295 
2296   StringRef Sig0 = R"cpp(
2297     int foo();
2298     int foo(double);
2299 
2300     void test() {
2301       foo(^);
2302     }
2303   )cpp";
2304 
2305   EXPECT_THAT(
2306       signatures(Sig0, {Foo0}).signatures,
2307       ElementsAre(AllOf(Sig("foo() -> int"), SigDoc("Doc from the index")),
2308                   AllOf(Sig("foo([[double]]) -> int"), SigDoc(""))));
2309 
2310   StringRef Sig1 = R"cpp(
2311     int foo();
2312     // Overriden doc from sema
2313     int foo(int);
2314     // Doc from sema
2315     int foo(int, int);
2316 
2317     void test() {
2318       foo(^);
2319     }
2320   )cpp";
2321 
2322   EXPECT_THAT(
2323       signatures(Sig1, {Foo0, Foo1, Foo2}).signatures,
2324       ElementsAre(
2325           AllOf(Sig("foo() -> int"), SigDoc("Doc from the index")),
2326           AllOf(Sig("foo([[int]]) -> int"), SigDoc("Overriden doc from sema")),
2327           AllOf(Sig("foo([[int]], [[int]]) -> int"), SigDoc("Doc from sema"))));
2328 }
2329 
2330 TEST(SignatureHelpTest, DynamicIndexDocumentation) {
2331   MockFS FS;
2332   MockCompilationDatabase CDB;
2333   ClangdServer::Options Opts = ClangdServer::optsForTest();
2334   Opts.BuildDynamicSymbolIndex = true;
2335   ClangdServer Server(CDB, FS, Opts);
2336 
2337   FS.Files[testPath("foo.h")] = R"cpp(
2338     struct Foo {
2339        // Member doc
2340        int foo();
2341     };
2342   )cpp";
2343   Annotations FileContent(R"cpp(
2344     #include "foo.h"
2345     void test() {
2346       Foo f;
2347       f.foo(^);
2348     }
2349   )cpp");
2350   auto File = testPath("test.cpp");
2351   Server.addDocument(File, FileContent.code());
2352   // Wait for the dynamic index being built.
2353   ASSERT_TRUE(Server.blockUntilIdleForTest());
2354   EXPECT_THAT(llvm::cantFail(runSignatureHelp(Server, File, FileContent.point(),
2355                                               MarkupKind::PlainText))
2356                   .signatures,
2357               ElementsAre(AllOf(Sig("foo() -> int"), SigDoc("Member doc"))));
2358 }
2359 
2360 TEST(CompletionTest, CompletionFunctionArgsDisabled) {
2361   CodeCompleteOptions Opts;
2362   Opts.EnableSnippets = true;
2363   Opts.EnableFunctionArgSnippets = false;
2364 
2365   {
2366     auto Results = completions(
2367         R"cpp(
2368       void xfoo();
2369       void xfoo(int x, int y);
2370       void f() { xfo^ })cpp",
2371         {}, Opts);
2372     EXPECT_THAT(
2373         Results.Completions,
2374         UnorderedElementsAre(AllOf(Named("xfoo"), SnippetSuffix("()")),
2375                              AllOf(Named("xfoo"), SnippetSuffix("($0)"))));
2376   }
2377   {
2378     auto Results = completions(
2379         R"cpp(
2380       void xbar();
2381       void f() { xba^ })cpp",
2382         {}, Opts);
2383     EXPECT_THAT(Results.Completions, UnorderedElementsAre(AllOf(
2384                                          Named("xbar"), SnippetSuffix("()"))));
2385   }
2386   {
2387     Opts.BundleOverloads = true;
2388     auto Results = completions(
2389         R"cpp(
2390       void xfoo();
2391       void xfoo(int x, int y);
2392       void f() { xfo^ })cpp",
2393         {}, Opts);
2394     EXPECT_THAT(
2395         Results.Completions,
2396         UnorderedElementsAre(AllOf(Named("xfoo"), SnippetSuffix("($0)"))));
2397   }
2398   {
2399     auto Results = completions(
2400         R"cpp(
2401       template <class T, class U>
2402       void xfoo(int a, U b);
2403       void f() { xfo^ })cpp",
2404         {}, Opts);
2405     EXPECT_THAT(
2406         Results.Completions,
2407         UnorderedElementsAre(AllOf(Named("xfoo"), SnippetSuffix("<$1>($0)"))));
2408   }
2409   {
2410     auto Results = completions(
2411         R"cpp(
2412       template <class T>
2413       class foo_class{};
2414       template <class T>
2415       using foo_alias = T**;
2416       void f() { foo_^ })cpp",
2417         {}, Opts);
2418     EXPECT_THAT(
2419         Results.Completions,
2420         UnorderedElementsAre(AllOf(Named("foo_class"), SnippetSuffix("<$0>")),
2421                              AllOf(Named("foo_alias"), SnippetSuffix("<$0>"))));
2422   }
2423   {
2424     auto Results = completions(
2425         R"cpp(
2426       #define FOO(x, y) x##f
2427       FO^ )cpp",
2428         {}, Opts);
2429     EXPECT_THAT(Results.Completions, UnorderedElementsAre(AllOf(
2430                                          Named("FOO"), SnippetSuffix("($0)"))));
2431   }
2432 }
2433 
2434 TEST(CompletionTest, SuggestOverrides) {
2435   constexpr const char *const Text(R"cpp(
2436   class A {
2437    public:
2438     virtual void vfunc(bool param);
2439     virtual void vfunc(bool param, int p);
2440     void func(bool param);
2441   };
2442   class B : public A {
2443   virtual void ttt(bool param) const;
2444   void vfunc(bool param, int p) override;
2445   };
2446   class C : public B {
2447    public:
2448     void vfunc(bool param) override;
2449     ^
2450   };
2451   )cpp");
2452   const auto Results = completions(Text);
2453   EXPECT_THAT(
2454       Results.Completions,
2455       AllOf(Contains(AllOf(Labeled("void vfunc(bool param, int p) override"),
2456                            NameStartsWith("vfunc"))),
2457             Contains(AllOf(Labeled("void ttt(bool param) const override"),
2458                            NameStartsWith("ttt"))),
2459             Not(Contains(Labeled("void vfunc(bool param) override")))));
2460 }
2461 
2462 TEST(CompletionTest, OverridesNonIdentName) {
2463   // Check the completions call does not crash.
2464   completions(R"cpp(
2465     struct Base {
2466       virtual ~Base() = 0;
2467       virtual operator int() = 0;
2468       virtual Base& operator+(Base&) = 0;
2469     };
2470 
2471     struct Derived : Base {
2472       ^
2473     };
2474   )cpp");
2475 }
2476 
2477 TEST(CompletionTest, NoCrashOnMissingNewLineAtEOF) {
2478   auto FooCpp = testPath("foo.cpp");
2479 
2480   MockCompilationDatabase CDB;
2481   MockFS FS;
2482   Annotations F("#pragma ^ // no new line");
2483   FS.Files[FooCpp] = F.code().str();
2484   ClangdServer Server(CDB, FS, ClangdServer::optsForTest());
2485   runAddDocument(Server, FooCpp, F.code());
2486   // Run completion outside the file range.
2487   EXPECT_THAT(cantFail(runCodeComplete(Server, FooCpp, F.point(),
2488                                        clangd::CodeCompleteOptions()))
2489                   .Completions,
2490               IsEmpty());
2491   EXPECT_THAT(cantFail(runSignatureHelp(Server, FooCpp, F.point(),
2492                                         MarkupKind::PlainText))
2493                   .signatures,
2494               IsEmpty());
2495 }
2496 
2497 TEST(GuessCompletionPrefix, Filters) {
2498   for (llvm::StringRef Case : {
2499            "[[scope::]][[ident]]^",
2500            "[[]][[]]^",
2501            "\n[[]][[]]^",
2502            "[[]][[ab]]^",
2503            "x.[[]][[ab]]^",
2504            "x.[[]][[]]^",
2505            "[[x::]][[ab]]^",
2506            "[[x::]][[]]^",
2507            "[[::x::]][[ab]]^",
2508            "some text [[scope::more::]][[identif]]^ier",
2509            "some text [[scope::]][[mor]]^e::identifier",
2510            "weird case foo::[[::bar::]][[baz]]^",
2511            "/* [[]][[]]^ */",
2512        }) {
2513     Annotations F(Case);
2514     auto Offset = cantFail(positionToOffset(F.code(), F.point()));
2515     auto ToStringRef = [&](Range R) {
2516       return F.code().slice(cantFail(positionToOffset(F.code(), R.start)),
2517                             cantFail(positionToOffset(F.code(), R.end)));
2518     };
2519     auto WantQualifier = ToStringRef(F.ranges()[0]),
2520          WantName = ToStringRef(F.ranges()[1]);
2521 
2522     auto Prefix = guessCompletionPrefix(F.code(), Offset);
2523     // Even when components are empty, check their offsets are correct.
2524     EXPECT_EQ(WantQualifier, Prefix.Qualifier) << Case;
2525     EXPECT_EQ(WantQualifier.begin(), Prefix.Qualifier.begin()) << Case;
2526     EXPECT_EQ(WantName, Prefix.Name) << Case;
2527     EXPECT_EQ(WantName.begin(), Prefix.Name.begin()) << Case;
2528   }
2529 }
2530 
2531 TEST(CompletionTest, EnableSpeculativeIndexRequest) {
2532   MockFS FS;
2533   MockCompilationDatabase CDB;
2534   ClangdServer Server(CDB, FS, ClangdServer::optsForTest());
2535 
2536   auto File = testPath("foo.cpp");
2537   Annotations Test(R"cpp(
2538       namespace ns1 { int abc; }
2539       namespace ns2 { int abc; }
2540       void f() { ns1::ab$1^; ns1::ab$2^; }
2541       void f2() { ns2::ab$3^; }
2542   )cpp");
2543   runAddDocument(Server, File, Test.code());
2544   clangd::CodeCompleteOptions Opts = {};
2545 
2546   IndexRequestCollector Requests;
2547   Opts.Index = &Requests;
2548 
2549   auto CompleteAtPoint = [&](StringRef P) {
2550     cantFail(runCodeComplete(Server, File, Test.point(P), Opts));
2551   };
2552 
2553   CompleteAtPoint("1");
2554   auto Reqs1 = Requests.consumeRequests(1);
2555   ASSERT_EQ(Reqs1.size(), 1u);
2556   EXPECT_THAT(Reqs1[0].Scopes, UnorderedElementsAre("ns1::"));
2557 
2558   CompleteAtPoint("2");
2559   auto Reqs2 = Requests.consumeRequests(1);
2560   // Speculation succeeded. Used speculative index result.
2561   ASSERT_EQ(Reqs2.size(), 1u);
2562   EXPECT_EQ(Reqs2[0], Reqs1[0]);
2563 
2564   CompleteAtPoint("3");
2565   // Speculation failed. Sent speculative index request and the new index
2566   // request after sema.
2567   auto Reqs3 = Requests.consumeRequests(2);
2568   ASSERT_EQ(Reqs3.size(), 2u);
2569 }
2570 
2571 TEST(CompletionTest, InsertTheMostPopularHeader) {
2572   std::string DeclFile = URI::create(testPath("foo")).toString();
2573   Symbol Sym = func("Func");
2574   Sym.CanonicalDeclaration.FileURI = DeclFile.c_str();
2575   Sym.IncludeHeaders.emplace_back("\"foo.h\"", 2);
2576   Sym.IncludeHeaders.emplace_back("\"bar.h\"", 1000);
2577 
2578   auto Results = completions("Fun^", {Sym}).Completions;
2579   assert(!Results.empty());
2580   EXPECT_THAT(Results[0], AllOf(Named("Func"), InsertInclude("\"bar.h\"")));
2581   EXPECT_EQ(Results[0].Includes.size(), 2u);
2582 }
2583 
2584 TEST(CompletionTest, NoInsertIncludeIfOnePresent) {
2585   Annotations Test(R"cpp(
2586     #include "foo.h"
2587     Fun^
2588   )cpp");
2589   auto TU = TestTU::withCode(Test.code());
2590   TU.AdditionalFiles["foo.h"] = "";
2591 
2592   std::string DeclFile = URI::create(testPath("foo")).toString();
2593   Symbol Sym = func("Func");
2594   Sym.CanonicalDeclaration.FileURI = DeclFile.c_str();
2595   Sym.IncludeHeaders.emplace_back("\"foo.h\"", 2);
2596   Sym.IncludeHeaders.emplace_back("\"bar.h\"", 1000);
2597 
2598   EXPECT_THAT(completions(TU, Test.point(), {Sym}).Completions,
2599               UnorderedElementsAre(AllOf(Named("Func"), HasInclude("\"foo.h\""),
2600                                          Not(InsertInclude()))));
2601 }
2602 
2603 TEST(CompletionTest, MergeMacrosFromIndexAndSema) {
2604   Symbol Sym;
2605   Sym.Name = "Clangd_Macro_Test";
2606   Sym.ID = SymbolID("c:foo.cpp@8@macro@Clangd_Macro_Test");
2607   Sym.SymInfo.Kind = index::SymbolKind::Macro;
2608   Sym.Flags |= Symbol::IndexedForCodeCompletion;
2609   EXPECT_THAT(completions("#define Clangd_Macro_Test\nClangd_Macro_T^", {Sym})
2610                   .Completions,
2611               UnorderedElementsAre(Named("Clangd_Macro_Test")));
2612 }
2613 
2614 TEST(CompletionTest, MacroFromPreamble) {
2615   Annotations Test(R"cpp(#define CLANGD_PREAMBLE_MAIN x
2616 
2617           int x = 0;
2618           #define CLANGD_MAIN x
2619           void f() { CLANGD_^ }
2620       )cpp");
2621   auto TU = TestTU::withCode(Test.code());
2622   TU.HeaderCode = "#define CLANGD_PREAMBLE_HEADER x";
2623   auto Results = completions(TU, Test.point(), {func("CLANGD_INDEX")});
2624   // We should get results from the main file, including the preamble section.
2625   // However no results from included files (the index should cover them).
2626   EXPECT_THAT(Results.Completions,
2627               UnorderedElementsAre(Named("CLANGD_PREAMBLE_MAIN"),
2628                                    Named("CLANGD_MAIN"),
2629                                    Named("CLANGD_INDEX")));
2630 }
2631 
2632 TEST(CompletionTest, DeprecatedResults) {
2633   std::string Body = R"cpp(
2634     void TestClangd();
2635     void TestClangc() __attribute__((deprecated("", "")));
2636   )cpp";
2637 
2638   EXPECT_THAT(
2639       completions(Body + "int main() { TestClang^ }").Completions,
2640       UnorderedElementsAre(AllOf(Named("TestClangd"), Not(Deprecated())),
2641                            AllOf(Named("TestClangc"), Deprecated())));
2642 }
2643 
2644 TEST(SignatureHelpTest, PartialSpec) {
2645   const auto Results = signatures(R"cpp(
2646       template <typename T> struct Foo {};
2647       template <typename T> struct Foo<T*> { Foo(T); };
2648       Foo<int*> F(^);)cpp");
2649   EXPECT_THAT(Results.signatures, Contains(Sig("Foo([[T]])")));
2650   EXPECT_EQ(0, Results.activeParameter);
2651 }
2652 
2653 TEST(SignatureHelpTest, InsideArgument) {
2654   {
2655     const auto Results = signatures(R"cpp(
2656       void foo(int x);
2657       void foo(int x, int y);
2658       int main() { foo(1+^); }
2659     )cpp");
2660     EXPECT_THAT(Results.signatures,
2661                 ElementsAre(Sig("foo([[int x]]) -> void"),
2662                             Sig("foo([[int x]], [[int y]]) -> void")));
2663     EXPECT_EQ(0, Results.activeParameter);
2664   }
2665   {
2666     const auto Results = signatures(R"cpp(
2667       void foo(int x);
2668       void foo(int x, int y);
2669       int main() { foo(1^); }
2670     )cpp");
2671     EXPECT_THAT(Results.signatures,
2672                 ElementsAre(Sig("foo([[int x]]) -> void"),
2673                             Sig("foo([[int x]], [[int y]]) -> void")));
2674     EXPECT_EQ(0, Results.activeParameter);
2675   }
2676   {
2677     const auto Results = signatures(R"cpp(
2678       void foo(int x);
2679       void foo(int x, int y);
2680       int main() { foo(1^0); }
2681     )cpp");
2682     EXPECT_THAT(Results.signatures,
2683                 ElementsAre(Sig("foo([[int x]]) -> void"),
2684                             Sig("foo([[int x]], [[int y]]) -> void")));
2685     EXPECT_EQ(0, Results.activeParameter);
2686   }
2687   {
2688     const auto Results = signatures(R"cpp(
2689       void foo(int x);
2690       void foo(int x, int y);
2691       int bar(int x, int y);
2692       int main() { bar(foo(2, 3^)); }
2693     )cpp");
2694     EXPECT_THAT(Results.signatures,
2695                 ElementsAre(Sig("foo([[int x]], [[int y]]) -> void")));
2696     EXPECT_EQ(1, Results.activeParameter);
2697   }
2698 }
2699 
2700 TEST(SignatureHelpTest, ConstructorInitializeFields) {
2701   {
2702     const auto Results = signatures(R"cpp(
2703       struct A { A(int); };
2704       struct B {
2705         B() : a_elem(^) {}
2706         A a_elem;
2707       };
2708     )cpp");
2709     EXPECT_THAT(Results.signatures,
2710                 UnorderedElementsAre(Sig("A([[int]])"), Sig("A([[A &&]])"),
2711                                      Sig("A([[const A &]])")));
2712   }
2713   {
2714     const auto Results = signatures(R"cpp(
2715       struct A { A(int); };
2716       struct B {
2717         B() : a_elem(^
2718         A a_elem;
2719       };
2720     )cpp");
2721     // FIXME: currently the parser skips over the decl of a_elem as part of the
2722     // (broken) init list, so we don't get signatures for the first member.
2723     EXPECT_THAT(Results.signatures, IsEmpty());
2724   }
2725   {
2726     const auto Results = signatures(R"cpp(
2727       struct A { A(int); };
2728       struct B {
2729         B() : a_elem(^
2730         int dummy_elem;
2731         A a_elem;
2732       };
2733     )cpp");
2734     EXPECT_THAT(Results.signatures,
2735                 UnorderedElementsAre(Sig("A([[int]])"), Sig("A([[A &&]])"),
2736                                      Sig("A([[const A &]])")));
2737   }
2738   {
2739     const auto Results = signatures(R"cpp(
2740       struct A {
2741         A(int);
2742       };
2743       struct C {
2744         C(int);
2745         C(A);
2746       };
2747       struct B {
2748         B() : c_elem(A(1^)) {}
2749         C c_elem;
2750       };
2751     )cpp");
2752     EXPECT_THAT(Results.signatures,
2753                 UnorderedElementsAre(Sig("A([[int]])"), Sig("A([[A &&]])"),
2754                                      Sig("A([[const A &]])")));
2755   }
2756 }
2757 
2758 TEST(SignatureHelpTest, Variadic) {
2759   const std::string Header = R"cpp(
2760     void fun(int x, ...) {}
2761     void test() {)cpp";
2762   const std::string ExpectedSig = "fun([[int x]], [[...]]) -> void";
2763 
2764   {
2765     const auto Result = signatures(Header + "fun(^);}");
2766     EXPECT_EQ(0, Result.activeParameter);
2767     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2768   }
2769   {
2770     const auto Result = signatures(Header + "fun(1, ^);}");
2771     EXPECT_EQ(1, Result.activeParameter);
2772     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2773   }
2774   {
2775     const auto Result = signatures(Header + "fun(1, 2, ^);}");
2776     EXPECT_EQ(1, Result.activeParameter);
2777     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2778   }
2779 }
2780 
2781 TEST(SignatureHelpTest, VariadicTemplate) {
2782   const std::string Header = R"cpp(
2783     template<typename T, typename ...Args>
2784     void fun(T t, Args ...args) {}
2785     void test() {)cpp";
2786   const std::string ExpectedSig = "fun([[T t]], [[Args args...]]) -> void";
2787 
2788   {
2789     const auto Result = signatures(Header + "fun(^);}");
2790     EXPECT_EQ(0, Result.activeParameter);
2791     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2792   }
2793   {
2794     const auto Result = signatures(Header + "fun(1, ^);}");
2795     EXPECT_EQ(1, Result.activeParameter);
2796     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2797   }
2798   {
2799     const auto Result = signatures(Header + "fun(1, 2, ^);}");
2800     EXPECT_EQ(1, Result.activeParameter);
2801     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2802   }
2803 }
2804 
2805 TEST(SignatureHelpTest, VariadicMethod) {
2806   const std::string Header = R"cpp(
2807   class C {
2808     template<typename T, typename ...Args>
2809     void fun(T t, Args ...args) {}
2810   };
2811     void test() {C c; )cpp";
2812   const std::string ExpectedSig = "fun([[T t]], [[Args args...]]) -> void";
2813 
2814   {
2815     const auto Result = signatures(Header + "c.fun(^);}");
2816     EXPECT_EQ(0, Result.activeParameter);
2817     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2818   }
2819   {
2820     const auto Result = signatures(Header + "c.fun(1, ^);}");
2821     EXPECT_EQ(1, Result.activeParameter);
2822     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2823   }
2824   {
2825     const auto Result = signatures(Header + "c.fun(1, 2, ^);}");
2826     EXPECT_EQ(1, Result.activeParameter);
2827     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2828   }
2829 }
2830 
2831 TEST(SignatureHelpTest, VariadicType) {
2832   const std::string Header = R"cpp(
2833   void fun(int x, ...) {}
2834   auto get_fun() { return fun; }
2835   void test() {
2836   )cpp";
2837   const std::string ExpectedSig = "([[int]], [[...]]) -> void";
2838 
2839   {
2840     const auto Result = signatures(Header + "get_fun()(^);}");
2841     EXPECT_EQ(0, Result.activeParameter);
2842     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2843   }
2844   {
2845     const auto Result = signatures(Header + "get_fun()(1, ^);}");
2846     EXPECT_EQ(1, Result.activeParameter);
2847     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2848   }
2849   {
2850     const auto Result = signatures(Header + "get_fun()(1, 2, ^);}");
2851     EXPECT_EQ(1, Result.activeParameter);
2852     EXPECT_THAT(Result.signatures, UnorderedElementsAre(Sig(ExpectedSig)));
2853   }
2854 }
2855 
2856 TEST(CompletionTest, IncludedCompletionKinds) {
2857   Annotations Test(R"cpp(#include "^)cpp");
2858   auto TU = TestTU::withCode(Test.code());
2859   TU.AdditionalFiles["sub/bar.h"] = "";
2860   TU.ExtraArgs.push_back("-I" + testPath("sub"));
2861 
2862   auto Results = completions(TU, Test.point());
2863   EXPECT_THAT(Results.Completions,
2864               AllOf(Has("sub/", CompletionItemKind::Folder),
2865                     Has("bar.h\"", CompletionItemKind::File)));
2866 }
2867 
2868 TEST(CompletionTest, NoCrashAtNonAlphaIncludeHeader) {
2869   completions(
2870       R"cpp(
2871         #include "./^"
2872       )cpp");
2873 }
2874 
2875 TEST(CompletionTest, NoAllScopesCompletionWhenQualified) {
2876   clangd::CodeCompleteOptions Opts = {};
2877   Opts.AllScopes = true;
2878 
2879   auto Results = completions(
2880       R"cpp(
2881     void f() { na::Clangd^ }
2882   )cpp",
2883       {cls("na::ClangdA"), cls("nx::ClangdX"), cls("Clangd3")}, Opts);
2884   EXPECT_THAT(Results.Completions,
2885               UnorderedElementsAre(
2886                   AllOf(Qualifier(""), Scope("na::"), Named("ClangdA"))));
2887 }
2888 
2889 TEST(CompletionTest, AllScopesCompletion) {
2890   clangd::CodeCompleteOptions Opts = {};
2891   Opts.AllScopes = true;
2892 
2893   auto Results = completions(
2894       R"cpp(
2895     namespace na {
2896     void f() { Clangd^ }
2897     }
2898   )cpp",
2899       {cls("nx::Clangd1"), cls("ny::Clangd2"), cls("Clangd3"),
2900        cls("na::nb::Clangd4")},
2901       Opts);
2902   EXPECT_THAT(
2903       Results.Completions,
2904       UnorderedElementsAre(AllOf(Qualifier("nx::"), Named("Clangd1")),
2905                            AllOf(Qualifier("ny::"), Named("Clangd2")),
2906                            AllOf(Qualifier(""), Scope(""), Named("Clangd3")),
2907                            AllOf(Qualifier("nb::"), Named("Clangd4"))));
2908 }
2909 
2910 TEST(CompletionTest, NoQualifierIfShadowed) {
2911   clangd::CodeCompleteOptions Opts = {};
2912   Opts.AllScopes = true;
2913 
2914   auto Results = completions(R"cpp(
2915     namespace nx { class Clangd1 {}; }
2916     using nx::Clangd1;
2917     void f() { Clangd^ }
2918   )cpp",
2919                              {cls("nx::Clangd1"), cls("nx::Clangd2")}, Opts);
2920   // Although Clangd1 is from another namespace, Sema tells us it's in-scope and
2921   // needs no qualifier.
2922   EXPECT_THAT(Results.Completions,
2923               UnorderedElementsAre(AllOf(Qualifier(""), Named("Clangd1")),
2924                                    AllOf(Qualifier("nx::"), Named("Clangd2"))));
2925 }
2926 
2927 TEST(CompletionTest, NoCompletionsForNewNames) {
2928   clangd::CodeCompleteOptions Opts;
2929   Opts.AllScopes = true;
2930   auto Results = completions(R"cpp(
2931       void f() { int n^ }
2932     )cpp",
2933                              {cls("naber"), cls("nx::naber")}, Opts);
2934   EXPECT_THAT(Results.Completions, UnorderedElementsAre());
2935 }
2936 
2937 TEST(CompletionTest, Lambda) {
2938   clangd::CodeCompleteOptions Opts = {};
2939 
2940   auto Results = completions(R"cpp(
2941     void function() {
2942       auto Lambda = [](int a, const double &b) {return 1.f;};
2943       Lam^
2944     }
2945   )cpp",
2946                              {}, Opts);
2947 
2948   ASSERT_EQ(Results.Completions.size(), 1u);
2949   const auto &A = Results.Completions.front();
2950   EXPECT_EQ(A.Name, "Lambda");
2951   EXPECT_EQ(A.Signature, "(int a, const double &b) const");
2952   EXPECT_EQ(A.Kind, CompletionItemKind::Variable);
2953   EXPECT_EQ(A.ReturnType, "float");
2954   EXPECT_EQ(A.SnippetSuffix, "(${1:int a}, ${2:const double &b})");
2955 }
2956 
2957 TEST(CompletionTest, StructuredBinding) {
2958   clangd::CodeCompleteOptions Opts = {};
2959 
2960   auto Results = completions(R"cpp(
2961     struct S {
2962       using Float = float;
2963       int x;
2964       Float y;
2965     };
2966     void function() {
2967       const auto &[xxx, yyy] = S{};
2968       yyy^
2969     }
2970   )cpp",
2971                              {}, Opts);
2972 
2973   ASSERT_EQ(Results.Completions.size(), 1u);
2974   const auto &A = Results.Completions.front();
2975   EXPECT_EQ(A.Name, "yyy");
2976   EXPECT_EQ(A.Kind, CompletionItemKind::Variable);
2977   EXPECT_EQ(A.ReturnType, "const Float");
2978 }
2979 
2980 TEST(CompletionTest, ObjectiveCMethodNoArguments) {
2981   auto Results = completions(R"objc(
2982       @interface Foo
2983       @property(nonatomic, setter=setXToIgnoreComplete:) int value;
2984       @end
2985       Foo *foo = [Foo new]; int y = [foo v^]
2986     )objc",
2987                              /*IndexSymbols=*/{},
2988                              /*Opts=*/{}, "Foo.m");
2989 
2990   auto C = Results.Completions;
2991   EXPECT_THAT(C, ElementsAre(Named("value")));
2992   EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method)));
2993   EXPECT_THAT(C, ElementsAre(ReturnType("int")));
2994   EXPECT_THAT(C, ElementsAre(Signature("")));
2995   EXPECT_THAT(C, ElementsAre(SnippetSuffix("")));
2996 }
2997 
2998 TEST(CompletionTest, ObjectiveCMethodOneArgument) {
2999   auto Results = completions(R"objc(
3000       @interface Foo
3001       - (int)valueForCharacter:(char)c;
3002       @end
3003       Foo *foo = [Foo new]; int y = [foo v^]
3004     )objc",
3005                              /*IndexSymbols=*/{},
3006                              /*Opts=*/{}, "Foo.m");
3007 
3008   auto C = Results.Completions;
3009   EXPECT_THAT(C, ElementsAre(Named("valueForCharacter:")));
3010   EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method)));
3011   EXPECT_THAT(C, ElementsAre(ReturnType("int")));
3012   EXPECT_THAT(C, ElementsAre(Signature("(char)")));
3013   EXPECT_THAT(C, ElementsAre(SnippetSuffix("${1:(char)}")));
3014 }
3015 
3016 TEST(CompletionTest, ObjectiveCMethodTwoArgumentsFromBeginning) {
3017   auto Results = completions(R"objc(
3018       @interface Foo
3019       + (id)fooWithValue:(int)value fooey:(unsigned int)fooey;
3020       @end
3021       id val = [Foo foo^]
3022     )objc",
3023                              /*IndexSymbols=*/{},
3024                              /*Opts=*/{}, "Foo.m");
3025 
3026   auto C = Results.Completions;
3027   EXPECT_THAT(C, ElementsAre(Named("fooWithValue:")));
3028   EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method)));
3029   EXPECT_THAT(C, ElementsAre(ReturnType("id")));
3030   EXPECT_THAT(C, ElementsAre(Signature("(int) fooey:(unsigned int)")));
3031   EXPECT_THAT(
3032       C, ElementsAre(SnippetSuffix("${1:(int)} fooey:${2:(unsigned int)}")));
3033 }
3034 
3035 TEST(CompletionTest, ObjectiveCMethodTwoArgumentsFromMiddle) {
3036   auto Results = completions(R"objc(
3037       @interface Foo
3038       + (id)fooWithValue:(int)value fooey:(unsigned int)fooey;
3039       @end
3040       id val = [Foo fooWithValue:10 f^]
3041     )objc",
3042                              /*IndexSymbols=*/{},
3043                              /*Opts=*/{}, "Foo.m");
3044 
3045   auto C = Results.Completions;
3046   EXPECT_THAT(C, ElementsAre(Named("fooey:")));
3047   EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method)));
3048   EXPECT_THAT(C, ElementsAre(ReturnType("id")));
3049   EXPECT_THAT(C, ElementsAre(Signature("(unsigned int)")));
3050   EXPECT_THAT(C, ElementsAre(SnippetSuffix("${1:(unsigned int)}")));
3051 }
3052 
3053 TEST(CompletionTest, ObjectiveCSimpleMethodDeclaration) {
3054   auto Results = completions(R"objc(
3055       @interface Foo
3056       - (void)foo;
3057       @end
3058       @implementation Foo
3059       fo^
3060       @end
3061     )objc",
3062                              /*IndexSymbols=*/{},
3063                              /*Opts=*/{}, "Foo.m");
3064 
3065   auto C = Results.Completions;
3066   EXPECT_THAT(C, ElementsAre(Named("foo")));
3067   EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method)));
3068   EXPECT_THAT(C, ElementsAre(Qualifier("- (void)")));
3069 }
3070 
3071 TEST(CompletionTest, ObjectiveCMethodDeclaration) {
3072   auto Results = completions(R"objc(
3073       @interface Foo
3074       - (int)valueForCharacter:(char)c secondArgument:(id)object;
3075       @end
3076       @implementation Foo
3077       valueFor^
3078       @end
3079     )objc",
3080                              /*IndexSymbols=*/{},
3081                              /*Opts=*/{}, "Foo.m");
3082 
3083   auto C = Results.Completions;
3084   EXPECT_THAT(C, ElementsAre(Named("valueForCharacter:")));
3085   EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method)));
3086   EXPECT_THAT(C, ElementsAre(Qualifier("- (int)")));
3087   EXPECT_THAT(C, ElementsAre(Signature("(char)c secondArgument:(id)object")));
3088 }
3089 
3090 TEST(CompletionTest, ObjectiveCMethodDeclarationPrefixTyped) {
3091   auto Results = completions(R"objc(
3092       @interface Foo
3093       - (int)valueForCharacter:(char)c;
3094       @end
3095       @implementation Foo
3096       - (int)valueFor^
3097       @end
3098     )objc",
3099                              /*IndexSymbols=*/{},
3100                              /*Opts=*/{}, "Foo.m");
3101 
3102   auto C = Results.Completions;
3103   EXPECT_THAT(C, ElementsAre(Named("valueForCharacter:")));
3104   EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method)));
3105   EXPECT_THAT(C, ElementsAre(Signature("(char)c")));
3106 }
3107 
3108 TEST(CompletionTest, ObjectiveCMethodDeclarationFromMiddle) {
3109   auto Results = completions(R"objc(
3110       @interface Foo
3111       - (int)valueForCharacter:(char)c secondArgument:(id)object;
3112       @end
3113       @implementation Foo
3114       - (int)valueForCharacter:(char)c second^
3115       @end
3116     )objc",
3117                              /*IndexSymbols=*/{},
3118                              /*Opts=*/{}, "Foo.m");
3119 
3120   auto C = Results.Completions;
3121   EXPECT_THAT(C, ElementsAre(Named("secondArgument:")));
3122   EXPECT_THAT(C, ElementsAre(Kind(CompletionItemKind::Method)));
3123   EXPECT_THAT(C, ElementsAre(Signature("(id)object")));
3124 }
3125 
3126 TEST(CompletionTest, CursorInSnippets) {
3127   clangd::CodeCompleteOptions Options;
3128   Options.EnableSnippets = true;
3129   auto Results = completions(
3130       R"cpp(
3131     void while_foo(int a, int b);
3132     void test() {
3133       whil^
3134     })cpp",
3135       /*IndexSymbols=*/{}, Options);
3136 
3137   // Last placeholder in code patterns should be $0 to put the cursor there.
3138   EXPECT_THAT(Results.Completions,
3139               Contains(AllOf(
3140                   Named("while"),
3141                   SnippetSuffix(" (${1:condition}) {\n${0:statements}\n}"))));
3142   // However, snippets for functions must *not* end with $0.
3143   EXPECT_THAT(Results.Completions,
3144               Contains(AllOf(Named("while_foo"),
3145                              SnippetSuffix("(${1:int a}, ${2:int b})"))));
3146 }
3147 
3148 TEST(CompletionTest, WorksWithNullType) {
3149   auto R = completions(R"cpp(
3150     int main() {
3151       for (auto [loopVar] : y ) { // y has to be unresolved.
3152         int z = loopV^;
3153       }
3154     }
3155   )cpp");
3156   EXPECT_THAT(R.Completions, ElementsAre(Named("loopVar")));
3157 }
3158 
3159 TEST(CompletionTest, UsingDecl) {
3160   const char *Header(R"cpp(
3161     void foo(int);
3162     namespace std {
3163       using ::foo;
3164     })cpp");
3165   const char *Source(R"cpp(
3166     void bar() {
3167       std::^;
3168     })cpp");
3169   auto Index = TestTU::withHeaderCode(Header).index();
3170   clangd::CodeCompleteOptions Opts;
3171   Opts.Index = Index.get();
3172   Opts.AllScopes = true;
3173   auto R = completions(Source, {}, Opts);
3174   EXPECT_THAT(R.Completions,
3175               ElementsAre(AllOf(Scope("std::"), Named("foo"),
3176                                 Kind(CompletionItemKind::Reference))));
3177 }
3178 
3179 TEST(CompletionTest, ScopeIsUnresolved) {
3180   clangd::CodeCompleteOptions Opts = {};
3181   Opts.AllScopes = true;
3182 
3183   auto Results = completions(R"cpp(
3184     namespace a {
3185     void f() { b::X^ }
3186     }
3187   )cpp",
3188                              {cls("a::b::XYZ")}, Opts);
3189   EXPECT_THAT(Results.Completions,
3190               UnorderedElementsAre(AllOf(Qualifier(""), Named("XYZ"))));
3191 }
3192 
3193 TEST(CompletionTest, NestedScopeIsUnresolved) {
3194   clangd::CodeCompleteOptions Opts = {};
3195   Opts.AllScopes = true;
3196 
3197   auto Results = completions(R"cpp(
3198     namespace a {
3199     namespace b {}
3200     void f() { b::c::X^ }
3201     }
3202   )cpp",
3203                              {cls("a::b::c::XYZ")}, Opts);
3204   EXPECT_THAT(Results.Completions,
3205               UnorderedElementsAre(AllOf(Qualifier(""), Named("XYZ"))));
3206 }
3207 
3208 // Clang parser gets confused here and doesn't report the ns:: prefix.
3209 // Naive behavior is to insert it again. We examine the source and recover.
3210 TEST(CompletionTest, NamespaceDoubleInsertion) {
3211   clangd::CodeCompleteOptions Opts = {};
3212 
3213   auto Results = completions(R"cpp(
3214     namespace foo {
3215     namespace ns {}
3216     #define M(X) < X
3217     M(ns::ABC^
3218     }
3219   )cpp",
3220                              {cls("foo::ns::ABCDE")}, Opts);
3221   EXPECT_THAT(Results.Completions,
3222               UnorderedElementsAre(AllOf(Qualifier(""), Named("ABCDE"))));
3223 }
3224 
3225 TEST(CompletionTest, DerivedMethodsAreAlwaysVisible) {
3226   // Despite the fact that base method matches the ref-qualifier better,
3227   // completion results should only include the derived method.
3228   auto Completions = completions(R"cpp(
3229     struct deque_base {
3230       float size();
3231       double size() const;
3232     };
3233     struct deque : deque_base {
3234         int size() const;
3235     };
3236 
3237     auto x = deque().^
3238   )cpp")
3239                          .Completions;
3240   EXPECT_THAT(Completions,
3241               ElementsAre(AllOf(ReturnType("int"), Named("size"))));
3242 }
3243 
3244 TEST(CompletionTest, NoCrashWithIncompleteLambda) {
3245   auto Completions = completions("auto&& x = []{^").Completions;
3246   // The completion of x itself can cause a problem: in the code completion
3247   // callback, its type is not known, which affects the linkage calculation.
3248   // A bad linkage value gets cached, and subsequently updated.
3249   EXPECT_THAT(Completions, Contains(Named("x")));
3250 
3251   auto Signatures = signatures("auto x() { x(^").signatures;
3252   EXPECT_THAT(Signatures, Contains(Sig("x() -> auto")));
3253 }
3254 
3255 TEST(CompletionTest, DelayedTemplateParsing) {
3256   Annotations Test(R"cpp(
3257     int xxx;
3258     template <typename T> int foo() { return xx^; }
3259   )cpp");
3260   auto TU = TestTU::withCode(Test.code());
3261   // Even though delayed-template-parsing is on, we will disable it to provide
3262   // completion in templates.
3263   TU.ExtraArgs.push_back("-fdelayed-template-parsing");
3264 
3265   EXPECT_THAT(completions(TU, Test.point()).Completions,
3266               Contains(Named("xxx")));
3267 }
3268 
3269 TEST(CompletionTest, CompletionRange) {
3270   const char *WithRange = "auto x = [[abc]]^";
3271   auto Completions = completions(WithRange);
3272   EXPECT_EQ(Completions.CompletionRange, Annotations(WithRange).range());
3273   Completions = completionsNoCompile(WithRange);
3274   EXPECT_EQ(Completions.CompletionRange, Annotations(WithRange).range());
3275 
3276   const char *EmptyRange = "auto x = [[]]^";
3277   Completions = completions(EmptyRange);
3278   EXPECT_EQ(Completions.CompletionRange, Annotations(EmptyRange).range());
3279   Completions = completionsNoCompile(EmptyRange);
3280   EXPECT_EQ(Completions.CompletionRange, Annotations(EmptyRange).range());
3281 
3282   // Sema doesn't trigger at all here, while the no-sema completion runs
3283   // heuristics as normal and reports a range. It'd be nice to be consistent.
3284   const char *NoCompletion = "/* foo [[]]^ */";
3285   Completions = completions(NoCompletion);
3286   EXPECT_EQ(Completions.CompletionRange, llvm::None);
3287   Completions = completionsNoCompile(NoCompletion);
3288   EXPECT_EQ(Completions.CompletionRange, Annotations(NoCompletion).range());
3289 }
3290 
3291 TEST(NoCompileCompletionTest, Basic) {
3292   auto Results = completionsNoCompile(R"cpp(
3293     void func() {
3294       int xyz;
3295       int abc;
3296       ^
3297     }
3298   )cpp");
3299   EXPECT_FALSE(Results.RanParser);
3300   EXPECT_THAT(Results.Completions,
3301               UnorderedElementsAre(Named("void"), Named("func"), Named("int"),
3302                                    Named("xyz"), Named("abc")));
3303 }
3304 
3305 TEST(NoCompileCompletionTest, WithFilter) {
3306   auto Results = completionsNoCompile(R"cpp(
3307     void func() {
3308       int sym1;
3309       int sym2;
3310       int xyz1;
3311       int xyz2;
3312       sy^
3313     }
3314   )cpp");
3315   EXPECT_THAT(Results.Completions,
3316               UnorderedElementsAre(Named("sym1"), Named("sym2")));
3317 }
3318 
3319 TEST(NoCompileCompletionTest, WithIndex) {
3320   std::vector<Symbol> Syms = {func("xxx"), func("a::xxx"), func("ns::b::xxx"),
3321                               func("c::xxx"), func("ns::d::xxx")};
3322   auto Results = completionsNoCompile(
3323       R"cpp(
3324         // Current-scopes, unqualified completion.
3325         using namespace a;
3326         namespace ns {
3327         using namespace b;
3328         void foo() {
3329         xx^
3330         }
3331         }
3332       )cpp",
3333       Syms);
3334   EXPECT_THAT(Results.Completions,
3335               UnorderedElementsAre(AllOf(Qualifier(""), Scope("")),
3336                                    AllOf(Qualifier(""), Scope("a::")),
3337                                    AllOf(Qualifier(""), Scope("ns::b::"))));
3338   CodeCompleteOptions Opts;
3339   Opts.AllScopes = true;
3340   Results = completionsNoCompile(
3341       R"cpp(
3342         // All-scopes unqualified completion.
3343         using namespace a;
3344         namespace ns {
3345         using namespace b;
3346         void foo() {
3347         xx^
3348         }
3349         }
3350       )cpp",
3351       Syms, Opts);
3352   EXPECT_THAT(Results.Completions,
3353               UnorderedElementsAre(AllOf(Qualifier(""), Scope("")),
3354                                    AllOf(Qualifier(""), Scope("a::")),
3355                                    AllOf(Qualifier(""), Scope("ns::b::")),
3356                                    AllOf(Qualifier("c::"), Scope("c::")),
3357                                    AllOf(Qualifier("d::"), Scope("ns::d::"))));
3358   Results = completionsNoCompile(
3359       R"cpp(
3360         // Qualified completion.
3361         using namespace a;
3362         namespace ns {
3363         using namespace b;
3364         void foo() {
3365         b::xx^
3366         }
3367         }
3368       )cpp",
3369       Syms, Opts);
3370   EXPECT_THAT(Results.Completions,
3371               ElementsAre(AllOf(Qualifier(""), Scope("ns::b::"))));
3372   Results = completionsNoCompile(
3373       R"cpp(
3374         // Absolutely qualified completion.
3375         using namespace a;
3376         namespace ns {
3377         using namespace b;
3378         void foo() {
3379         ::a::xx^
3380         }
3381         }
3382       )cpp",
3383       Syms, Opts);
3384   EXPECT_THAT(Results.Completions,
3385               ElementsAre(AllOf(Qualifier(""), Scope("a::"))));
3386 }
3387 
3388 TEST(AllowImplicitCompletion, All) {
3389   const char *Yes[] = {
3390       "foo.^bar",
3391       "foo->^bar",
3392       "foo::^bar",
3393       "  #  include <^foo.h>",
3394       "#import <foo/^bar.h>",
3395       "#include_next \"^",
3396   };
3397   const char *No[] = {
3398       "foo>^bar",
3399       "foo:^bar",
3400       "foo\n^bar",
3401       "#include <foo.h> //^",
3402       "#include \"foo.h\"^",
3403       "#error <^",
3404       "#<^",
3405   };
3406   for (const char *Test : Yes) {
3407     llvm::Annotations A(Test);
3408     EXPECT_TRUE(allowImplicitCompletion(A.code(), A.point())) << Test;
3409   }
3410   for (const char *Test : No) {
3411     llvm::Annotations A(Test);
3412     EXPECT_FALSE(allowImplicitCompletion(A.code(), A.point())) << Test;
3413   }
3414 }
3415 
3416 TEST(CompletionTest, FunctionArgsExist) {
3417   clangd::CodeCompleteOptions Opts;
3418   Opts.EnableSnippets = true;
3419   std::string Context = R"cpp(
3420     #define MACRO(x)
3421     int foo(int A);
3422     int bar();
3423     struct Object {
3424       Object(int B) {}
3425     };
3426     template <typename T>
3427     struct Container {
3428       Container(int Size) {}
3429     };
3430   )cpp";
3431   EXPECT_THAT(completions(Context + "int y = fo^", {}, Opts).Completions,
3432               UnorderedElementsAre(
3433                   AllOf(Labeled("foo(int A)"), SnippetSuffix("(${1:int A})"))));
3434   EXPECT_THAT(
3435       completions(Context + "int y = fo^(42)", {}, Opts).Completions,
3436       UnorderedElementsAre(AllOf(Labeled("foo(int A)"), SnippetSuffix(""))));
3437   // FIXME(kirillbobyrev): No snippet should be produced here.
3438   EXPECT_THAT(completions(Context + "int y = fo^o(42)", {}, Opts).Completions,
3439               UnorderedElementsAre(
3440                   AllOf(Labeled("foo(int A)"), SnippetSuffix("(${1:int A})"))));
3441   EXPECT_THAT(
3442       completions(Context + "int y = ba^", {}, Opts).Completions,
3443       UnorderedElementsAre(AllOf(Labeled("bar()"), SnippetSuffix("()"))));
3444   EXPECT_THAT(completions(Context + "int y = ba^()", {}, Opts).Completions,
3445               UnorderedElementsAre(AllOf(Labeled("bar()"), SnippetSuffix(""))));
3446   EXPECT_THAT(
3447       completions(Context + "Object o = Obj^", {}, Opts).Completions,
3448       Contains(AllOf(Labeled("Object(int B)"), SnippetSuffix("(${1:int B})"),
3449                      Kind(CompletionItemKind::Constructor))));
3450   EXPECT_THAT(completions(Context + "Object o = Obj^()", {}, Opts).Completions,
3451               Contains(AllOf(Labeled("Object(int B)"), SnippetSuffix(""),
3452                              Kind(CompletionItemKind::Constructor))));
3453   EXPECT_THAT(
3454       completions(Context + "Container c = Cont^", {}, Opts).Completions,
3455       Contains(AllOf(Labeled("Container<typename T>(int Size)"),
3456                      SnippetSuffix("<${1:typename T}>(${2:int Size})"),
3457                      Kind(CompletionItemKind::Constructor))));
3458   EXPECT_THAT(
3459       completions(Context + "Container c = Cont^()", {}, Opts).Completions,
3460       Contains(AllOf(Labeled("Container<typename T>(int Size)"),
3461                      SnippetSuffix("<${1:typename T}>"),
3462                      Kind(CompletionItemKind::Constructor))));
3463   EXPECT_THAT(
3464       completions(Context + "Container c = Cont^<int>()", {}, Opts).Completions,
3465       Contains(AllOf(Labeled("Container<typename T>(int Size)"),
3466                      SnippetSuffix(""),
3467                      Kind(CompletionItemKind::Constructor))));
3468   EXPECT_THAT(completions(Context + "MAC^(2)", {}, Opts).Completions,
3469               Contains(AllOf(Labeled("MACRO(x)"), SnippetSuffix(""),
3470                              Kind(CompletionItemKind::Text))));
3471 }
3472 
3473 TEST(CompletionTest, NoCrashDueToMacroOrdering) {
3474   EXPECT_THAT(completions(R"cpp(
3475     #define ECHO(X) X
3476     #define ECHO2(X) ECHO(X)
3477     int finish_preamble = EC^HO(2);)cpp")
3478                   .Completions,
3479               UnorderedElementsAre(Labeled("ECHO(X)"), Labeled("ECHO2(X)")));
3480 }
3481 
3482 TEST(CompletionTest, ObjCCategoryDecls) {
3483   TestTU TU;
3484   TU.ExtraArgs.push_back("-xobjective-c");
3485   TU.HeaderCode = R"objc(
3486   @interface Foo
3487   @end
3488 
3489   @interface Foo (FooExt1)
3490   @end
3491 
3492   @interface Foo (FooExt2)
3493   @end
3494 
3495   @interface Bar
3496   @end
3497 
3498   @interface Bar (BarExt)
3499   @end)objc";
3500 
3501   {
3502     Annotations Test(R"objc(
3503   @implementation Foo (^)
3504   @end
3505   )objc");
3506     TU.Code = Test.code().str();
3507     auto Results = completions(TU, Test.point());
3508     EXPECT_THAT(Results.Completions,
3509                 UnorderedElementsAre(Labeled("FooExt1"), Labeled("FooExt2")));
3510   }
3511   {
3512     Annotations Test(R"objc(
3513   @interface Foo (^)
3514   @end
3515   )objc");
3516     TU.Code = Test.code().str();
3517     auto Results = completions(TU, Test.point());
3518     EXPECT_THAT(Results.Completions, UnorderedElementsAre(Labeled("BarExt")));
3519   }
3520 }
3521 
3522 TEST(CompletionTest, PreambleCodeComplete) {
3523   llvm::StringLiteral Baseline = "\n#define MACRO 12\nint num = MACRO;";
3524   llvm::StringLiteral ModifiedCC =
3525       "#include \"header.h\"\n#define MACRO 12\nint num = MACRO; int num2 = M^";
3526 
3527   Annotations Test(ModifiedCC);
3528   auto BaselineTU = TestTU::withCode(Baseline);
3529   auto ModifiedTU = TestTU::withCode(Test.code());
3530 
3531   MockFS FS;
3532   auto Inputs = ModifiedTU.inputs(FS);
3533   auto Result = codeComplete(testPath(ModifiedTU.Filename), Test.point(),
3534                              BaselineTU.preamble().get(), Inputs, {});
3535   EXPECT_THAT(Result.Completions, Not(testing::IsEmpty()));
3536 }
3537 
3538 TEST(CompletionTest, CommentParamName) {
3539   clangd::CodeCompleteOptions Opts;
3540   const std::string Code = R"cpp(
3541     void fun(int foo, int bar);
3542     void overloaded(int param_int);
3543     void overloaded(int param_int, int param_other);
3544     void overloaded(char param_char);
3545     int main() {
3546   )cpp";
3547 
3548   EXPECT_THAT(completions(Code + "fun(/*^", {}, Opts).Completions,
3549               UnorderedElementsAre(Labeled("foo=")));
3550   EXPECT_THAT(completions(Code + "fun(1, /*^", {}, Opts).Completions,
3551               UnorderedElementsAre(Labeled("bar=")));
3552   EXPECT_THAT(completions(Code + "/*^", {}, Opts).Completions, IsEmpty());
3553   // Test de-duplication.
3554   EXPECT_THAT(
3555       completions(Code + "overloaded(/*^", {}, Opts).Completions,
3556       UnorderedElementsAre(Labeled("param_int="), Labeled("param_char=")));
3557   // Comment already has some text in it.
3558   EXPECT_THAT(completions(Code + "fun(/*  ^", {}, Opts).Completions,
3559               UnorderedElementsAre(Labeled("foo=")));
3560   EXPECT_THAT(completions(Code + "fun(/* f^", {}, Opts).Completions,
3561               UnorderedElementsAre(Labeled("foo=")));
3562   EXPECT_THAT(completions(Code + "fun(/* x^", {}, Opts).Completions, IsEmpty());
3563   EXPECT_THAT(completions(Code + "fun(/* f ^", {}, Opts).Completions,
3564               IsEmpty());
3565 }
3566 
3567 TEST(SignatureHelp, DocFormat) {
3568   Annotations Code(R"cpp(
3569     // Comment `with` markup.
3570     void foo(int);
3571     void bar() { foo(^); }
3572   )cpp");
3573   for (auto DocumentationFormat :
3574        {MarkupKind::PlainText, MarkupKind::Markdown}) {
3575     auto Sigs = signatures(Code.code(), Code.point(), /*IndexSymbols=*/{},
3576                            DocumentationFormat);
3577     ASSERT_EQ(Sigs.signatures.size(), 1U);
3578     EXPECT_EQ(Sigs.signatures[0].documentation.kind, DocumentationFormat);
3579   }
3580 }
3581 
3582 TEST(SignatureHelp, TemplateArguments) {
3583   std::string Top = R"cpp(
3584     template <typename T, int> bool foo(char);
3585     template <int I, int> bool foo(float);
3586   )cpp";
3587 
3588   auto First = signatures(Top + "bool x = foo<^");
3589   EXPECT_THAT(
3590       First.signatures,
3591       UnorderedElementsAre(Sig("foo<[[typename T]], [[int]]>() -> bool"),
3592                            Sig("foo<[[int I]], [[int]]>() -> bool")));
3593   EXPECT_EQ(First.activeParameter, 0);
3594 
3595   auto Second = signatures(Top + "bool x = foo<1, ^");
3596   EXPECT_THAT(Second.signatures,
3597               ElementsAre(Sig("foo<[[int I]], [[int]]>() -> bool")));
3598   EXPECT_EQ(Second.activeParameter, 1);
3599 }
3600 
3601 } // namespace
3602 } // namespace clangd
3603 } // namespace clang
3604