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