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