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