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