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