xref: /freebsd/contrib/llvm-project/clang/lib/Sema/SemaCodeComplete.cpp (revision 770cf0a5f02dc8983a89c6568d741fbc25baa999)
1 //===---------------- SemaCodeComplete.cpp - Code Completion ----*- 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 //  This file defines the code-completion semantic actions.
10 //
11 //===----------------------------------------------------------------------===//
12 #include "clang/AST/ASTConcept.h"
13 #include "clang/AST/Decl.h"
14 #include "clang/AST/DeclBase.h"
15 #include "clang/AST/DeclCXX.h"
16 #include "clang/AST/DeclObjC.h"
17 #include "clang/AST/DeclTemplate.h"
18 #include "clang/AST/DynamicRecursiveASTVisitor.h"
19 #include "clang/AST/Expr.h"
20 #include "clang/AST/ExprCXX.h"
21 #include "clang/AST/ExprConcepts.h"
22 #include "clang/AST/ExprObjC.h"
23 #include "clang/AST/NestedNameSpecifier.h"
24 #include "clang/AST/OperationKinds.h"
25 #include "clang/AST/QualTypeNames.h"
26 #include "clang/AST/Type.h"
27 #include "clang/Basic/AttributeCommonInfo.h"
28 #include "clang/Basic/CharInfo.h"
29 #include "clang/Basic/ExceptionSpecificationType.h"
30 #include "clang/Basic/OperatorKinds.h"
31 #include "clang/Basic/Specifiers.h"
32 #include "clang/Lex/HeaderSearch.h"
33 #include "clang/Lex/MacroInfo.h"
34 #include "clang/Lex/Preprocessor.h"
35 #include "clang/Sema/CodeCompleteConsumer.h"
36 #include "clang/Sema/DeclSpec.h"
37 #include "clang/Sema/Designator.h"
38 #include "clang/Sema/HeuristicResolver.h"
39 #include "clang/Sema/Lookup.h"
40 #include "clang/Sema/Overload.h"
41 #include "clang/Sema/ParsedAttr.h"
42 #include "clang/Sema/ParsedTemplate.h"
43 #include "clang/Sema/Scope.h"
44 #include "clang/Sema/ScopeInfo.h"
45 #include "clang/Sema/Sema.h"
46 #include "clang/Sema/SemaCodeCompletion.h"
47 #include "clang/Sema/SemaObjC.h"
48 #include "llvm/ADT/ArrayRef.h"
49 #include "llvm/ADT/DenseSet.h"
50 #include "llvm/ADT/SmallBitVector.h"
51 #include "llvm/ADT/SmallPtrSet.h"
52 #include "llvm/ADT/SmallString.h"
53 #include "llvm/ADT/StringSwitch.h"
54 #include "llvm/ADT/Twine.h"
55 #include "llvm/ADT/iterator_range.h"
56 #include "llvm/Support/Casting.h"
57 #include "llvm/Support/Path.h"
58 #include "llvm/Support/raw_ostream.h"
59 
60 #include <list>
61 #include <map>
62 #include <optional>
63 #include <string>
64 #include <vector>
65 
66 using namespace clang;
67 using namespace sema;
68 
69 namespace {
70 /// A container of code-completion results.
71 class ResultBuilder {
72 public:
73   /// The type of a name-lookup filter, which can be provided to the
74   /// name-lookup routines to specify which declarations should be included in
75   /// the result set (when it returns true) and which declarations should be
76   /// filtered out (returns false).
77   typedef bool (ResultBuilder::*LookupFilter)(const NamedDecl *) const;
78 
79   typedef CodeCompletionResult Result;
80 
81 private:
82   /// The actual results we have found.
83   std::vector<Result> Results;
84 
85   /// A record of all of the declarations we have found and placed
86   /// into the result set, used to ensure that no declaration ever gets into
87   /// the result set twice.
88   llvm::SmallPtrSet<const Decl *, 16> AllDeclsFound;
89 
90   typedef std::pair<const NamedDecl *, unsigned> DeclIndexPair;
91 
92   /// An entry in the shadow map, which is optimized to store
93   /// a single (declaration, index) mapping (the common case) but
94   /// can also store a list of (declaration, index) mappings.
95   class ShadowMapEntry {
96     typedef SmallVector<DeclIndexPair, 4> DeclIndexPairVector;
97 
98     /// Contains either the solitary NamedDecl * or a vector
99     /// of (declaration, index) pairs.
100     llvm::PointerUnion<const NamedDecl *, DeclIndexPairVector *> DeclOrVector;
101 
102     /// When the entry contains a single declaration, this is
103     /// the index associated with that entry.
104     unsigned SingleDeclIndex = 0;
105 
106   public:
107     ShadowMapEntry() = default;
108     ShadowMapEntry(const ShadowMapEntry &) = delete;
109     ShadowMapEntry(ShadowMapEntry &&Move) { *this = std::move(Move); }
110     ShadowMapEntry &operator=(const ShadowMapEntry &) = delete;
111     ShadowMapEntry &operator=(ShadowMapEntry &&Move) {
112       SingleDeclIndex = Move.SingleDeclIndex;
113       DeclOrVector = Move.DeclOrVector;
114       Move.DeclOrVector = nullptr;
115       return *this;
116     }
117 
118     void Add(const NamedDecl *ND, unsigned Index) {
119       if (DeclOrVector.isNull()) {
120         // 0 - > 1 elements: just set the single element information.
121         DeclOrVector = ND;
122         SingleDeclIndex = Index;
123         return;
124       }
125 
126       if (const NamedDecl *PrevND = dyn_cast<const NamedDecl *>(DeclOrVector)) {
127         // 1 -> 2 elements: create the vector of results and push in the
128         // existing declaration.
129         DeclIndexPairVector *Vec = new DeclIndexPairVector;
130         Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex));
131         DeclOrVector = Vec;
132       }
133 
134       // Add the new element to the end of the vector.
135       cast<DeclIndexPairVector *>(DeclOrVector)
136           ->push_back(DeclIndexPair(ND, Index));
137     }
138 
139     ~ShadowMapEntry() {
140       if (DeclIndexPairVector *Vec =
141               dyn_cast_if_present<DeclIndexPairVector *>(DeclOrVector)) {
142         delete Vec;
143         DeclOrVector = ((NamedDecl *)nullptr);
144       }
145     }
146 
147     // Iteration.
148     class iterator;
149     iterator begin() const;
150     iterator end() const;
151   };
152 
153   /// A mapping from declaration names to the declarations that have
154   /// this name within a particular scope and their index within the list of
155   /// results.
156   typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap;
157 
158   /// The semantic analysis object for which results are being
159   /// produced.
160   Sema &SemaRef;
161 
162   /// The allocator used to allocate new code-completion strings.
163   CodeCompletionAllocator &Allocator;
164 
165   CodeCompletionTUInfo &CCTUInfo;
166 
167   /// If non-NULL, a filter function used to remove any code-completion
168   /// results that are not desirable.
169   LookupFilter Filter;
170 
171   /// Whether we should allow declarations as
172   /// nested-name-specifiers that would otherwise be filtered out.
173   bool AllowNestedNameSpecifiers;
174 
175   /// If set, the type that we would prefer our resulting value
176   /// declarations to have.
177   ///
178   /// Closely matching the preferred type gives a boost to a result's
179   /// priority.
180   CanQualType PreferredType;
181 
182   /// A list of shadow maps, which is used to model name hiding at
183   /// different levels of, e.g., the inheritance hierarchy.
184   std::list<ShadowMap> ShadowMaps;
185 
186   /// Overloaded C++ member functions found by SemaLookup.
187   /// Used to determine when one overload is dominated by another.
188   llvm::DenseMap<std::pair<DeclContext *, /*Name*/uintptr_t>, ShadowMapEntry>
189       OverloadMap;
190 
191   /// If we're potentially referring to a C++ member function, the set
192   /// of qualifiers applied to the object type.
193   Qualifiers ObjectTypeQualifiers;
194   /// The kind of the object expression, for rvalue/lvalue overloads.
195   ExprValueKind ObjectKind;
196 
197   /// Whether the \p ObjectTypeQualifiers field is active.
198   bool HasObjectTypeQualifiers;
199 
200   /// The selector that we prefer.
201   Selector PreferredSelector;
202 
203   /// The completion context in which we are gathering results.
204   CodeCompletionContext CompletionContext;
205 
206   /// If we are in an instance method definition, the \@implementation
207   /// object.
208   ObjCImplementationDecl *ObjCImplementation;
209 
210   void AdjustResultPriorityForDecl(Result &R);
211 
212   void MaybeAddConstructorResults(Result R);
213 
214 public:
215   explicit ResultBuilder(Sema &SemaRef, CodeCompletionAllocator &Allocator,
216                          CodeCompletionTUInfo &CCTUInfo,
217                          const CodeCompletionContext &CompletionContext,
218                          LookupFilter Filter = nullptr)
219       : SemaRef(SemaRef), Allocator(Allocator), CCTUInfo(CCTUInfo),
220         Filter(Filter), AllowNestedNameSpecifiers(false),
221         HasObjectTypeQualifiers(false), CompletionContext(CompletionContext),
222         ObjCImplementation(nullptr) {
223     // If this is an Objective-C instance method definition, dig out the
224     // corresponding implementation.
225     switch (CompletionContext.getKind()) {
226     case CodeCompletionContext::CCC_Expression:
227     case CodeCompletionContext::CCC_ObjCMessageReceiver:
228     case CodeCompletionContext::CCC_ParenthesizedExpression:
229     case CodeCompletionContext::CCC_Statement:
230     case CodeCompletionContext::CCC_TopLevelOrExpression:
231     case CodeCompletionContext::CCC_Recovery:
232       if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl())
233         if (Method->isInstanceMethod())
234           if (ObjCInterfaceDecl *Interface = Method->getClassInterface())
235             ObjCImplementation = Interface->getImplementation();
236       break;
237 
238     default:
239       break;
240     }
241   }
242 
243   /// Determine the priority for a reference to the given declaration.
244   unsigned getBasePriority(const NamedDecl *D);
245 
246   /// Whether we should include code patterns in the completion
247   /// results.
248   bool includeCodePatterns() const {
249     return SemaRef.CodeCompletion().CodeCompleter &&
250            SemaRef.CodeCompletion().CodeCompleter->includeCodePatterns();
251   }
252 
253   /// Set the filter used for code-completion results.
254   void setFilter(LookupFilter Filter) { this->Filter = Filter; }
255 
256   Result *data() { return Results.empty() ? nullptr : &Results.front(); }
257   unsigned size() const { return Results.size(); }
258   bool empty() const { return Results.empty(); }
259 
260   /// Specify the preferred type.
261   void setPreferredType(QualType T) {
262     PreferredType = SemaRef.Context.getCanonicalType(T);
263   }
264 
265   /// Set the cv-qualifiers on the object type, for us in filtering
266   /// calls to member functions.
267   ///
268   /// When there are qualifiers in this set, they will be used to filter
269   /// out member functions that aren't available (because there will be a
270   /// cv-qualifier mismatch) or prefer functions with an exact qualifier
271   /// match.
272   void setObjectTypeQualifiers(Qualifiers Quals, ExprValueKind Kind) {
273     ObjectTypeQualifiers = Quals;
274     ObjectKind = Kind;
275     HasObjectTypeQualifiers = true;
276   }
277 
278   /// Set the preferred selector.
279   ///
280   /// When an Objective-C method declaration result is added, and that
281   /// method's selector matches this preferred selector, we give that method
282   /// a slight priority boost.
283   void setPreferredSelector(Selector Sel) { PreferredSelector = Sel; }
284 
285   /// Retrieve the code-completion context for which results are
286   /// being collected.
287   const CodeCompletionContext &getCompletionContext() const {
288     return CompletionContext;
289   }
290 
291   /// Specify whether nested-name-specifiers are allowed.
292   void allowNestedNameSpecifiers(bool Allow = true) {
293     AllowNestedNameSpecifiers = Allow;
294   }
295 
296   /// Return the semantic analysis object for which we are collecting
297   /// code completion results.
298   Sema &getSema() const { return SemaRef; }
299 
300   /// Retrieve the allocator used to allocate code completion strings.
301   CodeCompletionAllocator &getAllocator() const { return Allocator; }
302 
303   CodeCompletionTUInfo &getCodeCompletionTUInfo() const { return CCTUInfo; }
304 
305   /// Determine whether the given declaration is at all interesting
306   /// as a code-completion result.
307   ///
308   /// \param ND the declaration that we are inspecting.
309   ///
310   /// \param AsNestedNameSpecifier will be set true if this declaration is
311   /// only interesting when it is a nested-name-specifier.
312   bool isInterestingDecl(const NamedDecl *ND,
313                          bool &AsNestedNameSpecifier) const;
314 
315   /// Decide whether or not a use of function Decl can be a call.
316   ///
317   /// \param ND the function declaration.
318   ///
319   /// \param BaseExprType the object type in a member access expression,
320   /// if any.
321   bool canFunctionBeCalled(const NamedDecl *ND, QualType BaseExprType) const;
322 
323   /// Decide whether or not a use of member function Decl can be a call.
324   ///
325   /// \param Method the function declaration.
326   ///
327   /// \param BaseExprType the object type in a member access expression,
328   /// if any.
329   bool canCxxMethodBeCalled(const CXXMethodDecl *Method,
330                             QualType BaseExprType) const;
331 
332   /// Check whether the result is hidden by the Hiding declaration.
333   ///
334   /// \returns true if the result is hidden and cannot be found, false if
335   /// the hidden result could still be found. When false, \p R may be
336   /// modified to describe how the result can be found (e.g., via extra
337   /// qualification).
338   bool CheckHiddenResult(Result &R, DeclContext *CurContext,
339                          const NamedDecl *Hiding);
340 
341   /// Add a new result to this result set (if it isn't already in one
342   /// of the shadow maps), or replace an existing result (for, e.g., a
343   /// redeclaration).
344   ///
345   /// \param R the result to add (if it is unique).
346   ///
347   /// \param CurContext the context in which this result will be named.
348   void MaybeAddResult(Result R, DeclContext *CurContext = nullptr);
349 
350   /// Add a new result to this result set, where we already know
351   /// the hiding declaration (if any).
352   ///
353   /// \param R the result to add (if it is unique).
354   ///
355   /// \param CurContext the context in which this result will be named.
356   ///
357   /// \param Hiding the declaration that hides the result.
358   ///
359   /// \param InBaseClass whether the result was found in a base
360   /// class of the searched context.
361   ///
362   /// \param BaseExprType the type of expression that precedes the "." or "->"
363   /// in a member access expression.
364   void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding,
365                  bool InBaseClass, QualType BaseExprType);
366 
367   /// Add a new non-declaration result to this result set.
368   void AddResult(Result R);
369 
370   /// Enter into a new scope.
371   void EnterNewScope();
372 
373   /// Exit from the current scope.
374   void ExitScope();
375 
376   /// Ignore this declaration, if it is seen again.
377   void Ignore(const Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); }
378 
379   /// Add a visited context.
380   void addVisitedContext(DeclContext *Ctx) {
381     CompletionContext.addVisitedContext(Ctx);
382   }
383 
384   /// \name Name lookup predicates
385   ///
386   /// These predicates can be passed to the name lookup functions to filter the
387   /// results of name lookup. All of the predicates have the same type, so that
388   ///
389   //@{
390   bool IsOrdinaryName(const NamedDecl *ND) const;
391   bool IsOrdinaryNonTypeName(const NamedDecl *ND) const;
392   bool IsIntegralConstantValue(const NamedDecl *ND) const;
393   bool IsOrdinaryNonValueName(const NamedDecl *ND) const;
394   bool IsNestedNameSpecifier(const NamedDecl *ND) const;
395   bool IsEnum(const NamedDecl *ND) const;
396   bool IsClassOrStruct(const NamedDecl *ND) const;
397   bool IsUnion(const NamedDecl *ND) const;
398   bool IsNamespace(const NamedDecl *ND) const;
399   bool IsNamespaceOrAlias(const NamedDecl *ND) const;
400   bool IsType(const NamedDecl *ND) const;
401   bool IsMember(const NamedDecl *ND) const;
402   bool IsObjCIvar(const NamedDecl *ND) const;
403   bool IsObjCMessageReceiver(const NamedDecl *ND) const;
404   bool IsObjCMessageReceiverOrLambdaCapture(const NamedDecl *ND) const;
405   bool IsObjCCollection(const NamedDecl *ND) const;
406   bool IsImpossibleToSatisfy(const NamedDecl *ND) const;
407   //@}
408 };
409 } // namespace
410 
411 void PreferredTypeBuilder::enterReturn(Sema &S, SourceLocation Tok) {
412   if (!Enabled)
413     return;
414   if (isa<BlockDecl>(S.CurContext)) {
415     if (sema::BlockScopeInfo *BSI = S.getCurBlock()) {
416       ComputeType = nullptr;
417       Type = BSI->ReturnType;
418       ExpectedLoc = Tok;
419     }
420   } else if (const auto *Function = dyn_cast<FunctionDecl>(S.CurContext)) {
421     ComputeType = nullptr;
422     Type = Function->getReturnType();
423     ExpectedLoc = Tok;
424   } else if (const auto *Method = dyn_cast<ObjCMethodDecl>(S.CurContext)) {
425     ComputeType = nullptr;
426     Type = Method->getReturnType();
427     ExpectedLoc = Tok;
428   }
429 }
430 
431 void PreferredTypeBuilder::enterVariableInit(SourceLocation Tok, Decl *D) {
432   if (!Enabled)
433     return;
434   auto *VD = llvm::dyn_cast_or_null<ValueDecl>(D);
435   ComputeType = nullptr;
436   Type = VD ? VD->getType() : QualType();
437   ExpectedLoc = Tok;
438 }
439 
440 static QualType getDesignatedType(QualType BaseType, const Designation &Desig,
441                                   HeuristicResolver &Resolver);
442 
443 void PreferredTypeBuilder::enterDesignatedInitializer(SourceLocation Tok,
444                                                       QualType BaseType,
445                                                       const Designation &D) {
446   if (!Enabled)
447     return;
448   ComputeType = nullptr;
449   HeuristicResolver Resolver(*Ctx);
450   Type = getDesignatedType(BaseType, D, Resolver);
451   ExpectedLoc = Tok;
452 }
453 
454 void PreferredTypeBuilder::enterFunctionArgument(
455     SourceLocation Tok, llvm::function_ref<QualType()> ComputeType) {
456   if (!Enabled)
457     return;
458   this->ComputeType = ComputeType;
459   Type = QualType();
460   ExpectedLoc = Tok;
461 }
462 
463 void PreferredTypeBuilder::enterParenExpr(SourceLocation Tok,
464                                           SourceLocation LParLoc) {
465   if (!Enabled)
466     return;
467   // expected type for parenthesized expression does not change.
468   if (ExpectedLoc == LParLoc)
469     ExpectedLoc = Tok;
470 }
471 
472 static QualType getPreferredTypeOfBinaryRHS(Sema &S, Expr *LHS,
473                                             tok::TokenKind Op) {
474   if (!LHS)
475     return QualType();
476 
477   QualType LHSType = LHS->getType();
478   if (LHSType->isPointerType()) {
479     if (Op == tok::plus || Op == tok::plusequal || Op == tok::minusequal)
480       return S.getASTContext().getPointerDiffType();
481     // Pointer difference is more common than subtracting an int from a pointer.
482     if (Op == tok::minus)
483       return LHSType;
484   }
485 
486   switch (Op) {
487   // No way to infer the type of RHS from LHS.
488   case tok::comma:
489     return QualType();
490   // Prefer the type of the left operand for all of these.
491   // Arithmetic operations.
492   case tok::plus:
493   case tok::plusequal:
494   case tok::minus:
495   case tok::minusequal:
496   case tok::percent:
497   case tok::percentequal:
498   case tok::slash:
499   case tok::slashequal:
500   case tok::star:
501   case tok::starequal:
502   // Assignment.
503   case tok::equal:
504   // Comparison operators.
505   case tok::equalequal:
506   case tok::exclaimequal:
507   case tok::less:
508   case tok::lessequal:
509   case tok::greater:
510   case tok::greaterequal:
511   case tok::spaceship:
512     return LHS->getType();
513   // Binary shifts are often overloaded, so don't try to guess those.
514   case tok::greatergreater:
515   case tok::greatergreaterequal:
516   case tok::lessless:
517   case tok::lesslessequal:
518     if (LHSType->isIntegralOrEnumerationType())
519       return S.getASTContext().IntTy;
520     return QualType();
521   // Logical operators, assume we want bool.
522   case tok::ampamp:
523   case tok::pipepipe:
524     return S.getASTContext().BoolTy;
525   // Operators often used for bit manipulation are typically used with the type
526   // of the left argument.
527   case tok::pipe:
528   case tok::pipeequal:
529   case tok::caret:
530   case tok::caretequal:
531   case tok::amp:
532   case tok::ampequal:
533     if (LHSType->isIntegralOrEnumerationType())
534       return LHSType;
535     return QualType();
536   // RHS should be a pointer to a member of the 'LHS' type, but we can't give
537   // any particular type here.
538   case tok::periodstar:
539   case tok::arrowstar:
540     return QualType();
541   default:
542     // FIXME(ibiryukov): handle the missing op, re-add the assertion.
543     // assert(false && "unhandled binary op");
544     return QualType();
545   }
546 }
547 
548 /// Get preferred type for an argument of an unary expression. \p ContextType is
549 /// preferred type of the whole unary expression.
550 static QualType getPreferredTypeOfUnaryArg(Sema &S, QualType ContextType,
551                                            tok::TokenKind Op) {
552   switch (Op) {
553   case tok::exclaim:
554     return S.getASTContext().BoolTy;
555   case tok::amp:
556     if (!ContextType.isNull() && ContextType->isPointerType())
557       return ContextType->getPointeeType();
558     return QualType();
559   case tok::star:
560     if (ContextType.isNull())
561       return QualType();
562     return S.getASTContext().getPointerType(ContextType.getNonReferenceType());
563   case tok::plus:
564   case tok::minus:
565   case tok::tilde:
566   case tok::minusminus:
567   case tok::plusplus:
568     if (ContextType.isNull())
569       return S.getASTContext().IntTy;
570     // leave as is, these operators typically return the same type.
571     return ContextType;
572   case tok::kw___real:
573   case tok::kw___imag:
574     return QualType();
575   default:
576     assert(false && "unhandled unary op");
577     return QualType();
578   }
579 }
580 
581 void PreferredTypeBuilder::enterBinary(Sema &S, SourceLocation Tok, Expr *LHS,
582                                        tok::TokenKind Op) {
583   if (!Enabled)
584     return;
585   ComputeType = nullptr;
586   Type = getPreferredTypeOfBinaryRHS(S, LHS, Op);
587   ExpectedLoc = Tok;
588 }
589 
590 void PreferredTypeBuilder::enterMemAccess(Sema &S, SourceLocation Tok,
591                                           Expr *Base) {
592   if (!Enabled || !Base)
593     return;
594   // Do we have expected type for Base?
595   if (ExpectedLoc != Base->getBeginLoc())
596     return;
597   // Keep the expected type, only update the location.
598   ExpectedLoc = Tok;
599 }
600 
601 void PreferredTypeBuilder::enterUnary(Sema &S, SourceLocation Tok,
602                                       tok::TokenKind OpKind,
603                                       SourceLocation OpLoc) {
604   if (!Enabled)
605     return;
606   ComputeType = nullptr;
607   Type = getPreferredTypeOfUnaryArg(S, this->get(OpLoc), OpKind);
608   ExpectedLoc = Tok;
609 }
610 
611 void PreferredTypeBuilder::enterSubscript(Sema &S, SourceLocation Tok,
612                                           Expr *LHS) {
613   if (!Enabled)
614     return;
615   ComputeType = nullptr;
616   Type = S.getASTContext().IntTy;
617   ExpectedLoc = Tok;
618 }
619 
620 void PreferredTypeBuilder::enterTypeCast(SourceLocation Tok,
621                                          QualType CastType) {
622   if (!Enabled)
623     return;
624   ComputeType = nullptr;
625   Type = !CastType.isNull() ? CastType.getCanonicalType() : QualType();
626   ExpectedLoc = Tok;
627 }
628 
629 void PreferredTypeBuilder::enterCondition(Sema &S, SourceLocation Tok) {
630   if (!Enabled)
631     return;
632   ComputeType = nullptr;
633   Type = S.getASTContext().BoolTy;
634   ExpectedLoc = Tok;
635 }
636 
637 class ResultBuilder::ShadowMapEntry::iterator {
638   llvm::PointerUnion<const NamedDecl *, const DeclIndexPair *> DeclOrIterator;
639   unsigned SingleDeclIndex;
640 
641 public:
642   typedef DeclIndexPair value_type;
643   typedef value_type reference;
644   typedef std::ptrdiff_t difference_type;
645   typedef std::input_iterator_tag iterator_category;
646 
647   class pointer {
648     DeclIndexPair Value;
649 
650   public:
651     pointer(const DeclIndexPair &Value) : Value(Value) {}
652 
653     const DeclIndexPair *operator->() const { return &Value; }
654   };
655 
656   iterator() : DeclOrIterator((NamedDecl *)nullptr), SingleDeclIndex(0) {}
657 
658   iterator(const NamedDecl *SingleDecl, unsigned Index)
659       : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) {}
660 
661   iterator(const DeclIndexPair *Iterator)
662       : DeclOrIterator(Iterator), SingleDeclIndex(0) {}
663 
664   iterator &operator++() {
665     if (isa<const NamedDecl *>(DeclOrIterator)) {
666       DeclOrIterator = (NamedDecl *)nullptr;
667       SingleDeclIndex = 0;
668       return *this;
669     }
670 
671     const DeclIndexPair *I = cast<const DeclIndexPair *>(DeclOrIterator);
672     ++I;
673     DeclOrIterator = I;
674     return *this;
675   }
676 
677   /*iterator operator++(int) {
678     iterator tmp(*this);
679     ++(*this);
680     return tmp;
681   }*/
682 
683   reference operator*() const {
684     if (const NamedDecl *ND = dyn_cast<const NamedDecl *>(DeclOrIterator))
685       return reference(ND, SingleDeclIndex);
686 
687     return *cast<const DeclIndexPair *>(DeclOrIterator);
688   }
689 
690   pointer operator->() const { return pointer(**this); }
691 
692   friend bool operator==(const iterator &X, const iterator &Y) {
693     return X.DeclOrIterator.getOpaqueValue() ==
694                Y.DeclOrIterator.getOpaqueValue() &&
695            X.SingleDeclIndex == Y.SingleDeclIndex;
696   }
697 
698   friend bool operator!=(const iterator &X, const iterator &Y) {
699     return !(X == Y);
700   }
701 };
702 
703 ResultBuilder::ShadowMapEntry::iterator
704 ResultBuilder::ShadowMapEntry::begin() const {
705   if (DeclOrVector.isNull())
706     return iterator();
707 
708   if (const NamedDecl *ND = dyn_cast<const NamedDecl *>(DeclOrVector))
709     return iterator(ND, SingleDeclIndex);
710 
711   return iterator(cast<DeclIndexPairVector *>(DeclOrVector)->begin());
712 }
713 
714 ResultBuilder::ShadowMapEntry::iterator
715 ResultBuilder::ShadowMapEntry::end() const {
716   if (isa<const NamedDecl *>(DeclOrVector) || DeclOrVector.isNull())
717     return iterator();
718 
719   return iterator(cast<DeclIndexPairVector *>(DeclOrVector)->end());
720 }
721 
722 /// Compute the qualification required to get from the current context
723 /// (\p CurContext) to the target context (\p TargetContext).
724 ///
725 /// \param Context the AST context in which the qualification will be used.
726 ///
727 /// \param CurContext the context where an entity is being named, which is
728 /// typically based on the current scope.
729 ///
730 /// \param TargetContext the context in which the named entity actually
731 /// resides.
732 ///
733 /// \returns a nested name specifier that refers into the target context, or
734 /// NULL if no qualification is needed.
735 static NestedNameSpecifier *
736 getRequiredQualification(ASTContext &Context, const DeclContext *CurContext,
737                          const DeclContext *TargetContext) {
738   SmallVector<const DeclContext *, 4> TargetParents;
739 
740   for (const DeclContext *CommonAncestor = TargetContext;
741        CommonAncestor && !CommonAncestor->Encloses(CurContext);
742        CommonAncestor = CommonAncestor->getLookupParent()) {
743     if (CommonAncestor->isTransparentContext() ||
744         CommonAncestor->isFunctionOrMethod())
745       continue;
746 
747     TargetParents.push_back(CommonAncestor);
748   }
749 
750   NestedNameSpecifier *Result = nullptr;
751   while (!TargetParents.empty()) {
752     const DeclContext *Parent = TargetParents.pop_back_val();
753 
754     if (const auto *Namespace = dyn_cast<NamespaceDecl>(Parent)) {
755       if (!Namespace->getIdentifier())
756         continue;
757 
758       Result = NestedNameSpecifier::Create(Context, Result, Namespace);
759     } else if (const auto *TD = dyn_cast<TagDecl>(Parent))
760       Result = NestedNameSpecifier::Create(
761           Context, Result, Context.getTypeDeclType(TD).getTypePtr());
762   }
763   return Result;
764 }
765 
766 // Some declarations have reserved names that we don't want to ever show.
767 // Filter out names reserved for the implementation if they come from a
768 // system header.
769 static bool shouldIgnoreDueToReservedName(const NamedDecl *ND, Sema &SemaRef) {
770   // Debuggers want access to all identifiers, including reserved ones.
771   if (SemaRef.getLangOpts().DebuggerSupport)
772     return false;
773 
774   ReservedIdentifierStatus Status = ND->isReserved(SemaRef.getLangOpts());
775   // Ignore reserved names for compiler provided decls.
776   if (isReservedInAllContexts(Status) && ND->getLocation().isInvalid())
777     return true;
778 
779   // For system headers ignore only double-underscore names.
780   // This allows for system headers providing private symbols with a single
781   // underscore.
782   if (Status == ReservedIdentifierStatus::StartsWithDoubleUnderscore &&
783       SemaRef.SourceMgr.isInSystemHeader(
784           SemaRef.SourceMgr.getSpellingLoc(ND->getLocation())))
785     return true;
786 
787   return false;
788 }
789 
790 bool ResultBuilder::isInterestingDecl(const NamedDecl *ND,
791                                       bool &AsNestedNameSpecifier) const {
792   AsNestedNameSpecifier = false;
793 
794   auto *Named = ND;
795   ND = ND->getUnderlyingDecl();
796 
797   // Skip unnamed entities.
798   if (!ND->getDeclName())
799     return false;
800 
801   // Friend declarations and declarations introduced due to friends are never
802   // added as results.
803   if (ND->getFriendObjectKind() == Decl::FOK_Undeclared)
804     return false;
805 
806   // Class template (partial) specializations are never added as results.
807   if (isa<ClassTemplateSpecializationDecl>(ND) ||
808       isa<ClassTemplatePartialSpecializationDecl>(ND))
809     return false;
810 
811   // Using declarations themselves are never added as results.
812   if (isa<UsingDecl>(ND))
813     return false;
814 
815   if (shouldIgnoreDueToReservedName(ND, SemaRef))
816     return false;
817 
818   if (Filter == &ResultBuilder::IsNestedNameSpecifier ||
819       (isa<NamespaceDecl>(ND) && Filter != &ResultBuilder::IsNamespace &&
820        Filter != &ResultBuilder::IsNamespaceOrAlias && Filter != nullptr))
821     AsNestedNameSpecifier = true;
822 
823   // Filter out any unwanted results.
824   if (Filter && !(this->*Filter)(Named)) {
825     // Check whether it is interesting as a nested-name-specifier.
826     if (AllowNestedNameSpecifiers && SemaRef.getLangOpts().CPlusPlus &&
827         IsNestedNameSpecifier(ND) &&
828         (Filter != &ResultBuilder::IsMember ||
829          (isa<CXXRecordDecl>(ND) &&
830           cast<CXXRecordDecl>(ND)->isInjectedClassName()))) {
831       AsNestedNameSpecifier = true;
832       return true;
833     }
834 
835     return false;
836   }
837   // ... then it must be interesting!
838   return true;
839 }
840 
841 bool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext,
842                                       const NamedDecl *Hiding) {
843   // In C, there is no way to refer to a hidden name.
844   // FIXME: This isn't true; we can find a tag name hidden by an ordinary
845   // name if we introduce the tag type.
846   if (!SemaRef.getLangOpts().CPlusPlus)
847     return true;
848 
849   const DeclContext *HiddenCtx =
850       R.Declaration->getDeclContext()->getRedeclContext();
851 
852   // There is no way to qualify a name declared in a function or method.
853   if (HiddenCtx->isFunctionOrMethod())
854     return true;
855 
856   if (HiddenCtx == Hiding->getDeclContext()->getRedeclContext())
857     return true;
858 
859   // We can refer to the result with the appropriate qualification. Do it.
860   R.Hidden = true;
861   R.QualifierIsInformative = false;
862 
863   if (!R.Qualifier)
864     R.Qualifier = getRequiredQualification(SemaRef.Context, CurContext,
865                                            R.Declaration->getDeclContext());
866   return false;
867 }
868 
869 /// A simplified classification of types used to determine whether two
870 /// types are "similar enough" when adjusting priorities.
871 SimplifiedTypeClass clang::getSimplifiedTypeClass(CanQualType T) {
872   switch (T->getTypeClass()) {
873   case Type::Builtin:
874     switch (cast<BuiltinType>(T)->getKind()) {
875     case BuiltinType::Void:
876       return STC_Void;
877 
878     case BuiltinType::NullPtr:
879       return STC_Pointer;
880 
881     case BuiltinType::Overload:
882     case BuiltinType::Dependent:
883       return STC_Other;
884 
885     case BuiltinType::ObjCId:
886     case BuiltinType::ObjCClass:
887     case BuiltinType::ObjCSel:
888       return STC_ObjectiveC;
889 
890     default:
891       return STC_Arithmetic;
892     }
893 
894   case Type::Complex:
895     return STC_Arithmetic;
896 
897   case Type::Pointer:
898     return STC_Pointer;
899 
900   case Type::BlockPointer:
901     return STC_Block;
902 
903   case Type::LValueReference:
904   case Type::RValueReference:
905     return getSimplifiedTypeClass(T->getAs<ReferenceType>()->getPointeeType());
906 
907   case Type::ConstantArray:
908   case Type::IncompleteArray:
909   case Type::VariableArray:
910   case Type::DependentSizedArray:
911     return STC_Array;
912 
913   case Type::DependentSizedExtVector:
914   case Type::Vector:
915   case Type::ExtVector:
916     return STC_Arithmetic;
917 
918   case Type::FunctionProto:
919   case Type::FunctionNoProto:
920     return STC_Function;
921 
922   case Type::Record:
923     return STC_Record;
924 
925   case Type::Enum:
926     return STC_Arithmetic;
927 
928   case Type::ObjCObject:
929   case Type::ObjCInterface:
930   case Type::ObjCObjectPointer:
931     return STC_ObjectiveC;
932 
933   default:
934     return STC_Other;
935   }
936 }
937 
938 /// Get the type that a given expression will have if this declaration
939 /// is used as an expression in its "typical" code-completion form.
940 QualType clang::getDeclUsageType(ASTContext &C, const NamedDecl *ND) {
941   ND = ND->getUnderlyingDecl();
942 
943   if (const auto *Type = dyn_cast<TypeDecl>(ND))
944     return C.getTypeDeclType(Type);
945   if (const auto *Iface = dyn_cast<ObjCInterfaceDecl>(ND))
946     return C.getObjCInterfaceType(Iface);
947 
948   QualType T;
949   if (const FunctionDecl *Function = ND->getAsFunction())
950     T = Function->getCallResultType();
951   else if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND))
952     T = Method->getSendResultType();
953   else if (const auto *Enumerator = dyn_cast<EnumConstantDecl>(ND))
954     T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext()));
955   else if (const auto *Property = dyn_cast<ObjCPropertyDecl>(ND))
956     T = Property->getType();
957   else if (const auto *Value = dyn_cast<ValueDecl>(ND))
958     T = Value->getType();
959 
960   if (T.isNull())
961     return QualType();
962 
963   // Dig through references, function pointers, and block pointers to
964   // get down to the likely type of an expression when the entity is
965   // used.
966   do {
967     if (const auto *Ref = T->getAs<ReferenceType>()) {
968       T = Ref->getPointeeType();
969       continue;
970     }
971 
972     if (const auto *Pointer = T->getAs<PointerType>()) {
973       if (Pointer->getPointeeType()->isFunctionType()) {
974         T = Pointer->getPointeeType();
975         continue;
976       }
977 
978       break;
979     }
980 
981     if (const auto *Block = T->getAs<BlockPointerType>()) {
982       T = Block->getPointeeType();
983       continue;
984     }
985 
986     if (const auto *Function = T->getAs<FunctionType>()) {
987       T = Function->getReturnType();
988       continue;
989     }
990 
991     break;
992   } while (true);
993 
994   return T;
995 }
996 
997 unsigned ResultBuilder::getBasePriority(const NamedDecl *ND) {
998   if (!ND)
999     return CCP_Unlikely;
1000 
1001   // Context-based decisions.
1002   const DeclContext *LexicalDC = ND->getLexicalDeclContext();
1003   if (LexicalDC->isFunctionOrMethod()) {
1004     // _cmd is relatively rare
1005     if (const auto *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
1006       if (ImplicitParam->getIdentifier() &&
1007           ImplicitParam->getIdentifier()->isStr("_cmd"))
1008         return CCP_ObjC_cmd;
1009 
1010     return CCP_LocalDeclaration;
1011   }
1012 
1013   const DeclContext *DC = ND->getDeclContext()->getRedeclContext();
1014   if (DC->isRecord() || isa<ObjCContainerDecl>(DC)) {
1015     // Explicit destructor calls are very rare.
1016     if (isa<CXXDestructorDecl>(ND))
1017       return CCP_Unlikely;
1018     // Explicit operator and conversion function calls are also very rare.
1019     auto DeclNameKind = ND->getDeclName().getNameKind();
1020     if (DeclNameKind == DeclarationName::CXXOperatorName ||
1021         DeclNameKind == DeclarationName::CXXLiteralOperatorName ||
1022         DeclNameKind == DeclarationName::CXXConversionFunctionName)
1023       return CCP_Unlikely;
1024     return CCP_MemberDeclaration;
1025   }
1026 
1027   // Content-based decisions.
1028   if (isa<EnumConstantDecl>(ND))
1029     return CCP_Constant;
1030 
1031   // Use CCP_Type for type declarations unless we're in a statement, Objective-C
1032   // message receiver, or parenthesized expression context. There, it's as
1033   // likely that the user will want to write a type as other declarations.
1034   if ((isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) &&
1035       !(CompletionContext.getKind() == CodeCompletionContext::CCC_Statement ||
1036         CompletionContext.getKind() ==
1037             CodeCompletionContext::CCC_ObjCMessageReceiver ||
1038         CompletionContext.getKind() ==
1039             CodeCompletionContext::CCC_ParenthesizedExpression))
1040     return CCP_Type;
1041 
1042   return CCP_Declaration;
1043 }
1044 
1045 void ResultBuilder::AdjustResultPriorityForDecl(Result &R) {
1046   // If this is an Objective-C method declaration whose selector matches our
1047   // preferred selector, give it a priority boost.
1048   if (!PreferredSelector.isNull())
1049     if (const auto *Method = dyn_cast<ObjCMethodDecl>(R.Declaration))
1050       if (PreferredSelector == Method->getSelector())
1051         R.Priority += CCD_SelectorMatch;
1052 
1053   // If we have a preferred type, adjust the priority for results with exactly-
1054   // matching or nearly-matching types.
1055   if (!PreferredType.isNull()) {
1056     QualType T = getDeclUsageType(SemaRef.Context, R.Declaration);
1057     if (!T.isNull()) {
1058       CanQualType TC = SemaRef.Context.getCanonicalType(T);
1059       // Check for exactly-matching types (modulo qualifiers).
1060       if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC))
1061         R.Priority /= CCF_ExactTypeMatch;
1062       // Check for nearly-matching types, based on classification of each.
1063       else if ((getSimplifiedTypeClass(PreferredType) ==
1064                 getSimplifiedTypeClass(TC)) &&
1065                !(PreferredType->isEnumeralType() && TC->isEnumeralType()))
1066         R.Priority /= CCF_SimilarTypeMatch;
1067     }
1068   }
1069 }
1070 
1071 static DeclContext::lookup_result getConstructors(ASTContext &Context,
1072                                                   const CXXRecordDecl *Record) {
1073   QualType RecordTy = Context.getTypeDeclType(Record);
1074   DeclarationName ConstructorName =
1075       Context.DeclarationNames.getCXXConstructorName(
1076           Context.getCanonicalType(RecordTy));
1077   return Record->lookup(ConstructorName);
1078 }
1079 
1080 void ResultBuilder::MaybeAddConstructorResults(Result R) {
1081   if (!SemaRef.getLangOpts().CPlusPlus || !R.Declaration ||
1082       !CompletionContext.wantConstructorResults())
1083     return;
1084 
1085   const NamedDecl *D = R.Declaration;
1086   const CXXRecordDecl *Record = nullptr;
1087   if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D))
1088     Record = ClassTemplate->getTemplatedDecl();
1089   else if ((Record = dyn_cast<CXXRecordDecl>(D))) {
1090     // Skip specializations and partial specializations.
1091     if (isa<ClassTemplateSpecializationDecl>(Record))
1092       return;
1093   } else {
1094     // There are no constructors here.
1095     return;
1096   }
1097 
1098   Record = Record->getDefinition();
1099   if (!Record)
1100     return;
1101 
1102   for (NamedDecl *Ctor : getConstructors(SemaRef.Context, Record)) {
1103     R.Declaration = Ctor;
1104     R.CursorKind = getCursorKindForDecl(R.Declaration);
1105     Results.push_back(R);
1106   }
1107 }
1108 
1109 static bool isConstructor(const Decl *ND) {
1110   if (const auto *Tmpl = dyn_cast<FunctionTemplateDecl>(ND))
1111     ND = Tmpl->getTemplatedDecl();
1112   return isa<CXXConstructorDecl>(ND);
1113 }
1114 
1115 void ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) {
1116   assert(!ShadowMaps.empty() && "Must enter into a results scope");
1117 
1118   if (R.Kind != Result::RK_Declaration) {
1119     // For non-declaration results, just add the result.
1120     Results.push_back(R);
1121     return;
1122   }
1123 
1124   // Look through using declarations.
1125   if (const UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) {
1126     CodeCompletionResult Result(Using->getTargetDecl(),
1127                                 getBasePriority(Using->getTargetDecl()),
1128                                 R.Qualifier, false,
1129                                 (R.Availability == CXAvailability_Available ||
1130                                  R.Availability == CXAvailability_Deprecated),
1131                                 std::move(R.FixIts));
1132     Result.ShadowDecl = Using;
1133     MaybeAddResult(Result, CurContext);
1134     return;
1135   }
1136 
1137   const Decl *CanonDecl = R.Declaration->getCanonicalDecl();
1138   unsigned IDNS = CanonDecl->getIdentifierNamespace();
1139 
1140   bool AsNestedNameSpecifier = false;
1141   if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
1142     return;
1143 
1144   // C++ constructors are never found by name lookup.
1145   if (isConstructor(R.Declaration))
1146     return;
1147 
1148   ShadowMap &SMap = ShadowMaps.back();
1149   ShadowMapEntry::iterator I, IEnd;
1150   ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName());
1151   if (NamePos != SMap.end()) {
1152     I = NamePos->second.begin();
1153     IEnd = NamePos->second.end();
1154   }
1155 
1156   for (; I != IEnd; ++I) {
1157     const NamedDecl *ND = I->first;
1158     unsigned Index = I->second;
1159     if (ND->getCanonicalDecl() == CanonDecl) {
1160       // This is a redeclaration. Always pick the newer declaration.
1161       Results[Index].Declaration = R.Declaration;
1162 
1163       // We're done.
1164       return;
1165     }
1166   }
1167 
1168   // This is a new declaration in this scope. However, check whether this
1169   // declaration name is hidden by a similarly-named declaration in an outer
1170   // scope.
1171   std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end();
1172   --SMEnd;
1173   for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) {
1174     ShadowMapEntry::iterator I, IEnd;
1175     ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName());
1176     if (NamePos != SM->end()) {
1177       I = NamePos->second.begin();
1178       IEnd = NamePos->second.end();
1179     }
1180     for (; I != IEnd; ++I) {
1181       // A tag declaration does not hide a non-tag declaration.
1182       if (I->first->hasTagIdentifierNamespace() &&
1183           (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary |
1184                    Decl::IDNS_LocalExtern | Decl::IDNS_ObjCProtocol)))
1185         continue;
1186 
1187       // Protocols are in distinct namespaces from everything else.
1188       if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) ||
1189            (IDNS & Decl::IDNS_ObjCProtocol)) &&
1190           I->first->getIdentifierNamespace() != IDNS)
1191         continue;
1192 
1193       // The newly-added result is hidden by an entry in the shadow map.
1194       if (CheckHiddenResult(R, CurContext, I->first))
1195         return;
1196 
1197       break;
1198     }
1199   }
1200 
1201   // Make sure that any given declaration only shows up in the result set once.
1202   if (!AllDeclsFound.insert(CanonDecl).second)
1203     return;
1204 
1205   // If the filter is for nested-name-specifiers, then this result starts a
1206   // nested-name-specifier.
1207   if (AsNestedNameSpecifier) {
1208     R.StartsNestedNameSpecifier = true;
1209     R.Priority = CCP_NestedNameSpecifier;
1210   } else
1211     AdjustResultPriorityForDecl(R);
1212 
1213   // If this result is supposed to have an informative qualifier, add one.
1214   if (R.QualifierIsInformative && !R.Qualifier &&
1215       !R.StartsNestedNameSpecifier) {
1216     const DeclContext *Ctx = R.Declaration->getDeclContext();
1217     if (const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx))
1218       R.Qualifier =
1219           NestedNameSpecifier::Create(SemaRef.Context, nullptr, Namespace);
1220     else if (const TagDecl *Tag = dyn_cast<TagDecl>(Ctx))
1221       R.Qualifier = NestedNameSpecifier::Create(
1222           SemaRef.Context, nullptr,
1223           SemaRef.Context.getTypeDeclType(Tag).getTypePtr());
1224     else
1225       R.QualifierIsInformative = false;
1226   }
1227 
1228   // Insert this result into the set of results and into the current shadow
1229   // map.
1230   SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size());
1231   Results.push_back(R);
1232 
1233   if (!AsNestedNameSpecifier)
1234     MaybeAddConstructorResults(R);
1235 }
1236 
1237 static void setInBaseClass(ResultBuilder::Result &R) {
1238   R.Priority += CCD_InBaseClass;
1239   R.InBaseClass = true;
1240 }
1241 
1242 enum class OverloadCompare { BothViable, Dominates, Dominated };
1243 // Will Candidate ever be called on the object, when overloaded with Incumbent?
1244 // Returns Dominates if Candidate is always called, Dominated if Incumbent is
1245 // always called, BothViable if either may be called depending on arguments.
1246 // Precondition: must actually be overloads!
1247 static OverloadCompare compareOverloads(const CXXMethodDecl &Candidate,
1248                                         const CXXMethodDecl &Incumbent,
1249                                         const Qualifiers &ObjectQuals,
1250                                         ExprValueKind ObjectKind,
1251                                         const ASTContext &Ctx) {
1252   // Base/derived shadowing is handled elsewhere.
1253   if (Candidate.getDeclContext() != Incumbent.getDeclContext())
1254     return OverloadCompare::BothViable;
1255   if (Candidate.isVariadic() != Incumbent.isVariadic() ||
1256       Candidate.getNumParams() != Incumbent.getNumParams() ||
1257       Candidate.getMinRequiredArguments() !=
1258           Incumbent.getMinRequiredArguments())
1259     return OverloadCompare::BothViable;
1260   for (unsigned I = 0, E = Candidate.getNumParams(); I != E; ++I)
1261     if (Candidate.parameters()[I]->getType().getCanonicalType() !=
1262         Incumbent.parameters()[I]->getType().getCanonicalType())
1263       return OverloadCompare::BothViable;
1264   if (!Candidate.specific_attrs<EnableIfAttr>().empty() ||
1265       !Incumbent.specific_attrs<EnableIfAttr>().empty())
1266     return OverloadCompare::BothViable;
1267   // At this point, we know calls can't pick one or the other based on
1268   // arguments, so one of the two must win. (Or both fail, handled elsewhere).
1269   RefQualifierKind CandidateRef = Candidate.getRefQualifier();
1270   RefQualifierKind IncumbentRef = Incumbent.getRefQualifier();
1271   if (CandidateRef != IncumbentRef) {
1272     // If the object kind is LValue/RValue, there's one acceptable ref-qualifier
1273     // and it can't be mixed with ref-unqualified overloads (in valid code).
1274 
1275     // For xvalue objects, we prefer the rvalue overload even if we have to
1276     // add qualifiers (which is rare, because const&& is rare).
1277     if (ObjectKind == clang::VK_XValue)
1278       return CandidateRef == RQ_RValue ? OverloadCompare::Dominates
1279                                        : OverloadCompare::Dominated;
1280   }
1281   // Now the ref qualifiers are the same (or we're in some invalid state).
1282   // So make some decision based on the qualifiers.
1283   Qualifiers CandidateQual = Candidate.getMethodQualifiers();
1284   Qualifiers IncumbentQual = Incumbent.getMethodQualifiers();
1285   bool CandidateSuperset = CandidateQual.compatiblyIncludes(IncumbentQual, Ctx);
1286   bool IncumbentSuperset = IncumbentQual.compatiblyIncludes(CandidateQual, Ctx);
1287   if (CandidateSuperset == IncumbentSuperset)
1288     return OverloadCompare::BothViable;
1289   return IncumbentSuperset ? OverloadCompare::Dominates
1290                            : OverloadCompare::Dominated;
1291 }
1292 
1293 bool ResultBuilder::canCxxMethodBeCalled(const CXXMethodDecl *Method,
1294                                          QualType BaseExprType) const {
1295   // Find the class scope that we're currently in.
1296   // We could e.g. be inside a lambda, so walk up the DeclContext until we
1297   // find a CXXMethodDecl.
1298   DeclContext *CurContext = SemaRef.CurContext;
1299   const auto *CurrentClassScope = [&]() -> const CXXRecordDecl * {
1300     for (DeclContext *Ctx = CurContext; Ctx; Ctx = Ctx->getParent()) {
1301       const auto *CtxMethod = llvm::dyn_cast<CXXMethodDecl>(Ctx);
1302       if (CtxMethod && !CtxMethod->getParent()->isLambda()) {
1303         return CtxMethod->getParent();
1304       }
1305     }
1306     return nullptr;
1307   }();
1308 
1309   // If we're not inside the scope of the method's class, it can't be a call.
1310   bool FunctionCanBeCall =
1311       CurrentClassScope &&
1312       (CurrentClassScope == Method->getParent() ||
1313        CurrentClassScope->isDerivedFrom(Method->getParent()));
1314 
1315   // We skip the following calculation for exceptions if it's already true.
1316   if (FunctionCanBeCall)
1317     return true;
1318 
1319   // Exception: foo->FooBase::bar() or foo->Foo::bar() *is* a call.
1320   if (const CXXRecordDecl *MaybeDerived =
1321           BaseExprType.isNull() ? nullptr
1322                                 : BaseExprType->getAsCXXRecordDecl()) {
1323     auto *MaybeBase = Method->getParent();
1324     FunctionCanBeCall =
1325         MaybeDerived == MaybeBase || MaybeDerived->isDerivedFrom(MaybeBase);
1326   }
1327 
1328   return FunctionCanBeCall;
1329 }
1330 
1331 bool ResultBuilder::canFunctionBeCalled(const NamedDecl *ND,
1332                                         QualType BaseExprType) const {
1333   // We apply heuristics only to CCC_Symbol:
1334   // * CCC_{Arrow,Dot}MemberAccess reflect member access expressions:
1335   //   f.method() and f->method(). These are always calls.
1336   // * A qualified name to a member function may *not* be a call. We have to
1337   //   subdivide the cases: For example, f.Base::method(), which is regarded as
1338   //   CCC_Symbol, should be a call.
1339   // * Non-member functions and static member functions are always considered
1340   //   calls.
1341   if (CompletionContext.getKind() == clang::CodeCompletionContext::CCC_Symbol) {
1342     if (const auto *FuncTmpl = dyn_cast<FunctionTemplateDecl>(ND)) {
1343       ND = FuncTmpl->getTemplatedDecl();
1344     }
1345     const auto *Method = dyn_cast<CXXMethodDecl>(ND);
1346     if (Method && !Method->isStatic()) {
1347       return canCxxMethodBeCalled(Method, BaseExprType);
1348     }
1349   }
1350   return true;
1351 }
1352 
1353 void ResultBuilder::AddResult(Result R, DeclContext *CurContext,
1354                               NamedDecl *Hiding, bool InBaseClass = false,
1355                               QualType BaseExprType = QualType()) {
1356   if (R.Kind != Result::RK_Declaration) {
1357     // For non-declaration results, just add the result.
1358     Results.push_back(R);
1359     return;
1360   }
1361 
1362   // Look through using declarations.
1363   if (const auto *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) {
1364     CodeCompletionResult Result(Using->getTargetDecl(),
1365                                 getBasePriority(Using->getTargetDecl()),
1366                                 R.Qualifier, false,
1367                                 (R.Availability == CXAvailability_Available ||
1368                                  R.Availability == CXAvailability_Deprecated),
1369                                 std::move(R.FixIts));
1370     Result.ShadowDecl = Using;
1371     AddResult(Result, CurContext, Hiding, /*InBaseClass=*/false,
1372               /*BaseExprType=*/BaseExprType);
1373     return;
1374   }
1375 
1376   bool AsNestedNameSpecifier = false;
1377   if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
1378     return;
1379 
1380   // C++ constructors are never found by name lookup.
1381   if (isConstructor(R.Declaration))
1382     return;
1383 
1384   if (Hiding && CheckHiddenResult(R, CurContext, Hiding))
1385     return;
1386 
1387   // Make sure that any given declaration only shows up in the result set once.
1388   if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl()).second)
1389     return;
1390 
1391   // If the filter is for nested-name-specifiers, then this result starts a
1392   // nested-name-specifier.
1393   if (AsNestedNameSpecifier) {
1394     R.StartsNestedNameSpecifier = true;
1395     R.Priority = CCP_NestedNameSpecifier;
1396   } else if (Filter == &ResultBuilder::IsMember && !R.Qualifier &&
1397              InBaseClass &&
1398              isa<CXXRecordDecl>(
1399                  R.Declaration->getDeclContext()->getRedeclContext()))
1400     R.QualifierIsInformative = true;
1401 
1402   // If this result is supposed to have an informative qualifier, add one.
1403   if (R.QualifierIsInformative && !R.Qualifier &&
1404       !R.StartsNestedNameSpecifier) {
1405     const DeclContext *Ctx = R.Declaration->getDeclContext();
1406     if (const auto *Namespace = dyn_cast<NamespaceDecl>(Ctx))
1407       R.Qualifier =
1408           NestedNameSpecifier::Create(SemaRef.Context, nullptr, Namespace);
1409     else if (const auto *Tag = dyn_cast<TagDecl>(Ctx))
1410       R.Qualifier = NestedNameSpecifier::Create(
1411           SemaRef.Context, nullptr,
1412           SemaRef.Context.getTypeDeclType(Tag).getTypePtr());
1413     else
1414       R.QualifierIsInformative = false;
1415   }
1416 
1417   // Adjust the priority if this result comes from a base class.
1418   if (InBaseClass)
1419     setInBaseClass(R);
1420 
1421   AdjustResultPriorityForDecl(R);
1422 
1423   if (HasObjectTypeQualifiers)
1424     if (const auto *Method = dyn_cast<CXXMethodDecl>(R.Declaration))
1425       if (Method->isInstance()) {
1426         Qualifiers MethodQuals = Method->getMethodQualifiers();
1427         if (ObjectTypeQualifiers == MethodQuals)
1428           R.Priority += CCD_ObjectQualifierMatch;
1429         else if (ObjectTypeQualifiers - MethodQuals) {
1430           // The method cannot be invoked, because doing so would drop
1431           // qualifiers.
1432           return;
1433         }
1434         // Detect cases where a ref-qualified method cannot be invoked.
1435         switch (Method->getRefQualifier()) {
1436           case RQ_LValue:
1437             if (ObjectKind != VK_LValue && !MethodQuals.hasConst())
1438               return;
1439             break;
1440           case RQ_RValue:
1441             if (ObjectKind == VK_LValue)
1442               return;
1443             break;
1444           case RQ_None:
1445             break;
1446         }
1447 
1448         /// Check whether this dominates another overloaded method, which should
1449         /// be suppressed (or vice versa).
1450         /// Motivating case is const_iterator begin() const vs iterator begin().
1451         auto &OverloadSet = OverloadMap[std::make_pair(
1452             CurContext, Method->getDeclName().getAsOpaqueInteger())];
1453         for (const DeclIndexPair Entry : OverloadSet) {
1454           Result &Incumbent = Results[Entry.second];
1455           switch (compareOverloads(*Method,
1456                                    *cast<CXXMethodDecl>(Incumbent.Declaration),
1457                                    ObjectTypeQualifiers, ObjectKind,
1458                                    CurContext->getParentASTContext())) {
1459           case OverloadCompare::Dominates:
1460             // Replace the dominated overload with this one.
1461             // FIXME: if the overload dominates multiple incumbents then we
1462             // should remove all. But two overloads is by far the common case.
1463             Incumbent = std::move(R);
1464             return;
1465           case OverloadCompare::Dominated:
1466             // This overload can't be called, drop it.
1467             return;
1468           case OverloadCompare::BothViable:
1469             break;
1470           }
1471         }
1472         OverloadSet.Add(Method, Results.size());
1473       }
1474 
1475   R.FunctionCanBeCall = canFunctionBeCalled(R.getDeclaration(), BaseExprType);
1476 
1477   // Insert this result into the set of results.
1478   Results.push_back(R);
1479 
1480   if (!AsNestedNameSpecifier)
1481     MaybeAddConstructorResults(R);
1482 }
1483 
1484 void ResultBuilder::AddResult(Result R) {
1485   assert(R.Kind != Result::RK_Declaration &&
1486          "Declaration results need more context");
1487   Results.push_back(R);
1488 }
1489 
1490 /// Enter into a new scope.
1491 void ResultBuilder::EnterNewScope() { ShadowMaps.emplace_back(); }
1492 
1493 /// Exit from the current scope.
1494 void ResultBuilder::ExitScope() {
1495   ShadowMaps.pop_back();
1496 }
1497 
1498 /// Determines whether this given declaration will be found by
1499 /// ordinary name lookup.
1500 bool ResultBuilder::IsOrdinaryName(const NamedDecl *ND) const {
1501   ND = ND->getUnderlyingDecl();
1502 
1503   // If name lookup finds a local extern declaration, then we are in a
1504   // context where it behaves like an ordinary name.
1505   unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_LocalExtern;
1506   if (SemaRef.getLangOpts().CPlusPlus)
1507     IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member;
1508   else if (SemaRef.getLangOpts().ObjC) {
1509     if (isa<ObjCIvarDecl>(ND))
1510       return true;
1511   }
1512 
1513   return ND->getIdentifierNamespace() & IDNS;
1514 }
1515 
1516 /// Determines whether this given declaration will be found by
1517 /// ordinary name lookup but is not a type name.
1518 bool ResultBuilder::IsOrdinaryNonTypeName(const NamedDecl *ND) const {
1519   ND = ND->getUnderlyingDecl();
1520   if (isa<TypeDecl>(ND))
1521     return false;
1522   // Objective-C interfaces names are not filtered by this method because they
1523   // can be used in a class property expression. We can still filter out
1524   // @class declarations though.
1525   if (const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND)) {
1526     if (!ID->getDefinition())
1527       return false;
1528   }
1529 
1530   unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_LocalExtern;
1531   if (SemaRef.getLangOpts().CPlusPlus)
1532     IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member;
1533   else if (SemaRef.getLangOpts().ObjC) {
1534     if (isa<ObjCIvarDecl>(ND))
1535       return true;
1536   }
1537 
1538   return ND->getIdentifierNamespace() & IDNS;
1539 }
1540 
1541 bool ResultBuilder::IsIntegralConstantValue(const NamedDecl *ND) const {
1542   if (!IsOrdinaryNonTypeName(ND))
1543     return false;
1544 
1545   if (const auto *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl()))
1546     if (VD->getType()->isIntegralOrEnumerationType())
1547       return true;
1548 
1549   return false;
1550 }
1551 
1552 /// Determines whether this given declaration will be found by
1553 /// ordinary name lookup.
1554 bool ResultBuilder::IsOrdinaryNonValueName(const NamedDecl *ND) const {
1555   ND = ND->getUnderlyingDecl();
1556 
1557   unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_LocalExtern;
1558   if (SemaRef.getLangOpts().CPlusPlus)
1559     IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace;
1560 
1561   return (ND->getIdentifierNamespace() & IDNS) && !isa<ValueDecl>(ND) &&
1562          !isa<FunctionTemplateDecl>(ND) && !isa<ObjCPropertyDecl>(ND);
1563 }
1564 
1565 /// Determines whether the given declaration is suitable as the
1566 /// start of a C++ nested-name-specifier, e.g., a class or namespace.
1567 bool ResultBuilder::IsNestedNameSpecifier(const NamedDecl *ND) const {
1568   // Allow us to find class templates, too.
1569   if (const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1570     ND = ClassTemplate->getTemplatedDecl();
1571 
1572   return SemaRef.isAcceptableNestedNameSpecifier(ND);
1573 }
1574 
1575 /// Determines whether the given declaration is an enumeration.
1576 bool ResultBuilder::IsEnum(const NamedDecl *ND) const {
1577   return isa<EnumDecl>(ND);
1578 }
1579 
1580 /// Determines whether the given declaration is a class or struct.
1581 bool ResultBuilder::IsClassOrStruct(const NamedDecl *ND) const {
1582   // Allow us to find class templates, too.
1583   if (const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1584     ND = ClassTemplate->getTemplatedDecl();
1585 
1586   // For purposes of this check, interfaces match too.
1587   if (const auto *RD = dyn_cast<RecordDecl>(ND))
1588     return RD->getTagKind() == TagTypeKind::Class ||
1589            RD->getTagKind() == TagTypeKind::Struct ||
1590            RD->getTagKind() == TagTypeKind::Interface;
1591 
1592   return false;
1593 }
1594 
1595 /// Determines whether the given declaration is a union.
1596 bool ResultBuilder::IsUnion(const NamedDecl *ND) const {
1597   // Allow us to find class templates, too.
1598   if (const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1599     ND = ClassTemplate->getTemplatedDecl();
1600 
1601   if (const auto *RD = dyn_cast<RecordDecl>(ND))
1602     return RD->getTagKind() == TagTypeKind::Union;
1603 
1604   return false;
1605 }
1606 
1607 /// Determines whether the given declaration is a namespace.
1608 bool ResultBuilder::IsNamespace(const NamedDecl *ND) const {
1609   return isa<NamespaceDecl>(ND);
1610 }
1611 
1612 /// Determines whether the given declaration is a namespace or
1613 /// namespace alias.
1614 bool ResultBuilder::IsNamespaceOrAlias(const NamedDecl *ND) const {
1615   return isa<NamespaceDecl>(ND->getUnderlyingDecl());
1616 }
1617 
1618 /// Determines whether the given declaration is a type.
1619 bool ResultBuilder::IsType(const NamedDecl *ND) const {
1620   ND = ND->getUnderlyingDecl();
1621   return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND);
1622 }
1623 
1624 /// Determines which members of a class should be visible via
1625 /// "." or "->".  Only value declarations, nested name specifiers, and
1626 /// using declarations thereof should show up.
1627 bool ResultBuilder::IsMember(const NamedDecl *ND) const {
1628   ND = ND->getUnderlyingDecl();
1629   return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) ||
1630          isa<ObjCPropertyDecl>(ND);
1631 }
1632 
1633 static bool isObjCReceiverType(ASTContext &C, QualType T) {
1634   T = C.getCanonicalType(T);
1635   switch (T->getTypeClass()) {
1636   case Type::ObjCObject:
1637   case Type::ObjCInterface:
1638   case Type::ObjCObjectPointer:
1639     return true;
1640 
1641   case Type::Builtin:
1642     switch (cast<BuiltinType>(T)->getKind()) {
1643     case BuiltinType::ObjCId:
1644     case BuiltinType::ObjCClass:
1645     case BuiltinType::ObjCSel:
1646       return true;
1647 
1648     default:
1649       break;
1650     }
1651     return false;
1652 
1653   default:
1654     break;
1655   }
1656 
1657   if (!C.getLangOpts().CPlusPlus)
1658     return false;
1659 
1660   // FIXME: We could perform more analysis here to determine whether a
1661   // particular class type has any conversions to Objective-C types. For now,
1662   // just accept all class types.
1663   return T->isDependentType() || T->isRecordType();
1664 }
1665 
1666 bool ResultBuilder::IsObjCMessageReceiver(const NamedDecl *ND) const {
1667   QualType T = getDeclUsageType(SemaRef.Context, ND);
1668   if (T.isNull())
1669     return false;
1670 
1671   T = SemaRef.Context.getBaseElementType(T);
1672   return isObjCReceiverType(SemaRef.Context, T);
1673 }
1674 
1675 bool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(
1676     const NamedDecl *ND) const {
1677   if (IsObjCMessageReceiver(ND))
1678     return true;
1679 
1680   const auto *Var = dyn_cast<VarDecl>(ND);
1681   if (!Var)
1682     return false;
1683 
1684   return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>();
1685 }
1686 
1687 bool ResultBuilder::IsObjCCollection(const NamedDecl *ND) const {
1688   if ((SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryName(ND)) ||
1689       (!SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryNonTypeName(ND)))
1690     return false;
1691 
1692   QualType T = getDeclUsageType(SemaRef.Context, ND);
1693   if (T.isNull())
1694     return false;
1695 
1696   T = SemaRef.Context.getBaseElementType(T);
1697   return T->isObjCObjectType() || T->isObjCObjectPointerType() ||
1698          T->isObjCIdType() ||
1699          (SemaRef.getLangOpts().CPlusPlus && T->isRecordType());
1700 }
1701 
1702 bool ResultBuilder::IsImpossibleToSatisfy(const NamedDecl *ND) const {
1703   return false;
1704 }
1705 
1706 /// Determines whether the given declaration is an Objective-C
1707 /// instance variable.
1708 bool ResultBuilder::IsObjCIvar(const NamedDecl *ND) const {
1709   return isa<ObjCIvarDecl>(ND);
1710 }
1711 
1712 namespace {
1713 
1714 /// Visible declaration consumer that adds a code-completion result
1715 /// for each visible declaration.
1716 class CodeCompletionDeclConsumer : public VisibleDeclConsumer {
1717   ResultBuilder &Results;
1718   DeclContext *InitialLookupCtx;
1719   // NamingClass and BaseType are used for access-checking. See
1720   // Sema::IsSimplyAccessible for details.
1721   CXXRecordDecl *NamingClass;
1722   QualType BaseType;
1723   std::vector<FixItHint> FixIts;
1724 
1725 public:
1726   CodeCompletionDeclConsumer(
1727       ResultBuilder &Results, DeclContext *InitialLookupCtx,
1728       QualType BaseType = QualType(),
1729       std::vector<FixItHint> FixIts = std::vector<FixItHint>())
1730       : Results(Results), InitialLookupCtx(InitialLookupCtx),
1731         FixIts(std::move(FixIts)) {
1732     NamingClass = llvm::dyn_cast<CXXRecordDecl>(InitialLookupCtx);
1733     // If BaseType was not provided explicitly, emulate implicit 'this->'.
1734     if (BaseType.isNull()) {
1735       auto ThisType = Results.getSema().getCurrentThisType();
1736       if (!ThisType.isNull()) {
1737         assert(ThisType->isPointerType());
1738         BaseType = ThisType->getPointeeType();
1739         if (!NamingClass)
1740           NamingClass = BaseType->getAsCXXRecordDecl();
1741       }
1742     }
1743     this->BaseType = BaseType;
1744   }
1745 
1746   void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx,
1747                  bool InBaseClass) override {
1748     ResultBuilder::Result Result(ND, Results.getBasePriority(ND), nullptr,
1749                                  false, IsAccessible(ND, Ctx), FixIts);
1750     Results.AddResult(Result, InitialLookupCtx, Hiding, InBaseClass, BaseType);
1751   }
1752 
1753   void EnteredContext(DeclContext *Ctx) override {
1754     Results.addVisitedContext(Ctx);
1755   }
1756 
1757 private:
1758   bool IsAccessible(NamedDecl *ND, DeclContext *Ctx) {
1759     // Naming class to use for access check. In most cases it was provided
1760     // explicitly (e.g. member access (lhs.foo) or qualified lookup (X::)),
1761     // for unqualified lookup we fallback to the \p Ctx in which we found the
1762     // member.
1763     auto *NamingClass = this->NamingClass;
1764     QualType BaseType = this->BaseType;
1765     if (auto *Cls = llvm::dyn_cast_or_null<CXXRecordDecl>(Ctx)) {
1766       if (!NamingClass)
1767         NamingClass = Cls;
1768       // When we emulate implicit 'this->' in an unqualified lookup, we might
1769       // end up with an invalid naming class. In that case, we avoid emulating
1770       // 'this->' qualifier to satisfy preconditions of the access checking.
1771       if (NamingClass->getCanonicalDecl() != Cls->getCanonicalDecl() &&
1772           !NamingClass->isDerivedFrom(Cls)) {
1773         NamingClass = Cls;
1774         BaseType = QualType();
1775       }
1776     } else {
1777       // The decl was found outside the C++ class, so only ObjC access checks
1778       // apply. Those do not rely on NamingClass and BaseType, so we clear them
1779       // out.
1780       NamingClass = nullptr;
1781       BaseType = QualType();
1782     }
1783     return Results.getSema().IsSimplyAccessible(ND, NamingClass, BaseType);
1784   }
1785 };
1786 } // namespace
1787 
1788 /// Add type specifiers for the current language as keyword results.
1789 static void AddTypeSpecifierResults(const LangOptions &LangOpts,
1790                                     ResultBuilder &Results) {
1791   typedef CodeCompletionResult Result;
1792   Results.AddResult(Result("short", CCP_Type));
1793   Results.AddResult(Result("long", CCP_Type));
1794   Results.AddResult(Result("signed", CCP_Type));
1795   Results.AddResult(Result("unsigned", CCP_Type));
1796   Results.AddResult(Result("void", CCP_Type));
1797   Results.AddResult(Result("char", CCP_Type));
1798   Results.AddResult(Result("int", CCP_Type));
1799   Results.AddResult(Result("float", CCP_Type));
1800   Results.AddResult(Result("double", CCP_Type));
1801   Results.AddResult(Result("enum", CCP_Type));
1802   Results.AddResult(Result("struct", CCP_Type));
1803   Results.AddResult(Result("union", CCP_Type));
1804   Results.AddResult(Result("const", CCP_Type));
1805   Results.AddResult(Result("volatile", CCP_Type));
1806 
1807   if (LangOpts.C99) {
1808     // C99-specific
1809     Results.AddResult(Result("_Complex", CCP_Type));
1810     if (!LangOpts.C2y)
1811       Results.AddResult(Result("_Imaginary", CCP_Type));
1812     Results.AddResult(Result("_Bool", CCP_Type));
1813     Results.AddResult(Result("restrict", CCP_Type));
1814   }
1815 
1816   CodeCompletionBuilder Builder(Results.getAllocator(),
1817                                 Results.getCodeCompletionTUInfo());
1818   if (LangOpts.CPlusPlus) {
1819     // C++-specific
1820     Results.AddResult(
1821         Result("bool", CCP_Type + (LangOpts.ObjC ? CCD_bool_in_ObjC : 0)));
1822     Results.AddResult(Result("class", CCP_Type));
1823     Results.AddResult(Result("wchar_t", CCP_Type));
1824 
1825     // typename name
1826     Builder.AddTypedTextChunk("typename");
1827     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1828     Builder.AddPlaceholderChunk("name");
1829     Results.AddResult(Result(Builder.TakeString()));
1830 
1831     if (LangOpts.CPlusPlus11) {
1832       Results.AddResult(Result("auto", CCP_Type));
1833       Results.AddResult(Result("char16_t", CCP_Type));
1834       Results.AddResult(Result("char32_t", CCP_Type));
1835 
1836       Builder.AddTypedTextChunk("decltype");
1837       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1838       Builder.AddPlaceholderChunk("expression");
1839       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1840       Results.AddResult(Result(Builder.TakeString()));
1841     }
1842 
1843     if (LangOpts.Char8 || LangOpts.CPlusPlus20)
1844       Results.AddResult(Result("char8_t", CCP_Type));
1845   } else
1846     Results.AddResult(Result("__auto_type", CCP_Type));
1847 
1848   // GNU keywords
1849   if (LangOpts.GNUKeywords) {
1850     // FIXME: Enable when we actually support decimal floating point.
1851     //    Results.AddResult(Result("_Decimal32"));
1852     //    Results.AddResult(Result("_Decimal64"));
1853     //    Results.AddResult(Result("_Decimal128"));
1854 
1855     Builder.AddTypedTextChunk("typeof");
1856     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1857     Builder.AddPlaceholderChunk("expression");
1858     Results.AddResult(Result(Builder.TakeString()));
1859 
1860     Builder.AddTypedTextChunk("typeof");
1861     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1862     Builder.AddPlaceholderChunk("type");
1863     Builder.AddChunk(CodeCompletionString::CK_RightParen);
1864     Results.AddResult(Result(Builder.TakeString()));
1865   }
1866 
1867   // Nullability
1868   Results.AddResult(Result("_Nonnull", CCP_Type));
1869   Results.AddResult(Result("_Null_unspecified", CCP_Type));
1870   Results.AddResult(Result("_Nullable", CCP_Type));
1871 }
1872 
1873 static void
1874 AddStorageSpecifiers(SemaCodeCompletion::ParserCompletionContext CCC,
1875                      const LangOptions &LangOpts, ResultBuilder &Results) {
1876   typedef CodeCompletionResult Result;
1877   // Note: we don't suggest either "auto" or "register", because both
1878   // are pointless as storage specifiers. Elsewhere, we suggest "auto"
1879   // in C++0x as a type specifier.
1880   Results.AddResult(Result("extern"));
1881   Results.AddResult(Result("static"));
1882 
1883   if (LangOpts.CPlusPlus11) {
1884     CodeCompletionAllocator &Allocator = Results.getAllocator();
1885     CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
1886 
1887     // alignas
1888     Builder.AddTypedTextChunk("alignas");
1889     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1890     Builder.AddPlaceholderChunk("expression");
1891     Builder.AddChunk(CodeCompletionString::CK_RightParen);
1892     Results.AddResult(Result(Builder.TakeString()));
1893 
1894     Results.AddResult(Result("constexpr"));
1895     Results.AddResult(Result("thread_local"));
1896   }
1897 
1898   if (LangOpts.CPlusPlus20)
1899     Results.AddResult(Result("constinit"));
1900 }
1901 
1902 static void
1903 AddFunctionSpecifiers(SemaCodeCompletion::ParserCompletionContext CCC,
1904                       const LangOptions &LangOpts, ResultBuilder &Results) {
1905   typedef CodeCompletionResult Result;
1906   switch (CCC) {
1907   case SemaCodeCompletion::PCC_Class:
1908   case SemaCodeCompletion::PCC_MemberTemplate:
1909     if (LangOpts.CPlusPlus) {
1910       Results.AddResult(Result("explicit"));
1911       Results.AddResult(Result("friend"));
1912       Results.AddResult(Result("mutable"));
1913       Results.AddResult(Result("virtual"));
1914     }
1915     [[fallthrough]];
1916 
1917   case SemaCodeCompletion::PCC_ObjCInterface:
1918   case SemaCodeCompletion::PCC_ObjCImplementation:
1919   case SemaCodeCompletion::PCC_Namespace:
1920   case SemaCodeCompletion::PCC_Template:
1921     if (LangOpts.CPlusPlus || LangOpts.C99)
1922       Results.AddResult(Result("inline"));
1923 
1924     if (LangOpts.CPlusPlus20)
1925       Results.AddResult(Result("consteval"));
1926     break;
1927 
1928   case SemaCodeCompletion::PCC_ObjCInstanceVariableList:
1929   case SemaCodeCompletion::PCC_Expression:
1930   case SemaCodeCompletion::PCC_Statement:
1931   case SemaCodeCompletion::PCC_TopLevelOrExpression:
1932   case SemaCodeCompletion::PCC_ForInit:
1933   case SemaCodeCompletion::PCC_Condition:
1934   case SemaCodeCompletion::PCC_RecoveryInFunction:
1935   case SemaCodeCompletion::PCC_Type:
1936   case SemaCodeCompletion::PCC_ParenthesizedExpression:
1937   case SemaCodeCompletion::PCC_LocalDeclarationSpecifiers:
1938     break;
1939   }
1940 }
1941 
1942 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt);
1943 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt);
1944 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
1945                                      ResultBuilder &Results, bool NeedAt);
1946 static void AddObjCImplementationResults(const LangOptions &LangOpts,
1947                                          ResultBuilder &Results, bool NeedAt);
1948 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
1949                                     ResultBuilder &Results, bool NeedAt);
1950 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt);
1951 
1952 static void AddTypedefResult(ResultBuilder &Results) {
1953   CodeCompletionBuilder Builder(Results.getAllocator(),
1954                                 Results.getCodeCompletionTUInfo());
1955   Builder.AddTypedTextChunk("typedef");
1956   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1957   Builder.AddPlaceholderChunk("type");
1958   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1959   Builder.AddPlaceholderChunk("name");
1960   Builder.AddChunk(CodeCompletionString::CK_SemiColon);
1961   Results.AddResult(CodeCompletionResult(Builder.TakeString()));
1962 }
1963 
1964 // using name = type
1965 static void AddUsingAliasResult(CodeCompletionBuilder &Builder,
1966                                 ResultBuilder &Results) {
1967   Builder.AddTypedTextChunk("using");
1968   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1969   Builder.AddPlaceholderChunk("name");
1970   Builder.AddChunk(CodeCompletionString::CK_Equal);
1971   Builder.AddPlaceholderChunk("type");
1972   Builder.AddChunk(CodeCompletionString::CK_SemiColon);
1973   Results.AddResult(CodeCompletionResult(Builder.TakeString()));
1974 }
1975 
1976 static bool WantTypesInContext(SemaCodeCompletion::ParserCompletionContext CCC,
1977                                const LangOptions &LangOpts) {
1978   switch (CCC) {
1979   case SemaCodeCompletion::PCC_Namespace:
1980   case SemaCodeCompletion::PCC_Class:
1981   case SemaCodeCompletion::PCC_ObjCInstanceVariableList:
1982   case SemaCodeCompletion::PCC_Template:
1983   case SemaCodeCompletion::PCC_MemberTemplate:
1984   case SemaCodeCompletion::PCC_Statement:
1985   case SemaCodeCompletion::PCC_RecoveryInFunction:
1986   case SemaCodeCompletion::PCC_Type:
1987   case SemaCodeCompletion::PCC_ParenthesizedExpression:
1988   case SemaCodeCompletion::PCC_LocalDeclarationSpecifiers:
1989   case SemaCodeCompletion::PCC_TopLevelOrExpression:
1990     return true;
1991 
1992   case SemaCodeCompletion::PCC_Expression:
1993   case SemaCodeCompletion::PCC_Condition:
1994     return LangOpts.CPlusPlus;
1995 
1996   case SemaCodeCompletion::PCC_ObjCInterface:
1997   case SemaCodeCompletion::PCC_ObjCImplementation:
1998     return false;
1999 
2000   case SemaCodeCompletion::PCC_ForInit:
2001     return LangOpts.CPlusPlus || LangOpts.ObjC || LangOpts.C99;
2002   }
2003 
2004   llvm_unreachable("Invalid ParserCompletionContext!");
2005 }
2006 
2007 static PrintingPolicy getCompletionPrintingPolicy(const ASTContext &Context,
2008                                                   const Preprocessor &PP) {
2009   PrintingPolicy Policy = Sema::getPrintingPolicy(Context, PP);
2010   Policy.AnonymousTagLocations = false;
2011   Policy.SuppressStrongLifetime = true;
2012   Policy.SuppressUnwrittenScope = true;
2013   Policy.SuppressScope = true;
2014   Policy.CleanUglifiedParameters = true;
2015   return Policy;
2016 }
2017 
2018 /// Retrieve a printing policy suitable for code completion.
2019 static PrintingPolicy getCompletionPrintingPolicy(Sema &S) {
2020   return getCompletionPrintingPolicy(S.Context, S.PP);
2021 }
2022 
2023 /// Retrieve the string representation of the given type as a string
2024 /// that has the appropriate lifetime for code completion.
2025 ///
2026 /// This routine provides a fast path where we provide constant strings for
2027 /// common type names.
2028 static const char *GetCompletionTypeString(QualType T, ASTContext &Context,
2029                                            const PrintingPolicy &Policy,
2030                                            CodeCompletionAllocator &Allocator) {
2031   if (!T.getLocalQualifiers()) {
2032     // Built-in type names are constant strings.
2033     if (const BuiltinType *BT = dyn_cast<BuiltinType>(T))
2034       return BT->getNameAsCString(Policy);
2035 
2036     // Anonymous tag types are constant strings.
2037     if (const TagType *TagT = dyn_cast<TagType>(T))
2038       if (TagDecl *Tag = TagT->getDecl())
2039         if (!Tag->hasNameForLinkage()) {
2040           switch (Tag->getTagKind()) {
2041           case TagTypeKind::Struct:
2042             return "struct <anonymous>";
2043           case TagTypeKind::Interface:
2044             return "__interface <anonymous>";
2045           case TagTypeKind::Class:
2046             return "class <anonymous>";
2047           case TagTypeKind::Union:
2048             return "union <anonymous>";
2049           case TagTypeKind::Enum:
2050             return "enum <anonymous>";
2051           }
2052         }
2053   }
2054 
2055   // Slow path: format the type as a string.
2056   std::string Result;
2057   T.getAsStringInternal(Result, Policy);
2058   return Allocator.CopyString(Result);
2059 }
2060 
2061 /// Add a completion for "this", if we're in a member function.
2062 static void addThisCompletion(Sema &S, ResultBuilder &Results) {
2063   QualType ThisTy = S.getCurrentThisType();
2064   if (ThisTy.isNull())
2065     return;
2066 
2067   CodeCompletionAllocator &Allocator = Results.getAllocator();
2068   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
2069   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
2070   Builder.AddResultTypeChunk(
2071       GetCompletionTypeString(ThisTy, S.Context, Policy, Allocator));
2072   Builder.AddTypedTextChunk("this");
2073   Results.AddResult(CodeCompletionResult(Builder.TakeString()));
2074 }
2075 
2076 static void AddStaticAssertResult(CodeCompletionBuilder &Builder,
2077                                   ResultBuilder &Results,
2078                                   const LangOptions &LangOpts) {
2079   if (!LangOpts.CPlusPlus11)
2080     return;
2081 
2082   Builder.AddTypedTextChunk("static_assert");
2083   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2084   Builder.AddPlaceholderChunk("expression");
2085   Builder.AddChunk(CodeCompletionString::CK_Comma);
2086   Builder.AddPlaceholderChunk("message");
2087   Builder.AddChunk(CodeCompletionString::CK_RightParen);
2088   Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2089   Results.AddResult(CodeCompletionResult(Builder.TakeString()));
2090 }
2091 
2092 static void AddOverrideResults(ResultBuilder &Results,
2093                                const CodeCompletionContext &CCContext,
2094                                CodeCompletionBuilder &Builder) {
2095   Sema &S = Results.getSema();
2096   const auto *CR = llvm::dyn_cast<CXXRecordDecl>(S.CurContext);
2097   // If not inside a class/struct/union return empty.
2098   if (!CR)
2099     return;
2100   // First store overrides within current class.
2101   // These are stored by name to make querying fast in the later step.
2102   llvm::StringMap<std::vector<FunctionDecl *>> Overrides;
2103   for (auto *Method : CR->methods()) {
2104     if (!Method->isVirtual() || !Method->getIdentifier())
2105       continue;
2106     Overrides[Method->getName()].push_back(Method);
2107   }
2108 
2109   for (const auto &Base : CR->bases()) {
2110     const auto *BR = Base.getType().getTypePtr()->getAsCXXRecordDecl();
2111     if (!BR)
2112       continue;
2113     for (auto *Method : BR->methods()) {
2114       if (!Method->isVirtual() || !Method->getIdentifier())
2115         continue;
2116       const auto it = Overrides.find(Method->getName());
2117       bool IsOverriden = false;
2118       if (it != Overrides.end()) {
2119         for (auto *MD : it->second) {
2120           // If the method in current body is not an overload of this virtual
2121           // function, then it overrides this one.
2122           if (!S.IsOverload(MD, Method, false)) {
2123             IsOverriden = true;
2124             break;
2125           }
2126         }
2127       }
2128       if (!IsOverriden) {
2129         // Generates a new CodeCompletionResult by taking this function and
2130         // converting it into an override declaration with only one chunk in the
2131         // final CodeCompletionString as a TypedTextChunk.
2132         CodeCompletionResult CCR(Method, 0);
2133         PrintingPolicy Policy =
2134             getCompletionPrintingPolicy(S.getASTContext(), S.getPreprocessor());
2135         auto *CCS = CCR.createCodeCompletionStringForOverride(
2136             S.getPreprocessor(), S.getASTContext(), Builder,
2137             /*IncludeBriefComments=*/false, CCContext, Policy);
2138         Results.AddResult(CodeCompletionResult(CCS, Method, CCP_CodePattern));
2139       }
2140     }
2141   }
2142 }
2143 
2144 /// Add language constructs that show up for "ordinary" names.
2145 static void
2146 AddOrdinaryNameResults(SemaCodeCompletion::ParserCompletionContext CCC,
2147                        Scope *S, Sema &SemaRef, ResultBuilder &Results) {
2148   CodeCompletionAllocator &Allocator = Results.getAllocator();
2149   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
2150 
2151   typedef CodeCompletionResult Result;
2152   switch (CCC) {
2153   case SemaCodeCompletion::PCC_Namespace:
2154     if (SemaRef.getLangOpts().CPlusPlus) {
2155       if (Results.includeCodePatterns()) {
2156         // namespace <identifier> { declarations }
2157         Builder.AddTypedTextChunk("namespace");
2158         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2159         Builder.AddPlaceholderChunk("identifier");
2160         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2161         Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2162         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2163         Builder.AddPlaceholderChunk("declarations");
2164         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2165         Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2166         Results.AddResult(Result(Builder.TakeString()));
2167       }
2168 
2169       // namespace identifier = identifier ;
2170       Builder.AddTypedTextChunk("namespace");
2171       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2172       Builder.AddPlaceholderChunk("name");
2173       Builder.AddChunk(CodeCompletionString::CK_Equal);
2174       Builder.AddPlaceholderChunk("namespace");
2175       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2176       Results.AddResult(Result(Builder.TakeString()));
2177 
2178       // Using directives
2179       Builder.AddTypedTextChunk("using namespace");
2180       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2181       Builder.AddPlaceholderChunk("identifier");
2182       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2183       Results.AddResult(Result(Builder.TakeString()));
2184 
2185       // asm(string-literal)
2186       Builder.AddTypedTextChunk("asm");
2187       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2188       Builder.AddPlaceholderChunk("string-literal");
2189       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2190       Results.AddResult(Result(Builder.TakeString()));
2191 
2192       if (Results.includeCodePatterns()) {
2193         // Explicit template instantiation
2194         Builder.AddTypedTextChunk("template");
2195         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2196         Builder.AddPlaceholderChunk("declaration");
2197         Results.AddResult(Result(Builder.TakeString()));
2198       } else {
2199         Results.AddResult(Result("template", CodeCompletionResult::RK_Keyword));
2200       }
2201 
2202       if (SemaRef.getLangOpts().CPlusPlus20 &&
2203           SemaRef.getLangOpts().CPlusPlusModules) {
2204         clang::Module *CurrentModule = SemaRef.getCurrentModule();
2205         if (SemaRef.CurContext->isTranslationUnit()) {
2206           /// Global module fragment can only be declared in the beginning of
2207           /// the file. CurrentModule should be null in this case.
2208           if (!CurrentModule) {
2209             // module;
2210             Builder.AddTypedTextChunk("module");
2211             Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2212             Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2213             Results.AddResult(Result(Builder.TakeString()));
2214           }
2215 
2216           /// Named module should be declared in the beginning of the file,
2217           /// or after the global module fragment.
2218           if (!CurrentModule ||
2219               CurrentModule->Kind == Module::ExplicitGlobalModuleFragment ||
2220               CurrentModule->Kind == Module::ImplicitGlobalModuleFragment) {
2221             // export module;
2222             // module name;
2223             Builder.AddTypedTextChunk("module");
2224             Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2225             Builder.AddPlaceholderChunk("name");
2226             Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2227             Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2228             Results.AddResult(Result(Builder.TakeString()));
2229           }
2230 
2231           /// Import can occur in non module file or after the named module
2232           /// declaration.
2233           if (!CurrentModule ||
2234               CurrentModule->Kind == Module::ModuleInterfaceUnit ||
2235               CurrentModule->Kind == Module::ModulePartitionInterface) {
2236             // import name;
2237             Builder.AddTypedTextChunk("import");
2238             Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2239             Builder.AddPlaceholderChunk("name");
2240             Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2241             Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2242             Results.AddResult(Result(Builder.TakeString()));
2243           }
2244 
2245           if (CurrentModule &&
2246               (CurrentModule->Kind == Module::ModuleInterfaceUnit ||
2247                CurrentModule->Kind == Module::ModulePartitionInterface)) {
2248             // module: private;
2249             Builder.AddTypedTextChunk("module");
2250             Builder.AddChunk(CodeCompletionString::CK_Colon);
2251             Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2252             Builder.AddTypedTextChunk("private");
2253             Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2254             Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2255             Results.AddResult(Result(Builder.TakeString()));
2256           }
2257         }
2258 
2259         // export
2260         if (!CurrentModule ||
2261             CurrentModule->Kind != Module::ModuleKind::PrivateModuleFragment)
2262           Results.AddResult(Result("export", CodeCompletionResult::RK_Keyword));
2263       }
2264     }
2265 
2266     if (SemaRef.getLangOpts().ObjC)
2267       AddObjCTopLevelResults(Results, true);
2268 
2269     AddTypedefResult(Results);
2270     [[fallthrough]];
2271 
2272   case SemaCodeCompletion::PCC_Class:
2273     if (SemaRef.getLangOpts().CPlusPlus) {
2274       // Using declaration
2275       Builder.AddTypedTextChunk("using");
2276       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2277       Builder.AddPlaceholderChunk("qualifier");
2278       Builder.AddTextChunk("::");
2279       Builder.AddPlaceholderChunk("name");
2280       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2281       Results.AddResult(Result(Builder.TakeString()));
2282 
2283       if (SemaRef.getLangOpts().CPlusPlus11)
2284         AddUsingAliasResult(Builder, Results);
2285 
2286       // using typename qualifier::name (only in a dependent context)
2287       if (SemaRef.CurContext->isDependentContext()) {
2288         Builder.AddTypedTextChunk("using typename");
2289         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2290         Builder.AddPlaceholderChunk("qualifier");
2291         Builder.AddTextChunk("::");
2292         Builder.AddPlaceholderChunk("name");
2293         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2294         Results.AddResult(Result(Builder.TakeString()));
2295       }
2296 
2297       AddStaticAssertResult(Builder, Results, SemaRef.getLangOpts());
2298 
2299       if (CCC == SemaCodeCompletion::PCC_Class) {
2300         AddTypedefResult(Results);
2301 
2302         bool IsNotInheritanceScope = !S->isClassInheritanceScope();
2303         // public:
2304         Builder.AddTypedTextChunk("public");
2305         if (IsNotInheritanceScope && Results.includeCodePatterns())
2306           Builder.AddChunk(CodeCompletionString::CK_Colon);
2307         Results.AddResult(Result(Builder.TakeString()));
2308 
2309         // protected:
2310         Builder.AddTypedTextChunk("protected");
2311         if (IsNotInheritanceScope && Results.includeCodePatterns())
2312           Builder.AddChunk(CodeCompletionString::CK_Colon);
2313         Results.AddResult(Result(Builder.TakeString()));
2314 
2315         // private:
2316         Builder.AddTypedTextChunk("private");
2317         if (IsNotInheritanceScope && Results.includeCodePatterns())
2318           Builder.AddChunk(CodeCompletionString::CK_Colon);
2319         Results.AddResult(Result(Builder.TakeString()));
2320 
2321         // FIXME: This adds override results only if we are at the first word of
2322         // the declaration/definition. Also call this from other sides to have
2323         // more use-cases.
2324         AddOverrideResults(Results, CodeCompletionContext::CCC_ClassStructUnion,
2325                            Builder);
2326       }
2327     }
2328     [[fallthrough]];
2329 
2330   case SemaCodeCompletion::PCC_Template:
2331     if (SemaRef.getLangOpts().CPlusPlus20 &&
2332         CCC == SemaCodeCompletion::PCC_Template)
2333       Results.AddResult(Result("concept", CCP_Keyword));
2334     [[fallthrough]];
2335 
2336   case SemaCodeCompletion::PCC_MemberTemplate:
2337     if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns()) {
2338       // template < parameters >
2339       Builder.AddTypedTextChunk("template");
2340       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2341       Builder.AddPlaceholderChunk("parameters");
2342       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2343       Results.AddResult(Result(Builder.TakeString()));
2344     } else {
2345       Results.AddResult(Result("template", CodeCompletionResult::RK_Keyword));
2346     }
2347 
2348     if (SemaRef.getLangOpts().CPlusPlus20 &&
2349         (CCC == SemaCodeCompletion::PCC_Template ||
2350          CCC == SemaCodeCompletion::PCC_MemberTemplate))
2351       Results.AddResult(Result("requires", CCP_Keyword));
2352 
2353     AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2354     AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2355     break;
2356 
2357   case SemaCodeCompletion::PCC_ObjCInterface:
2358     AddObjCInterfaceResults(SemaRef.getLangOpts(), Results, true);
2359     AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2360     AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2361     break;
2362 
2363   case SemaCodeCompletion::PCC_ObjCImplementation:
2364     AddObjCImplementationResults(SemaRef.getLangOpts(), Results, true);
2365     AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2366     AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2367     break;
2368 
2369   case SemaCodeCompletion::PCC_ObjCInstanceVariableList:
2370     AddObjCVisibilityResults(SemaRef.getLangOpts(), Results, true);
2371     break;
2372 
2373   case SemaCodeCompletion::PCC_RecoveryInFunction:
2374   case SemaCodeCompletion::PCC_TopLevelOrExpression:
2375   case SemaCodeCompletion::PCC_Statement: {
2376     if (SemaRef.getLangOpts().CPlusPlus11)
2377       AddUsingAliasResult(Builder, Results);
2378 
2379     AddTypedefResult(Results);
2380 
2381     if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns() &&
2382         SemaRef.getLangOpts().CXXExceptions) {
2383       Builder.AddTypedTextChunk("try");
2384       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2385       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2386       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2387       Builder.AddPlaceholderChunk("statements");
2388       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2389       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2390       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2391       Builder.AddTextChunk("catch");
2392       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2393       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2394       Builder.AddPlaceholderChunk("declaration");
2395       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2396       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2397       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2398       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2399       Builder.AddPlaceholderChunk("statements");
2400       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2401       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2402       Results.AddResult(Result(Builder.TakeString()));
2403     }
2404     if (SemaRef.getLangOpts().ObjC)
2405       AddObjCStatementResults(Results, true);
2406 
2407     if (Results.includeCodePatterns()) {
2408       // if (condition) { statements }
2409       Builder.AddTypedTextChunk("if");
2410       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2411       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2412       if (SemaRef.getLangOpts().CPlusPlus)
2413         Builder.AddPlaceholderChunk("condition");
2414       else
2415         Builder.AddPlaceholderChunk("expression");
2416       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2417       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2418       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2419       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2420       Builder.AddPlaceholderChunk("statements");
2421       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2422       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2423       Results.AddResult(Result(Builder.TakeString()));
2424 
2425       // switch (condition) { }
2426       Builder.AddTypedTextChunk("switch");
2427       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2428       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2429       if (SemaRef.getLangOpts().CPlusPlus)
2430         Builder.AddPlaceholderChunk("condition");
2431       else
2432         Builder.AddPlaceholderChunk("expression");
2433       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2434       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2435       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2436       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2437       Builder.AddPlaceholderChunk("cases");
2438       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2439       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2440       Results.AddResult(Result(Builder.TakeString()));
2441     }
2442 
2443     // Switch-specific statements.
2444     if (SemaRef.getCurFunction() &&
2445         !SemaRef.getCurFunction()->SwitchStack.empty()) {
2446       // case expression:
2447       Builder.AddTypedTextChunk("case");
2448       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2449       Builder.AddPlaceholderChunk("expression");
2450       Builder.AddChunk(CodeCompletionString::CK_Colon);
2451       Results.AddResult(Result(Builder.TakeString()));
2452 
2453       // default:
2454       Builder.AddTypedTextChunk("default");
2455       Builder.AddChunk(CodeCompletionString::CK_Colon);
2456       Results.AddResult(Result(Builder.TakeString()));
2457     }
2458 
2459     if (Results.includeCodePatterns()) {
2460       /// while (condition) { statements }
2461       Builder.AddTypedTextChunk("while");
2462       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2463       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2464       if (SemaRef.getLangOpts().CPlusPlus)
2465         Builder.AddPlaceholderChunk("condition");
2466       else
2467         Builder.AddPlaceholderChunk("expression");
2468       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2469       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2470       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2471       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2472       Builder.AddPlaceholderChunk("statements");
2473       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2474       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2475       Results.AddResult(Result(Builder.TakeString()));
2476 
2477       // do { statements } while ( expression );
2478       Builder.AddTypedTextChunk("do");
2479       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2480       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2481       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2482       Builder.AddPlaceholderChunk("statements");
2483       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2484       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2485       Builder.AddTextChunk("while");
2486       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2487       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2488       Builder.AddPlaceholderChunk("expression");
2489       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2490       Results.AddResult(Result(Builder.TakeString()));
2491 
2492       // for ( for-init-statement ; condition ; expression ) { statements }
2493       Builder.AddTypedTextChunk("for");
2494       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2495       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2496       if (SemaRef.getLangOpts().CPlusPlus || SemaRef.getLangOpts().C99)
2497         Builder.AddPlaceholderChunk("init-statement");
2498       else
2499         Builder.AddPlaceholderChunk("init-expression");
2500       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2501       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2502       Builder.AddPlaceholderChunk("condition");
2503       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2504       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2505       Builder.AddPlaceholderChunk("inc-expression");
2506       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2507       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2508       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2509       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2510       Builder.AddPlaceholderChunk("statements");
2511       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2512       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2513       Results.AddResult(Result(Builder.TakeString()));
2514 
2515       if (SemaRef.getLangOpts().CPlusPlus11 || SemaRef.getLangOpts().ObjC) {
2516         // for ( range_declaration (:|in) range_expression ) { statements }
2517         Builder.AddTypedTextChunk("for");
2518         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2519         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2520         Builder.AddPlaceholderChunk("range-declaration");
2521         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2522         if (SemaRef.getLangOpts().ObjC)
2523           Builder.AddTextChunk("in");
2524         else
2525           Builder.AddChunk(CodeCompletionString::CK_Colon);
2526         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2527         Builder.AddPlaceholderChunk("range-expression");
2528         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2529         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2530         Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2531         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2532         Builder.AddPlaceholderChunk("statements");
2533         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2534         Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2535         Results.AddResult(Result(Builder.TakeString()));
2536       }
2537     }
2538 
2539     if (S->getContinueParent()) {
2540       // continue ;
2541       Builder.AddTypedTextChunk("continue");
2542       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2543       Results.AddResult(Result(Builder.TakeString()));
2544     }
2545 
2546     if (S->getBreakParent()) {
2547       // break ;
2548       Builder.AddTypedTextChunk("break");
2549       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2550       Results.AddResult(Result(Builder.TakeString()));
2551     }
2552 
2553     // "return expression ;" or "return ;", depending on the return type.
2554     QualType ReturnType;
2555     if (const auto *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext))
2556       ReturnType = Function->getReturnType();
2557     else if (const auto *Method = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext))
2558       ReturnType = Method->getReturnType();
2559     else if (SemaRef.getCurBlock() &&
2560              !SemaRef.getCurBlock()->ReturnType.isNull())
2561       ReturnType = SemaRef.getCurBlock()->ReturnType;;
2562     if (ReturnType.isNull() || ReturnType->isVoidType()) {
2563       Builder.AddTypedTextChunk("return");
2564       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2565       Results.AddResult(Result(Builder.TakeString()));
2566     } else {
2567       assert(!ReturnType.isNull());
2568       // "return expression ;"
2569       Builder.AddTypedTextChunk("return");
2570       Builder.AddChunk(clang::CodeCompletionString::CK_HorizontalSpace);
2571       Builder.AddPlaceholderChunk("expression");
2572       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2573       Results.AddResult(Result(Builder.TakeString()));
2574       // "co_return expression ;" for coroutines(C++20).
2575       if (SemaRef.getLangOpts().CPlusPlus20) {
2576         Builder.AddTypedTextChunk("co_return");
2577         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2578         Builder.AddPlaceholderChunk("expression");
2579         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2580         Results.AddResult(Result(Builder.TakeString()));
2581       }
2582       // When boolean, also add 'return true;' and 'return false;'.
2583       if (ReturnType->isBooleanType()) {
2584         Builder.AddTypedTextChunk("return true");
2585         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2586         Results.AddResult(Result(Builder.TakeString()));
2587 
2588         Builder.AddTypedTextChunk("return false");
2589         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2590         Results.AddResult(Result(Builder.TakeString()));
2591       }
2592       // For pointers, suggest 'return nullptr' in C++.
2593       if (SemaRef.getLangOpts().CPlusPlus11 &&
2594           (ReturnType->isPointerType() || ReturnType->isMemberPointerType())) {
2595         Builder.AddTypedTextChunk("return nullptr");
2596         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2597         Results.AddResult(Result(Builder.TakeString()));
2598       }
2599     }
2600 
2601     // goto identifier ;
2602     Builder.AddTypedTextChunk("goto");
2603     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2604     Builder.AddPlaceholderChunk("label");
2605     Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2606     Results.AddResult(Result(Builder.TakeString()));
2607 
2608     // Using directives
2609     Builder.AddTypedTextChunk("using namespace");
2610     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2611     Builder.AddPlaceholderChunk("identifier");
2612     Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2613     Results.AddResult(Result(Builder.TakeString()));
2614 
2615     AddStaticAssertResult(Builder, Results, SemaRef.getLangOpts());
2616   }
2617     [[fallthrough]];
2618 
2619   // Fall through (for statement expressions).
2620   case SemaCodeCompletion::PCC_ForInit:
2621   case SemaCodeCompletion::PCC_Condition:
2622     AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2623     // Fall through: conditions and statements can have expressions.
2624     [[fallthrough]];
2625 
2626   case SemaCodeCompletion::PCC_ParenthesizedExpression:
2627     if (SemaRef.getLangOpts().ObjCAutoRefCount &&
2628         CCC == SemaCodeCompletion::PCC_ParenthesizedExpression) {
2629       // (__bridge <type>)<expression>
2630       Builder.AddTypedTextChunk("__bridge");
2631       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2632       Builder.AddPlaceholderChunk("type");
2633       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2634       Builder.AddPlaceholderChunk("expression");
2635       Results.AddResult(Result(Builder.TakeString()));
2636 
2637       // (__bridge_transfer <Objective-C type>)<expression>
2638       Builder.AddTypedTextChunk("__bridge_transfer");
2639       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2640       Builder.AddPlaceholderChunk("Objective-C type");
2641       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2642       Builder.AddPlaceholderChunk("expression");
2643       Results.AddResult(Result(Builder.TakeString()));
2644 
2645       // (__bridge_retained <CF type>)<expression>
2646       Builder.AddTypedTextChunk("__bridge_retained");
2647       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2648       Builder.AddPlaceholderChunk("CF type");
2649       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2650       Builder.AddPlaceholderChunk("expression");
2651       Results.AddResult(Result(Builder.TakeString()));
2652     }
2653     // Fall through
2654     [[fallthrough]];
2655 
2656   case SemaCodeCompletion::PCC_Expression: {
2657     if (SemaRef.getLangOpts().CPlusPlus) {
2658       // 'this', if we're in a non-static member function.
2659       addThisCompletion(SemaRef, Results);
2660 
2661       // true
2662       Builder.AddResultTypeChunk("bool");
2663       Builder.AddTypedTextChunk("true");
2664       Results.AddResult(Result(Builder.TakeString()));
2665 
2666       // false
2667       Builder.AddResultTypeChunk("bool");
2668       Builder.AddTypedTextChunk("false");
2669       Results.AddResult(Result(Builder.TakeString()));
2670 
2671       if (SemaRef.getLangOpts().RTTI) {
2672         // dynamic_cast < type-id > ( expression )
2673         Builder.AddTypedTextChunk("dynamic_cast");
2674         Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2675         Builder.AddPlaceholderChunk("type");
2676         Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2677         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2678         Builder.AddPlaceholderChunk("expression");
2679         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2680         Results.AddResult(Result(Builder.TakeString()));
2681       }
2682 
2683       // static_cast < type-id > ( expression )
2684       Builder.AddTypedTextChunk("static_cast");
2685       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2686       Builder.AddPlaceholderChunk("type");
2687       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2688       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2689       Builder.AddPlaceholderChunk("expression");
2690       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2691       Results.AddResult(Result(Builder.TakeString()));
2692 
2693       // reinterpret_cast < type-id > ( expression )
2694       Builder.AddTypedTextChunk("reinterpret_cast");
2695       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2696       Builder.AddPlaceholderChunk("type");
2697       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2698       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2699       Builder.AddPlaceholderChunk("expression");
2700       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2701       Results.AddResult(Result(Builder.TakeString()));
2702 
2703       // const_cast < type-id > ( expression )
2704       Builder.AddTypedTextChunk("const_cast");
2705       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2706       Builder.AddPlaceholderChunk("type");
2707       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2708       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2709       Builder.AddPlaceholderChunk("expression");
2710       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2711       Results.AddResult(Result(Builder.TakeString()));
2712 
2713       if (SemaRef.getLangOpts().RTTI) {
2714         // typeid ( expression-or-type )
2715         Builder.AddResultTypeChunk("std::type_info");
2716         Builder.AddTypedTextChunk("typeid");
2717         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2718         Builder.AddPlaceholderChunk("expression-or-type");
2719         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2720         Results.AddResult(Result(Builder.TakeString()));
2721       }
2722 
2723       // new T ( ... )
2724       Builder.AddTypedTextChunk("new");
2725       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2726       Builder.AddPlaceholderChunk("type");
2727       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2728       Builder.AddPlaceholderChunk("expressions");
2729       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2730       Results.AddResult(Result(Builder.TakeString()));
2731 
2732       // new T [ ] ( ... )
2733       Builder.AddTypedTextChunk("new");
2734       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2735       Builder.AddPlaceholderChunk("type");
2736       Builder.AddChunk(CodeCompletionString::CK_LeftBracket);
2737       Builder.AddPlaceholderChunk("size");
2738       Builder.AddChunk(CodeCompletionString::CK_RightBracket);
2739       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2740       Builder.AddPlaceholderChunk("expressions");
2741       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2742       Results.AddResult(Result(Builder.TakeString()));
2743 
2744       // delete expression
2745       Builder.AddResultTypeChunk("void");
2746       Builder.AddTypedTextChunk("delete");
2747       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2748       Builder.AddPlaceholderChunk("expression");
2749       Results.AddResult(Result(Builder.TakeString()));
2750 
2751       // delete [] expression
2752       Builder.AddResultTypeChunk("void");
2753       Builder.AddTypedTextChunk("delete");
2754       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2755       Builder.AddChunk(CodeCompletionString::CK_LeftBracket);
2756       Builder.AddChunk(CodeCompletionString::CK_RightBracket);
2757       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2758       Builder.AddPlaceholderChunk("expression");
2759       Results.AddResult(Result(Builder.TakeString()));
2760 
2761       if (SemaRef.getLangOpts().CXXExceptions) {
2762         // throw expression
2763         Builder.AddResultTypeChunk("void");
2764         Builder.AddTypedTextChunk("throw");
2765         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2766         Builder.AddPlaceholderChunk("expression");
2767         Results.AddResult(Result(Builder.TakeString()));
2768       }
2769 
2770       // FIXME: Rethrow?
2771 
2772       if (SemaRef.getLangOpts().CPlusPlus11) {
2773         // nullptr
2774         Builder.AddResultTypeChunk("std::nullptr_t");
2775         Builder.AddTypedTextChunk("nullptr");
2776         Results.AddResult(Result(Builder.TakeString()));
2777 
2778         // alignof
2779         Builder.AddResultTypeChunk("size_t");
2780         Builder.AddTypedTextChunk("alignof");
2781         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2782         Builder.AddPlaceholderChunk("type");
2783         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2784         Results.AddResult(Result(Builder.TakeString()));
2785 
2786         // noexcept
2787         Builder.AddResultTypeChunk("bool");
2788         Builder.AddTypedTextChunk("noexcept");
2789         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2790         Builder.AddPlaceholderChunk("expression");
2791         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2792         Results.AddResult(Result(Builder.TakeString()));
2793 
2794         // sizeof... expression
2795         Builder.AddResultTypeChunk("size_t");
2796         Builder.AddTypedTextChunk("sizeof...");
2797         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2798         Builder.AddPlaceholderChunk("parameter-pack");
2799         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2800         Results.AddResult(Result(Builder.TakeString()));
2801       }
2802 
2803       if (SemaRef.getLangOpts().CPlusPlus20) {
2804         // co_await expression
2805         Builder.AddTypedTextChunk("co_await");
2806         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2807         Builder.AddPlaceholderChunk("expression");
2808         Results.AddResult(Result(Builder.TakeString()));
2809 
2810         // co_yield expression
2811         Builder.AddTypedTextChunk("co_yield");
2812         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2813         Builder.AddPlaceholderChunk("expression");
2814         Results.AddResult(Result(Builder.TakeString()));
2815 
2816         // requires (parameters) { requirements }
2817         Builder.AddResultTypeChunk("bool");
2818         Builder.AddTypedTextChunk("requires");
2819         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2820         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2821         Builder.AddPlaceholderChunk("parameters");
2822         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2823         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2824         Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2825         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2826         Builder.AddPlaceholderChunk("requirements");
2827         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
2828         Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2829         Results.AddResult(Result(Builder.TakeString()));
2830 
2831         if (SemaRef.CurContext->isRequiresExprBody()) {
2832           // requires expression ;
2833           Builder.AddTypedTextChunk("requires");
2834           Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2835           Builder.AddPlaceholderChunk("expression");
2836           Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2837           Results.AddResult(Result(Builder.TakeString()));
2838         }
2839       }
2840     }
2841 
2842     if (SemaRef.getLangOpts().ObjC) {
2843       // Add "super", if we're in an Objective-C class with a superclass.
2844       if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) {
2845         // The interface can be NULL.
2846         if (ObjCInterfaceDecl *ID = Method->getClassInterface())
2847           if (ID->getSuperClass()) {
2848             std::string SuperType;
2849             SuperType = ID->getSuperClass()->getNameAsString();
2850             if (Method->isInstanceMethod())
2851               SuperType += " *";
2852 
2853             Builder.AddResultTypeChunk(Allocator.CopyString(SuperType));
2854             Builder.AddTypedTextChunk("super");
2855             Results.AddResult(Result(Builder.TakeString()));
2856           }
2857       }
2858 
2859       AddObjCExpressionResults(Results, true);
2860     }
2861 
2862     if (SemaRef.getLangOpts().C11) {
2863       // _Alignof
2864       Builder.AddResultTypeChunk("size_t");
2865       if (SemaRef.PP.isMacroDefined("alignof"))
2866         Builder.AddTypedTextChunk("alignof");
2867       else
2868         Builder.AddTypedTextChunk("_Alignof");
2869       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2870       Builder.AddPlaceholderChunk("type");
2871       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2872       Results.AddResult(Result(Builder.TakeString()));
2873     }
2874 
2875     if (SemaRef.getLangOpts().C23) {
2876       // nullptr
2877       Builder.AddResultTypeChunk("nullptr_t");
2878       Builder.AddTypedTextChunk("nullptr");
2879       Results.AddResult(Result(Builder.TakeString()));
2880     }
2881 
2882     // sizeof expression
2883     Builder.AddResultTypeChunk("size_t");
2884     Builder.AddTypedTextChunk("sizeof");
2885     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2886     Builder.AddPlaceholderChunk("expression-or-type");
2887     Builder.AddChunk(CodeCompletionString::CK_RightParen);
2888     Results.AddResult(Result(Builder.TakeString()));
2889     break;
2890   }
2891 
2892   case SemaCodeCompletion::PCC_Type:
2893   case SemaCodeCompletion::PCC_LocalDeclarationSpecifiers:
2894     break;
2895   }
2896 
2897   if (WantTypesInContext(CCC, SemaRef.getLangOpts()))
2898     AddTypeSpecifierResults(SemaRef.getLangOpts(), Results);
2899 
2900   if (SemaRef.getLangOpts().CPlusPlus && CCC != SemaCodeCompletion::PCC_Type)
2901     Results.AddResult(Result("operator"));
2902 }
2903 
2904 /// If the given declaration has an associated type, add it as a result
2905 /// type chunk.
2906 static void AddResultTypeChunk(ASTContext &Context,
2907                                const PrintingPolicy &Policy,
2908                                const NamedDecl *ND, QualType BaseType,
2909                                CodeCompletionBuilder &Result) {
2910   if (!ND)
2911     return;
2912 
2913   // Skip constructors and conversion functions, which have their return types
2914   // built into their names.
2915   if (isConstructor(ND) || isa<CXXConversionDecl>(ND))
2916     return;
2917 
2918   // Determine the type of the declaration (if it has a type).
2919   QualType T;
2920   if (const FunctionDecl *Function = ND->getAsFunction())
2921     T = Function->getReturnType();
2922   else if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) {
2923     if (!BaseType.isNull())
2924       T = Method->getSendResultType(BaseType);
2925     else
2926       T = Method->getReturnType();
2927   } else if (const auto *Enumerator = dyn_cast<EnumConstantDecl>(ND)) {
2928     T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext()));
2929     T = clang::TypeName::getFullyQualifiedType(T, Context);
2930   } else if (isa<UnresolvedUsingValueDecl>(ND)) {
2931     /* Do nothing: ignore unresolved using declarations*/
2932   } else if (const auto *Ivar = dyn_cast<ObjCIvarDecl>(ND)) {
2933     if (!BaseType.isNull())
2934       T = Ivar->getUsageType(BaseType);
2935     else
2936       T = Ivar->getType();
2937   } else if (const auto *Value = dyn_cast<ValueDecl>(ND)) {
2938     T = Value->getType();
2939   } else if (const auto *Property = dyn_cast<ObjCPropertyDecl>(ND)) {
2940     if (!BaseType.isNull())
2941       T = Property->getUsageType(BaseType);
2942     else
2943       T = Property->getType();
2944   }
2945 
2946   if (T.isNull() || Context.hasSameType(T, Context.DependentTy))
2947     return;
2948 
2949   Result.AddResultTypeChunk(
2950       GetCompletionTypeString(T, Context, Policy, Result.getAllocator()));
2951 }
2952 
2953 static void MaybeAddSentinel(Preprocessor &PP,
2954                              const NamedDecl *FunctionOrMethod,
2955                              CodeCompletionBuilder &Result) {
2956   if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>())
2957     if (Sentinel->getSentinel() == 0) {
2958       if (PP.getLangOpts().ObjC && PP.isMacroDefined("nil"))
2959         Result.AddTextChunk(", nil");
2960       else if (PP.isMacroDefined("NULL"))
2961         Result.AddTextChunk(", NULL");
2962       else
2963         Result.AddTextChunk(", (void*)0");
2964     }
2965 }
2966 
2967 static std::string formatObjCParamQualifiers(unsigned ObjCQuals,
2968                                              QualType &Type) {
2969   std::string Result;
2970   if (ObjCQuals & Decl::OBJC_TQ_In)
2971     Result += "in ";
2972   else if (ObjCQuals & Decl::OBJC_TQ_Inout)
2973     Result += "inout ";
2974   else if (ObjCQuals & Decl::OBJC_TQ_Out)
2975     Result += "out ";
2976   if (ObjCQuals & Decl::OBJC_TQ_Bycopy)
2977     Result += "bycopy ";
2978   else if (ObjCQuals & Decl::OBJC_TQ_Byref)
2979     Result += "byref ";
2980   if (ObjCQuals & Decl::OBJC_TQ_Oneway)
2981     Result += "oneway ";
2982   if (ObjCQuals & Decl::OBJC_TQ_CSNullability) {
2983     if (auto nullability = AttributedType::stripOuterNullability(Type)) {
2984       switch (*nullability) {
2985       case NullabilityKind::NonNull:
2986         Result += "nonnull ";
2987         break;
2988 
2989       case NullabilityKind::Nullable:
2990         Result += "nullable ";
2991         break;
2992 
2993       case NullabilityKind::Unspecified:
2994         Result += "null_unspecified ";
2995         break;
2996 
2997       case NullabilityKind::NullableResult:
2998         llvm_unreachable("Not supported as a context-sensitive keyword!");
2999         break;
3000       }
3001     }
3002   }
3003   return Result;
3004 }
3005 
3006 /// Tries to find the most appropriate type location for an Objective-C
3007 /// block placeholder.
3008 ///
3009 /// This function ignores things like typedefs and qualifiers in order to
3010 /// present the most relevant and accurate block placeholders in code completion
3011 /// results.
3012 static void findTypeLocationForBlockDecl(const TypeSourceInfo *TSInfo,
3013                                          FunctionTypeLoc &Block,
3014                                          FunctionProtoTypeLoc &BlockProto,
3015                                          bool SuppressBlock = false) {
3016   if (!TSInfo)
3017     return;
3018   TypeLoc TL = TSInfo->getTypeLoc().getUnqualifiedLoc();
3019   while (true) {
3020     // Look through typedefs.
3021     if (!SuppressBlock) {
3022       if (TypedefTypeLoc TypedefTL = TL.getAsAdjusted<TypedefTypeLoc>()) {
3023         if (TypeSourceInfo *InnerTSInfo =
3024                 TypedefTL.getTypedefNameDecl()->getTypeSourceInfo()) {
3025           TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc();
3026           continue;
3027         }
3028       }
3029 
3030       // Look through qualified types
3031       if (QualifiedTypeLoc QualifiedTL = TL.getAs<QualifiedTypeLoc>()) {
3032         TL = QualifiedTL.getUnqualifiedLoc();
3033         continue;
3034       }
3035 
3036       if (AttributedTypeLoc AttrTL = TL.getAs<AttributedTypeLoc>()) {
3037         TL = AttrTL.getModifiedLoc();
3038         continue;
3039       }
3040     }
3041 
3042     // Try to get the function prototype behind the block pointer type,
3043     // then we're done.
3044     if (BlockPointerTypeLoc BlockPtr = TL.getAs<BlockPointerTypeLoc>()) {
3045       TL = BlockPtr.getPointeeLoc().IgnoreParens();
3046       Block = TL.getAs<FunctionTypeLoc>();
3047       BlockProto = TL.getAs<FunctionProtoTypeLoc>();
3048     }
3049     break;
3050   }
3051 }
3052 
3053 static std::string formatBlockPlaceholder(
3054     const PrintingPolicy &Policy, const NamedDecl *BlockDecl,
3055     FunctionTypeLoc &Block, FunctionProtoTypeLoc &BlockProto,
3056     bool SuppressBlockName = false, bool SuppressBlock = false,
3057     std::optional<ArrayRef<QualType>> ObjCSubsts = std::nullopt);
3058 
3059 static std::string FormatFunctionParameter(
3060     const PrintingPolicy &Policy, const DeclaratorDecl *Param,
3061     bool SuppressName = false, bool SuppressBlock = false,
3062     std::optional<ArrayRef<QualType>> ObjCSubsts = std::nullopt) {
3063   // Params are unavailable in FunctionTypeLoc if the FunctionType is invalid.
3064   // It would be better to pass in the param Type, which is usually available.
3065   // But this case is rare, so just pretend we fell back to int as elsewhere.
3066   if (!Param)
3067     return "int";
3068   Decl::ObjCDeclQualifier ObjCQual = Decl::OBJC_TQ_None;
3069   if (const auto *PVD = dyn_cast<ParmVarDecl>(Param))
3070     ObjCQual = PVD->getObjCDeclQualifier();
3071   bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext());
3072   if (Param->getType()->isDependentType() ||
3073       !Param->getType()->isBlockPointerType()) {
3074     // The argument for a dependent or non-block parameter is a placeholder
3075     // containing that parameter's type.
3076     std::string Result;
3077 
3078     if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName)
3079       Result = std::string(Param->getIdentifier()->deuglifiedName());
3080 
3081     QualType Type = Param->getType();
3082     if (ObjCSubsts)
3083       Type = Type.substObjCTypeArgs(Param->getASTContext(), *ObjCSubsts,
3084                                     ObjCSubstitutionContext::Parameter);
3085     if (ObjCMethodParam) {
3086       Result = "(" + formatObjCParamQualifiers(ObjCQual, Type);
3087       Result += Type.getAsString(Policy) + ")";
3088       if (Param->getIdentifier() && !SuppressName)
3089         Result += Param->getIdentifier()->deuglifiedName();
3090     } else {
3091       Type.getAsStringInternal(Result, Policy);
3092     }
3093     return Result;
3094   }
3095 
3096   // The argument for a block pointer parameter is a block literal with
3097   // the appropriate type.
3098   FunctionTypeLoc Block;
3099   FunctionProtoTypeLoc BlockProto;
3100   findTypeLocationForBlockDecl(Param->getTypeSourceInfo(), Block, BlockProto,
3101                                SuppressBlock);
3102   // Try to retrieve the block type information from the property if this is a
3103   // parameter in a setter.
3104   if (!Block && ObjCMethodParam &&
3105       cast<ObjCMethodDecl>(Param->getDeclContext())->isPropertyAccessor()) {
3106     if (const auto *PD = cast<ObjCMethodDecl>(Param->getDeclContext())
3107                              ->findPropertyDecl(/*CheckOverrides=*/false))
3108       findTypeLocationForBlockDecl(PD->getTypeSourceInfo(), Block, BlockProto,
3109                                    SuppressBlock);
3110   }
3111 
3112   if (!Block) {
3113     // We were unable to find a FunctionProtoTypeLoc with parameter names
3114     // for the block; just use the parameter type as a placeholder.
3115     std::string Result;
3116     if (!ObjCMethodParam && Param->getIdentifier())
3117       Result = std::string(Param->getIdentifier()->deuglifiedName());
3118 
3119     QualType Type = Param->getType().getUnqualifiedType();
3120 
3121     if (ObjCMethodParam) {
3122       Result = Type.getAsString(Policy);
3123       std::string Quals = formatObjCParamQualifiers(ObjCQual, Type);
3124       if (!Quals.empty())
3125         Result = "(" + Quals + " " + Result + ")";
3126       if (Result.back() != ')')
3127         Result += " ";
3128       if (Param->getIdentifier())
3129         Result += Param->getIdentifier()->deuglifiedName();
3130     } else {
3131       Type.getAsStringInternal(Result, Policy);
3132     }
3133 
3134     return Result;
3135   }
3136 
3137   // We have the function prototype behind the block pointer type, as it was
3138   // written in the source.
3139   return formatBlockPlaceholder(Policy, Param, Block, BlockProto,
3140                                 /*SuppressBlockName=*/false, SuppressBlock,
3141                                 ObjCSubsts);
3142 }
3143 
3144 /// Returns a placeholder string that corresponds to an Objective-C block
3145 /// declaration.
3146 ///
3147 /// \param BlockDecl A declaration with an Objective-C block type.
3148 ///
3149 /// \param Block The most relevant type location for that block type.
3150 ///
3151 /// \param SuppressBlockName Determines whether or not the name of the block
3152 /// declaration is included in the resulting string.
3153 static std::string
3154 formatBlockPlaceholder(const PrintingPolicy &Policy, const NamedDecl *BlockDecl,
3155                        FunctionTypeLoc &Block, FunctionProtoTypeLoc &BlockProto,
3156                        bool SuppressBlockName, bool SuppressBlock,
3157                        std::optional<ArrayRef<QualType>> ObjCSubsts) {
3158   std::string Result;
3159   QualType ResultType = Block.getTypePtr()->getReturnType();
3160   if (ObjCSubsts)
3161     ResultType =
3162         ResultType.substObjCTypeArgs(BlockDecl->getASTContext(), *ObjCSubsts,
3163                                      ObjCSubstitutionContext::Result);
3164   if (!ResultType->isVoidType() || SuppressBlock)
3165     ResultType.getAsStringInternal(Result, Policy);
3166 
3167   // Format the parameter list.
3168   std::string Params;
3169   if (!BlockProto || Block.getNumParams() == 0) {
3170     if (BlockProto && BlockProto.getTypePtr()->isVariadic())
3171       Params = "(...)";
3172     else
3173       Params = "(void)";
3174   } else {
3175     Params += "(";
3176     for (unsigned I = 0, N = Block.getNumParams(); I != N; ++I) {
3177       if (I)
3178         Params += ", ";
3179       Params += FormatFunctionParameter(Policy, Block.getParam(I),
3180                                         /*SuppressName=*/false,
3181                                         /*SuppressBlock=*/true, ObjCSubsts);
3182 
3183       if (I == N - 1 && BlockProto.getTypePtr()->isVariadic())
3184         Params += ", ...";
3185     }
3186     Params += ")";
3187   }
3188 
3189   if (SuppressBlock) {
3190     // Format as a parameter.
3191     Result = Result + " (^";
3192     if (!SuppressBlockName && BlockDecl->getIdentifier())
3193       Result += BlockDecl->getIdentifier()->getName();
3194     Result += ")";
3195     Result += Params;
3196   } else {
3197     // Format as a block literal argument.
3198     Result = '^' + Result;
3199     Result += Params;
3200 
3201     if (!SuppressBlockName && BlockDecl->getIdentifier())
3202       Result += BlockDecl->getIdentifier()->getName();
3203   }
3204 
3205   return Result;
3206 }
3207 
3208 static std::string GetDefaultValueString(const ParmVarDecl *Param,
3209                                          const SourceManager &SM,
3210                                          const LangOptions &LangOpts) {
3211   const SourceRange SrcRange = Param->getDefaultArgRange();
3212   CharSourceRange CharSrcRange = CharSourceRange::getTokenRange(SrcRange);
3213   bool Invalid = CharSrcRange.isInvalid();
3214   if (Invalid)
3215     return "";
3216   StringRef srcText =
3217       Lexer::getSourceText(CharSrcRange, SM, LangOpts, &Invalid);
3218   if (Invalid)
3219     return "";
3220 
3221   if (srcText.empty() || srcText == "=") {
3222     // Lexer can't determine the value.
3223     // This happens if the code is incorrect (for example class is forward
3224     // declared).
3225     return "";
3226   }
3227   std::string DefValue(srcText.str());
3228   // FIXME: remove this check if the Lexer::getSourceText value is fixed and
3229   // this value always has (or always does not have) '=' in front of it
3230   if (DefValue.at(0) != '=') {
3231     // If we don't have '=' in front of value.
3232     // Lexer returns built-in types values without '=' and user-defined types
3233     // values with it.
3234     return " = " + DefValue;
3235   }
3236   return " " + DefValue;
3237 }
3238 
3239 /// Add function parameter chunks to the given code completion string.
3240 static void AddFunctionParameterChunks(Preprocessor &PP,
3241                                        const PrintingPolicy &Policy,
3242                                        const FunctionDecl *Function,
3243                                        CodeCompletionBuilder &Result,
3244                                        unsigned Start = 0,
3245                                        bool InOptional = false) {
3246   bool FirstParameter = true;
3247 
3248   for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) {
3249     const ParmVarDecl *Param = Function->getParamDecl(P);
3250 
3251     if (Param->hasDefaultArg() && !InOptional) {
3252       // When we see an optional default argument, put that argument and
3253       // the remaining default arguments into a new, optional string.
3254       CodeCompletionBuilder Opt(Result.getAllocator(),
3255                                 Result.getCodeCompletionTUInfo());
3256       if (!FirstParameter)
3257         Opt.AddChunk(CodeCompletionString::CK_Comma);
3258       AddFunctionParameterChunks(PP, Policy, Function, Opt, P, true);
3259       Result.AddOptionalChunk(Opt.TakeString());
3260       break;
3261     }
3262 
3263     // C++23 introduces an explicit object parameter, a.k.a. "deducing this"
3264     // Skip it for autocomplete and treat the next parameter as the first
3265     // parameter
3266     if (FirstParameter && Param->isExplicitObjectParameter()) {
3267       continue;
3268     }
3269 
3270     if (FirstParameter)
3271       FirstParameter = false;
3272     else
3273       Result.AddChunk(CodeCompletionString::CK_Comma);
3274 
3275     InOptional = false;
3276 
3277     // Format the placeholder string.
3278     std::string PlaceholderStr = FormatFunctionParameter(Policy, Param);
3279     if (Param->hasDefaultArg())
3280       PlaceholderStr +=
3281           GetDefaultValueString(Param, PP.getSourceManager(), PP.getLangOpts());
3282 
3283     if (Function->isVariadic() && P == N - 1)
3284       PlaceholderStr += ", ...";
3285 
3286     // Add the placeholder string.
3287     Result.AddPlaceholderChunk(
3288         Result.getAllocator().CopyString(PlaceholderStr));
3289   }
3290 
3291   if (const auto *Proto = Function->getType()->getAs<FunctionProtoType>())
3292     if (Proto->isVariadic()) {
3293       if (Proto->getNumParams() == 0)
3294         Result.AddPlaceholderChunk("...");
3295 
3296       MaybeAddSentinel(PP, Function, Result);
3297     }
3298 }
3299 
3300 /// Add template parameter chunks to the given code completion string.
3301 static void AddTemplateParameterChunks(
3302     ASTContext &Context, const PrintingPolicy &Policy,
3303     const TemplateDecl *Template, CodeCompletionBuilder &Result,
3304     unsigned MaxParameters = 0, unsigned Start = 0, bool InDefaultArg = false) {
3305   bool FirstParameter = true;
3306 
3307   // Prefer to take the template parameter names from the first declaration of
3308   // the template.
3309   Template = cast<TemplateDecl>(Template->getCanonicalDecl());
3310 
3311   TemplateParameterList *Params = Template->getTemplateParameters();
3312   TemplateParameterList::iterator PEnd = Params->end();
3313   if (MaxParameters)
3314     PEnd = Params->begin() + MaxParameters;
3315   for (TemplateParameterList::iterator P = Params->begin() + Start; P != PEnd;
3316        ++P) {
3317     bool HasDefaultArg = false;
3318     std::string PlaceholderStr;
3319     if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
3320       if (TTP->wasDeclaredWithTypename())
3321         PlaceholderStr = "typename";
3322       else if (const auto *TC = TTP->getTypeConstraint()) {
3323         llvm::raw_string_ostream OS(PlaceholderStr);
3324         TC->print(OS, Policy);
3325       } else
3326         PlaceholderStr = "class";
3327 
3328       if (TTP->getIdentifier()) {
3329         PlaceholderStr += ' ';
3330         PlaceholderStr += TTP->getIdentifier()->deuglifiedName();
3331       }
3332 
3333       HasDefaultArg = TTP->hasDefaultArgument();
3334     } else if (NonTypeTemplateParmDecl *NTTP =
3335                    dyn_cast<NonTypeTemplateParmDecl>(*P)) {
3336       if (NTTP->getIdentifier())
3337         PlaceholderStr = std::string(NTTP->getIdentifier()->deuglifiedName());
3338       NTTP->getType().getAsStringInternal(PlaceholderStr, Policy);
3339       HasDefaultArg = NTTP->hasDefaultArgument();
3340     } else {
3341       assert(isa<TemplateTemplateParmDecl>(*P));
3342       TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P);
3343 
3344       // Since putting the template argument list into the placeholder would
3345       // be very, very long, we just use an abbreviation.
3346       PlaceholderStr = "template<...> class";
3347       if (TTP->getIdentifier()) {
3348         PlaceholderStr += ' ';
3349         PlaceholderStr += TTP->getIdentifier()->deuglifiedName();
3350       }
3351 
3352       HasDefaultArg = TTP->hasDefaultArgument();
3353     }
3354 
3355     if (HasDefaultArg && !InDefaultArg) {
3356       // When we see an optional default argument, put that argument and
3357       // the remaining default arguments into a new, optional string.
3358       CodeCompletionBuilder Opt(Result.getAllocator(),
3359                                 Result.getCodeCompletionTUInfo());
3360       if (!FirstParameter)
3361         Opt.AddChunk(CodeCompletionString::CK_Comma);
3362       AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters,
3363                                  P - Params->begin(), true);
3364       Result.AddOptionalChunk(Opt.TakeString());
3365       break;
3366     }
3367 
3368     InDefaultArg = false;
3369 
3370     if (FirstParameter)
3371       FirstParameter = false;
3372     else
3373       Result.AddChunk(CodeCompletionString::CK_Comma);
3374 
3375     // Add the placeholder string.
3376     Result.AddPlaceholderChunk(
3377         Result.getAllocator().CopyString(PlaceholderStr));
3378   }
3379 }
3380 
3381 /// Add a qualifier to the given code-completion string, if the
3382 /// provided nested-name-specifier is non-NULL.
3383 static void AddQualifierToCompletionString(CodeCompletionBuilder &Result,
3384                                            NestedNameSpecifier *Qualifier,
3385                                            bool QualifierIsInformative,
3386                                            ASTContext &Context,
3387                                            const PrintingPolicy &Policy) {
3388   if (!Qualifier)
3389     return;
3390 
3391   std::string PrintedNNS;
3392   {
3393     llvm::raw_string_ostream OS(PrintedNNS);
3394     Qualifier->print(OS, Policy);
3395   }
3396   if (QualifierIsInformative)
3397     Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS));
3398   else
3399     Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS));
3400 }
3401 
3402 static void
3403 AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result,
3404                                        const FunctionDecl *Function) {
3405   const auto *Proto = Function->getType()->getAs<FunctionProtoType>();
3406   if (!Proto || !Proto->getMethodQuals())
3407     return;
3408 
3409   // FIXME: Add ref-qualifier!
3410 
3411   // Handle single qualifiers without copying
3412   if (Proto->getMethodQuals().hasOnlyConst()) {
3413     Result.AddInformativeChunk(" const");
3414     return;
3415   }
3416 
3417   if (Proto->getMethodQuals().hasOnlyVolatile()) {
3418     Result.AddInformativeChunk(" volatile");
3419     return;
3420   }
3421 
3422   if (Proto->getMethodQuals().hasOnlyRestrict()) {
3423     Result.AddInformativeChunk(" restrict");
3424     return;
3425   }
3426 
3427   // Handle multiple qualifiers.
3428   std::string QualsStr;
3429   if (Proto->isConst())
3430     QualsStr += " const";
3431   if (Proto->isVolatile())
3432     QualsStr += " volatile";
3433   if (Proto->isRestrict())
3434     QualsStr += " restrict";
3435   Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr));
3436 }
3437 
3438 static void
3439 AddFunctionExceptSpecToCompletionString(std::string &NameAndSignature,
3440                                         const FunctionDecl *Function) {
3441   const auto *Proto = Function->getType()->getAs<FunctionProtoType>();
3442   if (!Proto)
3443     return;
3444 
3445   auto ExceptInfo = Proto->getExceptionSpecInfo();
3446   switch (ExceptInfo.Type) {
3447   case EST_BasicNoexcept:
3448   case EST_NoexceptTrue:
3449     NameAndSignature += " noexcept";
3450     break;
3451 
3452   default:
3453     break;
3454   }
3455 }
3456 
3457 /// Add the name of the given declaration
3458 static void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy,
3459                               const NamedDecl *ND,
3460                               CodeCompletionBuilder &Result) {
3461   DeclarationName Name = ND->getDeclName();
3462   if (!Name)
3463     return;
3464 
3465   switch (Name.getNameKind()) {
3466   case DeclarationName::CXXOperatorName: {
3467     const char *OperatorName = nullptr;
3468     switch (Name.getCXXOverloadedOperator()) {
3469     case OO_None:
3470     case OO_Conditional:
3471     case NUM_OVERLOADED_OPERATORS:
3472       OperatorName = "operator";
3473       break;
3474 
3475 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
3476   case OO_##Name:                                                              \
3477     OperatorName = "operator" Spelling;                                        \
3478     break;
3479 #define OVERLOADED_OPERATOR_MULTI(Name, Spelling, Unary, Binary, MemberOnly)
3480 #include "clang/Basic/OperatorKinds.def"
3481 
3482     case OO_New:
3483       OperatorName = "operator new";
3484       break;
3485     case OO_Delete:
3486       OperatorName = "operator delete";
3487       break;
3488     case OO_Array_New:
3489       OperatorName = "operator new[]";
3490       break;
3491     case OO_Array_Delete:
3492       OperatorName = "operator delete[]";
3493       break;
3494     case OO_Call:
3495       OperatorName = "operator()";
3496       break;
3497     case OO_Subscript:
3498       OperatorName = "operator[]";
3499       break;
3500     }
3501     Result.AddTypedTextChunk(OperatorName);
3502     break;
3503   }
3504 
3505   case DeclarationName::Identifier:
3506   case DeclarationName::CXXConversionFunctionName:
3507   case DeclarationName::CXXDestructorName:
3508   case DeclarationName::CXXLiteralOperatorName:
3509     Result.AddTypedTextChunk(
3510         Result.getAllocator().CopyString(ND->getNameAsString()));
3511     break;
3512 
3513   case DeclarationName::CXXDeductionGuideName:
3514   case DeclarationName::CXXUsingDirective:
3515   case DeclarationName::ObjCZeroArgSelector:
3516   case DeclarationName::ObjCOneArgSelector:
3517   case DeclarationName::ObjCMultiArgSelector:
3518     break;
3519 
3520   case DeclarationName::CXXConstructorName: {
3521     CXXRecordDecl *Record = nullptr;
3522     QualType Ty = Name.getCXXNameType();
3523     if (const auto *RecordTy = Ty->getAs<RecordType>())
3524       Record = cast<CXXRecordDecl>(RecordTy->getDecl());
3525     else if (const auto *InjectedTy = Ty->getAs<InjectedClassNameType>())
3526       Record = InjectedTy->getDecl();
3527     else {
3528       Result.AddTypedTextChunk(
3529           Result.getAllocator().CopyString(ND->getNameAsString()));
3530       break;
3531     }
3532 
3533     Result.AddTypedTextChunk(
3534         Result.getAllocator().CopyString(Record->getNameAsString()));
3535     if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) {
3536       Result.AddChunk(CodeCompletionString::CK_LeftAngle);
3537       AddTemplateParameterChunks(Context, Policy, Template, Result);
3538       Result.AddChunk(CodeCompletionString::CK_RightAngle);
3539     }
3540     break;
3541   }
3542   }
3543 }
3544 
3545 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(
3546     Sema &S, const CodeCompletionContext &CCContext,
3547     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
3548     bool IncludeBriefComments) {
3549   return CreateCodeCompletionString(S.Context, S.PP, CCContext, Allocator,
3550                                     CCTUInfo, IncludeBriefComments);
3551 }
3552 
3553 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionStringForMacro(
3554     Preprocessor &PP, CodeCompletionAllocator &Allocator,
3555     CodeCompletionTUInfo &CCTUInfo) {
3556   assert(Kind == RK_Macro);
3557   CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability);
3558   const MacroInfo *MI = PP.getMacroInfo(Macro);
3559   Result.AddTypedTextChunk(Result.getAllocator().CopyString(Macro->getName()));
3560 
3561   if (!MI || !MI->isFunctionLike())
3562     return Result.TakeString();
3563 
3564   // Format a function-like macro with placeholders for the arguments.
3565   Result.AddChunk(CodeCompletionString::CK_LeftParen);
3566   MacroInfo::param_iterator A = MI->param_begin(), AEnd = MI->param_end();
3567 
3568   // C99 variadic macros add __VA_ARGS__ at the end. Skip it.
3569   if (MI->isC99Varargs()) {
3570     --AEnd;
3571 
3572     if (A == AEnd) {
3573       Result.AddPlaceholderChunk("...");
3574     }
3575   }
3576 
3577   for (MacroInfo::param_iterator A = MI->param_begin(); A != AEnd; ++A) {
3578     if (A != MI->param_begin())
3579       Result.AddChunk(CodeCompletionString::CK_Comma);
3580 
3581     if (MI->isVariadic() && (A + 1) == AEnd) {
3582       SmallString<32> Arg = (*A)->getName();
3583       if (MI->isC99Varargs())
3584         Arg += ", ...";
3585       else
3586         Arg += "...";
3587       Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg));
3588       break;
3589     }
3590 
3591     // Non-variadic macros are simple.
3592     Result.AddPlaceholderChunk(
3593         Result.getAllocator().CopyString((*A)->getName()));
3594   }
3595   Result.AddChunk(CodeCompletionString::CK_RightParen);
3596   return Result.TakeString();
3597 }
3598 
3599 /// If possible, create a new code completion string for the given
3600 /// result.
3601 ///
3602 /// \returns Either a new, heap-allocated code completion string describing
3603 /// how to use this result, or NULL to indicate that the string or name of the
3604 /// result is all that is needed.
3605 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(
3606     ASTContext &Ctx, Preprocessor &PP, const CodeCompletionContext &CCContext,
3607     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
3608     bool IncludeBriefComments) {
3609   if (Kind == RK_Macro)
3610     return CreateCodeCompletionStringForMacro(PP, Allocator, CCTUInfo);
3611 
3612   CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability);
3613 
3614   PrintingPolicy Policy = getCompletionPrintingPolicy(Ctx, PP);
3615   if (Kind == RK_Pattern) {
3616     Pattern->Priority = Priority;
3617     Pattern->Availability = Availability;
3618 
3619     if (Declaration) {
3620       Result.addParentContext(Declaration->getDeclContext());
3621       Pattern->ParentName = Result.getParentName();
3622       if (const RawComment *RC =
3623               getPatternCompletionComment(Ctx, Declaration)) {
3624         Result.addBriefComment(RC->getBriefText(Ctx));
3625         Pattern->BriefComment = Result.getBriefComment();
3626       }
3627     }
3628 
3629     return Pattern;
3630   }
3631 
3632   if (Kind == RK_Keyword) {
3633     Result.AddTypedTextChunk(Keyword);
3634     return Result.TakeString();
3635   }
3636   assert(Kind == RK_Declaration && "Missed a result kind?");
3637   return createCodeCompletionStringForDecl(
3638       PP, Ctx, Result, IncludeBriefComments, CCContext, Policy);
3639 }
3640 
3641 static void printOverrideString(const CodeCompletionString &CCS,
3642                                 std::string &BeforeName,
3643                                 std::string &NameAndSignature) {
3644   bool SeenTypedChunk = false;
3645   for (auto &Chunk : CCS) {
3646     if (Chunk.Kind == CodeCompletionString::CK_Optional) {
3647       assert(SeenTypedChunk && "optional parameter before name");
3648       // Note that we put all chunks inside into NameAndSignature.
3649       printOverrideString(*Chunk.Optional, NameAndSignature, NameAndSignature);
3650       continue;
3651     }
3652     SeenTypedChunk |= Chunk.Kind == CodeCompletionString::CK_TypedText;
3653     if (SeenTypedChunk)
3654       NameAndSignature += Chunk.Text;
3655     else
3656       BeforeName += Chunk.Text;
3657   }
3658 }
3659 
3660 CodeCompletionString *
3661 CodeCompletionResult::createCodeCompletionStringForOverride(
3662     Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result,
3663     bool IncludeBriefComments, const CodeCompletionContext &CCContext,
3664     PrintingPolicy &Policy) {
3665   auto *CCS = createCodeCompletionStringForDecl(PP, Ctx, Result,
3666                                                 /*IncludeBriefComments=*/false,
3667                                                 CCContext, Policy);
3668   std::string BeforeName;
3669   std::string NameAndSignature;
3670   // For overrides all chunks go into the result, none are informative.
3671   printOverrideString(*CCS, BeforeName, NameAndSignature);
3672 
3673   // If the virtual function is declared with "noexcept", add it in the result
3674   // code completion string.
3675   const auto *VirtualFunc = dyn_cast<FunctionDecl>(Declaration);
3676   assert(VirtualFunc && "overridden decl must be a function");
3677   AddFunctionExceptSpecToCompletionString(NameAndSignature, VirtualFunc);
3678 
3679   NameAndSignature += " override";
3680 
3681   Result.AddTextChunk(Result.getAllocator().CopyString(BeforeName));
3682   Result.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3683   Result.AddTypedTextChunk(Result.getAllocator().CopyString(NameAndSignature));
3684   return Result.TakeString();
3685 }
3686 
3687 // FIXME: Right now this works well with lambdas. Add support for other functor
3688 // types like std::function.
3689 static const NamedDecl *extractFunctorCallOperator(const NamedDecl *ND) {
3690   const auto *VD = dyn_cast<VarDecl>(ND);
3691   if (!VD)
3692     return nullptr;
3693   const auto *RecordDecl = VD->getType()->getAsCXXRecordDecl();
3694   if (!RecordDecl || !RecordDecl->isLambda())
3695     return nullptr;
3696   return RecordDecl->getLambdaCallOperator();
3697 }
3698 
3699 CodeCompletionString *CodeCompletionResult::createCodeCompletionStringForDecl(
3700     Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result,
3701     bool IncludeBriefComments, const CodeCompletionContext &CCContext,
3702     PrintingPolicy &Policy) {
3703   const NamedDecl *ND = Declaration;
3704   Result.addParentContext(ND->getDeclContext());
3705 
3706   if (IncludeBriefComments) {
3707     // Add documentation comment, if it exists.
3708     if (const RawComment *RC = getCompletionComment(Ctx, Declaration)) {
3709       Result.addBriefComment(RC->getBriefText(Ctx));
3710     }
3711   }
3712 
3713   if (StartsNestedNameSpecifier) {
3714     Result.AddTypedTextChunk(
3715         Result.getAllocator().CopyString(ND->getNameAsString()));
3716     Result.AddTextChunk("::");
3717     return Result.TakeString();
3718   }
3719 
3720   for (const auto *I : ND->specific_attrs<AnnotateAttr>())
3721     Result.AddAnnotation(Result.getAllocator().CopyString(I->getAnnotation()));
3722 
3723   auto AddFunctionTypeAndResult = [&](const FunctionDecl *Function) {
3724     AddResultTypeChunk(Ctx, Policy, Function, CCContext.getBaseType(), Result);
3725     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
3726                                    Ctx, Policy);
3727     AddTypedNameChunk(Ctx, Policy, ND, Result);
3728     Result.AddChunk(CodeCompletionString::CK_LeftParen);
3729     AddFunctionParameterChunks(PP, Policy, Function, Result);
3730     Result.AddChunk(CodeCompletionString::CK_RightParen);
3731     AddFunctionTypeQualsToCompletionString(Result, Function);
3732   };
3733 
3734   if (const auto *Function = dyn_cast<FunctionDecl>(ND)) {
3735     AddFunctionTypeAndResult(Function);
3736     return Result.TakeString();
3737   }
3738 
3739   if (const auto *CallOperator =
3740           dyn_cast_or_null<FunctionDecl>(extractFunctorCallOperator(ND))) {
3741     AddFunctionTypeAndResult(CallOperator);
3742     return Result.TakeString();
3743   }
3744 
3745   AddResultTypeChunk(Ctx, Policy, ND, CCContext.getBaseType(), Result);
3746 
3747   if (const FunctionTemplateDecl *FunTmpl =
3748           dyn_cast<FunctionTemplateDecl>(ND)) {
3749     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
3750                                    Ctx, Policy);
3751     FunctionDecl *Function = FunTmpl->getTemplatedDecl();
3752     AddTypedNameChunk(Ctx, Policy, Function, Result);
3753 
3754     // Figure out which template parameters are deduced (or have default
3755     // arguments).
3756     // Note that we're creating a non-empty bit vector so that we can go
3757     // through the loop below to omit default template parameters for non-call
3758     // cases.
3759     llvm::SmallBitVector Deduced(FunTmpl->getTemplateParameters()->size());
3760     // Avoid running it if this is not a call: We should emit *all* template
3761     // parameters.
3762     if (FunctionCanBeCall)
3763       Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced);
3764     unsigned LastDeducibleArgument;
3765     for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0;
3766          --LastDeducibleArgument) {
3767       if (!Deduced[LastDeducibleArgument - 1]) {
3768         // C++0x: Figure out if the template argument has a default. If so,
3769         // the user doesn't need to type this argument.
3770         // FIXME: We need to abstract template parameters better!
3771         bool HasDefaultArg = false;
3772         NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam(
3773             LastDeducibleArgument - 1);
3774         if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
3775           HasDefaultArg = TTP->hasDefaultArgument();
3776         else if (NonTypeTemplateParmDecl *NTTP =
3777                      dyn_cast<NonTypeTemplateParmDecl>(Param))
3778           HasDefaultArg = NTTP->hasDefaultArgument();
3779         else {
3780           assert(isa<TemplateTemplateParmDecl>(Param));
3781           HasDefaultArg =
3782               cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument();
3783         }
3784 
3785         if (!HasDefaultArg)
3786           break;
3787       }
3788     }
3789 
3790     if (LastDeducibleArgument || !FunctionCanBeCall) {
3791       // Some of the function template arguments cannot be deduced from a
3792       // function call, so we introduce an explicit template argument list
3793       // containing all of the arguments up to the first deducible argument.
3794       //
3795       // Or, if this isn't a call, emit all the template arguments
3796       // to disambiguate the (potential) overloads.
3797       //
3798       // FIXME: Detect cases where the function parameters can be deduced from
3799       // the surrounding context, as per [temp.deduct.funcaddr].
3800       // e.g.,
3801       // template <class T> void foo(T);
3802       // void (*f)(int) = foo;
3803       Result.AddChunk(CodeCompletionString::CK_LeftAngle);
3804       AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result,
3805                                  LastDeducibleArgument);
3806       Result.AddChunk(CodeCompletionString::CK_RightAngle);
3807     }
3808 
3809     // Add the function parameters
3810     Result.AddChunk(CodeCompletionString::CK_LeftParen);
3811     AddFunctionParameterChunks(PP, Policy, Function, Result);
3812     Result.AddChunk(CodeCompletionString::CK_RightParen);
3813     AddFunctionTypeQualsToCompletionString(Result, Function);
3814     return Result.TakeString();
3815   }
3816 
3817   if (const auto *Template = dyn_cast<TemplateDecl>(ND)) {
3818     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
3819                                    Ctx, Policy);
3820     Result.AddTypedTextChunk(
3821         Result.getAllocator().CopyString(Template->getNameAsString()));
3822     Result.AddChunk(CodeCompletionString::CK_LeftAngle);
3823     AddTemplateParameterChunks(Ctx, Policy, Template, Result);
3824     Result.AddChunk(CodeCompletionString::CK_RightAngle);
3825     return Result.TakeString();
3826   }
3827 
3828   if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) {
3829     Selector Sel = Method->getSelector();
3830     if (Sel.isUnarySelector()) {
3831       Result.AddTypedTextChunk(
3832           Result.getAllocator().CopyString(Sel.getNameForSlot(0)));
3833       return Result.TakeString();
3834     }
3835 
3836     std::string SelName = Sel.getNameForSlot(0).str();
3837     SelName += ':';
3838     if (StartParameter == 0)
3839       Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName));
3840     else {
3841       Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName));
3842 
3843       // If there is only one parameter, and we're past it, add an empty
3844       // typed-text chunk since there is nothing to type.
3845       if (Method->param_size() == 1)
3846         Result.AddTypedTextChunk("");
3847     }
3848     unsigned Idx = 0;
3849     // The extra Idx < Sel.getNumArgs() check is needed due to legacy C-style
3850     // method parameters.
3851     for (ObjCMethodDecl::param_const_iterator P = Method->param_begin(),
3852                                               PEnd = Method->param_end();
3853          P != PEnd && Idx < Sel.getNumArgs(); (void)++P, ++Idx) {
3854       if (Idx > 0) {
3855         std::string Keyword;
3856         if (Idx > StartParameter)
3857           Result.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3858         if (const IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx))
3859           Keyword += II->getName();
3860         Keyword += ":";
3861         if (Idx < StartParameter || AllParametersAreInformative)
3862           Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword));
3863         else
3864           Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword));
3865       }
3866 
3867       // If we're before the starting parameter, skip the placeholder.
3868       if (Idx < StartParameter)
3869         continue;
3870 
3871       std::string Arg;
3872       QualType ParamType = (*P)->getType();
3873       std::optional<ArrayRef<QualType>> ObjCSubsts;
3874       if (!CCContext.getBaseType().isNull())
3875         ObjCSubsts = CCContext.getBaseType()->getObjCSubstitutions(Method);
3876 
3877       if (ParamType->isBlockPointerType() && !DeclaringEntity)
3878         Arg = FormatFunctionParameter(Policy, *P, true,
3879                                       /*SuppressBlock=*/false, ObjCSubsts);
3880       else {
3881         if (ObjCSubsts)
3882           ParamType = ParamType.substObjCTypeArgs(
3883               Ctx, *ObjCSubsts, ObjCSubstitutionContext::Parameter);
3884         Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier(),
3885                                               ParamType);
3886         Arg += ParamType.getAsString(Policy) + ")";
3887         if (const IdentifierInfo *II = (*P)->getIdentifier())
3888           if (DeclaringEntity || AllParametersAreInformative)
3889             Arg += II->getName();
3890       }
3891 
3892       if (Method->isVariadic() && (P + 1) == PEnd)
3893         Arg += ", ...";
3894 
3895       if (DeclaringEntity)
3896         Result.AddTextChunk(Result.getAllocator().CopyString(Arg));
3897       else if (AllParametersAreInformative)
3898         Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg));
3899       else
3900         Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg));
3901     }
3902 
3903     if (Method->isVariadic()) {
3904       if (Method->param_size() == 0) {
3905         if (DeclaringEntity)
3906           Result.AddTextChunk(", ...");
3907         else if (AllParametersAreInformative)
3908           Result.AddInformativeChunk(", ...");
3909         else
3910           Result.AddPlaceholderChunk(", ...");
3911       }
3912 
3913       MaybeAddSentinel(PP, Method, Result);
3914     }
3915 
3916     return Result.TakeString();
3917   }
3918 
3919   if (Qualifier)
3920     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
3921                                    Ctx, Policy);
3922 
3923   Result.AddTypedTextChunk(
3924       Result.getAllocator().CopyString(ND->getNameAsString()));
3925   return Result.TakeString();
3926 }
3927 
3928 const RawComment *clang::getCompletionComment(const ASTContext &Ctx,
3929                                               const NamedDecl *ND) {
3930   if (!ND)
3931     return nullptr;
3932   if (auto *RC = Ctx.getRawCommentForAnyRedecl(ND))
3933     return RC;
3934 
3935   // Try to find comment from a property for ObjC methods.
3936   const auto *M = dyn_cast<ObjCMethodDecl>(ND);
3937   if (!M)
3938     return nullptr;
3939   const ObjCPropertyDecl *PDecl = M->findPropertyDecl();
3940   if (!PDecl)
3941     return nullptr;
3942 
3943   return Ctx.getRawCommentForAnyRedecl(PDecl);
3944 }
3945 
3946 const RawComment *clang::getPatternCompletionComment(const ASTContext &Ctx,
3947                                                      const NamedDecl *ND) {
3948   const auto *M = dyn_cast_or_null<ObjCMethodDecl>(ND);
3949   if (!M || !M->isPropertyAccessor())
3950     return nullptr;
3951 
3952   // Provide code completion comment for self.GetterName where
3953   // GetterName is the getter method for a property with name
3954   // different from the property name (declared via a property
3955   // getter attribute.
3956   const ObjCPropertyDecl *PDecl = M->findPropertyDecl();
3957   if (!PDecl)
3958     return nullptr;
3959   if (PDecl->getGetterName() == M->getSelector() &&
3960       PDecl->getIdentifier() != M->getIdentifier()) {
3961     if (auto *RC = Ctx.getRawCommentForAnyRedecl(M))
3962       return RC;
3963     if (auto *RC = Ctx.getRawCommentForAnyRedecl(PDecl))
3964       return RC;
3965   }
3966   return nullptr;
3967 }
3968 
3969 const RawComment *clang::getParameterComment(
3970     const ASTContext &Ctx,
3971     const CodeCompleteConsumer::OverloadCandidate &Result, unsigned ArgIndex) {
3972   auto FDecl = Result.getFunction();
3973   if (!FDecl)
3974     return nullptr;
3975   if (ArgIndex < FDecl->getNumParams())
3976     return Ctx.getRawCommentForAnyRedecl(FDecl->getParamDecl(ArgIndex));
3977   return nullptr;
3978 }
3979 
3980 static void AddOverloadAggregateChunks(const RecordDecl *RD,
3981                                        const PrintingPolicy &Policy,
3982                                        CodeCompletionBuilder &Result,
3983                                        unsigned CurrentArg) {
3984   unsigned ChunkIndex = 0;
3985   auto AddChunk = [&](llvm::StringRef Placeholder) {
3986     if (ChunkIndex > 0)
3987       Result.AddChunk(CodeCompletionString::CK_Comma);
3988     const char *Copy = Result.getAllocator().CopyString(Placeholder);
3989     if (ChunkIndex == CurrentArg)
3990       Result.AddCurrentParameterChunk(Copy);
3991     else
3992       Result.AddPlaceholderChunk(Copy);
3993     ++ChunkIndex;
3994   };
3995   // Aggregate initialization has all bases followed by all fields.
3996   // (Bases are not legal in C++11 but in that case we never get here).
3997   if (auto *CRD = llvm::dyn_cast<CXXRecordDecl>(RD)) {
3998     for (const auto &Base : CRD->bases())
3999       AddChunk(Base.getType().getAsString(Policy));
4000   }
4001   for (const auto &Field : RD->fields())
4002     AddChunk(FormatFunctionParameter(Policy, Field));
4003 }
4004 
4005 /// Add function overload parameter chunks to the given code completion
4006 /// string.
4007 static void AddOverloadParameterChunks(
4008     ASTContext &Context, const PrintingPolicy &Policy,
4009     const FunctionDecl *Function, const FunctionProtoType *Prototype,
4010     FunctionProtoTypeLoc PrototypeLoc, CodeCompletionBuilder &Result,
4011     unsigned CurrentArg, unsigned Start = 0, bool InOptional = false) {
4012   if (!Function && !Prototype) {
4013     Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "...");
4014     return;
4015   }
4016 
4017   bool FirstParameter = true;
4018   unsigned NumParams =
4019       Function ? Function->getNumParams() : Prototype->getNumParams();
4020 
4021   for (unsigned P = Start; P != NumParams; ++P) {
4022     if (Function && Function->getParamDecl(P)->hasDefaultArg() && !InOptional) {
4023       // When we see an optional default argument, put that argument and
4024       // the remaining default arguments into a new, optional string.
4025       CodeCompletionBuilder Opt(Result.getAllocator(),
4026                                 Result.getCodeCompletionTUInfo());
4027       if (!FirstParameter)
4028         Opt.AddChunk(CodeCompletionString::CK_Comma);
4029       // Optional sections are nested.
4030       AddOverloadParameterChunks(Context, Policy, Function, Prototype,
4031                                  PrototypeLoc, Opt, CurrentArg, P,
4032                                  /*InOptional=*/true);
4033       Result.AddOptionalChunk(Opt.TakeString());
4034       return;
4035     }
4036 
4037     if (FirstParameter)
4038       FirstParameter = false;
4039     else
4040       Result.AddChunk(CodeCompletionString::CK_Comma);
4041 
4042     InOptional = false;
4043 
4044     // Format the placeholder string.
4045     std::string Placeholder;
4046     assert(P < Prototype->getNumParams());
4047     if (Function || PrototypeLoc) {
4048       const ParmVarDecl *Param =
4049           Function ? Function->getParamDecl(P) : PrototypeLoc.getParam(P);
4050       Placeholder = FormatFunctionParameter(Policy, Param);
4051       if (Param->hasDefaultArg())
4052         Placeholder += GetDefaultValueString(Param, Context.getSourceManager(),
4053                                              Context.getLangOpts());
4054     } else {
4055       Placeholder = Prototype->getParamType(P).getAsString(Policy);
4056     }
4057 
4058     if (P == CurrentArg)
4059       Result.AddCurrentParameterChunk(
4060           Result.getAllocator().CopyString(Placeholder));
4061     else
4062       Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Placeholder));
4063   }
4064 
4065   if (Prototype && Prototype->isVariadic()) {
4066     CodeCompletionBuilder Opt(Result.getAllocator(),
4067                               Result.getCodeCompletionTUInfo());
4068     if (!FirstParameter)
4069       Opt.AddChunk(CodeCompletionString::CK_Comma);
4070 
4071     if (CurrentArg < NumParams)
4072       Opt.AddPlaceholderChunk("...");
4073     else
4074       Opt.AddCurrentParameterChunk("...");
4075 
4076     Result.AddOptionalChunk(Opt.TakeString());
4077   }
4078 }
4079 
4080 static std::string
4081 formatTemplateParameterPlaceholder(const NamedDecl *Param, bool &Optional,
4082                                    const PrintingPolicy &Policy) {
4083   if (const auto *Type = dyn_cast<TemplateTypeParmDecl>(Param)) {
4084     Optional = Type->hasDefaultArgument();
4085   } else if (const auto *NonType = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
4086     Optional = NonType->hasDefaultArgument();
4087   } else if (const auto *Template = dyn_cast<TemplateTemplateParmDecl>(Param)) {
4088     Optional = Template->hasDefaultArgument();
4089   }
4090   std::string Result;
4091   llvm::raw_string_ostream OS(Result);
4092   Param->print(OS, Policy);
4093   return Result;
4094 }
4095 
4096 static std::string templateResultType(const TemplateDecl *TD,
4097                                       const PrintingPolicy &Policy) {
4098   if (const auto *CTD = dyn_cast<ClassTemplateDecl>(TD))
4099     return CTD->getTemplatedDecl()->getKindName().str();
4100   if (const auto *VTD = dyn_cast<VarTemplateDecl>(TD))
4101     return VTD->getTemplatedDecl()->getType().getAsString(Policy);
4102   if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(TD))
4103     return FTD->getTemplatedDecl()->getReturnType().getAsString(Policy);
4104   if (isa<TypeAliasTemplateDecl>(TD))
4105     return "type";
4106   if (isa<TemplateTemplateParmDecl>(TD))
4107     return "class";
4108   if (isa<ConceptDecl>(TD))
4109     return "concept";
4110   return "";
4111 }
4112 
4113 static CodeCompletionString *createTemplateSignatureString(
4114     const TemplateDecl *TD, CodeCompletionBuilder &Builder, unsigned CurrentArg,
4115     const PrintingPolicy &Policy) {
4116   llvm::ArrayRef<NamedDecl *> Params = TD->getTemplateParameters()->asArray();
4117   CodeCompletionBuilder OptionalBuilder(Builder.getAllocator(),
4118                                         Builder.getCodeCompletionTUInfo());
4119   std::string ResultType = templateResultType(TD, Policy);
4120   if (!ResultType.empty())
4121     Builder.AddResultTypeChunk(Builder.getAllocator().CopyString(ResultType));
4122   Builder.AddTextChunk(
4123       Builder.getAllocator().CopyString(TD->getNameAsString()));
4124   Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
4125   // Initially we're writing into the main string. Once we see an optional arg
4126   // (with default), we're writing into the nested optional chunk.
4127   CodeCompletionBuilder *Current = &Builder;
4128   for (unsigned I = 0; I < Params.size(); ++I) {
4129     bool Optional = false;
4130     std::string Placeholder =
4131         formatTemplateParameterPlaceholder(Params[I], Optional, Policy);
4132     if (Optional)
4133       Current = &OptionalBuilder;
4134     if (I > 0)
4135       Current->AddChunk(CodeCompletionString::CK_Comma);
4136     Current->AddChunk(I == CurrentArg
4137                           ? CodeCompletionString::CK_CurrentParameter
4138                           : CodeCompletionString::CK_Placeholder,
4139                       Current->getAllocator().CopyString(Placeholder));
4140   }
4141   // Add the optional chunk to the main string if we ever used it.
4142   if (Current == &OptionalBuilder)
4143     Builder.AddOptionalChunk(OptionalBuilder.TakeString());
4144   Builder.AddChunk(CodeCompletionString::CK_RightAngle);
4145   // For function templates, ResultType was the function's return type.
4146   // Give some clue this is a function. (Don't show the possibly-bulky params).
4147   if (isa<FunctionTemplateDecl>(TD))
4148     Builder.AddInformativeChunk("()");
4149   return Builder.TakeString();
4150 }
4151 
4152 CodeCompletionString *
4153 CodeCompleteConsumer::OverloadCandidate::CreateSignatureString(
4154     unsigned CurrentArg, Sema &S, CodeCompletionAllocator &Allocator,
4155     CodeCompletionTUInfo &CCTUInfo, bool IncludeBriefComments,
4156     bool Braced) const {
4157   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
4158   // Show signatures of constructors as they are declared:
4159   //   vector(int n) rather than vector<string>(int n)
4160   // This is less noisy without being less clear, and avoids tricky cases.
4161   Policy.SuppressTemplateArgsInCXXConstructors = true;
4162 
4163   // FIXME: Set priority, availability appropriately.
4164   CodeCompletionBuilder Result(Allocator, CCTUInfo, 1,
4165                                CXAvailability_Available);
4166 
4167   if (getKind() == CK_Template)
4168     return createTemplateSignatureString(getTemplate(), Result, CurrentArg,
4169                                          Policy);
4170 
4171   FunctionDecl *FDecl = getFunction();
4172   const FunctionProtoType *Proto =
4173       dyn_cast_or_null<FunctionProtoType>(getFunctionType());
4174 
4175   // First, the name/type of the callee.
4176   if (getKind() == CK_Aggregate) {
4177     Result.AddTextChunk(
4178         Result.getAllocator().CopyString(getAggregate()->getName()));
4179   } else if (FDecl) {
4180     if (IncludeBriefComments) {
4181       if (auto RC = getParameterComment(S.getASTContext(), *this, CurrentArg))
4182         Result.addBriefComment(RC->getBriefText(S.getASTContext()));
4183     }
4184     AddResultTypeChunk(S.Context, Policy, FDecl, QualType(), Result);
4185 
4186     std::string Name;
4187     llvm::raw_string_ostream OS(Name);
4188     FDecl->getDeclName().print(OS, Policy);
4189     Result.AddTextChunk(Result.getAllocator().CopyString(Name));
4190   } else {
4191     // Function without a declaration. Just give the return type.
4192     Result.AddResultTypeChunk(Result.getAllocator().CopyString(
4193         getFunctionType()->getReturnType().getAsString(Policy)));
4194   }
4195 
4196   // Next, the brackets and parameters.
4197   Result.AddChunk(Braced ? CodeCompletionString::CK_LeftBrace
4198                          : CodeCompletionString::CK_LeftParen);
4199   if (getKind() == CK_Aggregate)
4200     AddOverloadAggregateChunks(getAggregate(), Policy, Result, CurrentArg);
4201   else
4202     AddOverloadParameterChunks(S.getASTContext(), Policy, FDecl, Proto,
4203                                getFunctionProtoTypeLoc(), Result, CurrentArg);
4204   Result.AddChunk(Braced ? CodeCompletionString::CK_RightBrace
4205                          : CodeCompletionString::CK_RightParen);
4206 
4207   return Result.TakeString();
4208 }
4209 
4210 unsigned clang::getMacroUsagePriority(StringRef MacroName,
4211                                       const LangOptions &LangOpts,
4212                                       bool PreferredTypeIsPointer) {
4213   unsigned Priority = CCP_Macro;
4214 
4215   // Treat the "nil", "Nil" and "NULL" macros as null pointer constants.
4216   if (MacroName == "nil" || MacroName == "NULL" || MacroName == "Nil") {
4217     Priority = CCP_Constant;
4218     if (PreferredTypeIsPointer)
4219       Priority = Priority / CCF_SimilarTypeMatch;
4220   }
4221   // Treat "YES", "NO", "true", and "false" as constants.
4222   else if (MacroName == "YES" || MacroName == "NO" || MacroName == "true" ||
4223            MacroName == "false")
4224     Priority = CCP_Constant;
4225   // Treat "bool" as a type.
4226   else if (MacroName == "bool")
4227     Priority = CCP_Type + (LangOpts.ObjC ? CCD_bool_in_ObjC : 0);
4228 
4229   return Priority;
4230 }
4231 
4232 CXCursorKind clang::getCursorKindForDecl(const Decl *D) {
4233   if (!D)
4234     return CXCursor_UnexposedDecl;
4235 
4236   switch (D->getKind()) {
4237   case Decl::Enum:
4238     return CXCursor_EnumDecl;
4239   case Decl::EnumConstant:
4240     return CXCursor_EnumConstantDecl;
4241   case Decl::Field:
4242     return CXCursor_FieldDecl;
4243   case Decl::Function:
4244     return CXCursor_FunctionDecl;
4245   case Decl::ObjCCategory:
4246     return CXCursor_ObjCCategoryDecl;
4247   case Decl::ObjCCategoryImpl:
4248     return CXCursor_ObjCCategoryImplDecl;
4249   case Decl::ObjCImplementation:
4250     return CXCursor_ObjCImplementationDecl;
4251 
4252   case Decl::ObjCInterface:
4253     return CXCursor_ObjCInterfaceDecl;
4254   case Decl::ObjCIvar:
4255     return CXCursor_ObjCIvarDecl;
4256   case Decl::ObjCMethod:
4257     return cast<ObjCMethodDecl>(D)->isInstanceMethod()
4258                ? CXCursor_ObjCInstanceMethodDecl
4259                : CXCursor_ObjCClassMethodDecl;
4260   case Decl::CXXMethod:
4261     return CXCursor_CXXMethod;
4262   case Decl::CXXConstructor:
4263     return CXCursor_Constructor;
4264   case Decl::CXXDestructor:
4265     return CXCursor_Destructor;
4266   case Decl::CXXConversion:
4267     return CXCursor_ConversionFunction;
4268   case Decl::ObjCProperty:
4269     return CXCursor_ObjCPropertyDecl;
4270   case Decl::ObjCProtocol:
4271     return CXCursor_ObjCProtocolDecl;
4272   case Decl::ParmVar:
4273     return CXCursor_ParmDecl;
4274   case Decl::Typedef:
4275     return CXCursor_TypedefDecl;
4276   case Decl::TypeAlias:
4277     return CXCursor_TypeAliasDecl;
4278   case Decl::TypeAliasTemplate:
4279     return CXCursor_TypeAliasTemplateDecl;
4280   case Decl::Var:
4281     return CXCursor_VarDecl;
4282   case Decl::Namespace:
4283     return CXCursor_Namespace;
4284   case Decl::NamespaceAlias:
4285     return CXCursor_NamespaceAlias;
4286   case Decl::TemplateTypeParm:
4287     return CXCursor_TemplateTypeParameter;
4288   case Decl::NonTypeTemplateParm:
4289     return CXCursor_NonTypeTemplateParameter;
4290   case Decl::TemplateTemplateParm:
4291     return CXCursor_TemplateTemplateParameter;
4292   case Decl::FunctionTemplate:
4293     return CXCursor_FunctionTemplate;
4294   case Decl::ClassTemplate:
4295     return CXCursor_ClassTemplate;
4296   case Decl::AccessSpec:
4297     return CXCursor_CXXAccessSpecifier;
4298   case Decl::ClassTemplatePartialSpecialization:
4299     return CXCursor_ClassTemplatePartialSpecialization;
4300   case Decl::UsingDirective:
4301     return CXCursor_UsingDirective;
4302   case Decl::StaticAssert:
4303     return CXCursor_StaticAssert;
4304   case Decl::Friend:
4305     return CXCursor_FriendDecl;
4306   case Decl::TranslationUnit:
4307     return CXCursor_TranslationUnit;
4308 
4309   case Decl::Using:
4310   case Decl::UnresolvedUsingValue:
4311   case Decl::UnresolvedUsingTypename:
4312     return CXCursor_UsingDeclaration;
4313 
4314   case Decl::UsingEnum:
4315     return CXCursor_EnumDecl;
4316 
4317   case Decl::ObjCPropertyImpl:
4318     switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) {
4319     case ObjCPropertyImplDecl::Dynamic:
4320       return CXCursor_ObjCDynamicDecl;
4321 
4322     case ObjCPropertyImplDecl::Synthesize:
4323       return CXCursor_ObjCSynthesizeDecl;
4324     }
4325     llvm_unreachable("Unexpected Kind!");
4326 
4327   case Decl::Import:
4328     return CXCursor_ModuleImportDecl;
4329 
4330   case Decl::ObjCTypeParam:
4331     return CXCursor_TemplateTypeParameter;
4332 
4333   case Decl::Concept:
4334     return CXCursor_ConceptDecl;
4335 
4336   case Decl::LinkageSpec:
4337     return CXCursor_LinkageSpec;
4338 
4339   default:
4340     if (const auto *TD = dyn_cast<TagDecl>(D)) {
4341       switch (TD->getTagKind()) {
4342       case TagTypeKind::Interface: // fall through
4343       case TagTypeKind::Struct:
4344         return CXCursor_StructDecl;
4345       case TagTypeKind::Class:
4346         return CXCursor_ClassDecl;
4347       case TagTypeKind::Union:
4348         return CXCursor_UnionDecl;
4349       case TagTypeKind::Enum:
4350         return CXCursor_EnumDecl;
4351       }
4352     }
4353   }
4354 
4355   return CXCursor_UnexposedDecl;
4356 }
4357 
4358 static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results,
4359                             bool LoadExternal, bool IncludeUndefined,
4360                             bool TargetTypeIsPointer = false) {
4361   typedef CodeCompletionResult Result;
4362 
4363   Results.EnterNewScope();
4364 
4365   for (Preprocessor::macro_iterator M = PP.macro_begin(LoadExternal),
4366                                     MEnd = PP.macro_end(LoadExternal);
4367        M != MEnd; ++M) {
4368     auto MD = PP.getMacroDefinition(M->first);
4369     if (IncludeUndefined || MD) {
4370       MacroInfo *MI = MD.getMacroInfo();
4371       if (MI && MI->isUsedForHeaderGuard())
4372         continue;
4373 
4374       Results.AddResult(
4375           Result(M->first, MI,
4376                  getMacroUsagePriority(M->first->getName(), PP.getLangOpts(),
4377                                        TargetTypeIsPointer)));
4378     }
4379   }
4380 
4381   Results.ExitScope();
4382 }
4383 
4384 static void AddPrettyFunctionResults(const LangOptions &LangOpts,
4385                                      ResultBuilder &Results) {
4386   typedef CodeCompletionResult Result;
4387 
4388   Results.EnterNewScope();
4389 
4390   Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant));
4391   Results.AddResult(Result("__FUNCTION__", CCP_Constant));
4392   if (LangOpts.C99 || LangOpts.CPlusPlus11)
4393     Results.AddResult(Result("__func__", CCP_Constant));
4394   Results.ExitScope();
4395 }
4396 
4397 static void HandleCodeCompleteResults(Sema *S,
4398                                       CodeCompleteConsumer *CodeCompleter,
4399                                       const CodeCompletionContext &Context,
4400                                       CodeCompletionResult *Results,
4401                                       unsigned NumResults) {
4402   if (CodeCompleter)
4403     CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults);
4404 }
4405 
4406 static CodeCompletionContext
4407 mapCodeCompletionContext(Sema &S,
4408                          SemaCodeCompletion::ParserCompletionContext PCC) {
4409   switch (PCC) {
4410   case SemaCodeCompletion::PCC_Namespace:
4411     return CodeCompletionContext::CCC_TopLevel;
4412 
4413   case SemaCodeCompletion::PCC_Class:
4414     return CodeCompletionContext::CCC_ClassStructUnion;
4415 
4416   case SemaCodeCompletion::PCC_ObjCInterface:
4417     return CodeCompletionContext::CCC_ObjCInterface;
4418 
4419   case SemaCodeCompletion::PCC_ObjCImplementation:
4420     return CodeCompletionContext::CCC_ObjCImplementation;
4421 
4422   case SemaCodeCompletion::PCC_ObjCInstanceVariableList:
4423     return CodeCompletionContext::CCC_ObjCIvarList;
4424 
4425   case SemaCodeCompletion::PCC_Template:
4426   case SemaCodeCompletion::PCC_MemberTemplate:
4427     if (S.CurContext->isFileContext())
4428       return CodeCompletionContext::CCC_TopLevel;
4429     if (S.CurContext->isRecord())
4430       return CodeCompletionContext::CCC_ClassStructUnion;
4431     return CodeCompletionContext::CCC_Other;
4432 
4433   case SemaCodeCompletion::PCC_RecoveryInFunction:
4434     return CodeCompletionContext::CCC_Recovery;
4435 
4436   case SemaCodeCompletion::PCC_ForInit:
4437     if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 ||
4438         S.getLangOpts().ObjC)
4439       return CodeCompletionContext::CCC_ParenthesizedExpression;
4440     else
4441       return CodeCompletionContext::CCC_Expression;
4442 
4443   case SemaCodeCompletion::PCC_Expression:
4444     return CodeCompletionContext::CCC_Expression;
4445   case SemaCodeCompletion::PCC_Condition:
4446     return CodeCompletionContext(CodeCompletionContext::CCC_Expression,
4447                                  S.getASTContext().BoolTy);
4448 
4449   case SemaCodeCompletion::PCC_Statement:
4450     return CodeCompletionContext::CCC_Statement;
4451 
4452   case SemaCodeCompletion::PCC_Type:
4453     return CodeCompletionContext::CCC_Type;
4454 
4455   case SemaCodeCompletion::PCC_ParenthesizedExpression:
4456     return CodeCompletionContext::CCC_ParenthesizedExpression;
4457 
4458   case SemaCodeCompletion::PCC_LocalDeclarationSpecifiers:
4459     return CodeCompletionContext::CCC_Type;
4460   case SemaCodeCompletion::PCC_TopLevelOrExpression:
4461     return CodeCompletionContext::CCC_TopLevelOrExpression;
4462   }
4463 
4464   llvm_unreachable("Invalid ParserCompletionContext!");
4465 }
4466 
4467 /// If we're in a C++ virtual member function, add completion results
4468 /// that invoke the functions we override, since it's common to invoke the
4469 /// overridden function as well as adding new functionality.
4470 ///
4471 /// \param S The semantic analysis object for which we are generating results.
4472 ///
4473 /// \param InContext This context in which the nested-name-specifier preceding
4474 /// the code-completion point
4475 static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext,
4476                                   ResultBuilder &Results) {
4477   // Look through blocks.
4478   DeclContext *CurContext = S.CurContext;
4479   while (isa<BlockDecl>(CurContext))
4480     CurContext = CurContext->getParent();
4481 
4482   CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext);
4483   if (!Method || !Method->isVirtual())
4484     return;
4485 
4486   // We need to have names for all of the parameters, if we're going to
4487   // generate a forwarding call.
4488   for (auto *P : Method->parameters())
4489     if (!P->getDeclName())
4490       return;
4491 
4492   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
4493   for (const CXXMethodDecl *Overridden : Method->overridden_methods()) {
4494     CodeCompletionBuilder Builder(Results.getAllocator(),
4495                                   Results.getCodeCompletionTUInfo());
4496     if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl())
4497       continue;
4498 
4499     // If we need a nested-name-specifier, add one now.
4500     if (!InContext) {
4501       NestedNameSpecifier *NNS = getRequiredQualification(
4502           S.Context, CurContext, Overridden->getDeclContext());
4503       if (NNS) {
4504         std::string Str;
4505         llvm::raw_string_ostream OS(Str);
4506         NNS->print(OS, Policy);
4507         Builder.AddTextChunk(Results.getAllocator().CopyString(Str));
4508       }
4509     } else if (!InContext->Equals(Overridden->getDeclContext()))
4510       continue;
4511 
4512     Builder.AddTypedTextChunk(
4513         Results.getAllocator().CopyString(Overridden->getNameAsString()));
4514     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4515     bool FirstParam = true;
4516     for (auto *P : Method->parameters()) {
4517       if (FirstParam)
4518         FirstParam = false;
4519       else
4520         Builder.AddChunk(CodeCompletionString::CK_Comma);
4521 
4522       Builder.AddPlaceholderChunk(
4523           Results.getAllocator().CopyString(P->getIdentifier()->getName()));
4524     }
4525     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4526     Results.AddResult(CodeCompletionResult(
4527         Builder.TakeString(), CCP_SuperCompletion, CXCursor_CXXMethod,
4528         CXAvailability_Available, Overridden));
4529     Results.Ignore(Overridden);
4530   }
4531 }
4532 
4533 void SemaCodeCompletion::CodeCompleteModuleImport(SourceLocation ImportLoc,
4534                                                   ModuleIdPath Path) {
4535   typedef CodeCompletionResult Result;
4536   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
4537                         CodeCompleter->getCodeCompletionTUInfo(),
4538                         CodeCompletionContext::CCC_Other);
4539   Results.EnterNewScope();
4540 
4541   CodeCompletionAllocator &Allocator = Results.getAllocator();
4542   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
4543   typedef CodeCompletionResult Result;
4544   if (Path.empty()) {
4545     // Enumerate all top-level modules.
4546     SmallVector<Module *, 8> Modules;
4547     SemaRef.PP.getHeaderSearchInfo().collectAllModules(Modules);
4548     for (unsigned I = 0, N = Modules.size(); I != N; ++I) {
4549       Builder.AddTypedTextChunk(
4550           Builder.getAllocator().CopyString(Modules[I]->Name));
4551       Results.AddResult(Result(
4552           Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl,
4553           Modules[I]->isAvailable() ? CXAvailability_Available
4554                                     : CXAvailability_NotAvailable));
4555     }
4556   } else if (getLangOpts().Modules) {
4557     // Load the named module.
4558     Module *Mod = SemaRef.PP.getModuleLoader().loadModule(
4559         ImportLoc, Path, Module::AllVisible,
4560         /*IsInclusionDirective=*/false);
4561     // Enumerate submodules.
4562     if (Mod) {
4563       for (auto *Submodule : Mod->submodules()) {
4564         Builder.AddTypedTextChunk(
4565             Builder.getAllocator().CopyString(Submodule->Name));
4566         Results.AddResult(Result(
4567             Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl,
4568             Submodule->isAvailable() ? CXAvailability_Available
4569                                      : CXAvailability_NotAvailable));
4570       }
4571     }
4572   }
4573   Results.ExitScope();
4574   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
4575                             Results.getCompletionContext(), Results.data(),
4576                             Results.size());
4577 }
4578 
4579 void SemaCodeCompletion::CodeCompleteOrdinaryName(
4580     Scope *S, SemaCodeCompletion::ParserCompletionContext CompletionContext) {
4581   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
4582                         CodeCompleter->getCodeCompletionTUInfo(),
4583                         mapCodeCompletionContext(SemaRef, CompletionContext));
4584   Results.EnterNewScope();
4585 
4586   // Determine how to filter results, e.g., so that the names of
4587   // values (functions, enumerators, function templates, etc.) are
4588   // only allowed where we can have an expression.
4589   switch (CompletionContext) {
4590   case PCC_Namespace:
4591   case PCC_Class:
4592   case PCC_ObjCInterface:
4593   case PCC_ObjCImplementation:
4594   case PCC_ObjCInstanceVariableList:
4595   case PCC_Template:
4596   case PCC_MemberTemplate:
4597   case PCC_Type:
4598   case PCC_LocalDeclarationSpecifiers:
4599     Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
4600     break;
4601 
4602   case PCC_Statement:
4603   case PCC_TopLevelOrExpression:
4604   case PCC_ParenthesizedExpression:
4605   case PCC_Expression:
4606   case PCC_ForInit:
4607   case PCC_Condition:
4608     if (WantTypesInContext(CompletionContext, getLangOpts()))
4609       Results.setFilter(&ResultBuilder::IsOrdinaryName);
4610     else
4611       Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
4612 
4613     if (getLangOpts().CPlusPlus)
4614       MaybeAddOverrideCalls(SemaRef, /*InContext=*/nullptr, Results);
4615     break;
4616 
4617   case PCC_RecoveryInFunction:
4618     // Unfiltered
4619     break;
4620   }
4621 
4622   // If we are in a C++ non-static member function, check the qualifiers on
4623   // the member function to filter/prioritize the results list.
4624   auto ThisType = SemaRef.getCurrentThisType();
4625   if (!ThisType.isNull())
4626     Results.setObjectTypeQualifiers(ThisType->getPointeeType().getQualifiers(),
4627                                     VK_LValue);
4628 
4629   CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
4630   SemaRef.LookupVisibleDecls(S, SemaRef.LookupOrdinaryName, Consumer,
4631                              CodeCompleter->includeGlobals(),
4632                              CodeCompleter->loadExternal());
4633 
4634   AddOrdinaryNameResults(CompletionContext, S, SemaRef, Results);
4635   Results.ExitScope();
4636 
4637   switch (CompletionContext) {
4638   case PCC_ParenthesizedExpression:
4639   case PCC_Expression:
4640   case PCC_Statement:
4641   case PCC_TopLevelOrExpression:
4642   case PCC_RecoveryInFunction:
4643     if (S->getFnParent())
4644       AddPrettyFunctionResults(getLangOpts(), Results);
4645     break;
4646 
4647   case PCC_Namespace:
4648   case PCC_Class:
4649   case PCC_ObjCInterface:
4650   case PCC_ObjCImplementation:
4651   case PCC_ObjCInstanceVariableList:
4652   case PCC_Template:
4653   case PCC_MemberTemplate:
4654   case PCC_ForInit:
4655   case PCC_Condition:
4656   case PCC_Type:
4657   case PCC_LocalDeclarationSpecifiers:
4658     break;
4659   }
4660 
4661   if (CodeCompleter->includeMacros())
4662     AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false);
4663 
4664   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
4665                             Results.getCompletionContext(), Results.data(),
4666                             Results.size());
4667 }
4668 
4669 static void
4670 AddClassMessageCompletions(Sema &SemaRef, Scope *S, ParsedType Receiver,
4671                            ArrayRef<const IdentifierInfo *> SelIdents,
4672                            bool AtArgumentExpression, bool IsSuper,
4673                            ResultBuilder &Results);
4674 
4675 void SemaCodeCompletion::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS,
4676                                               bool AllowNonIdentifiers,
4677                                               bool AllowNestedNameSpecifiers) {
4678   typedef CodeCompletionResult Result;
4679   ResultBuilder Results(
4680       SemaRef, CodeCompleter->getAllocator(),
4681       CodeCompleter->getCodeCompletionTUInfo(),
4682       AllowNestedNameSpecifiers
4683           // FIXME: Try to separate codepath leading here to deduce whether we
4684           // need an existing symbol or a new one.
4685           ? CodeCompletionContext::CCC_SymbolOrNewName
4686           : CodeCompletionContext::CCC_NewName);
4687   Results.EnterNewScope();
4688 
4689   // Type qualifiers can come after names.
4690   Results.AddResult(Result("const"));
4691   Results.AddResult(Result("volatile"));
4692   if (getLangOpts().C99)
4693     Results.AddResult(Result("restrict"));
4694 
4695   if (getLangOpts().CPlusPlus) {
4696     if (getLangOpts().CPlusPlus11 &&
4697         (DS.getTypeSpecType() == DeclSpec::TST_class ||
4698          DS.getTypeSpecType() == DeclSpec::TST_struct))
4699       Results.AddResult("final");
4700 
4701     if (AllowNonIdentifiers) {
4702       Results.AddResult(Result("operator"));
4703     }
4704 
4705     // Add nested-name-specifiers.
4706     if (AllowNestedNameSpecifiers) {
4707       Results.allowNestedNameSpecifiers();
4708       Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy);
4709       CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
4710       SemaRef.LookupVisibleDecls(S, Sema::LookupNestedNameSpecifierName,
4711                                  Consumer, CodeCompleter->includeGlobals(),
4712                                  CodeCompleter->loadExternal());
4713       Results.setFilter(nullptr);
4714     }
4715   }
4716   Results.ExitScope();
4717 
4718   // If we're in a context where we might have an expression (rather than a
4719   // declaration), and what we've seen so far is an Objective-C type that could
4720   // be a receiver of a class message, this may be a class message send with
4721   // the initial opening bracket '[' missing. Add appropriate completions.
4722   if (AllowNonIdentifiers && !AllowNestedNameSpecifiers &&
4723       DS.getParsedSpecifiers() == DeclSpec::PQ_TypeSpecifier &&
4724       DS.getTypeSpecType() == DeclSpec::TST_typename &&
4725       DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified &&
4726       DS.getTypeSpecSign() == TypeSpecifierSign::Unspecified &&
4727       !DS.isTypeAltiVecVector() && S &&
4728       (S->getFlags() & Scope::DeclScope) != 0 &&
4729       (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope |
4730                         Scope::FunctionPrototypeScope | Scope::AtCatchScope)) ==
4731           0) {
4732     ParsedType T = DS.getRepAsType();
4733     if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType())
4734       AddClassMessageCompletions(SemaRef, S, T, {}, false, false, Results);
4735   }
4736 
4737   // Note that we intentionally suppress macro results here, since we do not
4738   // encourage using macros to produce the names of entities.
4739 
4740   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
4741                             Results.getCompletionContext(), Results.data(),
4742                             Results.size());
4743 }
4744 
4745 static const char *underscoreAttrScope(llvm::StringRef Scope) {
4746   if (Scope == "clang")
4747     return "_Clang";
4748   if (Scope == "gnu")
4749     return "__gnu__";
4750   return nullptr;
4751 }
4752 
4753 static const char *noUnderscoreAttrScope(llvm::StringRef Scope) {
4754   if (Scope == "_Clang")
4755     return "clang";
4756   if (Scope == "__gnu__")
4757     return "gnu";
4758   return nullptr;
4759 }
4760 
4761 void SemaCodeCompletion::CodeCompleteAttribute(
4762     AttributeCommonInfo::Syntax Syntax, AttributeCompletion Completion,
4763     const IdentifierInfo *InScope) {
4764   if (Completion == AttributeCompletion::None)
4765     return;
4766   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
4767                         CodeCompleter->getCodeCompletionTUInfo(),
4768                         CodeCompletionContext::CCC_Attribute);
4769 
4770   // We're going to iterate over the normalized spellings of the attribute.
4771   // These don't include "underscore guarding": the normalized spelling is
4772   // clang::foo but you can also write _Clang::__foo__.
4773   //
4774   // (Clang supports a mix like clang::__foo__ but we won't suggest it: either
4775   // you care about clashing with macros or you don't).
4776   //
4777   // So if we're already in a scope, we determine its canonical spellings
4778   // (for comparison with normalized attr spelling) and remember whether it was
4779   // underscore-guarded (so we know how to spell contained attributes).
4780   llvm::StringRef InScopeName;
4781   bool InScopeUnderscore = false;
4782   if (InScope) {
4783     InScopeName = InScope->getName();
4784     if (const char *NoUnderscore = noUnderscoreAttrScope(InScopeName)) {
4785       InScopeName = NoUnderscore;
4786       InScopeUnderscore = true;
4787     }
4788   }
4789   bool SyntaxSupportsGuards = Syntax == AttributeCommonInfo::AS_GNU ||
4790                               Syntax == AttributeCommonInfo::AS_CXX11 ||
4791                               Syntax == AttributeCommonInfo::AS_C23;
4792 
4793   llvm::DenseSet<llvm::StringRef> FoundScopes;
4794   auto AddCompletions = [&](const ParsedAttrInfo &A) {
4795     if (A.IsTargetSpecific &&
4796         !A.existsInTarget(getASTContext().getTargetInfo()))
4797       return;
4798     if (!A.acceptsLangOpts(getLangOpts()))
4799       return;
4800     for (const auto &S : A.Spellings) {
4801       if (S.Syntax != Syntax)
4802         continue;
4803       llvm::StringRef Name = S.NormalizedFullName;
4804       llvm::StringRef Scope;
4805       if ((Syntax == AttributeCommonInfo::AS_CXX11 ||
4806            Syntax == AttributeCommonInfo::AS_C23)) {
4807         std::tie(Scope, Name) = Name.split("::");
4808         if (Name.empty()) // oops, unscoped
4809           std::swap(Name, Scope);
4810       }
4811 
4812       // Do we just want a list of scopes rather than attributes?
4813       if (Completion == AttributeCompletion::Scope) {
4814         // Make sure to emit each scope only once.
4815         if (!Scope.empty() && FoundScopes.insert(Scope).second) {
4816           Results.AddResult(
4817               CodeCompletionResult(Results.getAllocator().CopyString(Scope)));
4818           // Include alternate form (__gnu__ instead of gnu).
4819           if (const char *Scope2 = underscoreAttrScope(Scope))
4820             Results.AddResult(CodeCompletionResult(Scope2));
4821         }
4822         continue;
4823       }
4824 
4825       // If a scope was specified, it must match but we don't need to print it.
4826       if (!InScopeName.empty()) {
4827         if (Scope != InScopeName)
4828           continue;
4829         Scope = "";
4830       }
4831 
4832       auto Add = [&](llvm::StringRef Scope, llvm::StringRef Name,
4833                      bool Underscores) {
4834         CodeCompletionBuilder Builder(Results.getAllocator(),
4835                                       Results.getCodeCompletionTUInfo());
4836         llvm::SmallString<32> Text;
4837         if (!Scope.empty()) {
4838           Text.append(Scope);
4839           Text.append("::");
4840         }
4841         if (Underscores)
4842           Text.append("__");
4843         Text.append(Name);
4844         if (Underscores)
4845           Text.append("__");
4846         Builder.AddTypedTextChunk(Results.getAllocator().CopyString(Text));
4847 
4848         if (!A.ArgNames.empty()) {
4849           Builder.AddChunk(CodeCompletionString::CK_LeftParen, "(");
4850           bool First = true;
4851           for (const char *Arg : A.ArgNames) {
4852             if (!First)
4853               Builder.AddChunk(CodeCompletionString::CK_Comma, ", ");
4854             First = false;
4855             Builder.AddPlaceholderChunk(Arg);
4856           }
4857           Builder.AddChunk(CodeCompletionString::CK_RightParen, ")");
4858         }
4859 
4860         Results.AddResult(Builder.TakeString());
4861       };
4862 
4863       // Generate the non-underscore-guarded result.
4864       // Note this is (a suffix of) the NormalizedFullName, no need to copy.
4865       // If an underscore-guarded scope was specified, only the
4866       // underscore-guarded attribute name is relevant.
4867       if (!InScopeUnderscore)
4868         Add(Scope, Name, /*Underscores=*/false);
4869 
4870       // Generate the underscore-guarded version, for syntaxes that support it.
4871       // We skip this if the scope was already spelled and not guarded, or
4872       // we must spell it and can't guard it.
4873       if (!(InScope && !InScopeUnderscore) && SyntaxSupportsGuards) {
4874         if (Scope.empty()) {
4875           Add(Scope, Name, /*Underscores=*/true);
4876         } else {
4877           const char *GuardedScope = underscoreAttrScope(Scope);
4878           if (!GuardedScope)
4879             continue;
4880           Add(GuardedScope, Name, /*Underscores=*/true);
4881         }
4882       }
4883 
4884       // It may be nice to include the Kind so we can look up the docs later.
4885     }
4886   };
4887 
4888   for (const auto *A : ParsedAttrInfo::getAllBuiltin())
4889     AddCompletions(*A);
4890   for (const auto &Entry : ParsedAttrInfoRegistry::entries())
4891     AddCompletions(*Entry.instantiate());
4892 
4893   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
4894                             Results.getCompletionContext(), Results.data(),
4895                             Results.size());
4896 }
4897 
4898 struct SemaCodeCompletion::CodeCompleteExpressionData {
4899   CodeCompleteExpressionData(QualType PreferredType = QualType(),
4900                              bool IsParenthesized = false)
4901       : PreferredType(PreferredType), IntegralConstantExpression(false),
4902         ObjCCollection(false), IsParenthesized(IsParenthesized) {}
4903 
4904   QualType PreferredType;
4905   bool IntegralConstantExpression;
4906   bool ObjCCollection;
4907   bool IsParenthesized;
4908   SmallVector<Decl *, 4> IgnoreDecls;
4909 };
4910 
4911 namespace {
4912 /// Information that allows to avoid completing redundant enumerators.
4913 struct CoveredEnumerators {
4914   llvm::SmallPtrSet<EnumConstantDecl *, 8> Seen;
4915   NestedNameSpecifier *SuggestedQualifier = nullptr;
4916 };
4917 } // namespace
4918 
4919 static void AddEnumerators(ResultBuilder &Results, ASTContext &Context,
4920                            EnumDecl *Enum, DeclContext *CurContext,
4921                            const CoveredEnumerators &Enumerators) {
4922   NestedNameSpecifier *Qualifier = Enumerators.SuggestedQualifier;
4923   if (Context.getLangOpts().CPlusPlus && !Qualifier && Enumerators.Seen.empty()) {
4924     // If there are no prior enumerators in C++, check whether we have to
4925     // qualify the names of the enumerators that we suggest, because they
4926     // may not be visible in this scope.
4927     Qualifier = getRequiredQualification(Context, CurContext, Enum);
4928   }
4929 
4930   Results.EnterNewScope();
4931   for (auto *E : Enum->enumerators()) {
4932     if (Enumerators.Seen.count(E))
4933       continue;
4934 
4935     CodeCompletionResult R(E, CCP_EnumInCase, Qualifier);
4936     Results.AddResult(R, CurContext, nullptr, false);
4937   }
4938   Results.ExitScope();
4939 }
4940 
4941 /// Try to find a corresponding FunctionProtoType for function-like types (e.g.
4942 /// function pointers, std::function, etc).
4943 static const FunctionProtoType *TryDeconstructFunctionLike(QualType T) {
4944   assert(!T.isNull());
4945   // Try to extract first template argument from std::function<> and similar.
4946   // Note we only handle the sugared types, they closely match what users wrote.
4947   // We explicitly choose to not handle ClassTemplateSpecializationDecl.
4948   if (auto *Specialization = T->getAs<TemplateSpecializationType>()) {
4949     if (Specialization->template_arguments().size() != 1)
4950       return nullptr;
4951     const TemplateArgument &Argument = Specialization->template_arguments()[0];
4952     if (Argument.getKind() != TemplateArgument::Type)
4953       return nullptr;
4954     return Argument.getAsType()->getAs<FunctionProtoType>();
4955   }
4956   // Handle other cases.
4957   if (T->isPointerType())
4958     T = T->getPointeeType();
4959   return T->getAs<FunctionProtoType>();
4960 }
4961 
4962 /// Adds a pattern completion for a lambda expression with the specified
4963 /// parameter types and placeholders for parameter names.
4964 static void AddLambdaCompletion(ResultBuilder &Results,
4965                                 llvm::ArrayRef<QualType> Parameters,
4966                                 const LangOptions &LangOpts) {
4967   if (!Results.includeCodePatterns())
4968     return;
4969   CodeCompletionBuilder Completion(Results.getAllocator(),
4970                                    Results.getCodeCompletionTUInfo());
4971   // [](<parameters>) {}
4972   Completion.AddChunk(CodeCompletionString::CK_LeftBracket);
4973   Completion.AddPlaceholderChunk("=");
4974   Completion.AddChunk(CodeCompletionString::CK_RightBracket);
4975   if (!Parameters.empty()) {
4976     Completion.AddChunk(CodeCompletionString::CK_LeftParen);
4977     bool First = true;
4978     for (auto Parameter : Parameters) {
4979       if (!First)
4980         Completion.AddChunk(CodeCompletionString::ChunkKind::CK_Comma);
4981       else
4982         First = false;
4983 
4984       constexpr llvm::StringLiteral NamePlaceholder = "!#!NAME_GOES_HERE!#!";
4985       std::string Type = std::string(NamePlaceholder);
4986       Parameter.getAsStringInternal(Type, PrintingPolicy(LangOpts));
4987       llvm::StringRef Prefix, Suffix;
4988       std::tie(Prefix, Suffix) = llvm::StringRef(Type).split(NamePlaceholder);
4989       Prefix = Prefix.rtrim();
4990       Suffix = Suffix.ltrim();
4991 
4992       Completion.AddTextChunk(Completion.getAllocator().CopyString(Prefix));
4993       Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4994       Completion.AddPlaceholderChunk("parameter");
4995       Completion.AddTextChunk(Completion.getAllocator().CopyString(Suffix));
4996     };
4997     Completion.AddChunk(CodeCompletionString::CK_RightParen);
4998   }
4999   Completion.AddChunk(clang::CodeCompletionString::CK_HorizontalSpace);
5000   Completion.AddChunk(CodeCompletionString::CK_LeftBrace);
5001   Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5002   Completion.AddPlaceholderChunk("body");
5003   Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5004   Completion.AddChunk(CodeCompletionString::CK_RightBrace);
5005 
5006   Results.AddResult(Completion.TakeString());
5007 }
5008 
5009 /// Perform code-completion in an expression context when we know what
5010 /// type we're looking for.
5011 void SemaCodeCompletion::CodeCompleteExpression(
5012     Scope *S, const CodeCompleteExpressionData &Data) {
5013   ResultBuilder Results(
5014       SemaRef, CodeCompleter->getAllocator(),
5015       CodeCompleter->getCodeCompletionTUInfo(),
5016       CodeCompletionContext(
5017           Data.IsParenthesized
5018               ? CodeCompletionContext::CCC_ParenthesizedExpression
5019               : CodeCompletionContext::CCC_Expression,
5020           Data.PreferredType));
5021   auto PCC =
5022       Data.IsParenthesized ? PCC_ParenthesizedExpression : PCC_Expression;
5023   if (Data.ObjCCollection)
5024     Results.setFilter(&ResultBuilder::IsObjCCollection);
5025   else if (Data.IntegralConstantExpression)
5026     Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
5027   else if (WantTypesInContext(PCC, getLangOpts()))
5028     Results.setFilter(&ResultBuilder::IsOrdinaryName);
5029   else
5030     Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
5031 
5032   if (!Data.PreferredType.isNull())
5033     Results.setPreferredType(Data.PreferredType.getNonReferenceType());
5034 
5035   // Ignore any declarations that we were told that we don't care about.
5036   for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I)
5037     Results.Ignore(Data.IgnoreDecls[I]);
5038 
5039   CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
5040   SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
5041                              CodeCompleter->includeGlobals(),
5042                              CodeCompleter->loadExternal());
5043 
5044   Results.EnterNewScope();
5045   AddOrdinaryNameResults(PCC, S, SemaRef, Results);
5046   Results.ExitScope();
5047 
5048   bool PreferredTypeIsPointer = false;
5049   if (!Data.PreferredType.isNull()) {
5050     PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() ||
5051                              Data.PreferredType->isMemberPointerType() ||
5052                              Data.PreferredType->isBlockPointerType();
5053     if (Data.PreferredType->isEnumeralType()) {
5054       EnumDecl *Enum = Data.PreferredType->castAs<EnumType>()->getDecl();
5055       if (auto *Def = Enum->getDefinition())
5056         Enum = Def;
5057       // FIXME: collect covered enumerators in cases like:
5058       //        if (x == my_enum::one) { ... } else if (x == ^) {}
5059       AddEnumerators(Results, getASTContext(), Enum, SemaRef.CurContext,
5060                      CoveredEnumerators());
5061     }
5062   }
5063 
5064   if (S->getFnParent() && !Data.ObjCCollection &&
5065       !Data.IntegralConstantExpression)
5066     AddPrettyFunctionResults(getLangOpts(), Results);
5067 
5068   if (CodeCompleter->includeMacros())
5069     AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false,
5070                     PreferredTypeIsPointer);
5071 
5072   // Complete a lambda expression when preferred type is a function.
5073   if (!Data.PreferredType.isNull() && getLangOpts().CPlusPlus11) {
5074     if (const FunctionProtoType *F =
5075             TryDeconstructFunctionLike(Data.PreferredType))
5076       AddLambdaCompletion(Results, F->getParamTypes(), getLangOpts());
5077   }
5078 
5079   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
5080                             Results.getCompletionContext(), Results.data(),
5081                             Results.size());
5082 }
5083 
5084 void SemaCodeCompletion::CodeCompleteExpression(Scope *S,
5085                                                 QualType PreferredType,
5086                                                 bool IsParenthesized) {
5087   return CodeCompleteExpression(
5088       S, CodeCompleteExpressionData(PreferredType, IsParenthesized));
5089 }
5090 
5091 void SemaCodeCompletion::CodeCompletePostfixExpression(Scope *S, ExprResult E,
5092                                                        QualType PreferredType) {
5093   if (E.isInvalid())
5094     CodeCompleteExpression(S, PreferredType);
5095   else if (getLangOpts().ObjC)
5096     CodeCompleteObjCInstanceMessage(S, E.get(), {}, false);
5097 }
5098 
5099 /// The set of properties that have already been added, referenced by
5100 /// property name.
5101 typedef llvm::SmallPtrSet<const IdentifierInfo *, 16> AddedPropertiesSet;
5102 
5103 /// Retrieve the container definition, if any?
5104 static ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) {
5105   if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) {
5106     if (Interface->hasDefinition())
5107       return Interface->getDefinition();
5108 
5109     return Interface;
5110   }
5111 
5112   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
5113     if (Protocol->hasDefinition())
5114       return Protocol->getDefinition();
5115 
5116     return Protocol;
5117   }
5118   return Container;
5119 }
5120 
5121 /// Adds a block invocation code completion result for the given block
5122 /// declaration \p BD.
5123 static void AddObjCBlockCall(ASTContext &Context, const PrintingPolicy &Policy,
5124                              CodeCompletionBuilder &Builder,
5125                              const NamedDecl *BD,
5126                              const FunctionTypeLoc &BlockLoc,
5127                              const FunctionProtoTypeLoc &BlockProtoLoc) {
5128   Builder.AddResultTypeChunk(
5129       GetCompletionTypeString(BlockLoc.getReturnLoc().getType(), Context,
5130                               Policy, Builder.getAllocator()));
5131 
5132   AddTypedNameChunk(Context, Policy, BD, Builder);
5133   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5134 
5135   if (BlockProtoLoc && BlockProtoLoc.getTypePtr()->isVariadic()) {
5136     Builder.AddPlaceholderChunk("...");
5137   } else {
5138     for (unsigned I = 0, N = BlockLoc.getNumParams(); I != N; ++I) {
5139       if (I)
5140         Builder.AddChunk(CodeCompletionString::CK_Comma);
5141 
5142       // Format the placeholder string.
5143       std::string PlaceholderStr =
5144           FormatFunctionParameter(Policy, BlockLoc.getParam(I));
5145 
5146       if (I == N - 1 && BlockProtoLoc &&
5147           BlockProtoLoc.getTypePtr()->isVariadic())
5148         PlaceholderStr += ", ...";
5149 
5150       // Add the placeholder string.
5151       Builder.AddPlaceholderChunk(
5152           Builder.getAllocator().CopyString(PlaceholderStr));
5153     }
5154   }
5155 
5156   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5157 }
5158 
5159 static void
5160 AddObjCProperties(const CodeCompletionContext &CCContext,
5161                   ObjCContainerDecl *Container, bool AllowCategories,
5162                   bool AllowNullaryMethods, DeclContext *CurContext,
5163                   AddedPropertiesSet &AddedProperties, ResultBuilder &Results,
5164                   bool IsBaseExprStatement = false,
5165                   bool IsClassProperty = false, bool InOriginalClass = true) {
5166   typedef CodeCompletionResult Result;
5167 
5168   // Retrieve the definition.
5169   Container = getContainerDef(Container);
5170 
5171   // Add properties in this container.
5172   const auto AddProperty = [&](const ObjCPropertyDecl *P) {
5173     if (!AddedProperties.insert(P->getIdentifier()).second)
5174       return;
5175 
5176     // FIXME: Provide block invocation completion for non-statement
5177     // expressions.
5178     if (!P->getType().getTypePtr()->isBlockPointerType() ||
5179         !IsBaseExprStatement) {
5180       Result R = Result(P, Results.getBasePriority(P), nullptr);
5181       if (!InOriginalClass)
5182         setInBaseClass(R);
5183       Results.MaybeAddResult(R, CurContext);
5184       return;
5185     }
5186 
5187     // Block setter and invocation completion is provided only when we are able
5188     // to find the FunctionProtoTypeLoc with parameter names for the block.
5189     FunctionTypeLoc BlockLoc;
5190     FunctionProtoTypeLoc BlockProtoLoc;
5191     findTypeLocationForBlockDecl(P->getTypeSourceInfo(), BlockLoc,
5192                                  BlockProtoLoc);
5193     if (!BlockLoc) {
5194       Result R = Result(P, Results.getBasePriority(P), nullptr);
5195       if (!InOriginalClass)
5196         setInBaseClass(R);
5197       Results.MaybeAddResult(R, CurContext);
5198       return;
5199     }
5200 
5201     // The default completion result for block properties should be the block
5202     // invocation completion when the base expression is a statement.
5203     CodeCompletionBuilder Builder(Results.getAllocator(),
5204                                   Results.getCodeCompletionTUInfo());
5205     AddObjCBlockCall(Container->getASTContext(),
5206                      getCompletionPrintingPolicy(Results.getSema()), Builder, P,
5207                      BlockLoc, BlockProtoLoc);
5208     Result R = Result(Builder.TakeString(), P, Results.getBasePriority(P));
5209     if (!InOriginalClass)
5210       setInBaseClass(R);
5211     Results.MaybeAddResult(R, CurContext);
5212 
5213     // Provide additional block setter completion iff the base expression is a
5214     // statement and the block property is mutable.
5215     if (!P->isReadOnly()) {
5216       CodeCompletionBuilder Builder(Results.getAllocator(),
5217                                     Results.getCodeCompletionTUInfo());
5218       AddResultTypeChunk(Container->getASTContext(),
5219                          getCompletionPrintingPolicy(Results.getSema()), P,
5220                          CCContext.getBaseType(), Builder);
5221       Builder.AddTypedTextChunk(
5222           Results.getAllocator().CopyString(P->getName()));
5223       Builder.AddChunk(CodeCompletionString::CK_Equal);
5224 
5225       std::string PlaceholderStr = formatBlockPlaceholder(
5226           getCompletionPrintingPolicy(Results.getSema()), P, BlockLoc,
5227           BlockProtoLoc, /*SuppressBlockName=*/true);
5228       // Add the placeholder string.
5229       Builder.AddPlaceholderChunk(
5230           Builder.getAllocator().CopyString(PlaceholderStr));
5231 
5232       // When completing blocks properties that return void the default
5233       // property completion result should show up before the setter,
5234       // otherwise the setter completion should show up before the default
5235       // property completion, as we normally want to use the result of the
5236       // call.
5237       Result R =
5238           Result(Builder.TakeString(), P,
5239                  Results.getBasePriority(P) +
5240                      (BlockLoc.getTypePtr()->getReturnType()->isVoidType()
5241                           ? CCD_BlockPropertySetter
5242                           : -CCD_BlockPropertySetter));
5243       if (!InOriginalClass)
5244         setInBaseClass(R);
5245       Results.MaybeAddResult(R, CurContext);
5246     }
5247   };
5248 
5249   if (IsClassProperty) {
5250     for (const auto *P : Container->class_properties())
5251       AddProperty(P);
5252   } else {
5253     for (const auto *P : Container->instance_properties())
5254       AddProperty(P);
5255   }
5256 
5257   // Add nullary methods or implicit class properties
5258   if (AllowNullaryMethods) {
5259     ASTContext &Context = Container->getASTContext();
5260     PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
5261     // Adds a method result
5262     const auto AddMethod = [&](const ObjCMethodDecl *M) {
5263       const IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0);
5264       if (!Name)
5265         return;
5266       if (!AddedProperties.insert(Name).second)
5267         return;
5268       CodeCompletionBuilder Builder(Results.getAllocator(),
5269                                     Results.getCodeCompletionTUInfo());
5270       AddResultTypeChunk(Context, Policy, M, CCContext.getBaseType(), Builder);
5271       Builder.AddTypedTextChunk(
5272           Results.getAllocator().CopyString(Name->getName()));
5273       Result R = Result(Builder.TakeString(), M,
5274                         CCP_MemberDeclaration + CCD_MethodAsProperty);
5275       if (!InOriginalClass)
5276         setInBaseClass(R);
5277       Results.MaybeAddResult(R, CurContext);
5278     };
5279 
5280     if (IsClassProperty) {
5281       for (const auto *M : Container->methods()) {
5282         // Gather the class method that can be used as implicit property
5283         // getters. Methods with arguments or methods that return void aren't
5284         // added to the results as they can't be used as a getter.
5285         if (!M->getSelector().isUnarySelector() ||
5286             M->getReturnType()->isVoidType() || M->isInstanceMethod())
5287           continue;
5288         AddMethod(M);
5289       }
5290     } else {
5291       for (auto *M : Container->methods()) {
5292         if (M->getSelector().isUnarySelector())
5293           AddMethod(M);
5294       }
5295     }
5296   }
5297 
5298   // Add properties in referenced protocols.
5299   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
5300     for (auto *P : Protocol->protocols())
5301       AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods,
5302                         CurContext, AddedProperties, Results,
5303                         IsBaseExprStatement, IsClassProperty,
5304                         /*InOriginalClass*/ false);
5305   } else if (ObjCInterfaceDecl *IFace =
5306                  dyn_cast<ObjCInterfaceDecl>(Container)) {
5307     if (AllowCategories) {
5308       // Look through categories.
5309       for (auto *Cat : IFace->known_categories())
5310         AddObjCProperties(CCContext, Cat, AllowCategories, AllowNullaryMethods,
5311                           CurContext, AddedProperties, Results,
5312                           IsBaseExprStatement, IsClassProperty,
5313                           InOriginalClass);
5314     }
5315 
5316     // Look through protocols.
5317     for (auto *I : IFace->all_referenced_protocols())
5318       AddObjCProperties(CCContext, I, AllowCategories, AllowNullaryMethods,
5319                         CurContext, AddedProperties, Results,
5320                         IsBaseExprStatement, IsClassProperty,
5321                         /*InOriginalClass*/ false);
5322 
5323     // Look in the superclass.
5324     if (IFace->getSuperClass())
5325       AddObjCProperties(CCContext, IFace->getSuperClass(), AllowCategories,
5326                         AllowNullaryMethods, CurContext, AddedProperties,
5327                         Results, IsBaseExprStatement, IsClassProperty,
5328                         /*InOriginalClass*/ false);
5329   } else if (const auto *Category =
5330                  dyn_cast<ObjCCategoryDecl>(Container)) {
5331     // Look through protocols.
5332     for (auto *P : Category->protocols())
5333       AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods,
5334                         CurContext, AddedProperties, Results,
5335                         IsBaseExprStatement, IsClassProperty,
5336                         /*InOriginalClass*/ false);
5337   }
5338 }
5339 
5340 static void
5341 AddRecordMembersCompletionResults(Sema &SemaRef, ResultBuilder &Results,
5342                                   Scope *S, QualType BaseType,
5343                                   ExprValueKind BaseKind, RecordDecl *RD,
5344                                   std::optional<FixItHint> AccessOpFixIt) {
5345   // Indicate that we are performing a member access, and the cv-qualifiers
5346   // for the base object type.
5347   Results.setObjectTypeQualifiers(BaseType.getQualifiers(), BaseKind);
5348 
5349   // Access to a C/C++ class, struct, or union.
5350   Results.allowNestedNameSpecifiers();
5351   std::vector<FixItHint> FixIts;
5352   if (AccessOpFixIt)
5353     FixIts.emplace_back(*AccessOpFixIt);
5354   CodeCompletionDeclConsumer Consumer(Results, RD, BaseType, std::move(FixIts));
5355   SemaRef.LookupVisibleDecls(
5356       RD, Sema::LookupMemberName, Consumer,
5357       SemaRef.CodeCompletion().CodeCompleter->includeGlobals(),
5358       /*IncludeDependentBases=*/true,
5359       SemaRef.CodeCompletion().CodeCompleter->loadExternal());
5360 
5361   if (SemaRef.getLangOpts().CPlusPlus) {
5362     if (!Results.empty()) {
5363       // The "template" keyword can follow "->" or "." in the grammar.
5364       // However, we only want to suggest the template keyword if something
5365       // is dependent.
5366       bool IsDependent = BaseType->isDependentType();
5367       if (!IsDependent) {
5368         for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent())
5369           if (DeclContext *Ctx = DepScope->getEntity()) {
5370             IsDependent = Ctx->isDependentContext();
5371             break;
5372           }
5373       }
5374 
5375       if (IsDependent)
5376         Results.AddResult(CodeCompletionResult("template"));
5377     }
5378   }
5379 }
5380 
5381 // Returns the RecordDecl inside the BaseType, falling back to primary template
5382 // in case of specializations. Since we might not have a decl for the
5383 // instantiation/specialization yet, e.g. dependent code.
5384 static RecordDecl *getAsRecordDecl(QualType BaseType,
5385                                    HeuristicResolver &Resolver) {
5386   BaseType = Resolver.simplifyType(BaseType, nullptr, /*UnwrapPointer=*/false);
5387   return dyn_cast_if_present<RecordDecl>(
5388       Resolver.resolveTypeToTagDecl(BaseType));
5389 }
5390 
5391 namespace {
5392 // Collects completion-relevant information about a concept-constrainted type T.
5393 // In particular, examines the constraint expressions to find members of T.
5394 //
5395 // The design is very simple: we walk down each constraint looking for
5396 // expressions of the form T.foo().
5397 // If we're extra lucky, the return type is specified.
5398 // We don't do any clever handling of && or || in constraint expressions, we
5399 // take members from both branches.
5400 //
5401 // For example, given:
5402 //   template <class T> concept X = requires (T t, string& s) { t.print(s); };
5403 //   template <X U> void foo(U u) { u.^ }
5404 // We want to suggest the inferred member function 'print(string)'.
5405 // We see that u has type U, so X<U> holds.
5406 // X<U> requires t.print(s) to be valid, where t has type U (substituted for T).
5407 // By looking at the CallExpr we find the signature of print().
5408 //
5409 // While we tend to know in advance which kind of members (access via . -> ::)
5410 // we want, it's simpler just to gather them all and post-filter.
5411 //
5412 // FIXME: some of this machinery could be used for non-concept type-parms too,
5413 // enabling completion for type parameters based on other uses of that param.
5414 //
5415 // FIXME: there are other cases where a type can be constrained by a concept,
5416 // e.g. inside `if constexpr(ConceptSpecializationExpr) { ... }`
5417 class ConceptInfo {
5418 public:
5419   // Describes a likely member of a type, inferred by concept constraints.
5420   // Offered as a code completion for T. T-> and T:: contexts.
5421   struct Member {
5422     // Always non-null: we only handle members with ordinary identifier names.
5423     const IdentifierInfo *Name = nullptr;
5424     // Set for functions we've seen called.
5425     // We don't have the declared parameter types, only the actual types of
5426     // arguments we've seen. These are still valuable, as it's hard to render
5427     // a useful function completion with neither parameter types nor names!
5428     std::optional<SmallVector<QualType, 1>> ArgTypes;
5429     // Whether this is accessed as T.member, T->member, or T::member.
5430     enum AccessOperator {
5431       Colons,
5432       Arrow,
5433       Dot,
5434     } Operator = Dot;
5435     // What's known about the type of a variable or return type of a function.
5436     const TypeConstraint *ResultType = nullptr;
5437     // FIXME: also track:
5438     //   - kind of entity (function/variable/type), to expose structured results
5439     //   - template args kinds/types, as a proxy for template params
5440 
5441     // For now we simply return these results as "pattern" strings.
5442     CodeCompletionString *render(Sema &S, CodeCompletionAllocator &Alloc,
5443                                  CodeCompletionTUInfo &Info) const {
5444       CodeCompletionBuilder B(Alloc, Info);
5445       // Result type
5446       if (ResultType) {
5447         std::string AsString;
5448         {
5449           llvm::raw_string_ostream OS(AsString);
5450           QualType ExactType = deduceType(*ResultType);
5451           if (!ExactType.isNull())
5452             ExactType.print(OS, getCompletionPrintingPolicy(S));
5453           else
5454             ResultType->print(OS, getCompletionPrintingPolicy(S));
5455         }
5456         B.AddResultTypeChunk(Alloc.CopyString(AsString));
5457       }
5458       // Member name
5459       B.AddTypedTextChunk(Alloc.CopyString(Name->getName()));
5460       // Function argument list
5461       if (ArgTypes) {
5462         B.AddChunk(clang::CodeCompletionString::CK_LeftParen);
5463         bool First = true;
5464         for (QualType Arg : *ArgTypes) {
5465           if (First)
5466             First = false;
5467           else {
5468             B.AddChunk(clang::CodeCompletionString::CK_Comma);
5469             B.AddChunk(clang::CodeCompletionString::CK_HorizontalSpace);
5470           }
5471           B.AddPlaceholderChunk(Alloc.CopyString(
5472               Arg.getAsString(getCompletionPrintingPolicy(S))));
5473         }
5474         B.AddChunk(clang::CodeCompletionString::CK_RightParen);
5475       }
5476       return B.TakeString();
5477     }
5478   };
5479 
5480   // BaseType is the type parameter T to infer members from.
5481   // T must be accessible within S, as we use it to find the template entity
5482   // that T is attached to in order to gather the relevant constraints.
5483   ConceptInfo(const TemplateTypeParmType &BaseType, Scope *S) {
5484     auto *TemplatedEntity = getTemplatedEntity(BaseType.getDecl(), S);
5485     for (const AssociatedConstraint &AC :
5486          constraintsForTemplatedEntity(TemplatedEntity))
5487       believe(AC.ConstraintExpr, &BaseType);
5488   }
5489 
5490   std::vector<Member> members() {
5491     std::vector<Member> Results;
5492     for (const auto &E : this->Results)
5493       Results.push_back(E.second);
5494     llvm::sort(Results, [](const Member &L, const Member &R) {
5495       return L.Name->getName() < R.Name->getName();
5496     });
5497     return Results;
5498   }
5499 
5500 private:
5501   // Infer members of T, given that the expression E (dependent on T) is true.
5502   void believe(const Expr *E, const TemplateTypeParmType *T) {
5503     if (!E || !T)
5504       return;
5505     if (auto *CSE = dyn_cast<ConceptSpecializationExpr>(E)) {
5506       // If the concept is
5507       //   template <class A, class B> concept CD = f<A, B>();
5508       // And the concept specialization is
5509       //   CD<int, T>
5510       // Then we're substituting T for B, so we want to make f<A, B>() true
5511       // by adding members to B - i.e. believe(f<A, B>(), B);
5512       //
5513       // For simplicity:
5514       // - we don't attempt to substitute int for A
5515       // - when T is used in other ways (like CD<T*>) we ignore it
5516       ConceptDecl *CD = CSE->getNamedConcept();
5517       TemplateParameterList *Params = CD->getTemplateParameters();
5518       unsigned Index = 0;
5519       for (const auto &Arg : CSE->getTemplateArguments()) {
5520         if (Index >= Params->size())
5521           break; // Won't happen in valid code.
5522         if (isApprox(Arg, T)) {
5523           auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Params->getParam(Index));
5524           if (!TTPD)
5525             continue;
5526           // T was used as an argument, and bound to the parameter TT.
5527           auto *TT = cast<TemplateTypeParmType>(TTPD->getTypeForDecl());
5528           // So now we know the constraint as a function of TT is true.
5529           believe(CD->getConstraintExpr(), TT);
5530           // (concepts themselves have no associated constraints to require)
5531         }
5532 
5533         ++Index;
5534       }
5535     } else if (auto *BO = dyn_cast<BinaryOperator>(E)) {
5536       // For A && B, we can infer members from both branches.
5537       // For A || B, the union is still more useful than the intersection.
5538       if (BO->getOpcode() == BO_LAnd || BO->getOpcode() == BO_LOr) {
5539         believe(BO->getLHS(), T);
5540         believe(BO->getRHS(), T);
5541       }
5542     } else if (auto *RE = dyn_cast<RequiresExpr>(E)) {
5543       // A requires(){...} lets us infer members from each requirement.
5544       for (const concepts::Requirement *Req : RE->getRequirements()) {
5545         if (!Req->isDependent())
5546           continue; // Can't tell us anything about T.
5547         // Now Req cannot a substitution-error: those aren't dependent.
5548 
5549         if (auto *TR = dyn_cast<concepts::TypeRequirement>(Req)) {
5550           // Do a full traversal so we get `foo` from `typename T::foo::bar`.
5551           QualType AssertedType = TR->getType()->getType();
5552           ValidVisitor(this, T).TraverseType(AssertedType);
5553         } else if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
5554           ValidVisitor Visitor(this, T);
5555           // If we have a type constraint on the value of the expression,
5556           // AND the whole outer expression describes a member, then we'll
5557           // be able to use the constraint to provide the return type.
5558           if (ER->getReturnTypeRequirement().isTypeConstraint()) {
5559             Visitor.OuterType =
5560                 ER->getReturnTypeRequirement().getTypeConstraint();
5561             Visitor.OuterExpr = ER->getExpr();
5562           }
5563           Visitor.TraverseStmt(ER->getExpr());
5564         } else if (auto *NR = dyn_cast<concepts::NestedRequirement>(Req)) {
5565           believe(NR->getConstraintExpr(), T);
5566         }
5567       }
5568     }
5569   }
5570 
5571   // This visitor infers members of T based on traversing expressions/types
5572   // that involve T. It is invoked with code known to be valid for T.
5573   class ValidVisitor : public DynamicRecursiveASTVisitor {
5574     ConceptInfo *Outer;
5575     const TemplateTypeParmType *T;
5576 
5577     CallExpr *Caller = nullptr;
5578     Expr *Callee = nullptr;
5579 
5580   public:
5581     // If set, OuterExpr is constrained by OuterType.
5582     Expr *OuterExpr = nullptr;
5583     const TypeConstraint *OuterType = nullptr;
5584 
5585     ValidVisitor(ConceptInfo *Outer, const TemplateTypeParmType *T)
5586         : Outer(Outer), T(T) {
5587       assert(T);
5588     }
5589 
5590     // In T.foo or T->foo, `foo` is a member function/variable.
5591     bool
5592     VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) override {
5593       const Type *Base = E->getBaseType().getTypePtr();
5594       bool IsArrow = E->isArrow();
5595       if (Base->isPointerType() && IsArrow) {
5596         IsArrow = false;
5597         Base = Base->getPointeeType().getTypePtr();
5598       }
5599       if (isApprox(Base, T))
5600         addValue(E, E->getMember(), IsArrow ? Member::Arrow : Member::Dot);
5601       return true;
5602     }
5603 
5604     // In T::foo, `foo` is a static member function/variable.
5605     bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) override {
5606       if (E->getQualifier() && isApprox(E->getQualifier()->getAsType(), T))
5607         addValue(E, E->getDeclName(), Member::Colons);
5608       return true;
5609     }
5610 
5611     // In T::typename foo, `foo` is a type.
5612     bool VisitDependentNameType(DependentNameType *DNT) override {
5613       const auto *Q = DNT->getQualifier();
5614       if (Q && isApprox(Q->getAsType(), T))
5615         addType(DNT->getIdentifier());
5616       return true;
5617     }
5618 
5619     // In T::foo::bar, `foo` must be a type.
5620     // VisitNNS() doesn't exist, and TraverseNNS isn't always called :-(
5621     bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNSL) override {
5622       if (NNSL) {
5623         NestedNameSpecifier *NNS = NNSL.getNestedNameSpecifier();
5624         const auto *Q = NNS->getPrefix();
5625         if (Q && isApprox(Q->getAsType(), T))
5626           addType(NNS->getAsIdentifier());
5627       }
5628       // FIXME: also handle T::foo<X>::bar
5629       return DynamicRecursiveASTVisitor::TraverseNestedNameSpecifierLoc(NNSL);
5630     }
5631 
5632     // FIXME also handle T::foo<X>
5633 
5634     // Track the innermost caller/callee relationship so we can tell if a
5635     // nested expr is being called as a function.
5636     bool VisitCallExpr(CallExpr *CE) override {
5637       Caller = CE;
5638       Callee = CE->getCallee();
5639       return true;
5640     }
5641 
5642   private:
5643     void addResult(Member &&M) {
5644       auto R = Outer->Results.try_emplace(M.Name);
5645       Member &O = R.first->second;
5646       // Overwrite existing if the new member has more info.
5647       // The preference of . vs :: vs -> is fairly arbitrary.
5648       if (/*Inserted*/ R.second ||
5649           std::make_tuple(M.ArgTypes.has_value(), M.ResultType != nullptr,
5650                           M.Operator) > std::make_tuple(O.ArgTypes.has_value(),
5651                                                         O.ResultType != nullptr,
5652                                                         O.Operator))
5653         O = std::move(M);
5654     }
5655 
5656     void addType(const IdentifierInfo *Name) {
5657       if (!Name)
5658         return;
5659       Member M;
5660       M.Name = Name;
5661       M.Operator = Member::Colons;
5662       addResult(std::move(M));
5663     }
5664 
5665     void addValue(Expr *E, DeclarationName Name,
5666                   Member::AccessOperator Operator) {
5667       if (!Name.isIdentifier())
5668         return;
5669       Member Result;
5670       Result.Name = Name.getAsIdentifierInfo();
5671       Result.Operator = Operator;
5672       // If this is the callee of an immediately-enclosing CallExpr, then
5673       // treat it as a method, otherwise it's a variable.
5674       if (Caller != nullptr && Callee == E) {
5675         Result.ArgTypes.emplace();
5676         for (const auto *Arg : Caller->arguments())
5677           Result.ArgTypes->push_back(Arg->getType());
5678         if (Caller == OuterExpr) {
5679           Result.ResultType = OuterType;
5680         }
5681       } else {
5682         if (E == OuterExpr)
5683           Result.ResultType = OuterType;
5684       }
5685       addResult(std::move(Result));
5686     }
5687   };
5688 
5689   static bool isApprox(const TemplateArgument &Arg, const Type *T) {
5690     return Arg.getKind() == TemplateArgument::Type &&
5691            isApprox(Arg.getAsType().getTypePtr(), T);
5692   }
5693 
5694   static bool isApprox(const Type *T1, const Type *T2) {
5695     return T1 && T2 &&
5696            T1->getCanonicalTypeUnqualified() ==
5697                T2->getCanonicalTypeUnqualified();
5698   }
5699 
5700   // Returns the DeclContext immediately enclosed by the template parameter
5701   // scope. For primary templates, this is the templated (e.g.) CXXRecordDecl.
5702   // For specializations, this is e.g. ClassTemplatePartialSpecializationDecl.
5703   static DeclContext *getTemplatedEntity(const TemplateTypeParmDecl *D,
5704                                          Scope *S) {
5705     if (D == nullptr)
5706       return nullptr;
5707     Scope *Inner = nullptr;
5708     while (S) {
5709       if (S->isTemplateParamScope() && S->isDeclScope(D))
5710         return Inner ? Inner->getEntity() : nullptr;
5711       Inner = S;
5712       S = S->getParent();
5713     }
5714     return nullptr;
5715   }
5716 
5717   // Gets all the type constraint expressions that might apply to the type
5718   // variables associated with DC (as returned by getTemplatedEntity()).
5719   static SmallVector<AssociatedConstraint, 1>
5720   constraintsForTemplatedEntity(DeclContext *DC) {
5721     SmallVector<AssociatedConstraint, 1> Result;
5722     if (DC == nullptr)
5723       return Result;
5724     // Primary templates can have constraints.
5725     if (const auto *TD = cast<Decl>(DC)->getDescribedTemplate())
5726       TD->getAssociatedConstraints(Result);
5727     // Partial specializations may have constraints.
5728     if (const auto *CTPSD =
5729             dyn_cast<ClassTemplatePartialSpecializationDecl>(DC))
5730       CTPSD->getAssociatedConstraints(Result);
5731     if (const auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(DC))
5732       VTPSD->getAssociatedConstraints(Result);
5733     return Result;
5734   }
5735 
5736   // Attempt to find the unique type satisfying a constraint.
5737   // This lets us show e.g. `int` instead of `std::same_as<int>`.
5738   static QualType deduceType(const TypeConstraint &T) {
5739     // Assume a same_as<T> return type constraint is std::same_as or equivalent.
5740     // In this case the return type is T.
5741     DeclarationName DN = T.getNamedConcept()->getDeclName();
5742     if (DN.isIdentifier() && DN.getAsIdentifierInfo()->isStr("same_as"))
5743       if (const auto *Args = T.getTemplateArgsAsWritten())
5744         if (Args->getNumTemplateArgs() == 1) {
5745           const auto &Arg = Args->arguments().front().getArgument();
5746           if (Arg.getKind() == TemplateArgument::Type)
5747             return Arg.getAsType();
5748         }
5749     return {};
5750   }
5751 
5752   llvm::DenseMap<const IdentifierInfo *, Member> Results;
5753 };
5754 
5755 // Returns a type for E that yields acceptable member completions.
5756 // In particular, when E->getType() is DependentTy, try to guess a likely type.
5757 // We accept some lossiness (like dropping parameters).
5758 // We only try to handle common expressions on the LHS of MemberExpr.
5759 QualType getApproximateType(const Expr *E, HeuristicResolver &Resolver) {
5760   if (E->getType().isNull())
5761     return QualType();
5762   // Don't drop implicit cast if it's an array decay.
5763   if (auto *ICE = dyn_cast<ImplicitCastExpr>(E);
5764       !ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
5765     E = E->IgnoreParenImpCasts();
5766   QualType Unresolved = E->getType();
5767   // Resolve DependentNameType
5768   if (const auto *DNT = Unresolved->getAs<DependentNameType>()) {
5769     if (auto Decls = Resolver.resolveDependentNameType(DNT);
5770         Decls.size() == 1) {
5771       if (const auto *TD = dyn_cast<TypeDecl>(Decls[0]))
5772         return QualType(TD->getTypeForDecl(), 0);
5773     }
5774   }
5775   // We only resolve DependentTy, or undeduced autos (including auto* etc).
5776   if (!Unresolved->isSpecificBuiltinType(BuiltinType::Dependent)) {
5777     AutoType *Auto = Unresolved->getContainedAutoType();
5778     if (!Auto || !Auto->isUndeducedAutoType())
5779       return Unresolved;
5780   }
5781   // A call: approximate-resolve callee to a function type, get its return type
5782   if (const CallExpr *CE = llvm::dyn_cast<CallExpr>(E)) {
5783     QualType Callee = getApproximateType(CE->getCallee(), Resolver);
5784     if (Callee.isNull() ||
5785         Callee->isSpecificPlaceholderType(BuiltinType::BoundMember))
5786       Callee = Expr::findBoundMemberType(CE->getCallee());
5787     if (Callee.isNull())
5788       return Unresolved;
5789 
5790     if (const auto *FnTypePtr = Callee->getAs<PointerType>()) {
5791       Callee = FnTypePtr->getPointeeType();
5792     } else if (const auto *BPT = Callee->getAs<BlockPointerType>()) {
5793       Callee = BPT->getPointeeType();
5794     }
5795     if (const FunctionType *FnType = Callee->getAs<FunctionType>())
5796       return FnType->getReturnType().getNonReferenceType();
5797 
5798     // Unresolved call: try to guess the return type.
5799     if (const auto *OE = llvm::dyn_cast<OverloadExpr>(CE->getCallee())) {
5800       // If all candidates have the same approximate return type, use it.
5801       // Discard references and const to allow more to be "the same".
5802       // (In particular, if there's one candidate + ADL, resolve it).
5803       const Type *Common = nullptr;
5804       for (const auto *D : OE->decls()) {
5805         QualType ReturnType;
5806         if (const auto *FD = llvm::dyn_cast<FunctionDecl>(D))
5807           ReturnType = FD->getReturnType();
5808         else if (const auto *FTD = llvm::dyn_cast<FunctionTemplateDecl>(D))
5809           ReturnType = FTD->getTemplatedDecl()->getReturnType();
5810         if (ReturnType.isNull())
5811           continue;
5812         const Type *Candidate =
5813             ReturnType.getNonReferenceType().getCanonicalType().getTypePtr();
5814         if (Common && Common != Candidate)
5815           return Unresolved; // Multiple candidates.
5816         Common = Candidate;
5817       }
5818       if (Common != nullptr)
5819         return QualType(Common, 0);
5820     }
5821   }
5822   // A dependent member: resolve using HeuristicResolver.
5823   if (const auto *CDSME = llvm::dyn_cast<CXXDependentScopeMemberExpr>(E)) {
5824     for (const auto *Member : Resolver.resolveMemberExpr(CDSME)) {
5825       if (const auto *VD = dyn_cast<ValueDecl>(Member)) {
5826         return VD->getType().getNonReferenceType();
5827       }
5828     }
5829   }
5830   // A reference to an `auto` variable: approximate-resolve its initializer.
5831   if (const auto *DRE = llvm::dyn_cast<DeclRefExpr>(E)) {
5832     if (const auto *VD = llvm::dyn_cast<VarDecl>(DRE->getDecl())) {
5833       if (VD->hasInit())
5834         return getApproximateType(VD->getInit(), Resolver);
5835     }
5836   }
5837   if (const auto *UO = llvm::dyn_cast<UnaryOperator>(E)) {
5838     if (UO->getOpcode() == UnaryOperatorKind::UO_Deref) {
5839       // We recurse into the subexpression because it could be of dependent
5840       // type.
5841       if (auto Pointee =
5842               getApproximateType(UO->getSubExpr(), Resolver)->getPointeeType();
5843           !Pointee.isNull())
5844         return Pointee;
5845       // Our caller expects a non-null result, even though the SubType is
5846       // supposed to have a pointee. Fall through to Unresolved anyway.
5847     }
5848   }
5849   return Unresolved;
5850 }
5851 
5852 // If \p Base is ParenListExpr, assume a chain of comma operators and pick the
5853 // last expr. We expect other ParenListExprs to be resolved to e.g. constructor
5854 // calls before here. (So the ParenListExpr should be nonempty, but check just
5855 // in case)
5856 Expr *unwrapParenList(Expr *Base) {
5857   if (auto *PLE = llvm::dyn_cast_or_null<ParenListExpr>(Base)) {
5858     if (PLE->getNumExprs() == 0)
5859       return nullptr;
5860     Base = PLE->getExpr(PLE->getNumExprs() - 1);
5861   }
5862   return Base;
5863 }
5864 
5865 } // namespace
5866 
5867 void SemaCodeCompletion::CodeCompleteMemberReferenceExpr(
5868     Scope *S, Expr *Base, Expr *OtherOpBase, SourceLocation OpLoc, bool IsArrow,
5869     bool IsBaseExprStatement, QualType PreferredType) {
5870   Base = unwrapParenList(Base);
5871   OtherOpBase = unwrapParenList(OtherOpBase);
5872   if (!Base || !CodeCompleter)
5873     return;
5874 
5875   ExprResult ConvertedBase =
5876       SemaRef.PerformMemberExprBaseConversion(Base, IsArrow);
5877   if (ConvertedBase.isInvalid())
5878     return;
5879   QualType ConvertedBaseType =
5880       getApproximateType(ConvertedBase.get(), Resolver);
5881 
5882   enum CodeCompletionContext::Kind contextKind;
5883 
5884   if (IsArrow) {
5885     if (QualType PointeeType = Resolver.getPointeeType(ConvertedBaseType);
5886         !PointeeType.isNull()) {
5887       ConvertedBaseType = PointeeType;
5888     }
5889   }
5890 
5891   if (IsArrow) {
5892     contextKind = CodeCompletionContext::CCC_ArrowMemberAccess;
5893   } else {
5894     if (ConvertedBaseType->isObjCObjectPointerType() ||
5895         ConvertedBaseType->isObjCObjectOrInterfaceType()) {
5896       contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess;
5897     } else {
5898       contextKind = CodeCompletionContext::CCC_DotMemberAccess;
5899     }
5900   }
5901 
5902   CodeCompletionContext CCContext(contextKind, ConvertedBaseType);
5903   CCContext.setPreferredType(PreferredType);
5904   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
5905                         CodeCompleter->getCodeCompletionTUInfo(), CCContext,
5906                         &ResultBuilder::IsMember);
5907 
5908   auto DoCompletion = [&](Expr *Base, bool IsArrow,
5909                           std::optional<FixItHint> AccessOpFixIt) -> bool {
5910     if (!Base)
5911       return false;
5912 
5913     ExprResult ConvertedBase =
5914         SemaRef.PerformMemberExprBaseConversion(Base, IsArrow);
5915     if (ConvertedBase.isInvalid())
5916       return false;
5917     Base = ConvertedBase.get();
5918 
5919     QualType BaseType = getApproximateType(Base, Resolver);
5920     if (BaseType.isNull())
5921       return false;
5922     ExprValueKind BaseKind = Base->getValueKind();
5923 
5924     if (IsArrow) {
5925       if (QualType PointeeType = Resolver.getPointeeType(BaseType);
5926           !PointeeType.isNull()) {
5927         BaseType = PointeeType;
5928         BaseKind = VK_LValue;
5929       } else if (BaseType->isObjCObjectPointerType() ||
5930                  BaseType->isTemplateTypeParmType()) {
5931         // Both cases (dot/arrow) handled below.
5932       } else {
5933         return false;
5934       }
5935     }
5936 
5937     if (RecordDecl *RD = getAsRecordDecl(BaseType, Resolver)) {
5938       AddRecordMembersCompletionResults(SemaRef, Results, S, BaseType, BaseKind,
5939                                         RD, std::move(AccessOpFixIt));
5940     } else if (const auto *TTPT =
5941                    dyn_cast<TemplateTypeParmType>(BaseType.getTypePtr())) {
5942       auto Operator =
5943           IsArrow ? ConceptInfo::Member::Arrow : ConceptInfo::Member::Dot;
5944       for (const auto &R : ConceptInfo(*TTPT, S).members()) {
5945         if (R.Operator != Operator)
5946           continue;
5947         CodeCompletionResult Result(
5948             R.render(SemaRef, CodeCompleter->getAllocator(),
5949                      CodeCompleter->getCodeCompletionTUInfo()));
5950         if (AccessOpFixIt)
5951           Result.FixIts.push_back(*AccessOpFixIt);
5952         Results.AddResult(std::move(Result));
5953       }
5954     } else if (!IsArrow && BaseType->isObjCObjectPointerType()) {
5955       // Objective-C property reference. Bail if we're performing fix-it code
5956       // completion since Objective-C properties are normally backed by ivars,
5957       // most Objective-C fix-its here would have little value.
5958       if (AccessOpFixIt) {
5959         return false;
5960       }
5961       AddedPropertiesSet AddedProperties;
5962 
5963       if (const ObjCObjectPointerType *ObjCPtr =
5964               BaseType->getAsObjCInterfacePointerType()) {
5965         // Add property results based on our interface.
5966         assert(ObjCPtr && "Non-NULL pointer guaranteed above!");
5967         AddObjCProperties(CCContext, ObjCPtr->getInterfaceDecl(), true,
5968                           /*AllowNullaryMethods=*/true, SemaRef.CurContext,
5969                           AddedProperties, Results, IsBaseExprStatement);
5970       }
5971 
5972       // Add properties from the protocols in a qualified interface.
5973       for (auto *I : BaseType->castAs<ObjCObjectPointerType>()->quals())
5974         AddObjCProperties(CCContext, I, true, /*AllowNullaryMethods=*/true,
5975                           SemaRef.CurContext, AddedProperties, Results,
5976                           IsBaseExprStatement, /*IsClassProperty*/ false,
5977                           /*InOriginalClass*/ false);
5978     } else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
5979                (!IsArrow && BaseType->isObjCObjectType())) {
5980       // Objective-C instance variable access. Bail if we're performing fix-it
5981       // code completion since Objective-C properties are normally backed by
5982       // ivars, most Objective-C fix-its here would have little value.
5983       if (AccessOpFixIt) {
5984         return false;
5985       }
5986       ObjCInterfaceDecl *Class = nullptr;
5987       if (const ObjCObjectPointerType *ObjCPtr =
5988               BaseType->getAs<ObjCObjectPointerType>())
5989         Class = ObjCPtr->getInterfaceDecl();
5990       else
5991         Class = BaseType->castAs<ObjCObjectType>()->getInterface();
5992 
5993       // Add all ivars from this class and its superclasses.
5994       if (Class) {
5995         CodeCompletionDeclConsumer Consumer(Results, Class, BaseType);
5996         Results.setFilter(&ResultBuilder::IsObjCIvar);
5997         SemaRef.LookupVisibleDecls(Class, Sema::LookupMemberName, Consumer,
5998                                    CodeCompleter->includeGlobals(),
5999                                    /*IncludeDependentBases=*/false,
6000                                    CodeCompleter->loadExternal());
6001       }
6002     }
6003 
6004     // FIXME: How do we cope with isa?
6005     return true;
6006   };
6007 
6008   Results.EnterNewScope();
6009 
6010   bool CompletionSucceded = DoCompletion(Base, IsArrow, std::nullopt);
6011   if (CodeCompleter->includeFixIts()) {
6012     const CharSourceRange OpRange =
6013         CharSourceRange::getTokenRange(OpLoc, OpLoc);
6014     CompletionSucceded |= DoCompletion(
6015         OtherOpBase, !IsArrow,
6016         FixItHint::CreateReplacement(OpRange, IsArrow ? "." : "->"));
6017   }
6018 
6019   Results.ExitScope();
6020 
6021   if (!CompletionSucceded)
6022     return;
6023 
6024   // Hand off the results found for code completion.
6025   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6026                             Results.getCompletionContext(), Results.data(),
6027                             Results.size());
6028 }
6029 
6030 void SemaCodeCompletion::CodeCompleteObjCClassPropertyRefExpr(
6031     Scope *S, const IdentifierInfo &ClassName, SourceLocation ClassNameLoc,
6032     bool IsBaseExprStatement) {
6033   const IdentifierInfo *ClassNamePtr = &ClassName;
6034   ObjCInterfaceDecl *IFace =
6035       SemaRef.ObjC().getObjCInterfaceDecl(ClassNamePtr, ClassNameLoc);
6036   if (!IFace)
6037     return;
6038   CodeCompletionContext CCContext(
6039       CodeCompletionContext::CCC_ObjCPropertyAccess);
6040   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6041                         CodeCompleter->getCodeCompletionTUInfo(), CCContext,
6042                         &ResultBuilder::IsMember);
6043   Results.EnterNewScope();
6044   AddedPropertiesSet AddedProperties;
6045   AddObjCProperties(CCContext, IFace, true,
6046                     /*AllowNullaryMethods=*/true, SemaRef.CurContext,
6047                     AddedProperties, Results, IsBaseExprStatement,
6048                     /*IsClassProperty=*/true);
6049   Results.ExitScope();
6050   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6051                             Results.getCompletionContext(), Results.data(),
6052                             Results.size());
6053 }
6054 
6055 void SemaCodeCompletion::CodeCompleteTag(Scope *S, unsigned TagSpec) {
6056   if (!CodeCompleter)
6057     return;
6058 
6059   ResultBuilder::LookupFilter Filter = nullptr;
6060   enum CodeCompletionContext::Kind ContextKind =
6061       CodeCompletionContext::CCC_Other;
6062   switch ((DeclSpec::TST)TagSpec) {
6063   case DeclSpec::TST_enum:
6064     Filter = &ResultBuilder::IsEnum;
6065     ContextKind = CodeCompletionContext::CCC_EnumTag;
6066     break;
6067 
6068   case DeclSpec::TST_union:
6069     Filter = &ResultBuilder::IsUnion;
6070     ContextKind = CodeCompletionContext::CCC_UnionTag;
6071     break;
6072 
6073   case DeclSpec::TST_struct:
6074   case DeclSpec::TST_class:
6075   case DeclSpec::TST_interface:
6076     Filter = &ResultBuilder::IsClassOrStruct;
6077     ContextKind = CodeCompletionContext::CCC_ClassOrStructTag;
6078     break;
6079 
6080   default:
6081     llvm_unreachable("Unknown type specifier kind in CodeCompleteTag");
6082   }
6083 
6084   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6085                         CodeCompleter->getCodeCompletionTUInfo(), ContextKind);
6086   CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
6087 
6088   // First pass: look for tags.
6089   Results.setFilter(Filter);
6090   SemaRef.LookupVisibleDecls(S, Sema::LookupTagName, Consumer,
6091                              CodeCompleter->includeGlobals(),
6092                              CodeCompleter->loadExternal());
6093 
6094   if (CodeCompleter->includeGlobals()) {
6095     // Second pass: look for nested name specifiers.
6096     Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
6097     SemaRef.LookupVisibleDecls(S, Sema::LookupNestedNameSpecifierName, Consumer,
6098                                CodeCompleter->includeGlobals(),
6099                                CodeCompleter->loadExternal());
6100   }
6101 
6102   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6103                             Results.getCompletionContext(), Results.data(),
6104                             Results.size());
6105 }
6106 
6107 static void AddTypeQualifierResults(DeclSpec &DS, ResultBuilder &Results,
6108                                     const LangOptions &LangOpts) {
6109   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const))
6110     Results.AddResult("const");
6111   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile))
6112     Results.AddResult("volatile");
6113   if (LangOpts.C99 && !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict))
6114     Results.AddResult("restrict");
6115   if (LangOpts.C11 && !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic))
6116     Results.AddResult("_Atomic");
6117   if (LangOpts.MSVCCompat && !(DS.getTypeQualifiers() & DeclSpec::TQ_unaligned))
6118     Results.AddResult("__unaligned");
6119 }
6120 
6121 void SemaCodeCompletion::CodeCompleteTypeQualifiers(DeclSpec &DS) {
6122   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6123                         CodeCompleter->getCodeCompletionTUInfo(),
6124                         CodeCompletionContext::CCC_TypeQualifiers);
6125   Results.EnterNewScope();
6126   AddTypeQualifierResults(DS, Results, getLangOpts());
6127   Results.ExitScope();
6128   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6129                             Results.getCompletionContext(), Results.data(),
6130                             Results.size());
6131 }
6132 
6133 void SemaCodeCompletion::CodeCompleteFunctionQualifiers(
6134     DeclSpec &DS, Declarator &D, const VirtSpecifiers *VS) {
6135   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6136                         CodeCompleter->getCodeCompletionTUInfo(),
6137                         CodeCompletionContext::CCC_TypeQualifiers);
6138   Results.EnterNewScope();
6139   AddTypeQualifierResults(DS, Results, getLangOpts());
6140   if (getLangOpts().CPlusPlus11) {
6141     Results.AddResult("noexcept");
6142     if (D.getContext() == DeclaratorContext::Member && !D.isCtorOrDtor() &&
6143         !D.isStaticMember()) {
6144       if (!VS || !VS->isFinalSpecified())
6145         Results.AddResult("final");
6146       if (!VS || !VS->isOverrideSpecified())
6147         Results.AddResult("override");
6148     }
6149   }
6150   Results.ExitScope();
6151   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6152                             Results.getCompletionContext(), Results.data(),
6153                             Results.size());
6154 }
6155 
6156 void SemaCodeCompletion::CodeCompleteBracketDeclarator(Scope *S) {
6157   CodeCompleteExpression(S, QualType(getASTContext().getSizeType()));
6158 }
6159 
6160 void SemaCodeCompletion::CodeCompleteCase(Scope *S) {
6161   if (SemaRef.getCurFunction()->SwitchStack.empty() || !CodeCompleter)
6162     return;
6163 
6164   SwitchStmt *Switch =
6165       SemaRef.getCurFunction()->SwitchStack.back().getPointer();
6166   // Condition expression might be invalid, do not continue in this case.
6167   if (!Switch->getCond())
6168     return;
6169   QualType type = Switch->getCond()->IgnoreImplicit()->getType();
6170   if (!type->isEnumeralType()) {
6171     CodeCompleteExpressionData Data(type);
6172     Data.IntegralConstantExpression = true;
6173     CodeCompleteExpression(S, Data);
6174     return;
6175   }
6176 
6177   // Code-complete the cases of a switch statement over an enumeration type
6178   // by providing the list of
6179   EnumDecl *Enum = type->castAs<EnumType>()->getDecl();
6180   if (EnumDecl *Def = Enum->getDefinition())
6181     Enum = Def;
6182 
6183   // Determine which enumerators we have already seen in the switch statement.
6184   // FIXME: Ideally, we would also be able to look *past* the code-completion
6185   // token, in case we are code-completing in the middle of the switch and not
6186   // at the end. However, we aren't able to do so at the moment.
6187   CoveredEnumerators Enumerators;
6188   for (SwitchCase *SC = Switch->getSwitchCaseList(); SC;
6189        SC = SC->getNextSwitchCase()) {
6190     CaseStmt *Case = dyn_cast<CaseStmt>(SC);
6191     if (!Case)
6192       continue;
6193 
6194     Expr *CaseVal = Case->getLHS()->IgnoreParenCasts();
6195     if (auto *DRE = dyn_cast<DeclRefExpr>(CaseVal))
6196       if (auto *Enumerator =
6197               dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
6198         // We look into the AST of the case statement to determine which
6199         // enumerator was named. Alternatively, we could compute the value of
6200         // the integral constant expression, then compare it against the
6201         // values of each enumerator. However, value-based approach would not
6202         // work as well with C++ templates where enumerators declared within a
6203         // template are type- and value-dependent.
6204         Enumerators.Seen.insert(Enumerator);
6205 
6206         // If this is a qualified-id, keep track of the nested-name-specifier
6207         // so that we can reproduce it as part of code completion, e.g.,
6208         //
6209         //   switch (TagD.getKind()) {
6210         //     case TagDecl::TK_enum:
6211         //       break;
6212         //     case XXX
6213         //
6214         // At the XXX, our completions are TagDecl::TK_union,
6215         // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union,
6216         // TK_struct, and TK_class.
6217         Enumerators.SuggestedQualifier = DRE->getQualifier();
6218       }
6219   }
6220 
6221   // Add any enumerators that have not yet been mentioned.
6222   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6223                         CodeCompleter->getCodeCompletionTUInfo(),
6224                         CodeCompletionContext::CCC_Expression);
6225   AddEnumerators(Results, getASTContext(), Enum, SemaRef.CurContext,
6226                  Enumerators);
6227 
6228   if (CodeCompleter->includeMacros()) {
6229     AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false);
6230   }
6231   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6232                             Results.getCompletionContext(), Results.data(),
6233                             Results.size());
6234 }
6235 
6236 static bool anyNullArguments(ArrayRef<Expr *> Args) {
6237   if (Args.size() && !Args.data())
6238     return true;
6239 
6240   for (unsigned I = 0; I != Args.size(); ++I)
6241     if (!Args[I])
6242       return true;
6243 
6244   return false;
6245 }
6246 
6247 typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate;
6248 
6249 static void mergeCandidatesWithResults(
6250     Sema &SemaRef, SmallVectorImpl<ResultCandidate> &Results,
6251     OverloadCandidateSet &CandidateSet, SourceLocation Loc, size_t ArgSize) {
6252   // Sort the overload candidate set by placing the best overloads first.
6253   llvm::stable_sort(CandidateSet, [&](const OverloadCandidate &X,
6254                                       const OverloadCandidate &Y) {
6255     return isBetterOverloadCandidate(SemaRef, X, Y, Loc, CandidateSet.getKind(),
6256                                      /*PartialOverloading=*/true);
6257   });
6258 
6259   // Add the remaining viable overload candidates as code-completion results.
6260   for (OverloadCandidate &Candidate : CandidateSet) {
6261     if (Candidate.Function) {
6262       if (Candidate.Function->isDeleted())
6263         continue;
6264       if (shouldEnforceArgLimit(/*PartialOverloading=*/true,
6265                                 Candidate.Function) &&
6266           Candidate.Function->getNumParams() <= ArgSize &&
6267           // Having zero args is annoying, normally we don't surface a function
6268           // with 2 params, if you already have 2 params, because you are
6269           // inserting the 3rd now. But with zero, it helps the user to figure
6270           // out there are no overloads that take any arguments. Hence we are
6271           // keeping the overload.
6272           ArgSize > 0)
6273         continue;
6274     }
6275     if (Candidate.Viable)
6276       Results.push_back(ResultCandidate(Candidate.Function));
6277   }
6278 }
6279 
6280 /// Get the type of the Nth parameter from a given set of overload
6281 /// candidates.
6282 static QualType getParamType(Sema &SemaRef,
6283                              ArrayRef<ResultCandidate> Candidates, unsigned N) {
6284 
6285   // Given the overloads 'Candidates' for a function call matching all arguments
6286   // up to N, return the type of the Nth parameter if it is the same for all
6287   // overload candidates.
6288   QualType ParamType;
6289   for (auto &Candidate : Candidates) {
6290     QualType CandidateParamType = Candidate.getParamType(N);
6291     if (CandidateParamType.isNull())
6292       continue;
6293     if (ParamType.isNull()) {
6294       ParamType = CandidateParamType;
6295       continue;
6296     }
6297     if (!SemaRef.Context.hasSameUnqualifiedType(
6298             ParamType.getNonReferenceType(),
6299             CandidateParamType.getNonReferenceType()))
6300       // Two conflicting types, give up.
6301       return QualType();
6302   }
6303 
6304   return ParamType;
6305 }
6306 
6307 static QualType
6308 ProduceSignatureHelp(Sema &SemaRef, MutableArrayRef<ResultCandidate> Candidates,
6309                      unsigned CurrentArg, SourceLocation OpenParLoc,
6310                      bool Braced) {
6311   if (Candidates.empty())
6312     return QualType();
6313   if (SemaRef.getPreprocessor().isCodeCompletionReached())
6314     SemaRef.CodeCompletion().CodeCompleter->ProcessOverloadCandidates(
6315         SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc,
6316         Braced);
6317   return getParamType(SemaRef, Candidates, CurrentArg);
6318 }
6319 
6320 QualType
6321 SemaCodeCompletion::ProduceCallSignatureHelp(Expr *Fn, ArrayRef<Expr *> Args,
6322                                              SourceLocation OpenParLoc) {
6323   Fn = unwrapParenList(Fn);
6324   if (!CodeCompleter || !Fn)
6325     return QualType();
6326 
6327   // FIXME: Provide support for variadic template functions.
6328   // Ignore type-dependent call expressions entirely.
6329   if (Fn->isTypeDependent() || anyNullArguments(Args))
6330     return QualType();
6331   // In presence of dependent args we surface all possible signatures using the
6332   // non-dependent args in the prefix. Afterwards we do a post filtering to make
6333   // sure provided candidates satisfy parameter count restrictions.
6334   auto ArgsWithoutDependentTypes =
6335       Args.take_while([](Expr *Arg) { return !Arg->isTypeDependent(); });
6336 
6337   SmallVector<ResultCandidate, 8> Results;
6338 
6339   Expr *NakedFn = Fn->IgnoreParenCasts();
6340   // Build an overload candidate set based on the functions we find.
6341   SourceLocation Loc = Fn->getExprLoc();
6342   OverloadCandidateSet CandidateSet(Loc,
6343                                     OverloadCandidateSet::CSK_CodeCompletion);
6344 
6345   if (auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) {
6346     SemaRef.AddOverloadedCallCandidates(ULE, ArgsWithoutDependentTypes,
6347                                         CandidateSet,
6348                                         /*PartialOverloading=*/true);
6349   } else if (auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) {
6350     TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr;
6351     if (UME->hasExplicitTemplateArgs()) {
6352       UME->copyTemplateArgumentsInto(TemplateArgsBuffer);
6353       TemplateArgs = &TemplateArgsBuffer;
6354     }
6355 
6356     // Add the base as first argument (use a nullptr if the base is implicit).
6357     SmallVector<Expr *, 12> ArgExprs(
6358         1, UME->isImplicitAccess() ? nullptr : UME->getBase());
6359     ArgExprs.append(ArgsWithoutDependentTypes.begin(),
6360                     ArgsWithoutDependentTypes.end());
6361     UnresolvedSet<8> Decls;
6362     Decls.append(UME->decls_begin(), UME->decls_end());
6363     const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase();
6364     SemaRef.AddFunctionCandidates(Decls, ArgExprs, CandidateSet, TemplateArgs,
6365                                   /*SuppressUserConversions=*/false,
6366                                   /*PartialOverloading=*/true,
6367                                   FirstArgumentIsBase);
6368   } else {
6369     FunctionDecl *FD = nullptr;
6370     if (auto *MCE = dyn_cast<MemberExpr>(NakedFn))
6371       FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl());
6372     else if (auto *DRE = dyn_cast<DeclRefExpr>(NakedFn))
6373       FD = dyn_cast<FunctionDecl>(DRE->getDecl());
6374     if (FD) { // We check whether it's a resolved function declaration.
6375       if (!getLangOpts().CPlusPlus ||
6376           !FD->getType()->getAs<FunctionProtoType>())
6377         Results.push_back(ResultCandidate(FD));
6378       else
6379         SemaRef.AddOverloadCandidate(FD,
6380                                      DeclAccessPair::make(FD, FD->getAccess()),
6381                                      ArgsWithoutDependentTypes, CandidateSet,
6382                                      /*SuppressUserConversions=*/false,
6383                                      /*PartialOverloading=*/true);
6384 
6385     } else if (auto DC = NakedFn->getType()->getAsCXXRecordDecl()) {
6386       // If expression's type is CXXRecordDecl, it may overload the function
6387       // call operator, so we check if it does and add them as candidates.
6388       // A complete type is needed to lookup for member function call operators.
6389       if (SemaRef.isCompleteType(Loc, NakedFn->getType())) {
6390         DeclarationName OpName =
6391             getASTContext().DeclarationNames.getCXXOperatorName(OO_Call);
6392         LookupResult R(SemaRef, OpName, Loc, Sema::LookupOrdinaryName);
6393         SemaRef.LookupQualifiedName(R, DC);
6394         R.suppressDiagnostics();
6395         SmallVector<Expr *, 12> ArgExprs(1, NakedFn);
6396         ArgExprs.append(ArgsWithoutDependentTypes.begin(),
6397                         ArgsWithoutDependentTypes.end());
6398         SemaRef.AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs,
6399                                       CandidateSet,
6400                                       /*ExplicitArgs=*/nullptr,
6401                                       /*SuppressUserConversions=*/false,
6402                                       /*PartialOverloading=*/true);
6403       }
6404     } else {
6405       // Lastly we check whether expression's type is function pointer or
6406       // function.
6407 
6408       FunctionProtoTypeLoc P = Resolver.getFunctionProtoTypeLoc(NakedFn);
6409       QualType T = NakedFn->getType();
6410       if (!T->getPointeeType().isNull())
6411         T = T->getPointeeType();
6412 
6413       if (auto FP = T->getAs<FunctionProtoType>()) {
6414         if (!SemaRef.TooManyArguments(FP->getNumParams(),
6415                                       ArgsWithoutDependentTypes.size(),
6416                                       /*PartialOverloading=*/true) ||
6417             FP->isVariadic()) {
6418           if (P) {
6419             Results.push_back(ResultCandidate(P));
6420           } else {
6421             Results.push_back(ResultCandidate(FP));
6422           }
6423         }
6424       } else if (auto FT = T->getAs<FunctionType>())
6425         // No prototype and declaration, it may be a K & R style function.
6426         Results.push_back(ResultCandidate(FT));
6427     }
6428   }
6429   mergeCandidatesWithResults(SemaRef, Results, CandidateSet, Loc, Args.size());
6430   QualType ParamType = ProduceSignatureHelp(SemaRef, Results, Args.size(),
6431                                             OpenParLoc, /*Braced=*/false);
6432   return !CandidateSet.empty() ? ParamType : QualType();
6433 }
6434 
6435 // Determine which param to continue aggregate initialization from after
6436 // a designated initializer.
6437 //
6438 // Given struct S { int a,b,c,d,e; }:
6439 //   after `S{.b=1,`       we want to suggest c to continue
6440 //   after `S{.b=1, 2,`    we continue with d (this is legal C and ext in C++)
6441 //   after `S{.b=1, .a=2,` we continue with b (this is legal C and ext in C++)
6442 //
6443 // Possible outcomes:
6444 //   - we saw a designator for a field, and continue from the returned index.
6445 //     Only aggregate initialization is allowed.
6446 //   - we saw a designator, but it was complex or we couldn't find the field.
6447 //     Only aggregate initialization is possible, but we can't assist with it.
6448 //     Returns an out-of-range index.
6449 //   - we saw no designators, just positional arguments.
6450 //     Returns std::nullopt.
6451 static std::optional<unsigned>
6452 getNextAggregateIndexAfterDesignatedInit(const ResultCandidate &Aggregate,
6453                                          ArrayRef<Expr *> Args) {
6454   static constexpr unsigned Invalid = std::numeric_limits<unsigned>::max();
6455   assert(Aggregate.getKind() == ResultCandidate::CK_Aggregate);
6456 
6457   // Look for designated initializers.
6458   // They're in their syntactic form, not yet resolved to fields.
6459   const IdentifierInfo *DesignatedFieldName = nullptr;
6460   unsigned ArgsAfterDesignator = 0;
6461   for (const Expr *Arg : Args) {
6462     if (const auto *DIE = dyn_cast<DesignatedInitExpr>(Arg)) {
6463       if (DIE->size() == 1 && DIE->getDesignator(0)->isFieldDesignator()) {
6464         DesignatedFieldName = DIE->getDesignator(0)->getFieldName();
6465         ArgsAfterDesignator = 0;
6466       } else {
6467         return Invalid; // Complicated designator.
6468       }
6469     } else if (isa<DesignatedInitUpdateExpr>(Arg)) {
6470       return Invalid; // Unsupported.
6471     } else {
6472       ++ArgsAfterDesignator;
6473     }
6474   }
6475   if (!DesignatedFieldName)
6476     return std::nullopt;
6477 
6478   // Find the index within the class's fields.
6479   // (Probing getParamDecl() directly would be quadratic in number of fields).
6480   unsigned DesignatedIndex = 0;
6481   const FieldDecl *DesignatedField = nullptr;
6482   for (const auto *Field : Aggregate.getAggregate()->fields()) {
6483     if (Field->getIdentifier() == DesignatedFieldName) {
6484       DesignatedField = Field;
6485       break;
6486     }
6487     ++DesignatedIndex;
6488   }
6489   if (!DesignatedField)
6490     return Invalid; // Designator referred to a missing field, give up.
6491 
6492   // Find the index within the aggregate (which may have leading bases).
6493   unsigned AggregateSize = Aggregate.getNumParams();
6494   while (DesignatedIndex < AggregateSize &&
6495          Aggregate.getParamDecl(DesignatedIndex) != DesignatedField)
6496     ++DesignatedIndex;
6497 
6498   // Continue from the index after the last named field.
6499   return DesignatedIndex + ArgsAfterDesignator + 1;
6500 }
6501 
6502 QualType SemaCodeCompletion::ProduceConstructorSignatureHelp(
6503     QualType Type, SourceLocation Loc, ArrayRef<Expr *> Args,
6504     SourceLocation OpenParLoc, bool Braced) {
6505   if (!CodeCompleter)
6506     return QualType();
6507   SmallVector<ResultCandidate, 8> Results;
6508 
6509   // A complete type is needed to lookup for constructors.
6510   RecordDecl *RD =
6511       SemaRef.isCompleteType(Loc, Type) ? Type->getAsRecordDecl() : nullptr;
6512   if (!RD)
6513     return Type;
6514   CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD);
6515 
6516   // Consider aggregate initialization.
6517   // We don't check that types so far are correct.
6518   // We also don't handle C99/C++17 brace-elision, we assume init-list elements
6519   // are 1:1 with fields.
6520   // FIXME: it would be nice to support "unwrapping" aggregates that contain
6521   // a single subaggregate, like std::array<T, N> -> T __elements[N].
6522   if (Braced && !RD->isUnion() &&
6523       (!getLangOpts().CPlusPlus || (CRD && CRD->isAggregate()))) {
6524     ResultCandidate AggregateSig(RD);
6525     unsigned AggregateSize = AggregateSig.getNumParams();
6526 
6527     if (auto NextIndex =
6528             getNextAggregateIndexAfterDesignatedInit(AggregateSig, Args)) {
6529       // A designator was used, only aggregate init is possible.
6530       if (*NextIndex >= AggregateSize)
6531         return Type;
6532       Results.push_back(AggregateSig);
6533       return ProduceSignatureHelp(SemaRef, Results, *NextIndex, OpenParLoc,
6534                                   Braced);
6535     }
6536 
6537     // Describe aggregate initialization, but also constructors below.
6538     if (Args.size() < AggregateSize)
6539       Results.push_back(AggregateSig);
6540   }
6541 
6542   // FIXME: Provide support for member initializers.
6543   // FIXME: Provide support for variadic template constructors.
6544 
6545   if (CRD) {
6546     OverloadCandidateSet CandidateSet(Loc,
6547                                       OverloadCandidateSet::CSK_CodeCompletion);
6548     for (NamedDecl *C : SemaRef.LookupConstructors(CRD)) {
6549       if (auto *FD = dyn_cast<FunctionDecl>(C)) {
6550         // FIXME: we can't yet provide correct signature help for initializer
6551         //        list constructors, so skip them entirely.
6552         if (Braced && getLangOpts().CPlusPlus &&
6553             SemaRef.isInitListConstructor(FD))
6554           continue;
6555         SemaRef.AddOverloadCandidate(
6556             FD, DeclAccessPair::make(FD, C->getAccess()), Args, CandidateSet,
6557             /*SuppressUserConversions=*/false,
6558             /*PartialOverloading=*/true,
6559             /*AllowExplicit*/ true);
6560       } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(C)) {
6561         if (Braced && getLangOpts().CPlusPlus &&
6562             SemaRef.isInitListConstructor(FTD->getTemplatedDecl()))
6563           continue;
6564 
6565         SemaRef.AddTemplateOverloadCandidate(
6566             FTD, DeclAccessPair::make(FTD, C->getAccess()),
6567             /*ExplicitTemplateArgs=*/nullptr, Args, CandidateSet,
6568             /*SuppressUserConversions=*/false,
6569             /*PartialOverloading=*/true);
6570       }
6571     }
6572     mergeCandidatesWithResults(SemaRef, Results, CandidateSet, Loc,
6573                                Args.size());
6574   }
6575 
6576   return ProduceSignatureHelp(SemaRef, Results, Args.size(), OpenParLoc,
6577                               Braced);
6578 }
6579 
6580 QualType SemaCodeCompletion::ProduceCtorInitMemberSignatureHelp(
6581     Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy,
6582     ArrayRef<Expr *> ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc,
6583     bool Braced) {
6584   if (!CodeCompleter)
6585     return QualType();
6586 
6587   CXXConstructorDecl *Constructor =
6588       dyn_cast<CXXConstructorDecl>(ConstructorDecl);
6589   if (!Constructor)
6590     return QualType();
6591   // FIXME: Add support for Base class constructors as well.
6592   if (ValueDecl *MemberDecl = SemaRef.tryLookupCtorInitMemberDecl(
6593           Constructor->getParent(), SS, TemplateTypeTy, II))
6594     return ProduceConstructorSignatureHelp(MemberDecl->getType(),
6595                                            MemberDecl->getLocation(), ArgExprs,
6596                                            OpenParLoc, Braced);
6597   return QualType();
6598 }
6599 
6600 static bool argMatchesTemplateParams(const ParsedTemplateArgument &Arg,
6601                                      unsigned Index,
6602                                      const TemplateParameterList &Params) {
6603   const NamedDecl *Param;
6604   if (Index < Params.size())
6605     Param = Params.getParam(Index);
6606   else if (Params.hasParameterPack())
6607     Param = Params.asArray().back();
6608   else
6609     return false; // too many args
6610 
6611   switch (Arg.getKind()) {
6612   case ParsedTemplateArgument::Type:
6613     return llvm::isa<TemplateTypeParmDecl>(Param); // constraints not checked
6614   case ParsedTemplateArgument::NonType:
6615     return llvm::isa<NonTypeTemplateParmDecl>(Param); // type not checked
6616   case ParsedTemplateArgument::Template:
6617     return llvm::isa<TemplateTemplateParmDecl>(Param); // signature not checked
6618   }
6619   llvm_unreachable("Unhandled switch case");
6620 }
6621 
6622 QualType SemaCodeCompletion::ProduceTemplateArgumentSignatureHelp(
6623     TemplateTy ParsedTemplate, ArrayRef<ParsedTemplateArgument> Args,
6624     SourceLocation LAngleLoc) {
6625   if (!CodeCompleter || !ParsedTemplate)
6626     return QualType();
6627 
6628   SmallVector<ResultCandidate, 8> Results;
6629   auto Consider = [&](const TemplateDecl *TD) {
6630     // Only add if the existing args are compatible with the template.
6631     bool Matches = true;
6632     for (unsigned I = 0; I < Args.size(); ++I) {
6633       if (!argMatchesTemplateParams(Args[I], I, *TD->getTemplateParameters())) {
6634         Matches = false;
6635         break;
6636       }
6637     }
6638     if (Matches)
6639       Results.emplace_back(TD);
6640   };
6641 
6642   TemplateName Template = ParsedTemplate.get();
6643   if (const auto *TD = Template.getAsTemplateDecl()) {
6644     Consider(TD);
6645   } else if (const auto *OTS = Template.getAsOverloadedTemplate()) {
6646     for (const NamedDecl *ND : *OTS)
6647       if (const auto *TD = llvm::dyn_cast<TemplateDecl>(ND))
6648         Consider(TD);
6649   }
6650   return ProduceSignatureHelp(SemaRef, Results, Args.size(), LAngleLoc,
6651                               /*Braced=*/false);
6652 }
6653 
6654 static QualType getDesignatedType(QualType BaseType, const Designation &Desig,
6655                                   HeuristicResolver &Resolver) {
6656   for (unsigned I = 0; I < Desig.getNumDesignators(); ++I) {
6657     if (BaseType.isNull())
6658       break;
6659     QualType NextType;
6660     const auto &D = Desig.getDesignator(I);
6661     if (D.isArrayDesignator() || D.isArrayRangeDesignator()) {
6662       if (BaseType->isArrayType())
6663         NextType = BaseType->getAsArrayTypeUnsafe()->getElementType();
6664     } else {
6665       assert(D.isFieldDesignator());
6666       auto *RD = getAsRecordDecl(BaseType, Resolver);
6667       if (RD && RD->isCompleteDefinition()) {
6668         for (const auto *Member : RD->lookup(D.getFieldDecl()))
6669           if (const FieldDecl *FD = llvm::dyn_cast<FieldDecl>(Member)) {
6670             NextType = FD->getType();
6671             break;
6672           }
6673       }
6674     }
6675     BaseType = NextType;
6676   }
6677   return BaseType;
6678 }
6679 
6680 void SemaCodeCompletion::CodeCompleteDesignator(
6681     QualType BaseType, llvm::ArrayRef<Expr *> InitExprs, const Designation &D) {
6682   BaseType = getDesignatedType(BaseType, D, Resolver);
6683   if (BaseType.isNull())
6684     return;
6685   const auto *RD = getAsRecordDecl(BaseType, Resolver);
6686   if (!RD || RD->fields().empty())
6687     return;
6688 
6689   CodeCompletionContext CCC(CodeCompletionContext::CCC_DotMemberAccess,
6690                             BaseType);
6691   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6692                         CodeCompleter->getCodeCompletionTUInfo(), CCC);
6693 
6694   Results.EnterNewScope();
6695   for (const Decl *D : RD->decls()) {
6696     const FieldDecl *FD;
6697     if (auto *IFD = dyn_cast<IndirectFieldDecl>(D))
6698       FD = IFD->getAnonField();
6699     else if (auto *DFD = dyn_cast<FieldDecl>(D))
6700       FD = DFD;
6701     else
6702       continue;
6703 
6704     // FIXME: Make use of previous designators to mark any fields before those
6705     // inaccessible, and also compute the next initializer priority.
6706     ResultBuilder::Result Result(FD, Results.getBasePriority(FD));
6707     Results.AddResult(Result, SemaRef.CurContext, /*Hiding=*/nullptr);
6708   }
6709   Results.ExitScope();
6710   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6711                             Results.getCompletionContext(), Results.data(),
6712                             Results.size());
6713 }
6714 
6715 void SemaCodeCompletion::CodeCompleteInitializer(Scope *S, Decl *D) {
6716   ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
6717   if (!VD) {
6718     CodeCompleteOrdinaryName(S, PCC_Expression);
6719     return;
6720   }
6721 
6722   CodeCompleteExpressionData Data;
6723   Data.PreferredType = VD->getType();
6724   // Ignore VD to avoid completing the variable itself, e.g. in 'int foo = ^'.
6725   Data.IgnoreDecls.push_back(VD);
6726 
6727   CodeCompleteExpression(S, Data);
6728 }
6729 
6730 void SemaCodeCompletion::CodeCompleteKeywordAfterIf(bool AfterExclaim) const {
6731   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6732                         CodeCompleter->getCodeCompletionTUInfo(),
6733                         CodeCompletionContext::CCC_Other);
6734   CodeCompletionBuilder Builder(Results.getAllocator(),
6735                                 Results.getCodeCompletionTUInfo());
6736   if (getLangOpts().CPlusPlus17) {
6737     if (!AfterExclaim) {
6738       if (Results.includeCodePatterns()) {
6739         Builder.AddTypedTextChunk("constexpr");
6740         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6741         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6742         Builder.AddPlaceholderChunk("condition");
6743         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6744         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6745         Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6746         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6747         Builder.AddPlaceholderChunk("statements");
6748         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6749         Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6750         Results.AddResult({Builder.TakeString()});
6751       } else {
6752         Results.AddResult({"constexpr"});
6753       }
6754     }
6755   }
6756   if (getLangOpts().CPlusPlus23) {
6757     if (Results.includeCodePatterns()) {
6758       Builder.AddTypedTextChunk("consteval");
6759       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6760       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6761       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6762       Builder.AddPlaceholderChunk("statements");
6763       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6764       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6765       Results.AddResult({Builder.TakeString()});
6766     } else {
6767       Results.AddResult({"consteval"});
6768     }
6769   }
6770 
6771   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6772                             Results.getCompletionContext(), Results.data(),
6773                             Results.size());
6774 }
6775 
6776 void SemaCodeCompletion::CodeCompleteAfterIf(Scope *S, bool IsBracedThen) {
6777   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6778                         CodeCompleter->getCodeCompletionTUInfo(),
6779                         mapCodeCompletionContext(SemaRef, PCC_Statement));
6780   Results.setFilter(&ResultBuilder::IsOrdinaryName);
6781   Results.EnterNewScope();
6782 
6783   CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
6784   SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
6785                              CodeCompleter->includeGlobals(),
6786                              CodeCompleter->loadExternal());
6787 
6788   AddOrdinaryNameResults(PCC_Statement, S, SemaRef, Results);
6789 
6790   // "else" block
6791   CodeCompletionBuilder Builder(Results.getAllocator(),
6792                                 Results.getCodeCompletionTUInfo());
6793 
6794   auto AddElseBodyPattern = [&] {
6795     if (IsBracedThen) {
6796       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6797       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6798       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6799       Builder.AddPlaceholderChunk("statements");
6800       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6801       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6802     } else {
6803       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6804       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6805       Builder.AddPlaceholderChunk("statement");
6806       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
6807     }
6808   };
6809   Builder.AddTypedTextChunk("else");
6810   if (Results.includeCodePatterns())
6811     AddElseBodyPattern();
6812   Results.AddResult(Builder.TakeString());
6813 
6814   // "else if" block
6815   Builder.AddTypedTextChunk("else if");
6816   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6817   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6818   if (getLangOpts().CPlusPlus)
6819     Builder.AddPlaceholderChunk("condition");
6820   else
6821     Builder.AddPlaceholderChunk("expression");
6822   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6823   if (Results.includeCodePatterns()) {
6824     AddElseBodyPattern();
6825   }
6826   Results.AddResult(Builder.TakeString());
6827 
6828   Results.ExitScope();
6829 
6830   if (S->getFnParent())
6831     AddPrettyFunctionResults(getLangOpts(), Results);
6832 
6833   if (CodeCompleter->includeMacros())
6834     AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false);
6835 
6836   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6837                             Results.getCompletionContext(), Results.data(),
6838                             Results.size());
6839 }
6840 
6841 void SemaCodeCompletion::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
6842                                                  bool EnteringContext,
6843                                                  bool IsUsingDeclaration,
6844                                                  QualType BaseType,
6845                                                  QualType PreferredType) {
6846   if (SS.isEmpty() || !CodeCompleter)
6847     return;
6848 
6849   CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol, PreferredType);
6850   CC.setIsUsingDeclaration(IsUsingDeclaration);
6851   CC.setCXXScopeSpecifier(SS);
6852 
6853   // We want to keep the scope specifier even if it's invalid (e.g. the scope
6854   // "a::b::" is not corresponding to any context/namespace in the AST), since
6855   // it can be useful for global code completion which have information about
6856   // contexts/symbols that are not in the AST.
6857   if (SS.isInvalid()) {
6858     // As SS is invalid, we try to collect accessible contexts from the current
6859     // scope with a dummy lookup so that the completion consumer can try to
6860     // guess what the specified scope is.
6861     ResultBuilder DummyResults(SemaRef, CodeCompleter->getAllocator(),
6862                                CodeCompleter->getCodeCompletionTUInfo(), CC);
6863     if (!PreferredType.isNull())
6864       DummyResults.setPreferredType(PreferredType);
6865     if (S->getEntity()) {
6866       CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(),
6867                                           BaseType);
6868       SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
6869                                  /*IncludeGlobalScope=*/false,
6870                                  /*LoadExternal=*/false);
6871     }
6872     HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6873                               DummyResults.getCompletionContext(), nullptr, 0);
6874     return;
6875   }
6876   // Always pretend to enter a context to ensure that a dependent type
6877   // resolves to a dependent record.
6878   DeclContext *Ctx = SemaRef.computeDeclContext(SS, /*EnteringContext=*/true);
6879 
6880   // Try to instantiate any non-dependent declaration contexts before
6881   // we look in them. Bail out if we fail.
6882   NestedNameSpecifier *NNS = SS.getScopeRep();
6883   if (NNS != nullptr && SS.isValid() && !NNS->isDependent()) {
6884     if (Ctx == nullptr || SemaRef.RequireCompleteDeclContext(SS, Ctx))
6885       return;
6886   }
6887 
6888   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6889                         CodeCompleter->getCodeCompletionTUInfo(), CC);
6890   if (!PreferredType.isNull())
6891     Results.setPreferredType(PreferredType);
6892   Results.EnterNewScope();
6893 
6894   // The "template" keyword can follow "::" in the grammar, but only
6895   // put it into the grammar if the nested-name-specifier is dependent.
6896   // FIXME: results is always empty, this appears to be dead.
6897   if (!Results.empty() && NNS && NNS->isDependent())
6898     Results.AddResult("template");
6899 
6900   // If the scope is a concept-constrained type parameter, infer nested
6901   // members based on the constraints.
6902   if (NNS) {
6903     if (const auto *TTPT =
6904             dyn_cast_or_null<TemplateTypeParmType>(NNS->getAsType())) {
6905       for (const auto &R : ConceptInfo(*TTPT, S).members()) {
6906         if (R.Operator != ConceptInfo::Member::Colons)
6907           continue;
6908         Results.AddResult(CodeCompletionResult(
6909             R.render(SemaRef, CodeCompleter->getAllocator(),
6910                      CodeCompleter->getCodeCompletionTUInfo())));
6911       }
6912     }
6913   }
6914 
6915   // Add calls to overridden virtual functions, if there are any.
6916   //
6917   // FIXME: This isn't wonderful, because we don't know whether we're actually
6918   // in a context that permits expressions. This is a general issue with
6919   // qualified-id completions.
6920   if (Ctx && !EnteringContext)
6921     MaybeAddOverrideCalls(SemaRef, Ctx, Results);
6922   Results.ExitScope();
6923 
6924   if (Ctx &&
6925       (CodeCompleter->includeNamespaceLevelDecls() || !Ctx->isFileContext())) {
6926     CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType);
6927     SemaRef.LookupVisibleDecls(Ctx, Sema::LookupOrdinaryName, Consumer,
6928                                /*IncludeGlobalScope=*/true,
6929                                /*IncludeDependentBases=*/true,
6930                                CodeCompleter->loadExternal());
6931   }
6932 
6933   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6934                             Results.getCompletionContext(), Results.data(),
6935                             Results.size());
6936 }
6937 
6938 void SemaCodeCompletion::CodeCompleteUsing(Scope *S) {
6939   if (!CodeCompleter)
6940     return;
6941 
6942   // This can be both a using alias or using declaration, in the former we
6943   // expect a new name and a symbol in the latter case.
6944   CodeCompletionContext Context(CodeCompletionContext::CCC_SymbolOrNewName);
6945   Context.setIsUsingDeclaration(true);
6946 
6947   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6948                         CodeCompleter->getCodeCompletionTUInfo(), Context,
6949                         &ResultBuilder::IsNestedNameSpecifier);
6950   Results.EnterNewScope();
6951 
6952   // If we aren't in class scope, we could see the "namespace" keyword.
6953   if (!S->isClassScope())
6954     Results.AddResult(CodeCompletionResult("namespace"));
6955 
6956   // After "using", we can see anything that would start a
6957   // nested-name-specifier.
6958   CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
6959   SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
6960                              CodeCompleter->includeGlobals(),
6961                              CodeCompleter->loadExternal());
6962   Results.ExitScope();
6963 
6964   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6965                             Results.getCompletionContext(), Results.data(),
6966                             Results.size());
6967 }
6968 
6969 void SemaCodeCompletion::CodeCompleteUsingDirective(Scope *S) {
6970   if (!CodeCompleter)
6971     return;
6972 
6973   // After "using namespace", we expect to see a namespace name or namespace
6974   // alias.
6975   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6976                         CodeCompleter->getCodeCompletionTUInfo(),
6977                         CodeCompletionContext::CCC_Namespace,
6978                         &ResultBuilder::IsNamespaceOrAlias);
6979   Results.EnterNewScope();
6980   CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
6981   SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
6982                              CodeCompleter->includeGlobals(),
6983                              CodeCompleter->loadExternal());
6984   Results.ExitScope();
6985   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6986                             Results.getCompletionContext(), Results.data(),
6987                             Results.size());
6988 }
6989 
6990 void SemaCodeCompletion::CodeCompleteNamespaceDecl(Scope *S) {
6991   if (!CodeCompleter)
6992     return;
6993 
6994   DeclContext *Ctx = S->getEntity();
6995   if (!S->getParent())
6996     Ctx = getASTContext().getTranslationUnitDecl();
6997 
6998   bool SuppressedGlobalResults =
6999       Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
7000 
7001   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7002                         CodeCompleter->getCodeCompletionTUInfo(),
7003                         SuppressedGlobalResults
7004                             ? CodeCompletionContext::CCC_Namespace
7005                             : CodeCompletionContext::CCC_Other,
7006                         &ResultBuilder::IsNamespace);
7007 
7008   if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
7009     // We only want to see those namespaces that have already been defined
7010     // within this scope, because its likely that the user is creating an
7011     // extended namespace declaration. Keep track of the most recent
7012     // definition of each namespace.
7013     std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
7014     for (DeclContext::specific_decl_iterator<NamespaceDecl>
7015              NS(Ctx->decls_begin()),
7016          NSEnd(Ctx->decls_end());
7017          NS != NSEnd; ++NS)
7018       OrigToLatest[NS->getFirstDecl()] = *NS;
7019 
7020     // Add the most recent definition (or extended definition) of each
7021     // namespace to the list of results.
7022     Results.EnterNewScope();
7023     for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
7024              NS = OrigToLatest.begin(),
7025              NSEnd = OrigToLatest.end();
7026          NS != NSEnd; ++NS)
7027       Results.AddResult(
7028           CodeCompletionResult(NS->second, Results.getBasePriority(NS->second),
7029                                nullptr),
7030           SemaRef.CurContext, nullptr, false);
7031     Results.ExitScope();
7032   }
7033 
7034   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7035                             Results.getCompletionContext(), Results.data(),
7036                             Results.size());
7037 }
7038 
7039 void SemaCodeCompletion::CodeCompleteNamespaceAliasDecl(Scope *S) {
7040   if (!CodeCompleter)
7041     return;
7042 
7043   // After "namespace", we expect to see a namespace or alias.
7044   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7045                         CodeCompleter->getCodeCompletionTUInfo(),
7046                         CodeCompletionContext::CCC_Namespace,
7047                         &ResultBuilder::IsNamespaceOrAlias);
7048   CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
7049   SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
7050                              CodeCompleter->includeGlobals(),
7051                              CodeCompleter->loadExternal());
7052   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7053                             Results.getCompletionContext(), Results.data(),
7054                             Results.size());
7055 }
7056 
7057 void SemaCodeCompletion::CodeCompleteOperatorName(Scope *S) {
7058   if (!CodeCompleter)
7059     return;
7060 
7061   typedef CodeCompletionResult Result;
7062   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7063                         CodeCompleter->getCodeCompletionTUInfo(),
7064                         CodeCompletionContext::CCC_Type,
7065                         &ResultBuilder::IsType);
7066   Results.EnterNewScope();
7067 
7068   // Add the names of overloadable operators. Note that OO_Conditional is not
7069   // actually overloadable.
7070 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
7071   if (OO_##Name != OO_Conditional)                                             \
7072     Results.AddResult(Result(Spelling));
7073 #include "clang/Basic/OperatorKinds.def"
7074 
7075   // Add any type names visible from the current scope
7076   Results.allowNestedNameSpecifiers();
7077   CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
7078   SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
7079                              CodeCompleter->includeGlobals(),
7080                              CodeCompleter->loadExternal());
7081 
7082   // Add any type specifiers
7083   AddTypeSpecifierResults(getLangOpts(), Results);
7084   Results.ExitScope();
7085 
7086   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7087                             Results.getCompletionContext(), Results.data(),
7088                             Results.size());
7089 }
7090 
7091 void SemaCodeCompletion::CodeCompleteConstructorInitializer(
7092     Decl *ConstructorD, ArrayRef<CXXCtorInitializer *> Initializers) {
7093   if (!ConstructorD)
7094     return;
7095 
7096   SemaRef.AdjustDeclIfTemplate(ConstructorD);
7097 
7098   auto *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD);
7099   if (!Constructor)
7100     return;
7101 
7102   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7103                         CodeCompleter->getCodeCompletionTUInfo(),
7104                         CodeCompletionContext::CCC_Symbol);
7105   Results.EnterNewScope();
7106 
7107   // Fill in any already-initialized fields or base classes.
7108   llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
7109   llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
7110   for (unsigned I = 0, E = Initializers.size(); I != E; ++I) {
7111     if (Initializers[I]->isBaseInitializer())
7112       InitializedBases.insert(getASTContext().getCanonicalType(
7113           QualType(Initializers[I]->getBaseClass(), 0)));
7114     else
7115       InitializedFields.insert(
7116           cast<FieldDecl>(Initializers[I]->getAnyMember()));
7117   }
7118 
7119   // Add completions for base classes.
7120   PrintingPolicy Policy = getCompletionPrintingPolicy(SemaRef);
7121   bool SawLastInitializer = Initializers.empty();
7122   CXXRecordDecl *ClassDecl = Constructor->getParent();
7123 
7124   auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) {
7125     CodeCompletionBuilder Builder(Results.getAllocator(),
7126                                   Results.getCodeCompletionTUInfo());
7127     Builder.AddTypedTextChunk(Name);
7128     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7129     if (const auto *Function = dyn_cast<FunctionDecl>(ND))
7130       AddFunctionParameterChunks(SemaRef.PP, Policy, Function, Builder);
7131     else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND))
7132       AddFunctionParameterChunks(SemaRef.PP, Policy,
7133                                  FunTemplDecl->getTemplatedDecl(), Builder);
7134     Builder.AddChunk(CodeCompletionString::CK_RightParen);
7135     return Builder.TakeString();
7136   };
7137   auto AddDefaultCtorInit = [&](const char *Name, const char *Type,
7138                                 const NamedDecl *ND) {
7139     CodeCompletionBuilder Builder(Results.getAllocator(),
7140                                   Results.getCodeCompletionTUInfo());
7141     Builder.AddTypedTextChunk(Name);
7142     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7143     Builder.AddPlaceholderChunk(Type);
7144     Builder.AddChunk(CodeCompletionString::CK_RightParen);
7145     if (ND) {
7146       auto CCR = CodeCompletionResult(
7147           Builder.TakeString(), ND,
7148           SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration);
7149       if (isa<FieldDecl>(ND))
7150         CCR.CursorKind = CXCursor_MemberRef;
7151       return Results.AddResult(CCR);
7152     }
7153     return Results.AddResult(CodeCompletionResult(
7154         Builder.TakeString(),
7155         SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration));
7156   };
7157   auto AddCtorsWithName = [&](const CXXRecordDecl *RD, unsigned int Priority,
7158                               const char *Name, const FieldDecl *FD) {
7159     if (!RD)
7160       return AddDefaultCtorInit(Name,
7161                                 FD ? Results.getAllocator().CopyString(
7162                                          FD->getType().getAsString(Policy))
7163                                    : Name,
7164                                 FD);
7165     auto Ctors = getConstructors(getASTContext(), RD);
7166     if (Ctors.begin() == Ctors.end())
7167       return AddDefaultCtorInit(Name, Name, RD);
7168     for (const NamedDecl *Ctor : Ctors) {
7169       auto CCR = CodeCompletionResult(GenerateCCS(Ctor, Name), RD, Priority);
7170       CCR.CursorKind = getCursorKindForDecl(Ctor);
7171       Results.AddResult(CCR);
7172     }
7173   };
7174   auto AddBase = [&](const CXXBaseSpecifier &Base) {
7175     const char *BaseName =
7176         Results.getAllocator().CopyString(Base.getType().getAsString(Policy));
7177     const auto *RD = Base.getType()->getAsCXXRecordDecl();
7178     AddCtorsWithName(
7179         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
7180         BaseName, nullptr);
7181   };
7182   auto AddField = [&](const FieldDecl *FD) {
7183     const char *FieldName =
7184         Results.getAllocator().CopyString(FD->getIdentifier()->getName());
7185     const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl();
7186     AddCtorsWithName(
7187         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
7188         FieldName, FD);
7189   };
7190 
7191   for (const auto &Base : ClassDecl->bases()) {
7192     if (!InitializedBases
7193              .insert(getASTContext().getCanonicalType(Base.getType()))
7194              .second) {
7195       SawLastInitializer =
7196           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
7197           getASTContext().hasSameUnqualifiedType(
7198               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
7199       continue;
7200     }
7201 
7202     AddBase(Base);
7203     SawLastInitializer = false;
7204   }
7205 
7206   // Add completions for virtual base classes.
7207   for (const auto &Base : ClassDecl->vbases()) {
7208     if (!InitializedBases
7209              .insert(getASTContext().getCanonicalType(Base.getType()))
7210              .second) {
7211       SawLastInitializer =
7212           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
7213           getASTContext().hasSameUnqualifiedType(
7214               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
7215       continue;
7216     }
7217 
7218     AddBase(Base);
7219     SawLastInitializer = false;
7220   }
7221 
7222   // Add completions for members.
7223   for (auto *Field : ClassDecl->fields()) {
7224     if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))
7225              .second) {
7226       SawLastInitializer = !Initializers.empty() &&
7227                            Initializers.back()->isAnyMemberInitializer() &&
7228                            Initializers.back()->getAnyMember() == Field;
7229       continue;
7230     }
7231 
7232     if (!Field->getDeclName())
7233       continue;
7234 
7235     AddField(Field);
7236     SawLastInitializer = false;
7237   }
7238   Results.ExitScope();
7239 
7240   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7241                             Results.getCompletionContext(), Results.data(),
7242                             Results.size());
7243 }
7244 
7245 /// Determine whether this scope denotes a namespace.
7246 static bool isNamespaceScope(Scope *S) {
7247   DeclContext *DC = S->getEntity();
7248   if (!DC)
7249     return false;
7250 
7251   return DC->isFileContext();
7252 }
7253 
7254 void SemaCodeCompletion::CodeCompleteLambdaIntroducer(Scope *S,
7255                                                       LambdaIntroducer &Intro,
7256                                                       bool AfterAmpersand) {
7257   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7258                         CodeCompleter->getCodeCompletionTUInfo(),
7259                         CodeCompletionContext::CCC_Other);
7260   Results.EnterNewScope();
7261 
7262   // Note what has already been captured.
7263   llvm::SmallPtrSet<IdentifierInfo *, 4> Known;
7264   bool IncludedThis = false;
7265   for (const auto &C : Intro.Captures) {
7266     if (C.Kind == LCK_This) {
7267       IncludedThis = true;
7268       continue;
7269     }
7270 
7271     Known.insert(C.Id);
7272   }
7273 
7274   // Look for other capturable variables.
7275   for (; S && !isNamespaceScope(S); S = S->getParent()) {
7276     for (const auto *D : S->decls()) {
7277       const auto *Var = dyn_cast<VarDecl>(D);
7278       if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>())
7279         continue;
7280 
7281       if (Known.insert(Var->getIdentifier()).second)
7282         Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration),
7283                           SemaRef.CurContext, nullptr, false);
7284     }
7285   }
7286 
7287   // Add 'this', if it would be valid.
7288   if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy)
7289     addThisCompletion(SemaRef, Results);
7290 
7291   Results.ExitScope();
7292 
7293   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7294                             Results.getCompletionContext(), Results.data(),
7295                             Results.size());
7296 }
7297 
7298 void SemaCodeCompletion::CodeCompleteAfterFunctionEquals(Declarator &D) {
7299   if (!getLangOpts().CPlusPlus11)
7300     return;
7301   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7302                         CodeCompleter->getCodeCompletionTUInfo(),
7303                         CodeCompletionContext::CCC_Other);
7304   auto ShouldAddDefault = [&D, this]() {
7305     if (!D.isFunctionDeclarator())
7306       return false;
7307     auto &Id = D.getName();
7308     if (Id.getKind() == UnqualifiedIdKind::IK_DestructorName)
7309       return true;
7310     // FIXME(liuhui): Ideally, we should check the constructor parameter list to
7311     // verify that it is the default, copy or move constructor?
7312     if (Id.getKind() == UnqualifiedIdKind::IK_ConstructorName &&
7313         D.getFunctionTypeInfo().NumParams <= 1)
7314       return true;
7315     if (Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId) {
7316       auto Op = Id.OperatorFunctionId.Operator;
7317       // FIXME(liuhui): Ideally, we should check the function parameter list to
7318       // verify that it is the copy or move assignment?
7319       if (Op == OverloadedOperatorKind::OO_Equal)
7320         return true;
7321       if (getLangOpts().CPlusPlus20 &&
7322           (Op == OverloadedOperatorKind::OO_EqualEqual ||
7323            Op == OverloadedOperatorKind::OO_ExclaimEqual ||
7324            Op == OverloadedOperatorKind::OO_Less ||
7325            Op == OverloadedOperatorKind::OO_LessEqual ||
7326            Op == OverloadedOperatorKind::OO_Greater ||
7327            Op == OverloadedOperatorKind::OO_GreaterEqual ||
7328            Op == OverloadedOperatorKind::OO_Spaceship))
7329         return true;
7330     }
7331     return false;
7332   };
7333 
7334   Results.EnterNewScope();
7335   if (ShouldAddDefault())
7336     Results.AddResult("default");
7337   // FIXME(liuhui): Ideally, we should only provide `delete` completion for the
7338   // first function declaration.
7339   Results.AddResult("delete");
7340   Results.ExitScope();
7341   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7342                             Results.getCompletionContext(), Results.data(),
7343                             Results.size());
7344 }
7345 
7346 /// Macro that optionally prepends an "@" to the string literal passed in via
7347 /// Keyword, depending on whether NeedAt is true or false.
7348 #define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword)
7349 
7350 static void AddObjCImplementationResults(const LangOptions &LangOpts,
7351                                          ResultBuilder &Results, bool NeedAt) {
7352   typedef CodeCompletionResult Result;
7353   // Since we have an implementation, we can end it.
7354   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
7355 
7356   CodeCompletionBuilder Builder(Results.getAllocator(),
7357                                 Results.getCodeCompletionTUInfo());
7358   if (LangOpts.ObjC) {
7359     // @dynamic
7360     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "dynamic"));
7361     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7362     Builder.AddPlaceholderChunk("property");
7363     Results.AddResult(Result(Builder.TakeString()));
7364 
7365     // @synthesize
7366     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synthesize"));
7367     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7368     Builder.AddPlaceholderChunk("property");
7369     Results.AddResult(Result(Builder.TakeString()));
7370   }
7371 }
7372 
7373 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
7374                                     ResultBuilder &Results, bool NeedAt) {
7375   typedef CodeCompletionResult Result;
7376 
7377   // Since we have an interface or protocol, we can end it.
7378   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
7379 
7380   if (LangOpts.ObjC) {
7381     // @property
7382     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "property")));
7383 
7384     // @required
7385     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "required")));
7386 
7387     // @optional
7388     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "optional")));
7389   }
7390 }
7391 
7392 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
7393   typedef CodeCompletionResult Result;
7394   CodeCompletionBuilder Builder(Results.getAllocator(),
7395                                 Results.getCodeCompletionTUInfo());
7396 
7397   // @class name ;
7398   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "class"));
7399   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7400   Builder.AddPlaceholderChunk("name");
7401   Results.AddResult(Result(Builder.TakeString()));
7402 
7403   if (Results.includeCodePatterns()) {
7404     // @interface name
7405     // FIXME: Could introduce the whole pattern, including superclasses and
7406     // such.
7407     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "interface"));
7408     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7409     Builder.AddPlaceholderChunk("class");
7410     Results.AddResult(Result(Builder.TakeString()));
7411 
7412     // @protocol name
7413     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
7414     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7415     Builder.AddPlaceholderChunk("protocol");
7416     Results.AddResult(Result(Builder.TakeString()));
7417 
7418     // @implementation name
7419     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "implementation"));
7420     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7421     Builder.AddPlaceholderChunk("class");
7422     Results.AddResult(Result(Builder.TakeString()));
7423   }
7424 
7425   // @compatibility_alias name
7426   Builder.AddTypedTextChunk(
7427       OBJC_AT_KEYWORD_NAME(NeedAt, "compatibility_alias"));
7428   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7429   Builder.AddPlaceholderChunk("alias");
7430   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7431   Builder.AddPlaceholderChunk("class");
7432   Results.AddResult(Result(Builder.TakeString()));
7433 
7434   if (Results.getSema().getLangOpts().Modules) {
7435     // @import name
7436     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import"));
7437     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7438     Builder.AddPlaceholderChunk("module");
7439     Results.AddResult(Result(Builder.TakeString()));
7440   }
7441 }
7442 
7443 void SemaCodeCompletion::CodeCompleteObjCAtDirective(Scope *S) {
7444   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7445                         CodeCompleter->getCodeCompletionTUInfo(),
7446                         CodeCompletionContext::CCC_Other);
7447   Results.EnterNewScope();
7448   if (isa<ObjCImplDecl>(SemaRef.CurContext))
7449     AddObjCImplementationResults(getLangOpts(), Results, false);
7450   else if (SemaRef.CurContext->isObjCContainer())
7451     AddObjCInterfaceResults(getLangOpts(), Results, false);
7452   else
7453     AddObjCTopLevelResults(Results, false);
7454   Results.ExitScope();
7455   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7456                             Results.getCompletionContext(), Results.data(),
7457                             Results.size());
7458 }
7459 
7460 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
7461   typedef CodeCompletionResult Result;
7462   CodeCompletionBuilder Builder(Results.getAllocator(),
7463                                 Results.getCodeCompletionTUInfo());
7464 
7465   // @encode ( type-name )
7466   const char *EncodeType = "char[]";
7467   if (Results.getSema().getLangOpts().CPlusPlus ||
7468       Results.getSema().getLangOpts().ConstStrings)
7469     EncodeType = "const char[]";
7470   Builder.AddResultTypeChunk(EncodeType);
7471   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "encode"));
7472   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7473   Builder.AddPlaceholderChunk("type-name");
7474   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7475   Results.AddResult(Result(Builder.TakeString()));
7476 
7477   // @protocol ( protocol-name )
7478   Builder.AddResultTypeChunk("Protocol *");
7479   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
7480   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7481   Builder.AddPlaceholderChunk("protocol-name");
7482   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7483   Results.AddResult(Result(Builder.TakeString()));
7484 
7485   // @selector ( selector )
7486   Builder.AddResultTypeChunk("SEL");
7487   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "selector"));
7488   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7489   Builder.AddPlaceholderChunk("selector");
7490   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7491   Results.AddResult(Result(Builder.TakeString()));
7492 
7493   // @"string"
7494   Builder.AddResultTypeChunk("NSString *");
7495   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "\""));
7496   Builder.AddPlaceholderChunk("string");
7497   Builder.AddTextChunk("\"");
7498   Results.AddResult(Result(Builder.TakeString()));
7499 
7500   // @[objects, ...]
7501   Builder.AddResultTypeChunk("NSArray *");
7502   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "["));
7503   Builder.AddPlaceholderChunk("objects, ...");
7504   Builder.AddChunk(CodeCompletionString::CK_RightBracket);
7505   Results.AddResult(Result(Builder.TakeString()));
7506 
7507   // @{key : object, ...}
7508   Builder.AddResultTypeChunk("NSDictionary *");
7509   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "{"));
7510   Builder.AddPlaceholderChunk("key");
7511   Builder.AddChunk(CodeCompletionString::CK_Colon);
7512   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7513   Builder.AddPlaceholderChunk("object, ...");
7514   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7515   Results.AddResult(Result(Builder.TakeString()));
7516 
7517   // @(expression)
7518   Builder.AddResultTypeChunk("id");
7519   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "("));
7520   Builder.AddPlaceholderChunk("expression");
7521   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7522   Results.AddResult(Result(Builder.TakeString()));
7523 }
7524 
7525 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
7526   typedef CodeCompletionResult Result;
7527   CodeCompletionBuilder Builder(Results.getAllocator(),
7528                                 Results.getCodeCompletionTUInfo());
7529 
7530   if (Results.includeCodePatterns()) {
7531     // @try { statements } @catch ( declaration ) { statements } @finally
7532     //   { statements }
7533     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "try"));
7534     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
7535     Builder.AddPlaceholderChunk("statements");
7536     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7537     Builder.AddTextChunk("@catch");
7538     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7539     Builder.AddPlaceholderChunk("parameter");
7540     Builder.AddChunk(CodeCompletionString::CK_RightParen);
7541     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
7542     Builder.AddPlaceholderChunk("statements");
7543     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7544     Builder.AddTextChunk("@finally");
7545     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
7546     Builder.AddPlaceholderChunk("statements");
7547     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7548     Results.AddResult(Result(Builder.TakeString()));
7549   }
7550 
7551   // @throw
7552   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "throw"));
7553   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7554   Builder.AddPlaceholderChunk("expression");
7555   Results.AddResult(Result(Builder.TakeString()));
7556 
7557   if (Results.includeCodePatterns()) {
7558     // @synchronized ( expression ) { statements }
7559     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synchronized"));
7560     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7561     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7562     Builder.AddPlaceholderChunk("expression");
7563     Builder.AddChunk(CodeCompletionString::CK_RightParen);
7564     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
7565     Builder.AddPlaceholderChunk("statements");
7566     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7567     Results.AddResult(Result(Builder.TakeString()));
7568   }
7569 }
7570 
7571 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
7572                                      ResultBuilder &Results, bool NeedAt) {
7573   typedef CodeCompletionResult Result;
7574   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "private")));
7575   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "protected")));
7576   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "public")));
7577   if (LangOpts.ObjC)
7578     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "package")));
7579 }
7580 
7581 void SemaCodeCompletion::CodeCompleteObjCAtVisibility(Scope *S) {
7582   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7583                         CodeCompleter->getCodeCompletionTUInfo(),
7584                         CodeCompletionContext::CCC_Other);
7585   Results.EnterNewScope();
7586   AddObjCVisibilityResults(getLangOpts(), Results, false);
7587   Results.ExitScope();
7588   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7589                             Results.getCompletionContext(), Results.data(),
7590                             Results.size());
7591 }
7592 
7593 void SemaCodeCompletion::CodeCompleteObjCAtStatement(Scope *S) {
7594   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7595                         CodeCompleter->getCodeCompletionTUInfo(),
7596                         CodeCompletionContext::CCC_Other);
7597   Results.EnterNewScope();
7598   AddObjCStatementResults(Results, false);
7599   AddObjCExpressionResults(Results, false);
7600   Results.ExitScope();
7601   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7602                             Results.getCompletionContext(), Results.data(),
7603                             Results.size());
7604 }
7605 
7606 void SemaCodeCompletion::CodeCompleteObjCAtExpression(Scope *S) {
7607   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7608                         CodeCompleter->getCodeCompletionTUInfo(),
7609                         CodeCompletionContext::CCC_Other);
7610   Results.EnterNewScope();
7611   AddObjCExpressionResults(Results, false);
7612   Results.ExitScope();
7613   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7614                             Results.getCompletionContext(), Results.data(),
7615                             Results.size());
7616 }
7617 
7618 /// Determine whether the addition of the given flag to an Objective-C
7619 /// property's attributes will cause a conflict.
7620 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
7621   // Check if we've already added this flag.
7622   if (Attributes & NewFlag)
7623     return true;
7624 
7625   Attributes |= NewFlag;
7626 
7627   // Check for collisions with "readonly".
7628   if ((Attributes & ObjCPropertyAttribute::kind_readonly) &&
7629       (Attributes & ObjCPropertyAttribute::kind_readwrite))
7630     return true;
7631 
7632   // Check for more than one of { assign, copy, retain, strong, weak }.
7633   unsigned AssignCopyRetMask =
7634       Attributes &
7635       (ObjCPropertyAttribute::kind_assign |
7636        ObjCPropertyAttribute::kind_unsafe_unretained |
7637        ObjCPropertyAttribute::kind_copy | ObjCPropertyAttribute::kind_retain |
7638        ObjCPropertyAttribute::kind_strong | ObjCPropertyAttribute::kind_weak);
7639   if (AssignCopyRetMask &&
7640       AssignCopyRetMask != ObjCPropertyAttribute::kind_assign &&
7641       AssignCopyRetMask != ObjCPropertyAttribute::kind_unsafe_unretained &&
7642       AssignCopyRetMask != ObjCPropertyAttribute::kind_copy &&
7643       AssignCopyRetMask != ObjCPropertyAttribute::kind_retain &&
7644       AssignCopyRetMask != ObjCPropertyAttribute::kind_strong &&
7645       AssignCopyRetMask != ObjCPropertyAttribute::kind_weak)
7646     return true;
7647 
7648   return false;
7649 }
7650 
7651 void SemaCodeCompletion::CodeCompleteObjCPropertyFlags(Scope *S,
7652                                                        ObjCDeclSpec &ODS) {
7653   if (!CodeCompleter)
7654     return;
7655 
7656   unsigned Attributes = ODS.getPropertyAttributes();
7657 
7658   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7659                         CodeCompleter->getCodeCompletionTUInfo(),
7660                         CodeCompletionContext::CCC_Other);
7661   Results.EnterNewScope();
7662   if (!ObjCPropertyFlagConflicts(Attributes,
7663                                  ObjCPropertyAttribute::kind_readonly))
7664     Results.AddResult(CodeCompletionResult("readonly"));
7665   if (!ObjCPropertyFlagConflicts(Attributes,
7666                                  ObjCPropertyAttribute::kind_assign))
7667     Results.AddResult(CodeCompletionResult("assign"));
7668   if (!ObjCPropertyFlagConflicts(Attributes,
7669                                  ObjCPropertyAttribute::kind_unsafe_unretained))
7670     Results.AddResult(CodeCompletionResult("unsafe_unretained"));
7671   if (!ObjCPropertyFlagConflicts(Attributes,
7672                                  ObjCPropertyAttribute::kind_readwrite))
7673     Results.AddResult(CodeCompletionResult("readwrite"));
7674   if (!ObjCPropertyFlagConflicts(Attributes,
7675                                  ObjCPropertyAttribute::kind_retain))
7676     Results.AddResult(CodeCompletionResult("retain"));
7677   if (!ObjCPropertyFlagConflicts(Attributes,
7678                                  ObjCPropertyAttribute::kind_strong))
7679     Results.AddResult(CodeCompletionResult("strong"));
7680   if (!ObjCPropertyFlagConflicts(Attributes, ObjCPropertyAttribute::kind_copy))
7681     Results.AddResult(CodeCompletionResult("copy"));
7682   if (!ObjCPropertyFlagConflicts(Attributes,
7683                                  ObjCPropertyAttribute::kind_nonatomic))
7684     Results.AddResult(CodeCompletionResult("nonatomic"));
7685   if (!ObjCPropertyFlagConflicts(Attributes,
7686                                  ObjCPropertyAttribute::kind_atomic))
7687     Results.AddResult(CodeCompletionResult("atomic"));
7688 
7689   // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC.
7690   if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC)
7691     if (!ObjCPropertyFlagConflicts(Attributes,
7692                                    ObjCPropertyAttribute::kind_weak))
7693       Results.AddResult(CodeCompletionResult("weak"));
7694 
7695   if (!ObjCPropertyFlagConflicts(Attributes,
7696                                  ObjCPropertyAttribute::kind_setter)) {
7697     CodeCompletionBuilder Setter(Results.getAllocator(),
7698                                  Results.getCodeCompletionTUInfo());
7699     Setter.AddTypedTextChunk("setter");
7700     Setter.AddTextChunk("=");
7701     Setter.AddPlaceholderChunk("method");
7702     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
7703   }
7704   if (!ObjCPropertyFlagConflicts(Attributes,
7705                                  ObjCPropertyAttribute::kind_getter)) {
7706     CodeCompletionBuilder Getter(Results.getAllocator(),
7707                                  Results.getCodeCompletionTUInfo());
7708     Getter.AddTypedTextChunk("getter");
7709     Getter.AddTextChunk("=");
7710     Getter.AddPlaceholderChunk("method");
7711     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
7712   }
7713   if (!ObjCPropertyFlagConflicts(Attributes,
7714                                  ObjCPropertyAttribute::kind_nullability)) {
7715     Results.AddResult(CodeCompletionResult("nonnull"));
7716     Results.AddResult(CodeCompletionResult("nullable"));
7717     Results.AddResult(CodeCompletionResult("null_unspecified"));
7718     Results.AddResult(CodeCompletionResult("null_resettable"));
7719   }
7720   Results.ExitScope();
7721   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7722                             Results.getCompletionContext(), Results.data(),
7723                             Results.size());
7724 }
7725 
7726 /// Describes the kind of Objective-C method that we want to find
7727 /// via code completion.
7728 enum ObjCMethodKind {
7729   MK_Any, ///< Any kind of method, provided it means other specified criteria.
7730   MK_ZeroArgSelector, ///< Zero-argument (unary) selector.
7731   MK_OneArgSelector   ///< One-argument selector.
7732 };
7733 
7734 static bool isAcceptableObjCSelector(Selector Sel, ObjCMethodKind WantKind,
7735                                      ArrayRef<const IdentifierInfo *> SelIdents,
7736                                      bool AllowSameLength = true) {
7737   unsigned NumSelIdents = SelIdents.size();
7738   if (NumSelIdents > Sel.getNumArgs())
7739     return false;
7740 
7741   switch (WantKind) {
7742   case MK_Any:
7743     break;
7744   case MK_ZeroArgSelector:
7745     return Sel.isUnarySelector();
7746   case MK_OneArgSelector:
7747     return Sel.getNumArgs() == 1;
7748   }
7749 
7750   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
7751     return false;
7752 
7753   for (unsigned I = 0; I != NumSelIdents; ++I)
7754     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
7755       return false;
7756 
7757   return true;
7758 }
7759 
7760 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
7761                                    ObjCMethodKind WantKind,
7762                                    ArrayRef<const IdentifierInfo *> SelIdents,
7763                                    bool AllowSameLength = true) {
7764   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
7765                                   AllowSameLength);
7766 }
7767 
7768 /// A set of selectors, which is used to avoid introducing multiple
7769 /// completions with the same selector into the result set.
7770 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
7771 
7772 /// Add all of the Objective-C methods in the given Objective-C
7773 /// container to the set of results.
7774 ///
7775 /// The container will be a class, protocol, category, or implementation of
7776 /// any of the above. This mether will recurse to include methods from
7777 /// the superclasses of classes along with their categories, protocols, and
7778 /// implementations.
7779 ///
7780 /// \param Container the container in which we'll look to find methods.
7781 ///
7782 /// \param WantInstanceMethods Whether to add instance methods (only); if
7783 /// false, this routine will add factory methods (only).
7784 ///
7785 /// \param CurContext the context in which we're performing the lookup that
7786 /// finds methods.
7787 ///
7788 /// \param AllowSameLength Whether we allow a method to be added to the list
7789 /// when it has the same number of parameters as we have selector identifiers.
7790 ///
7791 /// \param Results the structure into which we'll add results.
7792 static void AddObjCMethods(ObjCContainerDecl *Container,
7793                            bool WantInstanceMethods, ObjCMethodKind WantKind,
7794                            ArrayRef<const IdentifierInfo *> SelIdents,
7795                            DeclContext *CurContext,
7796                            VisitedSelectorSet &Selectors, bool AllowSameLength,
7797                            ResultBuilder &Results, bool InOriginalClass = true,
7798                            bool IsRootClass = false) {
7799   typedef CodeCompletionResult Result;
7800   Container = getContainerDef(Container);
7801   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
7802   IsRootClass = IsRootClass || (IFace && !IFace->getSuperClass());
7803   for (ObjCMethodDecl *M : Container->methods()) {
7804     // The instance methods on the root class can be messaged via the
7805     // metaclass.
7806     if (M->isInstanceMethod() == WantInstanceMethods ||
7807         (IsRootClass && !WantInstanceMethods)) {
7808       // Check whether the selector identifiers we've been given are a
7809       // subset of the identifiers for this particular method.
7810       if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength))
7811         continue;
7812 
7813       if (!Selectors.insert(M->getSelector()).second)
7814         continue;
7815 
7816       Result R = Result(M, Results.getBasePriority(M), nullptr);
7817       R.StartParameter = SelIdents.size();
7818       R.AllParametersAreInformative = (WantKind != MK_Any);
7819       if (!InOriginalClass)
7820         setInBaseClass(R);
7821       Results.MaybeAddResult(R, CurContext);
7822     }
7823   }
7824 
7825   // Visit the protocols of protocols.
7826   if (const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
7827     if (Protocol->hasDefinition()) {
7828       const ObjCList<ObjCProtocolDecl> &Protocols =
7829           Protocol->getReferencedProtocols();
7830       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7831                                                 E = Protocols.end();
7832            I != E; ++I)
7833         AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
7834                        Selectors, AllowSameLength, Results, false, IsRootClass);
7835     }
7836   }
7837 
7838   if (!IFace || !IFace->hasDefinition())
7839     return;
7840 
7841   // Add methods in protocols.
7842   for (ObjCProtocolDecl *I : IFace->protocols())
7843     AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext,
7844                    Selectors, AllowSameLength, Results, false, IsRootClass);
7845 
7846   // Add methods in categories.
7847   for (ObjCCategoryDecl *CatDecl : IFace->known_categories()) {
7848     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
7849                    CurContext, Selectors, AllowSameLength, Results,
7850                    InOriginalClass, IsRootClass);
7851 
7852     // Add a categories protocol methods.
7853     const ObjCList<ObjCProtocolDecl> &Protocols =
7854         CatDecl->getReferencedProtocols();
7855     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7856                                               E = Protocols.end();
7857          I != E; ++I)
7858       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
7859                      Selectors, AllowSameLength, Results, false, IsRootClass);
7860 
7861     // Add methods in category implementations.
7862     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
7863       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
7864                      Selectors, AllowSameLength, Results, InOriginalClass,
7865                      IsRootClass);
7866   }
7867 
7868   // Add methods in superclass.
7869   // Avoid passing in IsRootClass since root classes won't have super classes.
7870   if (IFace->getSuperClass())
7871     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
7872                    SelIdents, CurContext, Selectors, AllowSameLength, Results,
7873                    /*IsRootClass=*/false);
7874 
7875   // Add methods in our implementation, if any.
7876   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
7877     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
7878                    Selectors, AllowSameLength, Results, InOriginalClass,
7879                    IsRootClass);
7880 }
7881 
7882 void SemaCodeCompletion::CodeCompleteObjCPropertyGetter(Scope *S) {
7883   // Try to find the interface where getters might live.
7884   ObjCInterfaceDecl *Class =
7885       dyn_cast_or_null<ObjCInterfaceDecl>(SemaRef.CurContext);
7886   if (!Class) {
7887     if (ObjCCategoryDecl *Category =
7888             dyn_cast_or_null<ObjCCategoryDecl>(SemaRef.CurContext))
7889       Class = Category->getClassInterface();
7890 
7891     if (!Class)
7892       return;
7893   }
7894 
7895   // Find all of the potential getters.
7896   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7897                         CodeCompleter->getCodeCompletionTUInfo(),
7898                         CodeCompletionContext::CCC_Other);
7899   Results.EnterNewScope();
7900 
7901   VisitedSelectorSet Selectors;
7902   AddObjCMethods(Class, true, MK_ZeroArgSelector, {}, SemaRef.CurContext,
7903                  Selectors,
7904                  /*AllowSameLength=*/true, Results);
7905   Results.ExitScope();
7906   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7907                             Results.getCompletionContext(), Results.data(),
7908                             Results.size());
7909 }
7910 
7911 void SemaCodeCompletion::CodeCompleteObjCPropertySetter(Scope *S) {
7912   // Try to find the interface where setters might live.
7913   ObjCInterfaceDecl *Class =
7914       dyn_cast_or_null<ObjCInterfaceDecl>(SemaRef.CurContext);
7915   if (!Class) {
7916     if (ObjCCategoryDecl *Category =
7917             dyn_cast_or_null<ObjCCategoryDecl>(SemaRef.CurContext))
7918       Class = Category->getClassInterface();
7919 
7920     if (!Class)
7921       return;
7922   }
7923 
7924   // Find all of the potential getters.
7925   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7926                         CodeCompleter->getCodeCompletionTUInfo(),
7927                         CodeCompletionContext::CCC_Other);
7928   Results.EnterNewScope();
7929 
7930   VisitedSelectorSet Selectors;
7931   AddObjCMethods(Class, true, MK_OneArgSelector, {}, SemaRef.CurContext,
7932                  Selectors,
7933                  /*AllowSameLength=*/true, Results);
7934 
7935   Results.ExitScope();
7936   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
7937                             Results.getCompletionContext(), Results.data(),
7938                             Results.size());
7939 }
7940 
7941 void SemaCodeCompletion::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
7942                                                      bool IsParameter) {
7943   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7944                         CodeCompleter->getCodeCompletionTUInfo(),
7945                         CodeCompletionContext::CCC_Type);
7946   Results.EnterNewScope();
7947 
7948   // Add context-sensitive, Objective-C parameter-passing keywords.
7949   bool AddedInOut = false;
7950   if ((DS.getObjCDeclQualifier() &
7951        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
7952     Results.AddResult("in");
7953     Results.AddResult("inout");
7954     AddedInOut = true;
7955   }
7956   if ((DS.getObjCDeclQualifier() &
7957        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
7958     Results.AddResult("out");
7959     if (!AddedInOut)
7960       Results.AddResult("inout");
7961   }
7962   if ((DS.getObjCDeclQualifier() &
7963        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
7964         ObjCDeclSpec::DQ_Oneway)) == 0) {
7965     Results.AddResult("bycopy");
7966     Results.AddResult("byref");
7967     Results.AddResult("oneway");
7968   }
7969   if ((DS.getObjCDeclQualifier() & ObjCDeclSpec::DQ_CSNullability) == 0) {
7970     Results.AddResult("nonnull");
7971     Results.AddResult("nullable");
7972     Results.AddResult("null_unspecified");
7973   }
7974 
7975   // If we're completing the return type of an Objective-C method and the
7976   // identifier IBAction refers to a macro, provide a completion item for
7977   // an action, e.g.,
7978   //   IBAction)<#selector#>:(id)sender
7979   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
7980       SemaRef.PP.isMacroDefined("IBAction")) {
7981     CodeCompletionBuilder Builder(Results.getAllocator(),
7982                                   Results.getCodeCompletionTUInfo(),
7983                                   CCP_CodePattern, CXAvailability_Available);
7984     Builder.AddTypedTextChunk("IBAction");
7985     Builder.AddChunk(CodeCompletionString::CK_RightParen);
7986     Builder.AddPlaceholderChunk("selector");
7987     Builder.AddChunk(CodeCompletionString::CK_Colon);
7988     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7989     Builder.AddTextChunk("id");
7990     Builder.AddChunk(CodeCompletionString::CK_RightParen);
7991     Builder.AddTextChunk("sender");
7992     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
7993   }
7994 
7995   // If we're completing the return type, provide 'instancetype'.
7996   if (!IsParameter) {
7997     Results.AddResult(CodeCompletionResult("instancetype"));
7998   }
7999 
8000   // Add various builtin type names and specifiers.
8001   AddOrdinaryNameResults(PCC_Type, S, SemaRef, Results);
8002   Results.ExitScope();
8003 
8004   // Add the various type names
8005   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
8006   CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
8007   SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
8008                              CodeCompleter->includeGlobals(),
8009                              CodeCompleter->loadExternal());
8010 
8011   if (CodeCompleter->includeMacros())
8012     AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false);
8013 
8014   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8015                             Results.getCompletionContext(), Results.data(),
8016                             Results.size());
8017 }
8018 
8019 /// When we have an expression with type "id", we may assume
8020 /// that it has some more-specific class type based on knowledge of
8021 /// common uses of Objective-C. This routine returns that class type,
8022 /// or NULL if no better result could be determined.
8023 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
8024   auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
8025   if (!Msg)
8026     return nullptr;
8027 
8028   Selector Sel = Msg->getSelector();
8029   if (Sel.isNull())
8030     return nullptr;
8031 
8032   const IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
8033   if (!Id)
8034     return nullptr;
8035 
8036   ObjCMethodDecl *Method = Msg->getMethodDecl();
8037   if (!Method)
8038     return nullptr;
8039 
8040   // Determine the class that we're sending the message to.
8041   ObjCInterfaceDecl *IFace = nullptr;
8042   switch (Msg->getReceiverKind()) {
8043   case ObjCMessageExpr::Class:
8044     if (const ObjCObjectType *ObjType =
8045             Msg->getClassReceiver()->getAs<ObjCObjectType>())
8046       IFace = ObjType->getInterface();
8047     break;
8048 
8049   case ObjCMessageExpr::Instance: {
8050     QualType T = Msg->getInstanceReceiver()->getType();
8051     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
8052       IFace = Ptr->getInterfaceDecl();
8053     break;
8054   }
8055 
8056   case ObjCMessageExpr::SuperInstance:
8057   case ObjCMessageExpr::SuperClass:
8058     break;
8059   }
8060 
8061   if (!IFace)
8062     return nullptr;
8063 
8064   ObjCInterfaceDecl *Super = IFace->getSuperClass();
8065   if (Method->isInstanceMethod())
8066     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
8067         .Case("retain", IFace)
8068         .Case("strong", IFace)
8069         .Case("autorelease", IFace)
8070         .Case("copy", IFace)
8071         .Case("copyWithZone", IFace)
8072         .Case("mutableCopy", IFace)
8073         .Case("mutableCopyWithZone", IFace)
8074         .Case("awakeFromCoder", IFace)
8075         .Case("replacementObjectFromCoder", IFace)
8076         .Case("class", IFace)
8077         .Case("classForCoder", IFace)
8078         .Case("superclass", Super)
8079         .Default(nullptr);
8080 
8081   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
8082       .Case("new", IFace)
8083       .Case("alloc", IFace)
8084       .Case("allocWithZone", IFace)
8085       .Case("class", IFace)
8086       .Case("superclass", Super)
8087       .Default(nullptr);
8088 }
8089 
8090 // Add a special completion for a message send to "super", which fills in the
8091 // most likely case of forwarding all of our arguments to the superclass
8092 // function.
8093 ///
8094 /// \param S The semantic analysis object.
8095 ///
8096 /// \param NeedSuperKeyword Whether we need to prefix this completion with
8097 /// the "super" keyword. Otherwise, we just need to provide the arguments.
8098 ///
8099 /// \param SelIdents The identifiers in the selector that have already been
8100 /// provided as arguments for a send to "super".
8101 ///
8102 /// \param Results The set of results to augment.
8103 ///
8104 /// \returns the Objective-C method declaration that would be invoked by
8105 /// this "super" completion. If NULL, no completion was added.
8106 static ObjCMethodDecl *
8107 AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,
8108                        ArrayRef<const IdentifierInfo *> SelIdents,
8109                        ResultBuilder &Results) {
8110   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
8111   if (!CurMethod)
8112     return nullptr;
8113 
8114   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
8115   if (!Class)
8116     return nullptr;
8117 
8118   // Try to find a superclass method with the same selector.
8119   ObjCMethodDecl *SuperMethod = nullptr;
8120   while ((Class = Class->getSuperClass()) && !SuperMethod) {
8121     // Check in the class
8122     SuperMethod = Class->getMethod(CurMethod->getSelector(),
8123                                    CurMethod->isInstanceMethod());
8124 
8125     // Check in categories or class extensions.
8126     if (!SuperMethod) {
8127       for (const auto *Cat : Class->known_categories()) {
8128         if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(),
8129                                           CurMethod->isInstanceMethod())))
8130           break;
8131       }
8132     }
8133   }
8134 
8135   if (!SuperMethod)
8136     return nullptr;
8137 
8138   // Check whether the superclass method has the same signature.
8139   if (CurMethod->param_size() != SuperMethod->param_size() ||
8140       CurMethod->isVariadic() != SuperMethod->isVariadic())
8141     return nullptr;
8142 
8143   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
8144                                       CurPEnd = CurMethod->param_end(),
8145                                       SuperP = SuperMethod->param_begin();
8146        CurP != CurPEnd; ++CurP, ++SuperP) {
8147     // Make sure the parameter types are compatible.
8148     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
8149                                           (*SuperP)->getType()))
8150       return nullptr;
8151 
8152     // Make sure we have a parameter name to forward!
8153     if (!(*CurP)->getIdentifier())
8154       return nullptr;
8155   }
8156 
8157   // We have a superclass method. Now, form the send-to-super completion.
8158   CodeCompletionBuilder Builder(Results.getAllocator(),
8159                                 Results.getCodeCompletionTUInfo());
8160 
8161   // Give this completion a return type.
8162   AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod,
8163                      Results.getCompletionContext().getBaseType(), Builder);
8164 
8165   // If we need the "super" keyword, add it (plus some spacing).
8166   if (NeedSuperKeyword) {
8167     Builder.AddTypedTextChunk("super");
8168     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8169   }
8170 
8171   Selector Sel = CurMethod->getSelector();
8172   if (Sel.isUnarySelector()) {
8173     if (NeedSuperKeyword)
8174       Builder.AddTextChunk(
8175           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
8176     else
8177       Builder.AddTypedTextChunk(
8178           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
8179   } else {
8180     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
8181     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
8182       if (I > SelIdents.size())
8183         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8184 
8185       if (I < SelIdents.size())
8186         Builder.AddInformativeChunk(
8187             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
8188       else if (NeedSuperKeyword || I > SelIdents.size()) {
8189         Builder.AddTextChunk(
8190             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
8191         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
8192             (*CurP)->getIdentifier()->getName()));
8193       } else {
8194         Builder.AddTypedTextChunk(
8195             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
8196         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
8197             (*CurP)->getIdentifier()->getName()));
8198       }
8199     }
8200   }
8201 
8202   Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod,
8203                                          CCP_SuperCompletion));
8204   return SuperMethod;
8205 }
8206 
8207 void SemaCodeCompletion::CodeCompleteObjCMessageReceiver(Scope *S) {
8208   typedef CodeCompletionResult Result;
8209   ResultBuilder Results(
8210       SemaRef, CodeCompleter->getAllocator(),
8211       CodeCompleter->getCodeCompletionTUInfo(),
8212       CodeCompletionContext::CCC_ObjCMessageReceiver,
8213       getLangOpts().CPlusPlus11
8214           ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
8215           : &ResultBuilder::IsObjCMessageReceiver);
8216 
8217   CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
8218   Results.EnterNewScope();
8219   SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
8220                              CodeCompleter->includeGlobals(),
8221                              CodeCompleter->loadExternal());
8222 
8223   // If we are in an Objective-C method inside a class that has a superclass,
8224   // add "super" as an option.
8225   if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl())
8226     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
8227       if (Iface->getSuperClass()) {
8228         Results.AddResult(Result("super"));
8229 
8230         AddSuperSendCompletion(SemaRef, /*NeedSuperKeyword=*/true, {}, Results);
8231       }
8232 
8233   if (getLangOpts().CPlusPlus11)
8234     addThisCompletion(SemaRef, Results);
8235 
8236   Results.ExitScope();
8237 
8238   if (CodeCompleter->includeMacros())
8239     AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false);
8240   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8241                             Results.getCompletionContext(), Results.data(),
8242                             Results.size());
8243 }
8244 
8245 void SemaCodeCompletion::CodeCompleteObjCSuperMessage(
8246     Scope *S, SourceLocation SuperLoc,
8247     ArrayRef<const IdentifierInfo *> SelIdents, bool AtArgumentExpression) {
8248   ObjCInterfaceDecl *CDecl = nullptr;
8249   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) {
8250     // Figure out which interface we're in.
8251     CDecl = CurMethod->getClassInterface();
8252     if (!CDecl)
8253       return;
8254 
8255     // Find the superclass of this class.
8256     CDecl = CDecl->getSuperClass();
8257     if (!CDecl)
8258       return;
8259 
8260     if (CurMethod->isInstanceMethod()) {
8261       // We are inside an instance method, which means that the message
8262       // send [super ...] is actually calling an instance method on the
8263       // current object.
8264       return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents,
8265                                              AtArgumentExpression, CDecl);
8266     }
8267 
8268     // Fall through to send to the superclass in CDecl.
8269   } else {
8270     // "super" may be the name of a type or variable. Figure out which
8271     // it is.
8272     const IdentifierInfo *Super = SemaRef.getSuperIdentifier();
8273     NamedDecl *ND =
8274         SemaRef.LookupSingleName(S, Super, SuperLoc, Sema::LookupOrdinaryName);
8275     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
8276       // "super" names an interface. Use it.
8277     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
8278       if (const ObjCObjectType *Iface =
8279               getASTContext().getTypeDeclType(TD)->getAs<ObjCObjectType>())
8280         CDecl = Iface->getInterface();
8281     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
8282       // "super" names an unresolved type; we can't be more specific.
8283     } else {
8284       // Assume that "super" names some kind of value and parse that way.
8285       CXXScopeSpec SS;
8286       SourceLocation TemplateKWLoc;
8287       UnqualifiedId id;
8288       id.setIdentifier(Super, SuperLoc);
8289       ExprResult SuperExpr =
8290           SemaRef.ActOnIdExpression(S, SS, TemplateKWLoc, id,
8291                                     /*HasTrailingLParen=*/false,
8292                                     /*IsAddressOfOperand=*/false);
8293       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
8294                                              SelIdents, AtArgumentExpression);
8295     }
8296 
8297     // Fall through
8298   }
8299 
8300   ParsedType Receiver;
8301   if (CDecl)
8302     Receiver = ParsedType::make(getASTContext().getObjCInterfaceType(CDecl));
8303   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
8304                                       AtArgumentExpression,
8305                                       /*IsSuper=*/true);
8306 }
8307 
8308 /// Given a set of code-completion results for the argument of a message
8309 /// send, determine the preferred type (if any) for that argument expression.
8310 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
8311                                                        unsigned NumSelIdents) {
8312   typedef CodeCompletionResult Result;
8313   ASTContext &Context = Results.getSema().Context;
8314 
8315   QualType PreferredType;
8316   unsigned BestPriority = CCP_Unlikely * 2;
8317   Result *ResultsData = Results.data();
8318   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
8319     Result &R = ResultsData[I];
8320     if (R.Kind == Result::RK_Declaration &&
8321         isa<ObjCMethodDecl>(R.Declaration)) {
8322       if (R.Priority <= BestPriority) {
8323         const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
8324         if (NumSelIdents <= Method->param_size()) {
8325           QualType MyPreferredType =
8326               Method->parameters()[NumSelIdents - 1]->getType();
8327           if (R.Priority < BestPriority || PreferredType.isNull()) {
8328             BestPriority = R.Priority;
8329             PreferredType = MyPreferredType;
8330           } else if (!Context.hasSameUnqualifiedType(PreferredType,
8331                                                      MyPreferredType)) {
8332             PreferredType = QualType();
8333           }
8334         }
8335       }
8336     }
8337   }
8338 
8339   return PreferredType;
8340 }
8341 
8342 static void
8343 AddClassMessageCompletions(Sema &SemaRef, Scope *S, ParsedType Receiver,
8344                            ArrayRef<const IdentifierInfo *> SelIdents,
8345                            bool AtArgumentExpression, bool IsSuper,
8346                            ResultBuilder &Results) {
8347   typedef CodeCompletionResult Result;
8348   ObjCInterfaceDecl *CDecl = nullptr;
8349 
8350   // If the given name refers to an interface type, retrieve the
8351   // corresponding declaration.
8352   if (Receiver) {
8353     QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr);
8354     if (!T.isNull())
8355       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
8356         CDecl = Interface->getInterface();
8357   }
8358 
8359   // Add all of the factory methods in this Objective-C class, its protocols,
8360   // superclasses, categories, implementation, etc.
8361   Results.EnterNewScope();
8362 
8363   // If this is a send-to-super, try to add the special "super" send
8364   // completion.
8365   if (IsSuper) {
8366     if (ObjCMethodDecl *SuperMethod =
8367             AddSuperSendCompletion(SemaRef, false, SelIdents, Results))
8368       Results.Ignore(SuperMethod);
8369   }
8370 
8371   // If we're inside an Objective-C method definition, prefer its selector to
8372   // others.
8373   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
8374     Results.setPreferredSelector(CurMethod->getSelector());
8375 
8376   VisitedSelectorSet Selectors;
8377   if (CDecl)
8378     AddObjCMethods(CDecl, false, MK_Any, SelIdents, SemaRef.CurContext,
8379                    Selectors, AtArgumentExpression, Results);
8380   else {
8381     // We're messaging "id" as a type; provide all class/factory methods.
8382 
8383     // If we have an external source, load the entire class method
8384     // pool from the AST file.
8385     if (SemaRef.getExternalSource()) {
8386       for (uint32_t I = 0,
8387                     N = SemaRef.getExternalSource()->GetNumExternalSelectors();
8388            I != N; ++I) {
8389         Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I);
8390         if (Sel.isNull() || SemaRef.ObjC().MethodPool.count(Sel))
8391           continue;
8392 
8393         SemaRef.ObjC().ReadMethodPool(Sel);
8394       }
8395     }
8396 
8397     for (SemaObjC::GlobalMethodPool::iterator
8398              M = SemaRef.ObjC().MethodPool.begin(),
8399              MEnd = SemaRef.ObjC().MethodPool.end();
8400          M != MEnd; ++M) {
8401       for (ObjCMethodList *MethList = &M->second.second;
8402            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
8403         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
8404           continue;
8405 
8406         Result R(MethList->getMethod(),
8407                  Results.getBasePriority(MethList->getMethod()), nullptr);
8408         R.StartParameter = SelIdents.size();
8409         R.AllParametersAreInformative = false;
8410         Results.MaybeAddResult(R, SemaRef.CurContext);
8411       }
8412     }
8413   }
8414 
8415   Results.ExitScope();
8416 }
8417 
8418 void SemaCodeCompletion::CodeCompleteObjCClassMessage(
8419     Scope *S, ParsedType Receiver, ArrayRef<const IdentifierInfo *> SelIdents,
8420     bool AtArgumentExpression, bool IsSuper) {
8421 
8422   QualType T = SemaRef.GetTypeFromParser(Receiver);
8423 
8424   ResultBuilder Results(
8425       SemaRef, CodeCompleter->getAllocator(),
8426       CodeCompleter->getCodeCompletionTUInfo(),
8427       CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, T,
8428                             SelIdents));
8429 
8430   AddClassMessageCompletions(SemaRef, S, Receiver, SelIdents,
8431                              AtArgumentExpression, IsSuper, Results);
8432 
8433   // If we're actually at the argument expression (rather than prior to the
8434   // selector), we're actually performing code completion for an expression.
8435   // Determine whether we have a single, best method. If so, we can
8436   // code-complete the expression using the corresponding parameter type as
8437   // our preferred type, improving completion results.
8438   if (AtArgumentExpression) {
8439     QualType PreferredType =
8440         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
8441     if (PreferredType.isNull())
8442       CodeCompleteOrdinaryName(S, PCC_Expression);
8443     else
8444       CodeCompleteExpression(S, PreferredType);
8445     return;
8446   }
8447 
8448   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8449                             Results.getCompletionContext(), Results.data(),
8450                             Results.size());
8451 }
8452 
8453 void SemaCodeCompletion::CodeCompleteObjCInstanceMessage(
8454     Scope *S, Expr *RecExpr, ArrayRef<const IdentifierInfo *> SelIdents,
8455     bool AtArgumentExpression, ObjCInterfaceDecl *Super) {
8456   typedef CodeCompletionResult Result;
8457   ASTContext &Context = getASTContext();
8458 
8459   // If necessary, apply function/array conversion to the receiver.
8460   // C99 6.7.5.3p[7,8].
8461   if (RecExpr) {
8462     ExprResult Conv = SemaRef.DefaultFunctionArrayLvalueConversion(RecExpr);
8463     if (Conv.isInvalid()) // conversion failed. bail.
8464       return;
8465     RecExpr = Conv.get();
8466   }
8467   QualType ReceiverType = RecExpr
8468                               ? RecExpr->getType()
8469                               : Super ? Context.getObjCObjectPointerType(
8470                                             Context.getObjCInterfaceType(Super))
8471                                       : Context.getObjCIdType();
8472 
8473   // If we're messaging an expression with type "id" or "Class", check
8474   // whether we know something special about the receiver that allows
8475   // us to assume a more-specific receiver type.
8476   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) {
8477     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
8478       if (ReceiverType->isObjCClassType())
8479         return CodeCompleteObjCClassMessage(
8480             S, ParsedType::make(Context.getObjCInterfaceType(IFace)), SelIdents,
8481             AtArgumentExpression, Super);
8482 
8483       ReceiverType =
8484           Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace));
8485     }
8486   } else if (RecExpr && getLangOpts().CPlusPlus) {
8487     ExprResult Conv = SemaRef.PerformContextuallyConvertToObjCPointer(RecExpr);
8488     if (Conv.isUsable()) {
8489       RecExpr = Conv.get();
8490       ReceiverType = RecExpr->getType();
8491     }
8492   }
8493 
8494   // Build the set of methods we can see.
8495   ResultBuilder Results(
8496       SemaRef, CodeCompleter->getAllocator(),
8497       CodeCompleter->getCodeCompletionTUInfo(),
8498       CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
8499                             ReceiverType, SelIdents));
8500 
8501   Results.EnterNewScope();
8502 
8503   // If this is a send-to-super, try to add the special "super" send
8504   // completion.
8505   if (Super) {
8506     if (ObjCMethodDecl *SuperMethod =
8507             AddSuperSendCompletion(SemaRef, false, SelIdents, Results))
8508       Results.Ignore(SuperMethod);
8509   }
8510 
8511   // If we're inside an Objective-C method definition, prefer its selector to
8512   // others.
8513   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
8514     Results.setPreferredSelector(CurMethod->getSelector());
8515 
8516   // Keep track of the selectors we've already added.
8517   VisitedSelectorSet Selectors;
8518 
8519   // Handle messages to Class. This really isn't a message to an instance
8520   // method, so we treat it the same way we would treat a message send to a
8521   // class method.
8522   if (ReceiverType->isObjCClassType() ||
8523       ReceiverType->isObjCQualifiedClassType()) {
8524     if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) {
8525       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
8526         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, SemaRef.CurContext,
8527                        Selectors, AtArgumentExpression, Results);
8528     }
8529   }
8530   // Handle messages to a qualified ID ("id<foo>").
8531   else if (const ObjCObjectPointerType *QualID =
8532                ReceiverType->getAsObjCQualifiedIdType()) {
8533     // Search protocols for instance methods.
8534     for (auto *I : QualID->quals())
8535       AddObjCMethods(I, true, MK_Any, SelIdents, SemaRef.CurContext, Selectors,
8536                      AtArgumentExpression, Results);
8537   }
8538   // Handle messages to a pointer to interface type.
8539   else if (const ObjCObjectPointerType *IFacePtr =
8540                ReceiverType->getAsObjCInterfacePointerType()) {
8541     // Search the class, its superclasses, etc., for instance methods.
8542     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
8543                    SemaRef.CurContext, Selectors, AtArgumentExpression,
8544                    Results);
8545 
8546     // Search protocols for instance methods.
8547     for (auto *I : IFacePtr->quals())
8548       AddObjCMethods(I, true, MK_Any, SelIdents, SemaRef.CurContext, Selectors,
8549                      AtArgumentExpression, Results);
8550   }
8551   // Handle messages to "id".
8552   else if (ReceiverType->isObjCIdType()) {
8553     // We're messaging "id", so provide all instance methods we know
8554     // about as code-completion results.
8555 
8556     // If we have an external source, load the entire class method
8557     // pool from the AST file.
8558     if (SemaRef.ExternalSource) {
8559       for (uint32_t I = 0,
8560                     N = SemaRef.ExternalSource->GetNumExternalSelectors();
8561            I != N; ++I) {
8562         Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I);
8563         if (Sel.isNull() || SemaRef.ObjC().MethodPool.count(Sel))
8564           continue;
8565 
8566         SemaRef.ObjC().ReadMethodPool(Sel);
8567       }
8568     }
8569 
8570     for (SemaObjC::GlobalMethodPool::iterator
8571              M = SemaRef.ObjC().MethodPool.begin(),
8572              MEnd = SemaRef.ObjC().MethodPool.end();
8573          M != MEnd; ++M) {
8574       for (ObjCMethodList *MethList = &M->second.first;
8575            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
8576         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
8577           continue;
8578 
8579         if (!Selectors.insert(MethList->getMethod()->getSelector()).second)
8580           continue;
8581 
8582         Result R(MethList->getMethod(),
8583                  Results.getBasePriority(MethList->getMethod()), nullptr);
8584         R.StartParameter = SelIdents.size();
8585         R.AllParametersAreInformative = false;
8586         Results.MaybeAddResult(R, SemaRef.CurContext);
8587       }
8588     }
8589   }
8590   Results.ExitScope();
8591 
8592   // If we're actually at the argument expression (rather than prior to the
8593   // selector), we're actually performing code completion for an expression.
8594   // Determine whether we have a single, best method. If so, we can
8595   // code-complete the expression using the corresponding parameter type as
8596   // our preferred type, improving completion results.
8597   if (AtArgumentExpression) {
8598     QualType PreferredType =
8599         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
8600     if (PreferredType.isNull())
8601       CodeCompleteOrdinaryName(S, PCC_Expression);
8602     else
8603       CodeCompleteExpression(S, PreferredType);
8604     return;
8605   }
8606 
8607   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8608                             Results.getCompletionContext(), Results.data(),
8609                             Results.size());
8610 }
8611 
8612 void SemaCodeCompletion::CodeCompleteObjCForCollection(
8613     Scope *S, DeclGroupPtrTy IterationVar) {
8614   CodeCompleteExpressionData Data;
8615   Data.ObjCCollection = true;
8616 
8617   if (IterationVar.getAsOpaquePtr()) {
8618     DeclGroupRef DG = IterationVar.get();
8619     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
8620       if (*I)
8621         Data.IgnoreDecls.push_back(*I);
8622     }
8623   }
8624 
8625   CodeCompleteExpression(S, Data);
8626 }
8627 
8628 void SemaCodeCompletion::CodeCompleteObjCSelector(
8629     Scope *S, ArrayRef<const IdentifierInfo *> SelIdents) {
8630   // If we have an external source, load the entire class method
8631   // pool from the AST file.
8632   if (SemaRef.ExternalSource) {
8633     for (uint32_t I = 0, N = SemaRef.ExternalSource->GetNumExternalSelectors();
8634          I != N; ++I) {
8635       Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I);
8636       if (Sel.isNull() || SemaRef.ObjC().MethodPool.count(Sel))
8637         continue;
8638 
8639       SemaRef.ObjC().ReadMethodPool(Sel);
8640     }
8641   }
8642 
8643   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8644                         CodeCompleter->getCodeCompletionTUInfo(),
8645                         CodeCompletionContext::CCC_SelectorName);
8646   Results.EnterNewScope();
8647   for (SemaObjC::GlobalMethodPool::iterator
8648            M = SemaRef.ObjC().MethodPool.begin(),
8649            MEnd = SemaRef.ObjC().MethodPool.end();
8650        M != MEnd; ++M) {
8651 
8652     Selector Sel = M->first;
8653     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents))
8654       continue;
8655 
8656     CodeCompletionBuilder Builder(Results.getAllocator(),
8657                                   Results.getCodeCompletionTUInfo());
8658     if (Sel.isUnarySelector()) {
8659       Builder.AddTypedTextChunk(
8660           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
8661       Results.AddResult(Builder.TakeString());
8662       continue;
8663     }
8664 
8665     std::string Accumulator;
8666     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
8667       if (I == SelIdents.size()) {
8668         if (!Accumulator.empty()) {
8669           Builder.AddInformativeChunk(
8670               Builder.getAllocator().CopyString(Accumulator));
8671           Accumulator.clear();
8672         }
8673       }
8674 
8675       Accumulator += Sel.getNameForSlot(I);
8676       Accumulator += ':';
8677     }
8678     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator));
8679     Results.AddResult(Builder.TakeString());
8680   }
8681   Results.ExitScope();
8682 
8683   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8684                             Results.getCompletionContext(), Results.data(),
8685                             Results.size());
8686 }
8687 
8688 /// Add all of the protocol declarations that we find in the given
8689 /// (translation unit) context.
8690 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
8691                                bool OnlyForwardDeclarations,
8692                                ResultBuilder &Results) {
8693   typedef CodeCompletionResult Result;
8694 
8695   for (const auto *D : Ctx->decls()) {
8696     // Record any protocols we find.
8697     if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D))
8698       if (!OnlyForwardDeclarations || !Proto->hasDefinition())
8699         Results.AddResult(
8700             Result(Proto, Results.getBasePriority(Proto), nullptr), CurContext,
8701             nullptr, false);
8702   }
8703 }
8704 
8705 void SemaCodeCompletion::CodeCompleteObjCProtocolReferences(
8706     ArrayRef<IdentifierLoc> Protocols) {
8707   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8708                         CodeCompleter->getCodeCompletionTUInfo(),
8709                         CodeCompletionContext::CCC_ObjCProtocolName);
8710 
8711   if (CodeCompleter->includeGlobals()) {
8712     Results.EnterNewScope();
8713 
8714     // Tell the result set to ignore all of the protocols we have
8715     // already seen.
8716     // FIXME: This doesn't work when caching code-completion results.
8717     for (const IdentifierLoc &Pair : Protocols)
8718       if (ObjCProtocolDecl *Protocol = SemaRef.ObjC().LookupProtocol(
8719               Pair.getIdentifierInfo(), Pair.getLoc()))
8720         Results.Ignore(Protocol);
8721 
8722     // Add all protocols.
8723     AddProtocolResults(getASTContext().getTranslationUnitDecl(),
8724                        SemaRef.CurContext, false, Results);
8725 
8726     Results.ExitScope();
8727   }
8728 
8729   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8730                             Results.getCompletionContext(), Results.data(),
8731                             Results.size());
8732 }
8733 
8734 void SemaCodeCompletion::CodeCompleteObjCProtocolDecl(Scope *) {
8735   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8736                         CodeCompleter->getCodeCompletionTUInfo(),
8737                         CodeCompletionContext::CCC_ObjCProtocolName);
8738 
8739   if (CodeCompleter->includeGlobals()) {
8740     Results.EnterNewScope();
8741 
8742     // Add all protocols.
8743     AddProtocolResults(getASTContext().getTranslationUnitDecl(),
8744                        SemaRef.CurContext, true, Results);
8745 
8746     Results.ExitScope();
8747   }
8748 
8749   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8750                             Results.getCompletionContext(), Results.data(),
8751                             Results.size());
8752 }
8753 
8754 /// Add all of the Objective-C interface declarations that we find in
8755 /// the given (translation unit) context.
8756 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
8757                                 bool OnlyForwardDeclarations,
8758                                 bool OnlyUnimplemented,
8759                                 ResultBuilder &Results) {
8760   typedef CodeCompletionResult Result;
8761 
8762   for (const auto *D : Ctx->decls()) {
8763     // Record any interfaces we find.
8764     if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
8765       if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
8766           (!OnlyUnimplemented || !Class->getImplementation()))
8767         Results.AddResult(
8768             Result(Class, Results.getBasePriority(Class), nullptr), CurContext,
8769             nullptr, false);
8770   }
8771 }
8772 
8773 void SemaCodeCompletion::CodeCompleteObjCInterfaceDecl(Scope *S) {
8774   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8775                         CodeCompleter->getCodeCompletionTUInfo(),
8776                         CodeCompletionContext::CCC_ObjCInterfaceName);
8777   Results.EnterNewScope();
8778 
8779   if (CodeCompleter->includeGlobals()) {
8780     // Add all classes.
8781     AddInterfaceResults(getASTContext().getTranslationUnitDecl(),
8782                         SemaRef.CurContext, false, false, Results);
8783   }
8784 
8785   Results.ExitScope();
8786 
8787   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8788                             Results.getCompletionContext(), Results.data(),
8789                             Results.size());
8790 }
8791 
8792 void SemaCodeCompletion::CodeCompleteObjCClassForwardDecl(Scope *S) {
8793   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8794                         CodeCompleter->getCodeCompletionTUInfo(),
8795                         CodeCompletionContext::CCC_ObjCClassForwardDecl);
8796   Results.EnterNewScope();
8797 
8798   if (CodeCompleter->includeGlobals()) {
8799     // Add all classes.
8800     AddInterfaceResults(getASTContext().getTranslationUnitDecl(),
8801                         SemaRef.CurContext, false, false, Results);
8802   }
8803 
8804   Results.ExitScope();
8805 
8806   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8807                             Results.getCompletionContext(), Results.data(),
8808                             Results.size());
8809 }
8810 
8811 void SemaCodeCompletion::CodeCompleteObjCSuperclass(
8812     Scope *S, IdentifierInfo *ClassName, SourceLocation ClassNameLoc) {
8813   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8814                         CodeCompleter->getCodeCompletionTUInfo(),
8815                         CodeCompletionContext::CCC_ObjCInterfaceName);
8816   Results.EnterNewScope();
8817 
8818   // Make sure that we ignore the class we're currently defining.
8819   NamedDecl *CurClass = SemaRef.LookupSingleName(
8820       SemaRef.TUScope, ClassName, ClassNameLoc, Sema::LookupOrdinaryName);
8821   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
8822     Results.Ignore(CurClass);
8823 
8824   if (CodeCompleter->includeGlobals()) {
8825     // Add all classes.
8826     AddInterfaceResults(getASTContext().getTranslationUnitDecl(),
8827                         SemaRef.CurContext, false, false, Results);
8828   }
8829 
8830   Results.ExitScope();
8831 
8832   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8833                             Results.getCompletionContext(), Results.data(),
8834                             Results.size());
8835 }
8836 
8837 void SemaCodeCompletion::CodeCompleteObjCImplementationDecl(Scope *S) {
8838   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8839                         CodeCompleter->getCodeCompletionTUInfo(),
8840                         CodeCompletionContext::CCC_ObjCImplementation);
8841   Results.EnterNewScope();
8842 
8843   if (CodeCompleter->includeGlobals()) {
8844     // Add all unimplemented classes.
8845     AddInterfaceResults(getASTContext().getTranslationUnitDecl(),
8846                         SemaRef.CurContext, false, true, Results);
8847   }
8848 
8849   Results.ExitScope();
8850 
8851   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8852                             Results.getCompletionContext(), Results.data(),
8853                             Results.size());
8854 }
8855 
8856 void SemaCodeCompletion::CodeCompleteObjCInterfaceCategory(
8857     Scope *S, IdentifierInfo *ClassName, SourceLocation ClassNameLoc) {
8858   typedef CodeCompletionResult Result;
8859 
8860   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8861                         CodeCompleter->getCodeCompletionTUInfo(),
8862                         CodeCompletionContext::CCC_ObjCCategoryName);
8863 
8864   // Ignore any categories we find that have already been implemented by this
8865   // interface.
8866   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
8867   NamedDecl *CurClass = SemaRef.LookupSingleName(
8868       SemaRef.TUScope, ClassName, ClassNameLoc, Sema::LookupOrdinaryName);
8869   if (ObjCInterfaceDecl *Class =
8870           dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) {
8871     for (const auto *Cat : Class->visible_categories())
8872       CategoryNames.insert(Cat->getIdentifier());
8873   }
8874 
8875   // Add all of the categories we know about.
8876   Results.EnterNewScope();
8877   TranslationUnitDecl *TU = getASTContext().getTranslationUnitDecl();
8878   for (const auto *D : TU->decls())
8879     if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D))
8880       if (CategoryNames.insert(Category->getIdentifier()).second)
8881         Results.AddResult(
8882             Result(Category, Results.getBasePriority(Category), nullptr),
8883             SemaRef.CurContext, nullptr, false);
8884   Results.ExitScope();
8885 
8886   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8887                             Results.getCompletionContext(), Results.data(),
8888                             Results.size());
8889 }
8890 
8891 void SemaCodeCompletion::CodeCompleteObjCImplementationCategory(
8892     Scope *S, IdentifierInfo *ClassName, SourceLocation ClassNameLoc) {
8893   typedef CodeCompletionResult Result;
8894 
8895   // Find the corresponding interface. If we couldn't find the interface, the
8896   // program itself is ill-formed. However, we'll try to be helpful still by
8897   // providing the list of all of the categories we know about.
8898   NamedDecl *CurClass = SemaRef.LookupSingleName(
8899       SemaRef.TUScope, ClassName, ClassNameLoc, Sema::LookupOrdinaryName);
8900   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
8901   if (!Class)
8902     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
8903 
8904   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8905                         CodeCompleter->getCodeCompletionTUInfo(),
8906                         CodeCompletionContext::CCC_ObjCCategoryName);
8907 
8908   // Add all of the categories that have corresponding interface
8909   // declarations in this class and any of its superclasses, except for
8910   // already-implemented categories in the class itself.
8911   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
8912   Results.EnterNewScope();
8913   bool IgnoreImplemented = true;
8914   while (Class) {
8915     for (const auto *Cat : Class->visible_categories()) {
8916       if ((!IgnoreImplemented || !Cat->getImplementation()) &&
8917           CategoryNames.insert(Cat->getIdentifier()).second)
8918         Results.AddResult(Result(Cat, Results.getBasePriority(Cat), nullptr),
8919                           SemaRef.CurContext, nullptr, false);
8920     }
8921 
8922     Class = Class->getSuperClass();
8923     IgnoreImplemented = false;
8924   }
8925   Results.ExitScope();
8926 
8927   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8928                             Results.getCompletionContext(), Results.data(),
8929                             Results.size());
8930 }
8931 
8932 void SemaCodeCompletion::CodeCompleteObjCPropertyDefinition(Scope *S) {
8933   CodeCompletionContext CCContext(CodeCompletionContext::CCC_Other);
8934   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8935                         CodeCompleter->getCodeCompletionTUInfo(), CCContext);
8936 
8937   // Figure out where this @synthesize lives.
8938   ObjCContainerDecl *Container =
8939       dyn_cast_or_null<ObjCContainerDecl>(SemaRef.CurContext);
8940   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
8941                      !isa<ObjCCategoryImplDecl>(Container)))
8942     return;
8943 
8944   // Ignore any properties that have already been implemented.
8945   Container = getContainerDef(Container);
8946   for (const auto *D : Container->decls())
8947     if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D))
8948       Results.Ignore(PropertyImpl->getPropertyDecl());
8949 
8950   // Add any properties that we find.
8951   AddedPropertiesSet AddedProperties;
8952   Results.EnterNewScope();
8953   if (ObjCImplementationDecl *ClassImpl =
8954           dyn_cast<ObjCImplementationDecl>(Container))
8955     AddObjCProperties(CCContext, ClassImpl->getClassInterface(), false,
8956                       /*AllowNullaryMethods=*/false, SemaRef.CurContext,
8957                       AddedProperties, Results);
8958   else
8959     AddObjCProperties(CCContext,
8960                       cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
8961                       false, /*AllowNullaryMethods=*/false, SemaRef.CurContext,
8962                       AddedProperties, Results);
8963   Results.ExitScope();
8964 
8965   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
8966                             Results.getCompletionContext(), Results.data(),
8967                             Results.size());
8968 }
8969 
8970 void SemaCodeCompletion::CodeCompleteObjCPropertySynthesizeIvar(
8971     Scope *S, IdentifierInfo *PropertyName) {
8972   typedef CodeCompletionResult Result;
8973   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8974                         CodeCompleter->getCodeCompletionTUInfo(),
8975                         CodeCompletionContext::CCC_Other);
8976 
8977   // Figure out where this @synthesize lives.
8978   ObjCContainerDecl *Container =
8979       dyn_cast_or_null<ObjCContainerDecl>(SemaRef.CurContext);
8980   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
8981                      !isa<ObjCCategoryImplDecl>(Container)))
8982     return;
8983 
8984   // Figure out which interface we're looking into.
8985   ObjCInterfaceDecl *Class = nullptr;
8986   if (ObjCImplementationDecl *ClassImpl =
8987           dyn_cast<ObjCImplementationDecl>(Container))
8988     Class = ClassImpl->getClassInterface();
8989   else
8990     Class = cast<ObjCCategoryImplDecl>(Container)
8991                 ->getCategoryDecl()
8992                 ->getClassInterface();
8993 
8994   // Determine the type of the property we're synthesizing.
8995   QualType PropertyType = getASTContext().getObjCIdType();
8996   if (Class) {
8997     if (ObjCPropertyDecl *Property = Class->FindPropertyDeclaration(
8998             PropertyName, ObjCPropertyQueryKind::OBJC_PR_query_instance)) {
8999       PropertyType =
9000           Property->getType().getNonReferenceType().getUnqualifiedType();
9001 
9002       // Give preference to ivars
9003       Results.setPreferredType(PropertyType);
9004     }
9005   }
9006 
9007   // Add all of the instance variables in this class and its superclasses.
9008   Results.EnterNewScope();
9009   bool SawSimilarlyNamedIvar = false;
9010   std::string NameWithPrefix;
9011   NameWithPrefix += '_';
9012   NameWithPrefix += PropertyName->getName();
9013   std::string NameWithSuffix = PropertyName->getName().str();
9014   NameWithSuffix += '_';
9015   for (; Class; Class = Class->getSuperClass()) {
9016     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
9017          Ivar = Ivar->getNextIvar()) {
9018       Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), nullptr),
9019                         SemaRef.CurContext, nullptr, false);
9020 
9021       // Determine whether we've seen an ivar with a name similar to the
9022       // property.
9023       if ((PropertyName == Ivar->getIdentifier() ||
9024            NameWithPrefix == Ivar->getName() ||
9025            NameWithSuffix == Ivar->getName())) {
9026         SawSimilarlyNamedIvar = true;
9027 
9028         // Reduce the priority of this result by one, to give it a slight
9029         // advantage over other results whose names don't match so closely.
9030         if (Results.size() &&
9031             Results.data()[Results.size() - 1].Kind ==
9032                 CodeCompletionResult::RK_Declaration &&
9033             Results.data()[Results.size() - 1].Declaration == Ivar)
9034           Results.data()[Results.size() - 1].Priority--;
9035       }
9036     }
9037   }
9038 
9039   if (!SawSimilarlyNamedIvar) {
9040     // Create ivar result _propName, that the user can use to synthesize
9041     // an ivar of the appropriate type.
9042     unsigned Priority = CCP_MemberDeclaration + 1;
9043     typedef CodeCompletionResult Result;
9044     CodeCompletionAllocator &Allocator = Results.getAllocator();
9045     CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(),
9046                                   Priority, CXAvailability_Available);
9047 
9048     PrintingPolicy Policy = getCompletionPrintingPolicy(SemaRef);
9049     Builder.AddResultTypeChunk(GetCompletionTypeString(
9050         PropertyType, getASTContext(), Policy, Allocator));
9051     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
9052     Results.AddResult(
9053         Result(Builder.TakeString(), Priority, CXCursor_ObjCIvarDecl));
9054   }
9055 
9056   Results.ExitScope();
9057 
9058   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
9059                             Results.getCompletionContext(), Results.data(),
9060                             Results.size());
9061 }
9062 
9063 // Mapping from selectors to the methods that implement that selector, along
9064 // with the "in original class" flag.
9065 typedef llvm::DenseMap<Selector,
9066                        llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>>
9067     KnownMethodsMap;
9068 
9069 /// Find all of the methods that reside in the given container
9070 /// (and its superclasses, protocols, etc.) that meet the given
9071 /// criteria. Insert those methods into the map of known methods,
9072 /// indexed by selector so they can be easily found.
9073 static void FindImplementableMethods(ASTContext &Context,
9074                                      ObjCContainerDecl *Container,
9075                                      std::optional<bool> WantInstanceMethods,
9076                                      QualType ReturnType,
9077                                      KnownMethodsMap &KnownMethods,
9078                                      bool InOriginalClass = true) {
9079   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
9080     // Make sure we have a definition; that's what we'll walk.
9081     if (!IFace->hasDefinition())
9082       return;
9083 
9084     IFace = IFace->getDefinition();
9085     Container = IFace;
9086 
9087     const ObjCList<ObjCProtocolDecl> &Protocols =
9088         IFace->getReferencedProtocols();
9089     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
9090                                               E = Protocols.end();
9091          I != E; ++I)
9092       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
9093                                KnownMethods, InOriginalClass);
9094 
9095     // Add methods from any class extensions and categories.
9096     for (auto *Cat : IFace->visible_categories()) {
9097       FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType,
9098                                KnownMethods, false);
9099     }
9100 
9101     // Visit the superclass.
9102     if (IFace->getSuperClass())
9103       FindImplementableMethods(Context, IFace->getSuperClass(),
9104                                WantInstanceMethods, ReturnType, KnownMethods,
9105                                false);
9106   }
9107 
9108   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
9109     // Recurse into protocols.
9110     const ObjCList<ObjCProtocolDecl> &Protocols =
9111         Category->getReferencedProtocols();
9112     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
9113                                               E = Protocols.end();
9114          I != E; ++I)
9115       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
9116                                KnownMethods, InOriginalClass);
9117 
9118     // If this category is the original class, jump to the interface.
9119     if (InOriginalClass && Category->getClassInterface())
9120       FindImplementableMethods(Context, Category->getClassInterface(),
9121                                WantInstanceMethods, ReturnType, KnownMethods,
9122                                false);
9123   }
9124 
9125   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
9126     // Make sure we have a definition; that's what we'll walk.
9127     if (!Protocol->hasDefinition())
9128       return;
9129     Protocol = Protocol->getDefinition();
9130     Container = Protocol;
9131 
9132     // Recurse into protocols.
9133     const ObjCList<ObjCProtocolDecl> &Protocols =
9134         Protocol->getReferencedProtocols();
9135     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
9136                                               E = Protocols.end();
9137          I != E; ++I)
9138       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
9139                                KnownMethods, false);
9140   }
9141 
9142   // Add methods in this container. This operation occurs last because
9143   // we want the methods from this container to override any methods
9144   // we've previously seen with the same selector.
9145   for (auto *M : Container->methods()) {
9146     if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) {
9147       if (!ReturnType.isNull() &&
9148           !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType()))
9149         continue;
9150 
9151       KnownMethods[M->getSelector()] =
9152           KnownMethodsMap::mapped_type(M, InOriginalClass);
9153     }
9154   }
9155 }
9156 
9157 /// Add the parenthesized return or parameter type chunk to a code
9158 /// completion string.
9159 static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals,
9160                                     ASTContext &Context,
9161                                     const PrintingPolicy &Policy,
9162                                     CodeCompletionBuilder &Builder) {
9163   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9164   std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals, Type);
9165   if (!Quals.empty())
9166     Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
9167   Builder.AddTextChunk(
9168       GetCompletionTypeString(Type, Context, Policy, Builder.getAllocator()));
9169   Builder.AddChunk(CodeCompletionString::CK_RightParen);
9170 }
9171 
9172 /// Determine whether the given class is or inherits from a class by
9173 /// the given name.
9174 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name) {
9175   if (!Class)
9176     return false;
9177 
9178   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
9179     return true;
9180 
9181   return InheritsFromClassNamed(Class->getSuperClass(), Name);
9182 }
9183 
9184 /// Add code completions for Objective-C Key-Value Coding (KVC) and
9185 /// Key-Value Observing (KVO).
9186 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
9187                                        bool IsInstanceMethod,
9188                                        QualType ReturnType, ASTContext &Context,
9189                                        VisitedSelectorSet &KnownSelectors,
9190                                        ResultBuilder &Results) {
9191   IdentifierInfo *PropName = Property->getIdentifier();
9192   if (!PropName || PropName->getLength() == 0)
9193     return;
9194 
9195   PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
9196 
9197   // Builder that will create each code completion.
9198   typedef CodeCompletionResult Result;
9199   CodeCompletionAllocator &Allocator = Results.getAllocator();
9200   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
9201 
9202   // The selector table.
9203   SelectorTable &Selectors = Context.Selectors;
9204 
9205   // The property name, copied into the code completion allocation region
9206   // on demand.
9207   struct KeyHolder {
9208     CodeCompletionAllocator &Allocator;
9209     StringRef Key;
9210     const char *CopiedKey;
9211 
9212     KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key)
9213         : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {}
9214 
9215     operator const char *() {
9216       if (CopiedKey)
9217         return CopiedKey;
9218 
9219       return CopiedKey = Allocator.CopyString(Key);
9220     }
9221   } Key(Allocator, PropName->getName());
9222 
9223   // The uppercased name of the property name.
9224   std::string UpperKey = std::string(PropName->getName());
9225   if (!UpperKey.empty())
9226     UpperKey[0] = toUppercase(UpperKey[0]);
9227 
9228   bool ReturnTypeMatchesProperty =
9229       ReturnType.isNull() ||
9230       Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
9231                                      Property->getType());
9232   bool ReturnTypeMatchesVoid = ReturnType.isNull() || ReturnType->isVoidType();
9233 
9234   // Add the normal accessor -(type)key.
9235   if (IsInstanceMethod &&
9236       KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second &&
9237       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
9238     if (ReturnType.isNull())
9239       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
9240                               Builder);
9241 
9242     Builder.AddTypedTextChunk(Key);
9243     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
9244                              CXCursor_ObjCInstanceMethodDecl));
9245   }
9246 
9247   // If we have an integral or boolean property (or the user has provided
9248   // an integral or boolean return type), add the accessor -(type)isKey.
9249   if (IsInstanceMethod &&
9250       ((!ReturnType.isNull() &&
9251         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
9252        (ReturnType.isNull() && (Property->getType()->isIntegerType() ||
9253                                 Property->getType()->isBooleanType())))) {
9254     std::string SelectorName = (Twine("is") + UpperKey).str();
9255     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9256     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
9257             .second) {
9258       if (ReturnType.isNull()) {
9259         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9260         Builder.AddTextChunk("BOOL");
9261         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9262       }
9263 
9264       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
9265       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
9266                                CXCursor_ObjCInstanceMethodDecl));
9267     }
9268   }
9269 
9270   // Add the normal mutator.
9271   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
9272       !Property->getSetterMethodDecl()) {
9273     std::string SelectorName = (Twine("set") + UpperKey).str();
9274     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9275     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9276       if (ReturnType.isNull()) {
9277         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9278         Builder.AddTextChunk("void");
9279         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9280       }
9281 
9282       Builder.AddTypedTextChunk(
9283           Allocator.CopyString(SelectorId->getName() + ":"));
9284       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
9285                               Builder);
9286       Builder.AddTextChunk(Key);
9287       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
9288                                CXCursor_ObjCInstanceMethodDecl));
9289     }
9290   }
9291 
9292   // Indexed and unordered accessors
9293   unsigned IndexedGetterPriority = CCP_CodePattern;
9294   unsigned IndexedSetterPriority = CCP_CodePattern;
9295   unsigned UnorderedGetterPriority = CCP_CodePattern;
9296   unsigned UnorderedSetterPriority = CCP_CodePattern;
9297   if (const auto *ObjCPointer =
9298           Property->getType()->getAs<ObjCObjectPointerType>()) {
9299     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
9300       // If this interface type is not provably derived from a known
9301       // collection, penalize the corresponding completions.
9302       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
9303         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
9304         if (!InheritsFromClassNamed(IFace, "NSArray"))
9305           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
9306       }
9307 
9308       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
9309         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
9310         if (!InheritsFromClassNamed(IFace, "NSSet"))
9311           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
9312       }
9313     }
9314   } else {
9315     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
9316     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
9317     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
9318     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
9319   }
9320 
9321   // Add -(NSUInteger)countOf<key>
9322   if (IsInstanceMethod &&
9323       (ReturnType.isNull() || ReturnType->isIntegerType())) {
9324     std::string SelectorName = (Twine("countOf") + UpperKey).str();
9325     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9326     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
9327             .second) {
9328       if (ReturnType.isNull()) {
9329         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9330         Builder.AddTextChunk("NSUInteger");
9331         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9332       }
9333 
9334       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
9335       Results.AddResult(
9336           Result(Builder.TakeString(),
9337                  std::min(IndexedGetterPriority, UnorderedGetterPriority),
9338                  CXCursor_ObjCInstanceMethodDecl));
9339     }
9340   }
9341 
9342   // Indexed getters
9343   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
9344   if (IsInstanceMethod &&
9345       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
9346     std::string SelectorName = (Twine("objectIn") + UpperKey + "AtIndex").str();
9347     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9348     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9349       if (ReturnType.isNull()) {
9350         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9351         Builder.AddTextChunk("id");
9352         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9353       }
9354 
9355       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9356       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9357       Builder.AddTextChunk("NSUInteger");
9358       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9359       Builder.AddTextChunk("index");
9360       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
9361                                CXCursor_ObjCInstanceMethodDecl));
9362     }
9363   }
9364 
9365   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
9366   if (IsInstanceMethod &&
9367       (ReturnType.isNull() ||
9368        (ReturnType->isObjCObjectPointerType() &&
9369         ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
9370         ReturnType->castAs<ObjCObjectPointerType>()
9371                 ->getInterfaceDecl()
9372                 ->getName() == "NSArray"))) {
9373     std::string SelectorName = (Twine(Property->getName()) + "AtIndexes").str();
9374     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9375     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9376       if (ReturnType.isNull()) {
9377         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9378         Builder.AddTextChunk("NSArray *");
9379         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9380       }
9381 
9382       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9383       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9384       Builder.AddTextChunk("NSIndexSet *");
9385       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9386       Builder.AddTextChunk("indexes");
9387       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
9388                                CXCursor_ObjCInstanceMethodDecl));
9389     }
9390   }
9391 
9392   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
9393   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9394     std::string SelectorName = (Twine("get") + UpperKey).str();
9395     const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
9396                                             &Context.Idents.get("range")};
9397 
9398     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
9399       if (ReturnType.isNull()) {
9400         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9401         Builder.AddTextChunk("void");
9402         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9403       }
9404 
9405       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9406       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9407       Builder.AddPlaceholderChunk("object-type");
9408       Builder.AddTextChunk(" **");
9409       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9410       Builder.AddTextChunk("buffer");
9411       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9412       Builder.AddTypedTextChunk("range:");
9413       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9414       Builder.AddTextChunk("NSRange");
9415       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9416       Builder.AddTextChunk("inRange");
9417       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
9418                                CXCursor_ObjCInstanceMethodDecl));
9419     }
9420   }
9421 
9422   // Mutable indexed accessors
9423 
9424   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
9425   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9426     std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str();
9427     const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get("insertObject"),
9428                                             &Context.Idents.get(SelectorName)};
9429 
9430     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
9431       if (ReturnType.isNull()) {
9432         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9433         Builder.AddTextChunk("void");
9434         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9435       }
9436 
9437       Builder.AddTypedTextChunk("insertObject:");
9438       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9439       Builder.AddPlaceholderChunk("object-type");
9440       Builder.AddTextChunk(" *");
9441       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9442       Builder.AddTextChunk("object");
9443       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9444       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9445       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9446       Builder.AddPlaceholderChunk("NSUInteger");
9447       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9448       Builder.AddTextChunk("index");
9449       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9450                                CXCursor_ObjCInstanceMethodDecl));
9451     }
9452   }
9453 
9454   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
9455   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9456     std::string SelectorName = (Twine("insert") + UpperKey).str();
9457     const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
9458                                             &Context.Idents.get("atIndexes")};
9459 
9460     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
9461       if (ReturnType.isNull()) {
9462         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9463         Builder.AddTextChunk("void");
9464         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9465       }
9466 
9467       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9468       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9469       Builder.AddTextChunk("NSArray *");
9470       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9471       Builder.AddTextChunk("array");
9472       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9473       Builder.AddTypedTextChunk("atIndexes:");
9474       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9475       Builder.AddPlaceholderChunk("NSIndexSet *");
9476       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9477       Builder.AddTextChunk("indexes");
9478       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9479                                CXCursor_ObjCInstanceMethodDecl));
9480     }
9481   }
9482 
9483   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
9484   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9485     std::string SelectorName =
9486         (Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
9487     const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9488     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9489       if (ReturnType.isNull()) {
9490         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9491         Builder.AddTextChunk("void");
9492         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9493       }
9494 
9495       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9496       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9497       Builder.AddTextChunk("NSUInteger");
9498       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9499       Builder.AddTextChunk("index");
9500       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9501                                CXCursor_ObjCInstanceMethodDecl));
9502     }
9503   }
9504 
9505   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
9506   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9507     std::string SelectorName = (Twine("remove") + UpperKey + "AtIndexes").str();
9508     const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9509     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9510       if (ReturnType.isNull()) {
9511         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9512         Builder.AddTextChunk("void");
9513         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9514       }
9515 
9516       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9517       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9518       Builder.AddTextChunk("NSIndexSet *");
9519       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9520       Builder.AddTextChunk("indexes");
9521       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9522                                CXCursor_ObjCInstanceMethodDecl));
9523     }
9524   }
9525 
9526   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
9527   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9528     std::string SelectorName =
9529         (Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
9530     const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
9531                                             &Context.Idents.get("withObject")};
9532 
9533     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
9534       if (ReturnType.isNull()) {
9535         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9536         Builder.AddTextChunk("void");
9537         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9538       }
9539 
9540       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9541       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9542       Builder.AddPlaceholderChunk("NSUInteger");
9543       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9544       Builder.AddTextChunk("index");
9545       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9546       Builder.AddTypedTextChunk("withObject:");
9547       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9548       Builder.AddTextChunk("id");
9549       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9550       Builder.AddTextChunk("object");
9551       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9552                                CXCursor_ObjCInstanceMethodDecl));
9553     }
9554   }
9555 
9556   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
9557   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9558     std::string SelectorName1 =
9559         (Twine("replace") + UpperKey + "AtIndexes").str();
9560     std::string SelectorName2 = (Twine("with") + UpperKey).str();
9561     const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1),
9562                                             &Context.Idents.get(SelectorName2)};
9563 
9564     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
9565       if (ReturnType.isNull()) {
9566         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9567         Builder.AddTextChunk("void");
9568         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9569       }
9570 
9571       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
9572       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9573       Builder.AddPlaceholderChunk("NSIndexSet *");
9574       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9575       Builder.AddTextChunk("indexes");
9576       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9577       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
9578       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9579       Builder.AddTextChunk("NSArray *");
9580       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9581       Builder.AddTextChunk("array");
9582       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9583                                CXCursor_ObjCInstanceMethodDecl));
9584     }
9585   }
9586 
9587   // Unordered getters
9588   // - (NSEnumerator *)enumeratorOfKey
9589   if (IsInstanceMethod &&
9590       (ReturnType.isNull() ||
9591        (ReturnType->isObjCObjectPointerType() &&
9592         ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
9593         ReturnType->castAs<ObjCObjectPointerType>()
9594                 ->getInterfaceDecl()
9595                 ->getName() == "NSEnumerator"))) {
9596     std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str();
9597     const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9598     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
9599             .second) {
9600       if (ReturnType.isNull()) {
9601         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9602         Builder.AddTextChunk("NSEnumerator *");
9603         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9604       }
9605 
9606       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
9607       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
9608                                CXCursor_ObjCInstanceMethodDecl));
9609     }
9610   }
9611 
9612   // - (type *)memberOfKey:(type *)object
9613   if (IsInstanceMethod &&
9614       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
9615     std::string SelectorName = (Twine("memberOf") + UpperKey).str();
9616     const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9617     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9618       if (ReturnType.isNull()) {
9619         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9620         Builder.AddPlaceholderChunk("object-type");
9621         Builder.AddTextChunk(" *");
9622         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9623       }
9624 
9625       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9626       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9627       if (ReturnType.isNull()) {
9628         Builder.AddPlaceholderChunk("object-type");
9629         Builder.AddTextChunk(" *");
9630       } else {
9631         Builder.AddTextChunk(GetCompletionTypeString(
9632             ReturnType, Context, Policy, Builder.getAllocator()));
9633       }
9634       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9635       Builder.AddTextChunk("object");
9636       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
9637                                CXCursor_ObjCInstanceMethodDecl));
9638     }
9639   }
9640 
9641   // Mutable unordered accessors
9642   // - (void)addKeyObject:(type *)object
9643   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9644     std::string SelectorName =
9645         (Twine("add") + UpperKey + Twine("Object")).str();
9646     const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9647     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9648       if (ReturnType.isNull()) {
9649         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9650         Builder.AddTextChunk("void");
9651         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9652       }
9653 
9654       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9655       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9656       Builder.AddPlaceholderChunk("object-type");
9657       Builder.AddTextChunk(" *");
9658       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9659       Builder.AddTextChunk("object");
9660       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
9661                                CXCursor_ObjCInstanceMethodDecl));
9662     }
9663   }
9664 
9665   // - (void)addKey:(NSSet *)objects
9666   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9667     std::string SelectorName = (Twine("add") + UpperKey).str();
9668     const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9669     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9670       if (ReturnType.isNull()) {
9671         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9672         Builder.AddTextChunk("void");
9673         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9674       }
9675 
9676       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9677       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9678       Builder.AddTextChunk("NSSet *");
9679       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9680       Builder.AddTextChunk("objects");
9681       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
9682                                CXCursor_ObjCInstanceMethodDecl));
9683     }
9684   }
9685 
9686   // - (void)removeKeyObject:(type *)object
9687   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9688     std::string SelectorName =
9689         (Twine("remove") + UpperKey + Twine("Object")).str();
9690     const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9691     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9692       if (ReturnType.isNull()) {
9693         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9694         Builder.AddTextChunk("void");
9695         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9696       }
9697 
9698       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9699       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9700       Builder.AddPlaceholderChunk("object-type");
9701       Builder.AddTextChunk(" *");
9702       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9703       Builder.AddTextChunk("object");
9704       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
9705                                CXCursor_ObjCInstanceMethodDecl));
9706     }
9707   }
9708 
9709   // - (void)removeKey:(NSSet *)objects
9710   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9711     std::string SelectorName = (Twine("remove") + UpperKey).str();
9712     const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9713     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9714       if (ReturnType.isNull()) {
9715         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9716         Builder.AddTextChunk("void");
9717         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9718       }
9719 
9720       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9721       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9722       Builder.AddTextChunk("NSSet *");
9723       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9724       Builder.AddTextChunk("objects");
9725       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
9726                                CXCursor_ObjCInstanceMethodDecl));
9727     }
9728   }
9729 
9730   // - (void)intersectKey:(NSSet *)objects
9731   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9732     std::string SelectorName = (Twine("intersect") + UpperKey).str();
9733     const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9734     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9735       if (ReturnType.isNull()) {
9736         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9737         Builder.AddTextChunk("void");
9738         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9739       }
9740 
9741       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9742       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9743       Builder.AddTextChunk("NSSet *");
9744       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9745       Builder.AddTextChunk("objects");
9746       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
9747                                CXCursor_ObjCInstanceMethodDecl));
9748     }
9749   }
9750 
9751   // Key-Value Observing
9752   // + (NSSet *)keyPathsForValuesAffectingKey
9753   if (!IsInstanceMethod &&
9754       (ReturnType.isNull() ||
9755        (ReturnType->isObjCObjectPointerType() &&
9756         ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
9757         ReturnType->castAs<ObjCObjectPointerType>()
9758                 ->getInterfaceDecl()
9759                 ->getName() == "NSSet"))) {
9760     std::string SelectorName =
9761         (Twine("keyPathsForValuesAffecting") + UpperKey).str();
9762     const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9763     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
9764             .second) {
9765       if (ReturnType.isNull()) {
9766         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9767         Builder.AddTextChunk("NSSet<NSString *> *");
9768         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9769       }
9770 
9771       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
9772       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
9773                                CXCursor_ObjCClassMethodDecl));
9774     }
9775   }
9776 
9777   // + (BOOL)automaticallyNotifiesObserversForKey
9778   if (!IsInstanceMethod &&
9779       (ReturnType.isNull() || ReturnType->isIntegerType() ||
9780        ReturnType->isBooleanType())) {
9781     std::string SelectorName =
9782         (Twine("automaticallyNotifiesObserversOf") + UpperKey).str();
9783     const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9784     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
9785             .second) {
9786       if (ReturnType.isNull()) {
9787         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9788         Builder.AddTextChunk("BOOL");
9789         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9790       }
9791 
9792       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
9793       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
9794                                CXCursor_ObjCClassMethodDecl));
9795     }
9796   }
9797 }
9798 
9799 void SemaCodeCompletion::CodeCompleteObjCMethodDecl(
9800     Scope *S, std::optional<bool> IsInstanceMethod, ParsedType ReturnTy) {
9801   ASTContext &Context = getASTContext();
9802   // Determine the return type of the method we're declaring, if
9803   // provided.
9804   QualType ReturnType = SemaRef.GetTypeFromParser(ReturnTy);
9805   Decl *IDecl = nullptr;
9806   if (SemaRef.CurContext->isObjCContainer()) {
9807     ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(SemaRef.CurContext);
9808     IDecl = OCD;
9809   }
9810   // Determine where we should start searching for methods.
9811   ObjCContainerDecl *SearchDecl = nullptr;
9812   bool IsInImplementation = false;
9813   if (Decl *D = IDecl) {
9814     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
9815       SearchDecl = Impl->getClassInterface();
9816       IsInImplementation = true;
9817     } else if (ObjCCategoryImplDecl *CatImpl =
9818                    dyn_cast<ObjCCategoryImplDecl>(D)) {
9819       SearchDecl = CatImpl->getCategoryDecl();
9820       IsInImplementation = true;
9821     } else
9822       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
9823   }
9824 
9825   if (!SearchDecl && S) {
9826     if (DeclContext *DC = S->getEntity())
9827       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
9828   }
9829 
9830   if (!SearchDecl) {
9831     HandleCodeCompleteResults(&SemaRef, CodeCompleter,
9832                               CodeCompletionContext::CCC_Other, nullptr, 0);
9833     return;
9834   }
9835 
9836   // Find all of the methods that we could declare/implement here.
9837   KnownMethodsMap KnownMethods;
9838   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, ReturnType,
9839                            KnownMethods);
9840 
9841   // Add declarations or definitions for each of the known methods.
9842   typedef CodeCompletionResult Result;
9843   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9844                         CodeCompleter->getCodeCompletionTUInfo(),
9845                         CodeCompletionContext::CCC_Other);
9846   Results.EnterNewScope();
9847   PrintingPolicy Policy = getCompletionPrintingPolicy(SemaRef);
9848   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
9849                                  MEnd = KnownMethods.end();
9850        M != MEnd; ++M) {
9851     ObjCMethodDecl *Method = M->second.getPointer();
9852     CodeCompletionBuilder Builder(Results.getAllocator(),
9853                                   Results.getCodeCompletionTUInfo());
9854 
9855     // Add the '-'/'+' prefix if it wasn't provided yet.
9856     if (!IsInstanceMethod) {
9857       Builder.AddTextChunk(Method->isInstanceMethod() ? "-" : "+");
9858       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9859     }
9860 
9861     // If the result type was not already provided, add it to the
9862     // pattern as (type).
9863     if (ReturnType.isNull()) {
9864       QualType ResTy = Method->getSendResultType().stripObjCKindOfType(Context);
9865       AttributedType::stripOuterNullability(ResTy);
9866       AddObjCPassingTypeChunk(ResTy, Method->getObjCDeclQualifier(), Context,
9867                               Policy, Builder);
9868     }
9869 
9870     Selector Sel = Method->getSelector();
9871 
9872     if (Sel.isUnarySelector()) {
9873       // Unary selectors have no arguments.
9874       Builder.AddTypedTextChunk(
9875           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
9876     } else {
9877       // Add all parameters to the pattern.
9878       unsigned I = 0;
9879       for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
9880                                           PEnd = Method->param_end();
9881            P != PEnd; (void)++P, ++I) {
9882         // Add the part of the selector name.
9883         if (I == 0)
9884           Builder.AddTypedTextChunk(
9885               Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
9886         else if (I < Sel.getNumArgs()) {
9887           Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9888           Builder.AddTypedTextChunk(
9889               Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
9890         } else
9891           break;
9892 
9893         // Add the parameter type.
9894         QualType ParamType;
9895         if ((*P)->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability)
9896           ParamType = (*P)->getType();
9897         else
9898           ParamType = (*P)->getOriginalType();
9899         ParamType = ParamType.substObjCTypeArgs(
9900             Context, {}, ObjCSubstitutionContext::Parameter);
9901         AttributedType::stripOuterNullability(ParamType);
9902         AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(),
9903                                 Context, Policy, Builder);
9904 
9905         if (IdentifierInfo *Id = (*P)->getIdentifier())
9906           Builder.AddTextChunk(
9907               Builder.getAllocator().CopyString(Id->getName()));
9908       }
9909     }
9910 
9911     if (Method->isVariadic()) {
9912       if (Method->param_size() > 0)
9913         Builder.AddChunk(CodeCompletionString::CK_Comma);
9914       Builder.AddTextChunk("...");
9915     }
9916 
9917     if (IsInImplementation && Results.includeCodePatterns()) {
9918       // We will be defining the method here, so add a compound statement.
9919       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9920       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
9921       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
9922       if (!Method->getReturnType()->isVoidType()) {
9923         // If the result type is not void, add a return clause.
9924         Builder.AddTextChunk("return");
9925         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9926         Builder.AddPlaceholderChunk("expression");
9927         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
9928       } else
9929         Builder.AddPlaceholderChunk("statements");
9930 
9931       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
9932       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
9933     }
9934 
9935     unsigned Priority = CCP_CodePattern;
9936     auto R = Result(Builder.TakeString(), Method, Priority);
9937     if (!M->second.getInt())
9938       setInBaseClass(R);
9939     Results.AddResult(std::move(R));
9940   }
9941 
9942   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
9943   // the properties in this class and its categories.
9944   if (Context.getLangOpts().ObjC) {
9945     SmallVector<ObjCContainerDecl *, 4> Containers;
9946     Containers.push_back(SearchDecl);
9947 
9948     VisitedSelectorSet KnownSelectors;
9949     for (KnownMethodsMap::iterator M = KnownMethods.begin(),
9950                                    MEnd = KnownMethods.end();
9951          M != MEnd; ++M)
9952       KnownSelectors.insert(M->first);
9953 
9954     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
9955     if (!IFace)
9956       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
9957         IFace = Category->getClassInterface();
9958 
9959     if (IFace)
9960       llvm::append_range(Containers, IFace->visible_categories());
9961 
9962     if (IsInstanceMethod) {
9963       for (unsigned I = 0, N = Containers.size(); I != N; ++I)
9964         for (auto *P : Containers[I]->instance_properties())
9965           AddObjCKeyValueCompletions(P, *IsInstanceMethod, ReturnType, Context,
9966                                      KnownSelectors, Results);
9967     }
9968   }
9969 
9970   Results.ExitScope();
9971 
9972   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
9973                             Results.getCompletionContext(), Results.data(),
9974                             Results.size());
9975 }
9976 
9977 void SemaCodeCompletion::CodeCompleteObjCMethodDeclSelector(
9978     Scope *S, bool IsInstanceMethod, bool AtParameterName, ParsedType ReturnTy,
9979     ArrayRef<const IdentifierInfo *> SelIdents) {
9980   // If we have an external source, load the entire class method
9981   // pool from the AST file.
9982   if (SemaRef.ExternalSource) {
9983     for (uint32_t I = 0, N = SemaRef.ExternalSource->GetNumExternalSelectors();
9984          I != N; ++I) {
9985       Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I);
9986       if (Sel.isNull() || SemaRef.ObjC().MethodPool.count(Sel))
9987         continue;
9988 
9989       SemaRef.ObjC().ReadMethodPool(Sel);
9990     }
9991   }
9992 
9993   // Build the set of methods we can see.
9994   typedef CodeCompletionResult Result;
9995   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9996                         CodeCompleter->getCodeCompletionTUInfo(),
9997                         CodeCompletionContext::CCC_Other);
9998 
9999   if (ReturnTy)
10000     Results.setPreferredType(
10001         SemaRef.GetTypeFromParser(ReturnTy).getNonReferenceType());
10002 
10003   Results.EnterNewScope();
10004   for (SemaObjC::GlobalMethodPool::iterator
10005            M = SemaRef.ObjC().MethodPool.begin(),
10006            MEnd = SemaRef.ObjC().MethodPool.end();
10007        M != MEnd; ++M) {
10008     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first
10009                                                      : &M->second.second;
10010          MethList && MethList->getMethod(); MethList = MethList->getNext()) {
10011       if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
10012         continue;
10013 
10014       if (AtParameterName) {
10015         // Suggest parameter names we've seen before.
10016         unsigned NumSelIdents = SelIdents.size();
10017         if (NumSelIdents &&
10018             NumSelIdents <= MethList->getMethod()->param_size()) {
10019           ParmVarDecl *Param =
10020               MethList->getMethod()->parameters()[NumSelIdents - 1];
10021           if (Param->getIdentifier()) {
10022             CodeCompletionBuilder Builder(Results.getAllocator(),
10023                                           Results.getCodeCompletionTUInfo());
10024             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
10025                 Param->getIdentifier()->getName()));
10026             Results.AddResult(Builder.TakeString());
10027           }
10028         }
10029 
10030         continue;
10031       }
10032 
10033       Result R(MethList->getMethod(),
10034                Results.getBasePriority(MethList->getMethod()), nullptr);
10035       R.StartParameter = SelIdents.size();
10036       R.AllParametersAreInformative = false;
10037       R.DeclaringEntity = true;
10038       Results.MaybeAddResult(R, SemaRef.CurContext);
10039     }
10040   }
10041 
10042   Results.ExitScope();
10043 
10044   if (!AtParameterName && !SelIdents.empty() &&
10045       SelIdents.front()->getName().starts_with("init")) {
10046     for (const auto &M : SemaRef.PP.macros()) {
10047       if (M.first->getName() != "NS_DESIGNATED_INITIALIZER")
10048         continue;
10049       Results.EnterNewScope();
10050       CodeCompletionBuilder Builder(Results.getAllocator(),
10051                                     Results.getCodeCompletionTUInfo());
10052       Builder.AddTypedTextChunk(
10053           Builder.getAllocator().CopyString(M.first->getName()));
10054       Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_Macro,
10055                                              CXCursor_MacroDefinition));
10056       Results.ExitScope();
10057     }
10058   }
10059 
10060   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
10061                             Results.getCompletionContext(), Results.data(),
10062                             Results.size());
10063 }
10064 
10065 void SemaCodeCompletion::CodeCompletePreprocessorDirective(bool InConditional) {
10066   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10067                         CodeCompleter->getCodeCompletionTUInfo(),
10068                         CodeCompletionContext::CCC_PreprocessorDirective);
10069   Results.EnterNewScope();
10070 
10071   // #if <condition>
10072   CodeCompletionBuilder Builder(Results.getAllocator(),
10073                                 Results.getCodeCompletionTUInfo());
10074   Builder.AddTypedTextChunk("if");
10075   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10076   Builder.AddPlaceholderChunk("condition");
10077   Results.AddResult(Builder.TakeString());
10078 
10079   // #ifdef <macro>
10080   Builder.AddTypedTextChunk("ifdef");
10081   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10082   Builder.AddPlaceholderChunk("macro");
10083   Results.AddResult(Builder.TakeString());
10084 
10085   // #ifndef <macro>
10086   Builder.AddTypedTextChunk("ifndef");
10087   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10088   Builder.AddPlaceholderChunk("macro");
10089   Results.AddResult(Builder.TakeString());
10090 
10091   if (InConditional) {
10092     // #elif <condition>
10093     Builder.AddTypedTextChunk("elif");
10094     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10095     Builder.AddPlaceholderChunk("condition");
10096     Results.AddResult(Builder.TakeString());
10097 
10098     // #elifdef <macro>
10099     Builder.AddTypedTextChunk("elifdef");
10100     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10101     Builder.AddPlaceholderChunk("macro");
10102     Results.AddResult(Builder.TakeString());
10103 
10104     // #elifndef <macro>
10105     Builder.AddTypedTextChunk("elifndef");
10106     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10107     Builder.AddPlaceholderChunk("macro");
10108     Results.AddResult(Builder.TakeString());
10109 
10110     // #else
10111     Builder.AddTypedTextChunk("else");
10112     Results.AddResult(Builder.TakeString());
10113 
10114     // #endif
10115     Builder.AddTypedTextChunk("endif");
10116     Results.AddResult(Builder.TakeString());
10117   }
10118 
10119   // #include "header"
10120   Builder.AddTypedTextChunk("include");
10121   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10122   Builder.AddTextChunk("\"");
10123   Builder.AddPlaceholderChunk("header");
10124   Builder.AddTextChunk("\"");
10125   Results.AddResult(Builder.TakeString());
10126 
10127   // #include <header>
10128   Builder.AddTypedTextChunk("include");
10129   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10130   Builder.AddTextChunk("<");
10131   Builder.AddPlaceholderChunk("header");
10132   Builder.AddTextChunk(">");
10133   Results.AddResult(Builder.TakeString());
10134 
10135   // #define <macro>
10136   Builder.AddTypedTextChunk("define");
10137   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10138   Builder.AddPlaceholderChunk("macro");
10139   Results.AddResult(Builder.TakeString());
10140 
10141   // #define <macro>(<args>)
10142   Builder.AddTypedTextChunk("define");
10143   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10144   Builder.AddPlaceholderChunk("macro");
10145   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
10146   Builder.AddPlaceholderChunk("args");
10147   Builder.AddChunk(CodeCompletionString::CK_RightParen);
10148   Results.AddResult(Builder.TakeString());
10149 
10150   // #undef <macro>
10151   Builder.AddTypedTextChunk("undef");
10152   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10153   Builder.AddPlaceholderChunk("macro");
10154   Results.AddResult(Builder.TakeString());
10155 
10156   // #line <number>
10157   Builder.AddTypedTextChunk("line");
10158   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10159   Builder.AddPlaceholderChunk("number");
10160   Results.AddResult(Builder.TakeString());
10161 
10162   // #line <number> "filename"
10163   Builder.AddTypedTextChunk("line");
10164   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10165   Builder.AddPlaceholderChunk("number");
10166   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10167   Builder.AddTextChunk("\"");
10168   Builder.AddPlaceholderChunk("filename");
10169   Builder.AddTextChunk("\"");
10170   Results.AddResult(Builder.TakeString());
10171 
10172   // #error <message>
10173   Builder.AddTypedTextChunk("error");
10174   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10175   Builder.AddPlaceholderChunk("message");
10176   Results.AddResult(Builder.TakeString());
10177 
10178   // #pragma <arguments>
10179   Builder.AddTypedTextChunk("pragma");
10180   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10181   Builder.AddPlaceholderChunk("arguments");
10182   Results.AddResult(Builder.TakeString());
10183 
10184   if (getLangOpts().ObjC) {
10185     // #import "header"
10186     Builder.AddTypedTextChunk("import");
10187     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10188     Builder.AddTextChunk("\"");
10189     Builder.AddPlaceholderChunk("header");
10190     Builder.AddTextChunk("\"");
10191     Results.AddResult(Builder.TakeString());
10192 
10193     // #import <header>
10194     Builder.AddTypedTextChunk("import");
10195     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10196     Builder.AddTextChunk("<");
10197     Builder.AddPlaceholderChunk("header");
10198     Builder.AddTextChunk(">");
10199     Results.AddResult(Builder.TakeString());
10200   }
10201 
10202   // #include_next "header"
10203   Builder.AddTypedTextChunk("include_next");
10204   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10205   Builder.AddTextChunk("\"");
10206   Builder.AddPlaceholderChunk("header");
10207   Builder.AddTextChunk("\"");
10208   Results.AddResult(Builder.TakeString());
10209 
10210   // #include_next <header>
10211   Builder.AddTypedTextChunk("include_next");
10212   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10213   Builder.AddTextChunk("<");
10214   Builder.AddPlaceholderChunk("header");
10215   Builder.AddTextChunk(">");
10216   Results.AddResult(Builder.TakeString());
10217 
10218   // #warning <message>
10219   Builder.AddTypedTextChunk("warning");
10220   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10221   Builder.AddPlaceholderChunk("message");
10222   Results.AddResult(Builder.TakeString());
10223 
10224   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
10225   // completions for them. And __include_macros is a Clang-internal extension
10226   // that we don't want to encourage anyone to use.
10227 
10228   // FIXME: we don't support #assert or #unassert, so don't suggest them.
10229   Results.ExitScope();
10230 
10231   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
10232                             Results.getCompletionContext(), Results.data(),
10233                             Results.size());
10234 }
10235 
10236 void SemaCodeCompletion::CodeCompleteInPreprocessorConditionalExclusion(
10237     Scope *S) {
10238   CodeCompleteOrdinaryName(S, S->getFnParent()
10239                                   ? SemaCodeCompletion::PCC_RecoveryInFunction
10240                                   : SemaCodeCompletion::PCC_Namespace);
10241 }
10242 
10243 void SemaCodeCompletion::CodeCompletePreprocessorMacroName(bool IsDefinition) {
10244   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10245                         CodeCompleter->getCodeCompletionTUInfo(),
10246                         IsDefinition ? CodeCompletionContext::CCC_MacroName
10247                                      : CodeCompletionContext::CCC_MacroNameUse);
10248   if (!IsDefinition && CodeCompleter->includeMacros()) {
10249     // Add just the names of macros, not their arguments.
10250     CodeCompletionBuilder Builder(Results.getAllocator(),
10251                                   Results.getCodeCompletionTUInfo());
10252     Results.EnterNewScope();
10253     for (Preprocessor::macro_iterator M = SemaRef.PP.macro_begin(),
10254                                       MEnd = SemaRef.PP.macro_end();
10255          M != MEnd; ++M) {
10256       Builder.AddTypedTextChunk(
10257           Builder.getAllocator().CopyString(M->first->getName()));
10258       Results.AddResult(CodeCompletionResult(
10259           Builder.TakeString(), CCP_CodePattern, CXCursor_MacroDefinition));
10260     }
10261     Results.ExitScope();
10262   } else if (IsDefinition) {
10263     // FIXME: Can we detect when the user just wrote an include guard above?
10264   }
10265 
10266   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
10267                             Results.getCompletionContext(), Results.data(),
10268                             Results.size());
10269 }
10270 
10271 void SemaCodeCompletion::CodeCompletePreprocessorExpression() {
10272   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10273                         CodeCompleter->getCodeCompletionTUInfo(),
10274                         CodeCompletionContext::CCC_PreprocessorExpression);
10275 
10276   if (CodeCompleter->includeMacros())
10277     AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), true);
10278 
10279   // defined (<macro>)
10280   Results.EnterNewScope();
10281   CodeCompletionBuilder Builder(Results.getAllocator(),
10282                                 Results.getCodeCompletionTUInfo());
10283   Builder.AddTypedTextChunk("defined");
10284   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
10285   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
10286   Builder.AddPlaceholderChunk("macro");
10287   Builder.AddChunk(CodeCompletionString::CK_RightParen);
10288   Results.AddResult(Builder.TakeString());
10289   Results.ExitScope();
10290 
10291   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
10292                             Results.getCompletionContext(), Results.data(),
10293                             Results.size());
10294 }
10295 
10296 void SemaCodeCompletion::CodeCompletePreprocessorMacroArgument(
10297     Scope *S, IdentifierInfo *Macro, MacroInfo *MacroInfo, unsigned Argument) {
10298   // FIXME: In the future, we could provide "overload" results, much like we
10299   // do for function calls.
10300 
10301   // Now just ignore this. There will be another code-completion callback
10302   // for the expanded tokens.
10303 }
10304 
10305 // This handles completion inside an #include filename, e.g. #include <foo/ba
10306 // We look for the directory "foo" under each directory on the include path,
10307 // list its files, and reassemble the appropriate #include.
10308 void SemaCodeCompletion::CodeCompleteIncludedFile(llvm::StringRef Dir,
10309                                                   bool Angled) {
10310   // RelDir should use /, but unescaped \ is possible on windows!
10311   // Our completions will normalize to / for simplicity, this case is rare.
10312   std::string RelDir = llvm::sys::path::convert_to_slash(Dir);
10313   // We need the native slashes for the actual file system interactions.
10314   SmallString<128> NativeRelDir = StringRef(RelDir);
10315   llvm::sys::path::native(NativeRelDir);
10316   llvm::vfs::FileSystem &FS =
10317       SemaRef.getSourceManager().getFileManager().getVirtualFileSystem();
10318 
10319   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10320                         CodeCompleter->getCodeCompletionTUInfo(),
10321                         CodeCompletionContext::CCC_IncludedFile);
10322   llvm::DenseSet<StringRef> SeenResults; // To deduplicate results.
10323 
10324   // Helper: adds one file or directory completion result.
10325   auto AddCompletion = [&](StringRef Filename, bool IsDirectory) {
10326     SmallString<64> TypedChunk = Filename;
10327     // Directory completion is up to the slash, e.g. <sys/
10328     TypedChunk.push_back(IsDirectory ? '/' : Angled ? '>' : '"');
10329     auto R = SeenResults.insert(TypedChunk);
10330     if (R.second) { // New completion
10331       const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk);
10332       *R.first = InternedTyped; // Avoid dangling StringRef.
10333       CodeCompletionBuilder Builder(CodeCompleter->getAllocator(),
10334                                     CodeCompleter->getCodeCompletionTUInfo());
10335       Builder.AddTypedTextChunk(InternedTyped);
10336       // The result is a "Pattern", which is pretty opaque.
10337       // We may want to include the real filename to allow smart ranking.
10338       Results.AddResult(CodeCompletionResult(Builder.TakeString()));
10339     }
10340   };
10341 
10342   // Helper: scans IncludeDir for nice files, and adds results for each.
10343   auto AddFilesFromIncludeDir = [&](StringRef IncludeDir,
10344                                     bool IsSystem,
10345                                     DirectoryLookup::LookupType_t LookupType) {
10346     llvm::SmallString<128> Dir = IncludeDir;
10347     if (!NativeRelDir.empty()) {
10348       if (LookupType == DirectoryLookup::LT_Framework) {
10349         // For a framework dir, #include <Foo/Bar/> actually maps to
10350         // a path of Foo.framework/Headers/Bar/.
10351         auto Begin = llvm::sys::path::begin(NativeRelDir);
10352         auto End = llvm::sys::path::end(NativeRelDir);
10353 
10354         llvm::sys::path::append(Dir, *Begin + ".framework", "Headers");
10355         llvm::sys::path::append(Dir, ++Begin, End);
10356       } else {
10357         llvm::sys::path::append(Dir, NativeRelDir);
10358       }
10359     }
10360 
10361     const StringRef &Dirname = llvm::sys::path::filename(Dir);
10362     const bool isQt = Dirname.starts_with("Qt") || Dirname == "ActiveQt";
10363     const bool ExtensionlessHeaders =
10364         IsSystem || isQt || Dir.ends_with(".framework/Headers");
10365     std::error_code EC;
10366     unsigned Count = 0;
10367     for (auto It = FS.dir_begin(Dir, EC);
10368          !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) {
10369       if (++Count == 2500) // If we happen to hit a huge directory,
10370         break;             // bail out early so we're not too slow.
10371       StringRef Filename = llvm::sys::path::filename(It->path());
10372 
10373       // To know whether a symlink should be treated as file or a directory, we
10374       // have to stat it. This should be cheap enough as there shouldn't be many
10375       // symlinks.
10376       llvm::sys::fs::file_type Type = It->type();
10377       if (Type == llvm::sys::fs::file_type::symlink_file) {
10378         if (auto FileStatus = FS.status(It->path()))
10379           Type = FileStatus->getType();
10380       }
10381       switch (Type) {
10382       case llvm::sys::fs::file_type::directory_file:
10383         // All entries in a framework directory must have a ".framework" suffix,
10384         // but the suffix does not appear in the source code's include/import.
10385         if (LookupType == DirectoryLookup::LT_Framework &&
10386             NativeRelDir.empty() && !Filename.consume_back(".framework"))
10387           break;
10388 
10389         AddCompletion(Filename, /*IsDirectory=*/true);
10390         break;
10391       case llvm::sys::fs::file_type::regular_file: {
10392         // Only files that really look like headers. (Except in special dirs).
10393         const bool IsHeader = Filename.ends_with_insensitive(".h") ||
10394                               Filename.ends_with_insensitive(".hh") ||
10395                               Filename.ends_with_insensitive(".hpp") ||
10396                               Filename.ends_with_insensitive(".hxx") ||
10397                               Filename.ends_with_insensitive(".inc") ||
10398                               (ExtensionlessHeaders && !Filename.contains('.'));
10399         if (!IsHeader)
10400           break;
10401         AddCompletion(Filename, /*IsDirectory=*/false);
10402         break;
10403       }
10404       default:
10405         break;
10406       }
10407     }
10408   };
10409 
10410   // Helper: adds results relative to IncludeDir, if possible.
10411   auto AddFilesFromDirLookup = [&](const DirectoryLookup &IncludeDir,
10412                                    bool IsSystem) {
10413     switch (IncludeDir.getLookupType()) {
10414     case DirectoryLookup::LT_HeaderMap:
10415       // header maps are not (currently) enumerable.
10416       break;
10417     case DirectoryLookup::LT_NormalDir:
10418       AddFilesFromIncludeDir(IncludeDir.getDirRef()->getName(), IsSystem,
10419                              DirectoryLookup::LT_NormalDir);
10420       break;
10421     case DirectoryLookup::LT_Framework:
10422       AddFilesFromIncludeDir(IncludeDir.getFrameworkDirRef()->getName(),
10423                              IsSystem, DirectoryLookup::LT_Framework);
10424       break;
10425     }
10426   };
10427 
10428   // Finally with all our helpers, we can scan the include path.
10429   // Do this in standard order so deduplication keeps the right file.
10430   // (In case we decide to add more details to the results later).
10431   const auto &S = SemaRef.PP.getHeaderSearchInfo();
10432   using llvm::make_range;
10433   if (!Angled) {
10434     // The current directory is on the include path for "quoted" includes.
10435     if (auto CurFile = SemaRef.PP.getCurrentFileLexer()->getFileEntry())
10436       AddFilesFromIncludeDir(CurFile->getDir().getName(), false,
10437                              DirectoryLookup::LT_NormalDir);
10438     for (const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end()))
10439       AddFilesFromDirLookup(D, false);
10440   }
10441   for (const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end()))
10442     AddFilesFromDirLookup(D, false);
10443   for (const auto &D : make_range(S.system_dir_begin(), S.system_dir_end()))
10444     AddFilesFromDirLookup(D, true);
10445 
10446   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
10447                             Results.getCompletionContext(), Results.data(),
10448                             Results.size());
10449 }
10450 
10451 void SemaCodeCompletion::CodeCompleteNaturalLanguage() {
10452   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
10453                             CodeCompletionContext::CCC_NaturalLanguage, nullptr,
10454                             0);
10455 }
10456 
10457 void SemaCodeCompletion::CodeCompleteAvailabilityPlatformName() {
10458   ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10459                         CodeCompleter->getCodeCompletionTUInfo(),
10460                         CodeCompletionContext::CCC_Other);
10461   Results.EnterNewScope();
10462   static const char *Platforms[] = {"macOS", "iOS", "watchOS", "tvOS"};
10463   for (const char *Platform : llvm::ArrayRef(Platforms)) {
10464     Results.AddResult(CodeCompletionResult(Platform));
10465     Results.AddResult(CodeCompletionResult(Results.getAllocator().CopyString(
10466         Twine(Platform) + "ApplicationExtension")));
10467   }
10468   Results.ExitScope();
10469   HandleCodeCompleteResults(&SemaRef, CodeCompleter,
10470                             Results.getCompletionContext(), Results.data(),
10471                             Results.size());
10472 }
10473 
10474 void SemaCodeCompletion::GatherGlobalCodeCompletions(
10475     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
10476     SmallVectorImpl<CodeCompletionResult> &Results) {
10477   ResultBuilder Builder(SemaRef, Allocator, CCTUInfo,
10478                         CodeCompletionContext::CCC_Recovery);
10479   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
10480     CodeCompletionDeclConsumer Consumer(
10481         Builder, getASTContext().getTranslationUnitDecl());
10482     SemaRef.LookupVisibleDecls(getASTContext().getTranslationUnitDecl(),
10483                                Sema::LookupAnyName, Consumer,
10484                                !CodeCompleter || CodeCompleter->loadExternal());
10485   }
10486 
10487   if (!CodeCompleter || CodeCompleter->includeMacros())
10488     AddMacroResults(SemaRef.PP, Builder,
10489                     !CodeCompleter || CodeCompleter->loadExternal(), true);
10490 
10491   Results.clear();
10492   Results.insert(Results.end(), Builder.data(),
10493                  Builder.data() + Builder.size());
10494 }
10495 
10496 SemaCodeCompletion::SemaCodeCompletion(Sema &S,
10497                                        CodeCompleteConsumer *CompletionConsumer)
10498     : SemaBase(S), CodeCompleter(CompletionConsumer),
10499       Resolver(S.getASTContext()) {}
10500