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