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 if (auto DC = NakedFn->getType()->getCanonicalTypeInternal()
3931                        ->getAsCXXRecordDecl()) {
3932     // If it's a CXXRecordDecl, it may overload the function call operator,
3933     // so we check if it does and add them as candidates.
3934     DeclarationName OpName = Context.DeclarationNames
3935                              .getCXXOperatorName(OO_Call);
3936     LookupResult R(*this, OpName, Loc, LookupOrdinaryName);
3937     LookupQualifiedName(R, DC);
3938     R.suppressDiagnostics();
3939     SmallVector<Expr *, 12> ArgExprs(1, NakedFn);
3940     ArgExprs.append(Args.begin(), Args.end());
3941     AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs, CandidateSet,
3942                           /*ExplicitArgs=*/nullptr,
3943                           /*SuppressUsedConversions=*/false,
3944                           /*PartialOverloading=*/true);
3945   } else {
3946     // Lastly we check, as a possibly resolved expression, whether it can be
3947     // converted to a function.
3948     FunctionDecl *FD = nullptr;
3949     if (auto MCE = dyn_cast<MemberExpr>(NakedFn))
3950       FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl());
3951     else if (auto DRE = dyn_cast<DeclRefExpr>(NakedFn))
3952       FD = dyn_cast<FunctionDecl>(DRE->getDecl());
3953     if (FD) {
3954       if (!getLangOpts().CPlusPlus ||
3955           !FD->getType()->getAs<FunctionProtoType>())
3956         Results.push_back(ResultCandidate(FD));
3957       else
3958         AddOverloadCandidate(FD, DeclAccessPair::make(FD, FD->getAccess()),
3959                              Args, CandidateSet,
3960                              /*SuppressUsedConversions=*/false,
3961                              /*PartialOverloading=*/true);
3962     }
3963   }
3964 
3965   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc);
3966   CodeCompleteOverloadResults(*this, S, Results, Args.size(),
3967                               !CandidateSet.empty());
3968 }
3969 
3970 void Sema::CodeCompleteConstructor(Scope *S, QualType Type, SourceLocation Loc,
3971                                    ArrayRef<Expr *> Args) {
3972   if (!CodeCompleter)
3973     return;
3974 
3975   // A complete type is needed to lookup for constructors.
3976   if (RequireCompleteType(Loc, Type, 0))
3977     return;
3978 
3979   // FIXME: Provide support for member initializers.
3980   // FIXME: Provide support for variadic template constructors.
3981   // FIXME: Provide support for highlighting optional parameters.
3982 
3983   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
3984 
3985   for (auto C : LookupConstructors(Type->getAsCXXRecordDecl())) {
3986     if (auto FD = dyn_cast<FunctionDecl>(C)) {
3987       AddOverloadCandidate(FD, DeclAccessPair::make(FD, C->getAccess()),
3988                            Args, CandidateSet,
3989                            /*SuppressUsedConversions=*/false,
3990                            /*PartialOverloading=*/true);
3991     } else if (auto FTD = dyn_cast<FunctionTemplateDecl>(C)) {
3992       AddTemplateOverloadCandidate(FTD,
3993                                    DeclAccessPair::make(FTD, C->getAccess()),
3994                                    /*ExplicitTemplateArgs=*/nullptr,
3995                                    Args, CandidateSet,
3996                                    /*SuppressUsedConversions=*/false,
3997                                    /*PartialOverloading=*/true);
3998     }
3999   }
4000 
4001   SmallVector<ResultCandidate, 8> Results;
4002   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc);
4003   CodeCompleteOverloadResults(*this, S, Results, Args.size());
4004 }
4005 
4006 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) {
4007   ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
4008   if (!VD) {
4009     CodeCompleteOrdinaryName(S, PCC_Expression);
4010     return;
4011   }
4012 
4013   CodeCompleteExpression(S, VD->getType());
4014 }
4015 
4016 void Sema::CodeCompleteReturn(Scope *S) {
4017   QualType ResultType;
4018   if (isa<BlockDecl>(CurContext)) {
4019     if (BlockScopeInfo *BSI = getCurBlock())
4020       ResultType = BSI->ReturnType;
4021   } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext))
4022     ResultType = Function->getReturnType();
4023   else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext))
4024     ResultType = Method->getReturnType();
4025 
4026   if (ResultType.isNull())
4027     CodeCompleteOrdinaryName(S, PCC_Expression);
4028   else
4029     CodeCompleteExpression(S, ResultType);
4030 }
4031 
4032 void Sema::CodeCompleteAfterIf(Scope *S) {
4033   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4034                         CodeCompleter->getCodeCompletionTUInfo(),
4035                         mapCodeCompletionContext(*this, PCC_Statement));
4036   Results.setFilter(&ResultBuilder::IsOrdinaryName);
4037   Results.EnterNewScope();
4038 
4039   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4040   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4041                      CodeCompleter->includeGlobals());
4042 
4043   AddOrdinaryNameResults(PCC_Statement, S, *this, Results);
4044 
4045   // "else" block
4046   CodeCompletionBuilder Builder(Results.getAllocator(),
4047                                 Results.getCodeCompletionTUInfo());
4048   Builder.AddTypedTextChunk("else");
4049   if (Results.includeCodePatterns()) {
4050     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4051     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4052     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
4053     Builder.AddPlaceholderChunk("statements");
4054     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
4055     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4056   }
4057   Results.AddResult(Builder.TakeString());
4058 
4059   // "else if" block
4060   Builder.AddTypedTextChunk("else");
4061   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4062   Builder.AddTextChunk("if");
4063   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4064   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4065   if (getLangOpts().CPlusPlus)
4066     Builder.AddPlaceholderChunk("condition");
4067   else
4068     Builder.AddPlaceholderChunk("expression");
4069   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4070   if (Results.includeCodePatterns()) {
4071     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4072     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4073     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
4074     Builder.AddPlaceholderChunk("statements");
4075     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
4076     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4077   }
4078   Results.AddResult(Builder.TakeString());
4079 
4080   Results.ExitScope();
4081 
4082   if (S->getFnParent())
4083     AddPrettyFunctionResults(PP.getLangOpts(), Results);
4084 
4085   if (CodeCompleter->includeMacros())
4086     AddMacroResults(PP, Results, false);
4087 
4088   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4089                             Results.data(),Results.size());
4090 }
4091 
4092 void Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) {
4093   if (LHS)
4094     CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType());
4095   else
4096     CodeCompleteOrdinaryName(S, PCC_Expression);
4097 }
4098 
4099 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
4100                                    bool EnteringContext) {
4101   if (!SS.getScopeRep() || !CodeCompleter)
4102     return;
4103 
4104   DeclContext *Ctx = computeDeclContext(SS, EnteringContext);
4105   if (!Ctx)
4106     return;
4107 
4108   // Try to instantiate any non-dependent declaration contexts before
4109   // we look in them.
4110   if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx))
4111     return;
4112 
4113   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4114                         CodeCompleter->getCodeCompletionTUInfo(),
4115                         CodeCompletionContext::CCC_Name);
4116   Results.EnterNewScope();
4117 
4118   // The "template" keyword can follow "::" in the grammar, but only
4119   // put it into the grammar if the nested-name-specifier is dependent.
4120   NestedNameSpecifier *NNS = SS.getScopeRep();
4121   if (!Results.empty() && NNS->isDependent())
4122     Results.AddResult("template");
4123 
4124   // Add calls to overridden virtual functions, if there are any.
4125   //
4126   // FIXME: This isn't wonderful, because we don't know whether we're actually
4127   // in a context that permits expressions. This is a general issue with
4128   // qualified-id completions.
4129   if (!EnteringContext)
4130     MaybeAddOverrideCalls(*this, Ctx, Results);
4131   Results.ExitScope();
4132 
4133   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4134   LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer);
4135 
4136   HandleCodeCompleteResults(this, CodeCompleter,
4137                             Results.getCompletionContext(),
4138                             Results.data(),Results.size());
4139 }
4140 
4141 void Sema::CodeCompleteUsing(Scope *S) {
4142   if (!CodeCompleter)
4143     return;
4144 
4145   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4146                         CodeCompleter->getCodeCompletionTUInfo(),
4147                         CodeCompletionContext::CCC_PotentiallyQualifiedName,
4148                         &ResultBuilder::IsNestedNameSpecifier);
4149   Results.EnterNewScope();
4150 
4151   // If we aren't in class scope, we could see the "namespace" keyword.
4152   if (!S->isClassScope())
4153     Results.AddResult(CodeCompletionResult("namespace"));
4154 
4155   // After "using", we can see anything that would start a
4156   // nested-name-specifier.
4157   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4158   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4159                      CodeCompleter->includeGlobals());
4160   Results.ExitScope();
4161 
4162   HandleCodeCompleteResults(this, CodeCompleter,
4163                             CodeCompletionContext::CCC_PotentiallyQualifiedName,
4164                             Results.data(),Results.size());
4165 }
4166 
4167 void Sema::CodeCompleteUsingDirective(Scope *S) {
4168   if (!CodeCompleter)
4169     return;
4170 
4171   // After "using namespace", we expect to see a namespace name or namespace
4172   // alias.
4173   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4174                         CodeCompleter->getCodeCompletionTUInfo(),
4175                         CodeCompletionContext::CCC_Namespace,
4176                         &ResultBuilder::IsNamespaceOrAlias);
4177   Results.EnterNewScope();
4178   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4179   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4180                      CodeCompleter->includeGlobals());
4181   Results.ExitScope();
4182   HandleCodeCompleteResults(this, CodeCompleter,
4183                             CodeCompletionContext::CCC_Namespace,
4184                             Results.data(),Results.size());
4185 }
4186 
4187 void Sema::CodeCompleteNamespaceDecl(Scope *S)  {
4188   if (!CodeCompleter)
4189     return;
4190 
4191   DeclContext *Ctx = S->getEntity();
4192   if (!S->getParent())
4193     Ctx = Context.getTranslationUnitDecl();
4194 
4195   bool SuppressedGlobalResults
4196     = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
4197 
4198   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4199                         CodeCompleter->getCodeCompletionTUInfo(),
4200                         SuppressedGlobalResults
4201                           ? CodeCompletionContext::CCC_Namespace
4202                           : CodeCompletionContext::CCC_Other,
4203                         &ResultBuilder::IsNamespace);
4204 
4205   if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
4206     // We only want to see those namespaces that have already been defined
4207     // within this scope, because its likely that the user is creating an
4208     // extended namespace declaration. Keep track of the most recent
4209     // definition of each namespace.
4210     std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
4211     for (DeclContext::specific_decl_iterator<NamespaceDecl>
4212          NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end());
4213          NS != NSEnd; ++NS)
4214       OrigToLatest[NS->getOriginalNamespace()] = *NS;
4215 
4216     // Add the most recent definition (or extended definition) of each
4217     // namespace to the list of results.
4218     Results.EnterNewScope();
4219     for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
4220               NS = OrigToLatest.begin(),
4221            NSEnd = OrigToLatest.end();
4222          NS != NSEnd; ++NS)
4223       Results.AddResult(CodeCompletionResult(
4224                           NS->second, Results.getBasePriority(NS->second),
4225                           nullptr),
4226                         CurContext, nullptr, false);
4227     Results.ExitScope();
4228   }
4229 
4230   HandleCodeCompleteResults(this, CodeCompleter,
4231                             Results.getCompletionContext(),
4232                             Results.data(),Results.size());
4233 }
4234 
4235 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S)  {
4236   if (!CodeCompleter)
4237     return;
4238 
4239   // After "namespace", we expect to see a namespace or alias.
4240   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4241                         CodeCompleter->getCodeCompletionTUInfo(),
4242                         CodeCompletionContext::CCC_Namespace,
4243                         &ResultBuilder::IsNamespaceOrAlias);
4244   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4245   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4246                      CodeCompleter->includeGlobals());
4247   HandleCodeCompleteResults(this, CodeCompleter,
4248                             Results.getCompletionContext(),
4249                             Results.data(),Results.size());
4250 }
4251 
4252 void Sema::CodeCompleteOperatorName(Scope *S) {
4253   if (!CodeCompleter)
4254     return;
4255 
4256   typedef CodeCompletionResult Result;
4257   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4258                         CodeCompleter->getCodeCompletionTUInfo(),
4259                         CodeCompletionContext::CCC_Type,
4260                         &ResultBuilder::IsType);
4261   Results.EnterNewScope();
4262 
4263   // Add the names of overloadable operators.
4264 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly)      \
4265   if (std::strcmp(Spelling, "?"))                                                  \
4266     Results.AddResult(Result(Spelling));
4267 #include "clang/Basic/OperatorKinds.def"
4268 
4269   // Add any type names visible from the current scope
4270   Results.allowNestedNameSpecifiers();
4271   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4272   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4273                      CodeCompleter->includeGlobals());
4274 
4275   // Add any type specifiers
4276   AddTypeSpecifierResults(getLangOpts(), Results);
4277   Results.ExitScope();
4278 
4279   HandleCodeCompleteResults(this, CodeCompleter,
4280                             CodeCompletionContext::CCC_Type,
4281                             Results.data(),Results.size());
4282 }
4283 
4284 void Sema::CodeCompleteConstructorInitializer(
4285                               Decl *ConstructorD,
4286                               ArrayRef <CXXCtorInitializer *> Initializers) {
4287   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
4288   CXXConstructorDecl *Constructor
4289     = static_cast<CXXConstructorDecl *>(ConstructorD);
4290   if (!Constructor)
4291     return;
4292 
4293   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4294                         CodeCompleter->getCodeCompletionTUInfo(),
4295                         CodeCompletionContext::CCC_PotentiallyQualifiedName);
4296   Results.EnterNewScope();
4297 
4298   // Fill in any already-initialized fields or base classes.
4299   llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
4300   llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
4301   for (unsigned I = 0, E = Initializers.size(); I != E; ++I) {
4302     if (Initializers[I]->isBaseInitializer())
4303       InitializedBases.insert(
4304         Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0)));
4305     else
4306       InitializedFields.insert(cast<FieldDecl>(
4307                                Initializers[I]->getAnyMember()));
4308   }
4309 
4310   // Add completions for base classes.
4311   CodeCompletionBuilder Builder(Results.getAllocator(),
4312                                 Results.getCodeCompletionTUInfo());
4313   bool SawLastInitializer = Initializers.empty();
4314   CXXRecordDecl *ClassDecl = Constructor->getParent();
4315   for (const auto &Base : ClassDecl->bases()) {
4316     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
4317              .second) {
4318       SawLastInitializer
4319         = !Initializers.empty() &&
4320           Initializers.back()->isBaseInitializer() &&
4321           Context.hasSameUnqualifiedType(Base.getType(),
4322                QualType(Initializers.back()->getBaseClass(), 0));
4323       continue;
4324     }
4325 
4326     Builder.AddTypedTextChunk(
4327                Results.getAllocator().CopyString(
4328                           Base.getType().getAsString(Policy)));
4329     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4330     Builder.AddPlaceholderChunk("args");
4331     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4332     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4333                                    SawLastInitializer? CCP_NextInitializer
4334                                                      : CCP_MemberDeclaration));
4335     SawLastInitializer = false;
4336   }
4337 
4338   // Add completions for virtual base classes.
4339   for (const auto &Base : ClassDecl->vbases()) {
4340     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
4341              .second) {
4342       SawLastInitializer
4343         = !Initializers.empty() &&
4344           Initializers.back()->isBaseInitializer() &&
4345           Context.hasSameUnqualifiedType(Base.getType(),
4346                QualType(Initializers.back()->getBaseClass(), 0));
4347       continue;
4348     }
4349 
4350     Builder.AddTypedTextChunk(
4351                Builder.getAllocator().CopyString(
4352                           Base.getType().getAsString(Policy)));
4353     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4354     Builder.AddPlaceholderChunk("args");
4355     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4356     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4357                                    SawLastInitializer? CCP_NextInitializer
4358                                                      : CCP_MemberDeclaration));
4359     SawLastInitializer = false;
4360   }
4361 
4362   // Add completions for members.
4363   for (auto *Field : ClassDecl->fields()) {
4364     if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))
4365              .second) {
4366       SawLastInitializer
4367         = !Initializers.empty() &&
4368           Initializers.back()->isAnyMemberInitializer() &&
4369           Initializers.back()->getAnyMember() == Field;
4370       continue;
4371     }
4372 
4373     if (!Field->getDeclName())
4374       continue;
4375 
4376     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
4377                                          Field->getIdentifier()->getName()));
4378     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4379     Builder.AddPlaceholderChunk("args");
4380     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4381     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4382                                    SawLastInitializer? CCP_NextInitializer
4383                                                      : CCP_MemberDeclaration,
4384                                            CXCursor_MemberRef,
4385                                            CXAvailability_Available,
4386                                            Field));
4387     SawLastInitializer = false;
4388   }
4389   Results.ExitScope();
4390 
4391   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4392                             Results.data(), Results.size());
4393 }
4394 
4395 /// \brief Determine whether this scope denotes a namespace.
4396 static bool isNamespaceScope(Scope *S) {
4397   DeclContext *DC = S->getEntity();
4398   if (!DC)
4399     return false;
4400 
4401   return DC->isFileContext();
4402 }
4403 
4404 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro,
4405                                         bool AfterAmpersand) {
4406   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4407                         CodeCompleter->getCodeCompletionTUInfo(),
4408                         CodeCompletionContext::CCC_Other);
4409   Results.EnterNewScope();
4410 
4411   // Note what has already been captured.
4412   llvm::SmallPtrSet<IdentifierInfo *, 4> Known;
4413   bool IncludedThis = false;
4414   for (const auto &C : Intro.Captures) {
4415     if (C.Kind == LCK_This) {
4416       IncludedThis = true;
4417       continue;
4418     }
4419 
4420     Known.insert(C.Id);
4421   }
4422 
4423   // Look for other capturable variables.
4424   for (; S && !isNamespaceScope(S); S = S->getParent()) {
4425     for (const auto *D : S->decls()) {
4426       const auto *Var = dyn_cast<VarDecl>(D);
4427       if (!Var ||
4428           !Var->hasLocalStorage() ||
4429           Var->hasAttr<BlocksAttr>())
4430         continue;
4431 
4432       if (Known.insert(Var->getIdentifier()).second)
4433         Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration),
4434                           CurContext, nullptr, false);
4435     }
4436   }
4437 
4438   // Add 'this', if it would be valid.
4439   if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy)
4440     addThisCompletion(*this, Results);
4441 
4442   Results.ExitScope();
4443 
4444   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4445                             Results.data(), Results.size());
4446 }
4447 
4448 /// Macro that optionally prepends an "@" to the string literal passed in via
4449 /// Keyword, depending on whether NeedAt is true or false.
4450 #define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) ((NeedAt)? "@" Keyword : Keyword)
4451 
4452 static void AddObjCImplementationResults(const LangOptions &LangOpts,
4453                                          ResultBuilder &Results,
4454                                          bool NeedAt) {
4455   typedef CodeCompletionResult Result;
4456   // Since we have an implementation, we can end it.
4457   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end")));
4458 
4459   CodeCompletionBuilder Builder(Results.getAllocator(),
4460                                 Results.getCodeCompletionTUInfo());
4461   if (LangOpts.ObjC2) {
4462     // @dynamic
4463     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"dynamic"));
4464     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4465     Builder.AddPlaceholderChunk("property");
4466     Results.AddResult(Result(Builder.TakeString()));
4467 
4468     // @synthesize
4469     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synthesize"));
4470     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4471     Builder.AddPlaceholderChunk("property");
4472     Results.AddResult(Result(Builder.TakeString()));
4473   }
4474 }
4475 
4476 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
4477                                     ResultBuilder &Results,
4478                                     bool NeedAt) {
4479   typedef CodeCompletionResult Result;
4480 
4481   // Since we have an interface or protocol, we can end it.
4482   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end")));
4483 
4484   if (LangOpts.ObjC2) {
4485     // @property
4486     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"property")));
4487 
4488     // @required
4489     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"required")));
4490 
4491     // @optional
4492     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"optional")));
4493   }
4494 }
4495 
4496 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
4497   typedef CodeCompletionResult Result;
4498   CodeCompletionBuilder Builder(Results.getAllocator(),
4499                                 Results.getCodeCompletionTUInfo());
4500 
4501   // @class name ;
4502   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"class"));
4503   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4504   Builder.AddPlaceholderChunk("name");
4505   Results.AddResult(Result(Builder.TakeString()));
4506 
4507   if (Results.includeCodePatterns()) {
4508     // @interface name
4509     // FIXME: Could introduce the whole pattern, including superclasses and
4510     // such.
4511     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"interface"));
4512     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4513     Builder.AddPlaceholderChunk("class");
4514     Results.AddResult(Result(Builder.TakeString()));
4515 
4516     // @protocol name
4517     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol"));
4518     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4519     Builder.AddPlaceholderChunk("protocol");
4520     Results.AddResult(Result(Builder.TakeString()));
4521 
4522     // @implementation name
4523     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"implementation"));
4524     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4525     Builder.AddPlaceholderChunk("class");
4526     Results.AddResult(Result(Builder.TakeString()));
4527   }
4528 
4529   // @compatibility_alias name
4530   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"compatibility_alias"));
4531   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4532   Builder.AddPlaceholderChunk("alias");
4533   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4534   Builder.AddPlaceholderChunk("class");
4535   Results.AddResult(Result(Builder.TakeString()));
4536 
4537   if (Results.getSema().getLangOpts().Modules) {
4538     // @import name
4539     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import"));
4540     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4541     Builder.AddPlaceholderChunk("module");
4542     Results.AddResult(Result(Builder.TakeString()));
4543   }
4544 }
4545 
4546 void Sema::CodeCompleteObjCAtDirective(Scope *S) {
4547   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4548                         CodeCompleter->getCodeCompletionTUInfo(),
4549                         CodeCompletionContext::CCC_Other);
4550   Results.EnterNewScope();
4551   if (isa<ObjCImplDecl>(CurContext))
4552     AddObjCImplementationResults(getLangOpts(), Results, false);
4553   else if (CurContext->isObjCContainer())
4554     AddObjCInterfaceResults(getLangOpts(), Results, false);
4555   else
4556     AddObjCTopLevelResults(Results, false);
4557   Results.ExitScope();
4558   HandleCodeCompleteResults(this, CodeCompleter,
4559                             CodeCompletionContext::CCC_Other,
4560                             Results.data(),Results.size());
4561 }
4562 
4563 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
4564   typedef CodeCompletionResult Result;
4565   CodeCompletionBuilder Builder(Results.getAllocator(),
4566                                 Results.getCodeCompletionTUInfo());
4567 
4568   // @encode ( type-name )
4569   const char *EncodeType = "char[]";
4570   if (Results.getSema().getLangOpts().CPlusPlus ||
4571       Results.getSema().getLangOpts().ConstStrings)
4572     EncodeType = "const char[]";
4573   Builder.AddResultTypeChunk(EncodeType);
4574   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"encode"));
4575   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4576   Builder.AddPlaceholderChunk("type-name");
4577   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4578   Results.AddResult(Result(Builder.TakeString()));
4579 
4580   // @protocol ( protocol-name )
4581   Builder.AddResultTypeChunk("Protocol *");
4582   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol"));
4583   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4584   Builder.AddPlaceholderChunk("protocol-name");
4585   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4586   Results.AddResult(Result(Builder.TakeString()));
4587 
4588   // @selector ( selector )
4589   Builder.AddResultTypeChunk("SEL");
4590   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"selector"));
4591   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4592   Builder.AddPlaceholderChunk("selector");
4593   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4594   Results.AddResult(Result(Builder.TakeString()));
4595 
4596   // @"string"
4597   Builder.AddResultTypeChunk("NSString *");
4598   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"\""));
4599   Builder.AddPlaceholderChunk("string");
4600   Builder.AddTextChunk("\"");
4601   Results.AddResult(Result(Builder.TakeString()));
4602 
4603   // @[objects, ...]
4604   Builder.AddResultTypeChunk("NSArray *");
4605   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"["));
4606   Builder.AddPlaceholderChunk("objects, ...");
4607   Builder.AddChunk(CodeCompletionString::CK_RightBracket);
4608   Results.AddResult(Result(Builder.TakeString()));
4609 
4610   // @{key : object, ...}
4611   Builder.AddResultTypeChunk("NSDictionary *");
4612   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"{"));
4613   Builder.AddPlaceholderChunk("key");
4614   Builder.AddChunk(CodeCompletionString::CK_Colon);
4615   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4616   Builder.AddPlaceholderChunk("object, ...");
4617   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4618   Results.AddResult(Result(Builder.TakeString()));
4619 
4620   // @(expression)
4621   Builder.AddResultTypeChunk("id");
4622   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "("));
4623   Builder.AddPlaceholderChunk("expression");
4624   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4625   Results.AddResult(Result(Builder.TakeString()));
4626 }
4627 
4628 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
4629   typedef CodeCompletionResult Result;
4630   CodeCompletionBuilder Builder(Results.getAllocator(),
4631                                 Results.getCodeCompletionTUInfo());
4632 
4633   if (Results.includeCodePatterns()) {
4634     // @try { statements } @catch ( declaration ) { statements } @finally
4635     //   { statements }
4636     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"try"));
4637     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4638     Builder.AddPlaceholderChunk("statements");
4639     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4640     Builder.AddTextChunk("@catch");
4641     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4642     Builder.AddPlaceholderChunk("parameter");
4643     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4644     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4645     Builder.AddPlaceholderChunk("statements");
4646     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4647     Builder.AddTextChunk("@finally");
4648     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4649     Builder.AddPlaceholderChunk("statements");
4650     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4651     Results.AddResult(Result(Builder.TakeString()));
4652   }
4653 
4654   // @throw
4655   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"throw"));
4656   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4657   Builder.AddPlaceholderChunk("expression");
4658   Results.AddResult(Result(Builder.TakeString()));
4659 
4660   if (Results.includeCodePatterns()) {
4661     // @synchronized ( expression ) { statements }
4662     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synchronized"));
4663     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4664     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4665     Builder.AddPlaceholderChunk("expression");
4666     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4667     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4668     Builder.AddPlaceholderChunk("statements");
4669     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4670     Results.AddResult(Result(Builder.TakeString()));
4671   }
4672 }
4673 
4674 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
4675                                      ResultBuilder &Results,
4676                                      bool NeedAt) {
4677   typedef CodeCompletionResult Result;
4678   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"private")));
4679   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"protected")));
4680   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"public")));
4681   if (LangOpts.ObjC2)
4682     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"package")));
4683 }
4684 
4685 void Sema::CodeCompleteObjCAtVisibility(Scope *S) {
4686   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4687                         CodeCompleter->getCodeCompletionTUInfo(),
4688                         CodeCompletionContext::CCC_Other);
4689   Results.EnterNewScope();
4690   AddObjCVisibilityResults(getLangOpts(), Results, false);
4691   Results.ExitScope();
4692   HandleCodeCompleteResults(this, CodeCompleter,
4693                             CodeCompletionContext::CCC_Other,
4694                             Results.data(),Results.size());
4695 }
4696 
4697 void Sema::CodeCompleteObjCAtStatement(Scope *S) {
4698   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4699                         CodeCompleter->getCodeCompletionTUInfo(),
4700                         CodeCompletionContext::CCC_Other);
4701   Results.EnterNewScope();
4702   AddObjCStatementResults(Results, false);
4703   AddObjCExpressionResults(Results, false);
4704   Results.ExitScope();
4705   HandleCodeCompleteResults(this, CodeCompleter,
4706                             CodeCompletionContext::CCC_Other,
4707                             Results.data(),Results.size());
4708 }
4709 
4710 void Sema::CodeCompleteObjCAtExpression(Scope *S) {
4711   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4712                         CodeCompleter->getCodeCompletionTUInfo(),
4713                         CodeCompletionContext::CCC_Other);
4714   Results.EnterNewScope();
4715   AddObjCExpressionResults(Results, false);
4716   Results.ExitScope();
4717   HandleCodeCompleteResults(this, CodeCompleter,
4718                             CodeCompletionContext::CCC_Other,
4719                             Results.data(),Results.size());
4720 }
4721 
4722 /// \brief Determine whether the addition of the given flag to an Objective-C
4723 /// property's attributes will cause a conflict.
4724 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
4725   // Check if we've already added this flag.
4726   if (Attributes & NewFlag)
4727     return true;
4728 
4729   Attributes |= NewFlag;
4730 
4731   // Check for collisions with "readonly".
4732   if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
4733       (Attributes & ObjCDeclSpec::DQ_PR_readwrite))
4734     return true;
4735 
4736   // Check for more than one of { assign, copy, retain, strong, weak }.
4737   unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign |
4738                                          ObjCDeclSpec::DQ_PR_unsafe_unretained |
4739                                              ObjCDeclSpec::DQ_PR_copy |
4740                                              ObjCDeclSpec::DQ_PR_retain |
4741                                              ObjCDeclSpec::DQ_PR_strong |
4742                                              ObjCDeclSpec::DQ_PR_weak);
4743   if (AssignCopyRetMask &&
4744       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign &&
4745       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained &&
4746       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy &&
4747       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain &&
4748       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong &&
4749       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_weak)
4750     return true;
4751 
4752   return false;
4753 }
4754 
4755 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
4756   if (!CodeCompleter)
4757     return;
4758 
4759   unsigned Attributes = ODS.getPropertyAttributes();
4760 
4761   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4762                         CodeCompleter->getCodeCompletionTUInfo(),
4763                         CodeCompletionContext::CCC_Other);
4764   Results.EnterNewScope();
4765   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly))
4766     Results.AddResult(CodeCompletionResult("readonly"));
4767   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign))
4768     Results.AddResult(CodeCompletionResult("assign"));
4769   if (!ObjCPropertyFlagConflicts(Attributes,
4770                                  ObjCDeclSpec::DQ_PR_unsafe_unretained))
4771     Results.AddResult(CodeCompletionResult("unsafe_unretained"));
4772   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite))
4773     Results.AddResult(CodeCompletionResult("readwrite"));
4774   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain))
4775     Results.AddResult(CodeCompletionResult("retain"));
4776   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong))
4777     Results.AddResult(CodeCompletionResult("strong"));
4778   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy))
4779     Results.AddResult(CodeCompletionResult("copy"));
4780   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic))
4781     Results.AddResult(CodeCompletionResult("nonatomic"));
4782   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic))
4783     Results.AddResult(CodeCompletionResult("atomic"));
4784 
4785   // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC.
4786   if (getLangOpts().ObjCARCWeak || getLangOpts().getGC() != LangOptions::NonGC)
4787     if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_weak))
4788       Results.AddResult(CodeCompletionResult("weak"));
4789 
4790   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) {
4791     CodeCompletionBuilder Setter(Results.getAllocator(),
4792                                  Results.getCodeCompletionTUInfo());
4793     Setter.AddTypedTextChunk("setter");
4794     Setter.AddTextChunk("=");
4795     Setter.AddPlaceholderChunk("method");
4796     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
4797   }
4798   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) {
4799     CodeCompletionBuilder Getter(Results.getAllocator(),
4800                                  Results.getCodeCompletionTUInfo());
4801     Getter.AddTypedTextChunk("getter");
4802     Getter.AddTextChunk("=");
4803     Getter.AddPlaceholderChunk("method");
4804     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
4805   }
4806   Results.ExitScope();
4807   HandleCodeCompleteResults(this, CodeCompleter,
4808                             CodeCompletionContext::CCC_Other,
4809                             Results.data(),Results.size());
4810 }
4811 
4812 /// \brief Describes the kind of Objective-C method that we want to find
4813 /// via code completion.
4814 enum ObjCMethodKind {
4815   MK_Any, ///< Any kind of method, provided it means other specified criteria.
4816   MK_ZeroArgSelector, ///< Zero-argument (unary) selector.
4817   MK_OneArgSelector ///< One-argument selector.
4818 };
4819 
4820 static bool isAcceptableObjCSelector(Selector Sel,
4821                                      ObjCMethodKind WantKind,
4822                                      ArrayRef<IdentifierInfo *> SelIdents,
4823                                      bool AllowSameLength = true) {
4824   unsigned NumSelIdents = SelIdents.size();
4825   if (NumSelIdents > Sel.getNumArgs())
4826     return false;
4827 
4828   switch (WantKind) {
4829     case MK_Any:             break;
4830     case MK_ZeroArgSelector: return Sel.isUnarySelector();
4831     case MK_OneArgSelector:  return Sel.getNumArgs() == 1;
4832   }
4833 
4834   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
4835     return false;
4836 
4837   for (unsigned I = 0; I != NumSelIdents; ++I)
4838     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
4839       return false;
4840 
4841   return true;
4842 }
4843 
4844 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
4845                                    ObjCMethodKind WantKind,
4846                                    ArrayRef<IdentifierInfo *> SelIdents,
4847                                    bool AllowSameLength = true) {
4848   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
4849                                   AllowSameLength);
4850 }
4851 
4852 namespace {
4853   /// \brief A set of selectors, which is used to avoid introducing multiple
4854   /// completions with the same selector into the result set.
4855   typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
4856 }
4857 
4858 /// \brief Add all of the Objective-C methods in the given Objective-C
4859 /// container to the set of results.
4860 ///
4861 /// The container will be a class, protocol, category, or implementation of
4862 /// any of the above. This mether will recurse to include methods from
4863 /// the superclasses of classes along with their categories, protocols, and
4864 /// implementations.
4865 ///
4866 /// \param Container the container in which we'll look to find methods.
4867 ///
4868 /// \param WantInstanceMethods Whether to add instance methods (only); if
4869 /// false, this routine will add factory methods (only).
4870 ///
4871 /// \param CurContext the context in which we're performing the lookup that
4872 /// finds methods.
4873 ///
4874 /// \param AllowSameLength Whether we allow a method to be added to the list
4875 /// when it has the same number of parameters as we have selector identifiers.
4876 ///
4877 /// \param Results the structure into which we'll add results.
4878 static void AddObjCMethods(ObjCContainerDecl *Container,
4879                            bool WantInstanceMethods,
4880                            ObjCMethodKind WantKind,
4881                            ArrayRef<IdentifierInfo *> SelIdents,
4882                            DeclContext *CurContext,
4883                            VisitedSelectorSet &Selectors,
4884                            bool AllowSameLength,
4885                            ResultBuilder &Results,
4886                            bool InOriginalClass = true) {
4887   typedef CodeCompletionResult Result;
4888   Container = getContainerDef(Container);
4889   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
4890   bool isRootClass = IFace && !IFace->getSuperClass();
4891   for (auto *M : Container->methods()) {
4892     // The instance methods on the root class can be messaged via the
4893     // metaclass.
4894     if (M->isInstanceMethod() == WantInstanceMethods ||
4895         (isRootClass && !WantInstanceMethods)) {
4896       // Check whether the selector identifiers we've been given are a
4897       // subset of the identifiers for this particular method.
4898       if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength))
4899         continue;
4900 
4901       if (!Selectors.insert(M->getSelector()).second)
4902         continue;
4903 
4904       Result R = Result(M, Results.getBasePriority(M), nullptr);
4905       R.StartParameter = SelIdents.size();
4906       R.AllParametersAreInformative = (WantKind != MK_Any);
4907       if (!InOriginalClass)
4908         R.Priority += CCD_InBaseClass;
4909       Results.MaybeAddResult(R, CurContext);
4910     }
4911   }
4912 
4913   // Visit the protocols of protocols.
4914   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
4915     if (Protocol->hasDefinition()) {
4916       const ObjCList<ObjCProtocolDecl> &Protocols
4917         = Protocol->getReferencedProtocols();
4918       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4919                                                 E = Protocols.end();
4920            I != E; ++I)
4921         AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,
4922                        CurContext, Selectors, AllowSameLength, Results, false);
4923     }
4924   }
4925 
4926   if (!IFace || !IFace->hasDefinition())
4927     return;
4928 
4929   // Add methods in protocols.
4930   for (auto *I : IFace->protocols())
4931     AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents,
4932                    CurContext, Selectors, AllowSameLength, Results, false);
4933 
4934   // Add methods in categories.
4935   for (auto *CatDecl : IFace->known_categories()) {
4936     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
4937                    CurContext, Selectors, AllowSameLength,
4938                    Results, InOriginalClass);
4939 
4940     // Add a categories protocol methods.
4941     const ObjCList<ObjCProtocolDecl> &Protocols
4942       = CatDecl->getReferencedProtocols();
4943     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4944                                               E = Protocols.end();
4945          I != E; ++I)
4946       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,
4947                      CurContext, Selectors, AllowSameLength,
4948                      Results, false);
4949 
4950     // Add methods in category implementations.
4951     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
4952       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4953                      CurContext, Selectors, AllowSameLength,
4954                      Results, InOriginalClass);
4955   }
4956 
4957   // Add methods in superclass.
4958   if (IFace->getSuperClass())
4959     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
4960                    SelIdents, CurContext, Selectors,
4961                    AllowSameLength, Results, false);
4962 
4963   // Add methods in our implementation, if any.
4964   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
4965     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4966                    CurContext, Selectors, AllowSameLength,
4967                    Results, InOriginalClass);
4968 }
4969 
4970 
4971 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) {
4972   // Try to find the interface where getters might live.
4973   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
4974   if (!Class) {
4975     if (ObjCCategoryDecl *Category
4976           = dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
4977       Class = Category->getClassInterface();
4978 
4979     if (!Class)
4980       return;
4981   }
4982 
4983   // Find all of the potential getters.
4984   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4985                         CodeCompleter->getCodeCompletionTUInfo(),
4986                         CodeCompletionContext::CCC_Other);
4987   Results.EnterNewScope();
4988 
4989   VisitedSelectorSet Selectors;
4990   AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors,
4991                  /*AllowSameLength=*/true, Results);
4992   Results.ExitScope();
4993   HandleCodeCompleteResults(this, CodeCompleter,
4994                             CodeCompletionContext::CCC_Other,
4995                             Results.data(),Results.size());
4996 }
4997 
4998 void Sema::CodeCompleteObjCPropertySetter(Scope *S) {
4999   // Try to find the interface where setters might live.
5000   ObjCInterfaceDecl *Class
5001     = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
5002   if (!Class) {
5003     if (ObjCCategoryDecl *Category
5004           = dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
5005       Class = Category->getClassInterface();
5006 
5007     if (!Class)
5008       return;
5009   }
5010 
5011   // Find all of the potential getters.
5012   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5013                         CodeCompleter->getCodeCompletionTUInfo(),
5014                         CodeCompletionContext::CCC_Other);
5015   Results.EnterNewScope();
5016 
5017   VisitedSelectorSet Selectors;
5018   AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext,
5019                  Selectors, /*AllowSameLength=*/true, Results);
5020 
5021   Results.ExitScope();
5022   HandleCodeCompleteResults(this, CodeCompleter,
5023                             CodeCompletionContext::CCC_Other,
5024                             Results.data(),Results.size());
5025 }
5026 
5027 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
5028                                        bool IsParameter) {
5029   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5030                         CodeCompleter->getCodeCompletionTUInfo(),
5031                         CodeCompletionContext::CCC_Type);
5032   Results.EnterNewScope();
5033 
5034   // Add context-sensitive, Objective-C parameter-passing keywords.
5035   bool AddedInOut = false;
5036   if ((DS.getObjCDeclQualifier() &
5037        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
5038     Results.AddResult("in");
5039     Results.AddResult("inout");
5040     AddedInOut = true;
5041   }
5042   if ((DS.getObjCDeclQualifier() &
5043        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
5044     Results.AddResult("out");
5045     if (!AddedInOut)
5046       Results.AddResult("inout");
5047   }
5048   if ((DS.getObjCDeclQualifier() &
5049        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
5050         ObjCDeclSpec::DQ_Oneway)) == 0) {
5051      Results.AddResult("bycopy");
5052      Results.AddResult("byref");
5053      Results.AddResult("oneway");
5054   }
5055 
5056   // If we're completing the return type of an Objective-C method and the
5057   // identifier IBAction refers to a macro, provide a completion item for
5058   // an action, e.g.,
5059   //   IBAction)<#selector#>:(id)sender
5060   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
5061       Context.Idents.get("IBAction").hasMacroDefinition()) {
5062     CodeCompletionBuilder Builder(Results.getAllocator(),
5063                                   Results.getCodeCompletionTUInfo(),
5064                                   CCP_CodePattern, CXAvailability_Available);
5065     Builder.AddTypedTextChunk("IBAction");
5066     Builder.AddChunk(CodeCompletionString::CK_RightParen);
5067     Builder.AddPlaceholderChunk("selector");
5068     Builder.AddChunk(CodeCompletionString::CK_Colon);
5069     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5070     Builder.AddTextChunk("id");
5071     Builder.AddChunk(CodeCompletionString::CK_RightParen);
5072     Builder.AddTextChunk("sender");
5073     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
5074   }
5075 
5076   // If we're completing the return type, provide 'instancetype'.
5077   if (!IsParameter) {
5078     Results.AddResult(CodeCompletionResult("instancetype"));
5079   }
5080 
5081   // Add various builtin type names and specifiers.
5082   AddOrdinaryNameResults(PCC_Type, S, *this, Results);
5083   Results.ExitScope();
5084 
5085   // Add the various type names
5086   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
5087   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5088   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5089                      CodeCompleter->includeGlobals());
5090 
5091   if (CodeCompleter->includeMacros())
5092     AddMacroResults(PP, Results, false);
5093 
5094   HandleCodeCompleteResults(this, CodeCompleter,
5095                             CodeCompletionContext::CCC_Type,
5096                             Results.data(), Results.size());
5097 }
5098 
5099 /// \brief When we have an expression with type "id", we may assume
5100 /// that it has some more-specific class type based on knowledge of
5101 /// common uses of Objective-C. This routine returns that class type,
5102 /// or NULL if no better result could be determined.
5103 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
5104   ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
5105   if (!Msg)
5106     return nullptr;
5107 
5108   Selector Sel = Msg->getSelector();
5109   if (Sel.isNull())
5110     return nullptr;
5111 
5112   IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
5113   if (!Id)
5114     return nullptr;
5115 
5116   ObjCMethodDecl *Method = Msg->getMethodDecl();
5117   if (!Method)
5118     return nullptr;
5119 
5120   // Determine the class that we're sending the message to.
5121   ObjCInterfaceDecl *IFace = nullptr;
5122   switch (Msg->getReceiverKind()) {
5123   case ObjCMessageExpr::Class:
5124     if (const ObjCObjectType *ObjType
5125                            = Msg->getClassReceiver()->getAs<ObjCObjectType>())
5126       IFace = ObjType->getInterface();
5127     break;
5128 
5129   case ObjCMessageExpr::Instance: {
5130     QualType T = Msg->getInstanceReceiver()->getType();
5131     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
5132       IFace = Ptr->getInterfaceDecl();
5133     break;
5134   }
5135 
5136   case ObjCMessageExpr::SuperInstance:
5137   case ObjCMessageExpr::SuperClass:
5138     break;
5139   }
5140 
5141   if (!IFace)
5142     return nullptr;
5143 
5144   ObjCInterfaceDecl *Super = IFace->getSuperClass();
5145   if (Method->isInstanceMethod())
5146     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
5147       .Case("retain", IFace)
5148       .Case("strong", IFace)
5149       .Case("autorelease", IFace)
5150       .Case("copy", IFace)
5151       .Case("copyWithZone", IFace)
5152       .Case("mutableCopy", IFace)
5153       .Case("mutableCopyWithZone", IFace)
5154       .Case("awakeFromCoder", IFace)
5155       .Case("replacementObjectFromCoder", IFace)
5156       .Case("class", IFace)
5157       .Case("classForCoder", IFace)
5158       .Case("superclass", Super)
5159       .Default(nullptr);
5160 
5161   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
5162     .Case("new", IFace)
5163     .Case("alloc", IFace)
5164     .Case("allocWithZone", IFace)
5165     .Case("class", IFace)
5166     .Case("superclass", Super)
5167     .Default(nullptr);
5168 }
5169 
5170 // Add a special completion for a message send to "super", which fills in the
5171 // most likely case of forwarding all of our arguments to the superclass
5172 // function.
5173 ///
5174 /// \param S The semantic analysis object.
5175 ///
5176 /// \param NeedSuperKeyword Whether we need to prefix this completion with
5177 /// the "super" keyword. Otherwise, we just need to provide the arguments.
5178 ///
5179 /// \param SelIdents The identifiers in the selector that have already been
5180 /// provided as arguments for a send to "super".
5181 ///
5182 /// \param Results The set of results to augment.
5183 ///
5184 /// \returns the Objective-C method declaration that would be invoked by
5185 /// this "super" completion. If NULL, no completion was added.
5186 static ObjCMethodDecl *AddSuperSendCompletion(
5187                                           Sema &S, bool NeedSuperKeyword,
5188                                           ArrayRef<IdentifierInfo *> SelIdents,
5189                                           ResultBuilder &Results) {
5190   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
5191   if (!CurMethod)
5192     return nullptr;
5193 
5194   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
5195   if (!Class)
5196     return nullptr;
5197 
5198   // Try to find a superclass method with the same selector.
5199   ObjCMethodDecl *SuperMethod = nullptr;
5200   while ((Class = Class->getSuperClass()) && !SuperMethod) {
5201     // Check in the class
5202     SuperMethod = Class->getMethod(CurMethod->getSelector(),
5203                                    CurMethod->isInstanceMethod());
5204 
5205     // Check in categories or class extensions.
5206     if (!SuperMethod) {
5207       for (const auto *Cat : Class->known_categories()) {
5208         if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(),
5209                                                CurMethod->isInstanceMethod())))
5210           break;
5211       }
5212     }
5213   }
5214 
5215   if (!SuperMethod)
5216     return nullptr;
5217 
5218   // Check whether the superclass method has the same signature.
5219   if (CurMethod->param_size() != SuperMethod->param_size() ||
5220       CurMethod->isVariadic() != SuperMethod->isVariadic())
5221     return nullptr;
5222 
5223   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
5224                                    CurPEnd = CurMethod->param_end(),
5225                                     SuperP = SuperMethod->param_begin();
5226        CurP != CurPEnd; ++CurP, ++SuperP) {
5227     // Make sure the parameter types are compatible.
5228     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
5229                                           (*SuperP)->getType()))
5230       return nullptr;
5231 
5232     // Make sure we have a parameter name to forward!
5233     if (!(*CurP)->getIdentifier())
5234       return nullptr;
5235   }
5236 
5237   // We have a superclass method. Now, form the send-to-super completion.
5238   CodeCompletionBuilder Builder(Results.getAllocator(),
5239                                 Results.getCodeCompletionTUInfo());
5240 
5241   // Give this completion a return type.
5242   AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod,
5243                      Builder);
5244 
5245   // If we need the "super" keyword, add it (plus some spacing).
5246   if (NeedSuperKeyword) {
5247     Builder.AddTypedTextChunk("super");
5248     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5249   }
5250 
5251   Selector Sel = CurMethod->getSelector();
5252   if (Sel.isUnarySelector()) {
5253     if (NeedSuperKeyword)
5254       Builder.AddTextChunk(Builder.getAllocator().CopyString(
5255                                   Sel.getNameForSlot(0)));
5256     else
5257       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
5258                                    Sel.getNameForSlot(0)));
5259   } else {
5260     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
5261     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
5262       if (I > SelIdents.size())
5263         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5264 
5265       if (I < SelIdents.size())
5266         Builder.AddInformativeChunk(
5267                    Builder.getAllocator().CopyString(
5268                                                  Sel.getNameForSlot(I) + ":"));
5269       else if (NeedSuperKeyword || I > SelIdents.size()) {
5270         Builder.AddTextChunk(
5271                  Builder.getAllocator().CopyString(
5272                                                   Sel.getNameForSlot(I) + ":"));
5273         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
5274                                          (*CurP)->getIdentifier()->getName()));
5275       } else {
5276         Builder.AddTypedTextChunk(
5277                   Builder.getAllocator().CopyString(
5278                                                   Sel.getNameForSlot(I) + ":"));
5279         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
5280                                          (*CurP)->getIdentifier()->getName()));
5281       }
5282     }
5283   }
5284 
5285   Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod,
5286                                          CCP_SuperCompletion));
5287   return SuperMethod;
5288 }
5289 
5290 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {
5291   typedef CodeCompletionResult Result;
5292   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5293                         CodeCompleter->getCodeCompletionTUInfo(),
5294                         CodeCompletionContext::CCC_ObjCMessageReceiver,
5295                         getLangOpts().CPlusPlus11
5296                           ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
5297                           : &ResultBuilder::IsObjCMessageReceiver);
5298 
5299   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5300   Results.EnterNewScope();
5301   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5302                      CodeCompleter->includeGlobals());
5303 
5304   // If we are in an Objective-C method inside a class that has a superclass,
5305   // add "super" as an option.
5306   if (ObjCMethodDecl *Method = getCurMethodDecl())
5307     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
5308       if (Iface->getSuperClass()) {
5309         Results.AddResult(Result("super"));
5310 
5311         AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results);
5312       }
5313 
5314   if (getLangOpts().CPlusPlus11)
5315     addThisCompletion(*this, Results);
5316 
5317   Results.ExitScope();
5318 
5319   if (CodeCompleter->includeMacros())
5320     AddMacroResults(PP, Results, false);
5321   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5322                             Results.data(), Results.size());
5323 
5324 }
5325 
5326 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
5327                                         ArrayRef<IdentifierInfo *> SelIdents,
5328                                         bool AtArgumentExpression) {
5329   ObjCInterfaceDecl *CDecl = nullptr;
5330   if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
5331     // Figure out which interface we're in.
5332     CDecl = CurMethod->getClassInterface();
5333     if (!CDecl)
5334       return;
5335 
5336     // Find the superclass of this class.
5337     CDecl = CDecl->getSuperClass();
5338     if (!CDecl)
5339       return;
5340 
5341     if (CurMethod->isInstanceMethod()) {
5342       // We are inside an instance method, which means that the message
5343       // send [super ...] is actually calling an instance method on the
5344       // current object.
5345       return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents,
5346                                              AtArgumentExpression,
5347                                              CDecl);
5348     }
5349 
5350     // Fall through to send to the superclass in CDecl.
5351   } else {
5352     // "super" may be the name of a type or variable. Figure out which
5353     // it is.
5354     IdentifierInfo *Super = getSuperIdentifier();
5355     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc,
5356                                      LookupOrdinaryName);
5357     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
5358       // "super" names an interface. Use it.
5359     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
5360       if (const ObjCObjectType *Iface
5361             = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>())
5362         CDecl = Iface->getInterface();
5363     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
5364       // "super" names an unresolved type; we can't be more specific.
5365     } else {
5366       // Assume that "super" names some kind of value and parse that way.
5367       CXXScopeSpec SS;
5368       SourceLocation TemplateKWLoc;
5369       UnqualifiedId id;
5370       id.setIdentifier(Super, SuperLoc);
5371       ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id,
5372                                                false, false);
5373       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
5374                                              SelIdents,
5375                                              AtArgumentExpression);
5376     }
5377 
5378     // Fall through
5379   }
5380 
5381   ParsedType Receiver;
5382   if (CDecl)
5383     Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));
5384   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
5385                                       AtArgumentExpression,
5386                                       /*IsSuper=*/true);
5387 }
5388 
5389 /// \brief Given a set of code-completion results for the argument of a message
5390 /// send, determine the preferred type (if any) for that argument expression.
5391 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
5392                                                        unsigned NumSelIdents) {
5393   typedef CodeCompletionResult Result;
5394   ASTContext &Context = Results.getSema().Context;
5395 
5396   QualType PreferredType;
5397   unsigned BestPriority = CCP_Unlikely * 2;
5398   Result *ResultsData = Results.data();
5399   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
5400     Result &R = ResultsData[I];
5401     if (R.Kind == Result::RK_Declaration &&
5402         isa<ObjCMethodDecl>(R.Declaration)) {
5403       if (R.Priority <= BestPriority) {
5404         const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
5405         if (NumSelIdents <= Method->param_size()) {
5406           QualType MyPreferredType = Method->parameters()[NumSelIdents - 1]
5407                                        ->getType();
5408           if (R.Priority < BestPriority || PreferredType.isNull()) {
5409             BestPriority = R.Priority;
5410             PreferredType = MyPreferredType;
5411           } else if (!Context.hasSameUnqualifiedType(PreferredType,
5412                                                      MyPreferredType)) {
5413             PreferredType = QualType();
5414           }
5415         }
5416       }
5417     }
5418   }
5419 
5420   return PreferredType;
5421 }
5422 
5423 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
5424                                        ParsedType Receiver,
5425                                        ArrayRef<IdentifierInfo *> SelIdents,
5426                                        bool AtArgumentExpression,
5427                                        bool IsSuper,
5428                                        ResultBuilder &Results) {
5429   typedef CodeCompletionResult Result;
5430   ObjCInterfaceDecl *CDecl = nullptr;
5431 
5432   // If the given name refers to an interface type, retrieve the
5433   // corresponding declaration.
5434   if (Receiver) {
5435     QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr);
5436     if (!T.isNull())
5437       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
5438         CDecl = Interface->getInterface();
5439   }
5440 
5441   // Add all of the factory methods in this Objective-C class, its protocols,
5442   // superclasses, categories, implementation, etc.
5443   Results.EnterNewScope();
5444 
5445   // If this is a send-to-super, try to add the special "super" send
5446   // completion.
5447   if (IsSuper) {
5448     if (ObjCMethodDecl *SuperMethod
5449         = AddSuperSendCompletion(SemaRef, false, SelIdents, Results))
5450       Results.Ignore(SuperMethod);
5451   }
5452 
5453   // If we're inside an Objective-C method definition, prefer its selector to
5454   // others.
5455   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
5456     Results.setPreferredSelector(CurMethod->getSelector());
5457 
5458   VisitedSelectorSet Selectors;
5459   if (CDecl)
5460     AddObjCMethods(CDecl, false, MK_Any, SelIdents,
5461                    SemaRef.CurContext, Selectors, AtArgumentExpression,
5462                    Results);
5463   else {
5464     // We're messaging "id" as a type; provide all class/factory methods.
5465 
5466     // If we have an external source, load the entire class method
5467     // pool from the AST file.
5468     if (SemaRef.getExternalSource()) {
5469       for (uint32_t I = 0,
5470                     N = SemaRef.getExternalSource()->GetNumExternalSelectors();
5471            I != N; ++I) {
5472         Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I);
5473         if (Sel.isNull() || SemaRef.MethodPool.count(Sel))
5474           continue;
5475 
5476         SemaRef.ReadMethodPool(Sel);
5477       }
5478     }
5479 
5480     for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(),
5481                                        MEnd = SemaRef.MethodPool.end();
5482          M != MEnd; ++M) {
5483       for (ObjCMethodList *MethList = &M->second.second;
5484            MethList && MethList->getMethod();
5485            MethList = MethList->getNext()) {
5486         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
5487           continue;
5488 
5489         Result R(MethList->getMethod(),
5490                  Results.getBasePriority(MethList->getMethod()), nullptr);
5491         R.StartParameter = SelIdents.size();
5492         R.AllParametersAreInformative = false;
5493         Results.MaybeAddResult(R, SemaRef.CurContext);
5494       }
5495     }
5496   }
5497 
5498   Results.ExitScope();
5499 }
5500 
5501 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
5502                                         ArrayRef<IdentifierInfo *> SelIdents,
5503                                         bool AtArgumentExpression,
5504                                         bool IsSuper) {
5505 
5506   QualType T = this->GetTypeFromParser(Receiver);
5507 
5508   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5509                         CodeCompleter->getCodeCompletionTUInfo(),
5510               CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage,
5511                                     T, SelIdents));
5512 
5513   AddClassMessageCompletions(*this, S, Receiver, SelIdents,
5514                              AtArgumentExpression, IsSuper, Results);
5515 
5516   // If we're actually at the argument expression (rather than prior to the
5517   // selector), we're actually performing code completion for an expression.
5518   // Determine whether we have a single, best method. If so, we can
5519   // code-complete the expression using the corresponding parameter type as
5520   // our preferred type, improving completion results.
5521   if (AtArgumentExpression) {
5522     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
5523                                                               SelIdents.size());
5524     if (PreferredType.isNull())
5525       CodeCompleteOrdinaryName(S, PCC_Expression);
5526     else
5527       CodeCompleteExpression(S, PreferredType);
5528     return;
5529   }
5530 
5531   HandleCodeCompleteResults(this, CodeCompleter,
5532                             Results.getCompletionContext(),
5533                             Results.data(), Results.size());
5534 }
5535 
5536 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,
5537                                            ArrayRef<IdentifierInfo *> SelIdents,
5538                                            bool AtArgumentExpression,
5539                                            ObjCInterfaceDecl *Super) {
5540   typedef CodeCompletionResult Result;
5541 
5542   Expr *RecExpr = static_cast<Expr *>(Receiver);
5543 
5544   // If necessary, apply function/array conversion to the receiver.
5545   // C99 6.7.5.3p[7,8].
5546   if (RecExpr) {
5547     ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr);
5548     if (Conv.isInvalid()) // conversion failed. bail.
5549       return;
5550     RecExpr = Conv.get();
5551   }
5552   QualType ReceiverType = RecExpr? RecExpr->getType()
5553                           : Super? Context.getObjCObjectPointerType(
5554                                             Context.getObjCInterfaceType(Super))
5555                                  : Context.getObjCIdType();
5556 
5557   // If we're messaging an expression with type "id" or "Class", check
5558   // whether we know something special about the receiver that allows
5559   // us to assume a more-specific receiver type.
5560   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) {
5561     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
5562       if (ReceiverType->isObjCClassType())
5563         return CodeCompleteObjCClassMessage(S,
5564                        ParsedType::make(Context.getObjCInterfaceType(IFace)),
5565                                             SelIdents,
5566                                             AtArgumentExpression, Super);
5567 
5568       ReceiverType = Context.getObjCObjectPointerType(
5569                                           Context.getObjCInterfaceType(IFace));
5570     }
5571   } else if (RecExpr && getLangOpts().CPlusPlus) {
5572     ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr);
5573     if (Conv.isUsable()) {
5574       RecExpr = Conv.get();
5575       ReceiverType = RecExpr->getType();
5576     }
5577   }
5578 
5579   // Build the set of methods we can see.
5580   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5581                         CodeCompleter->getCodeCompletionTUInfo(),
5582            CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
5583                                  ReceiverType, SelIdents));
5584 
5585   Results.EnterNewScope();
5586 
5587   // If this is a send-to-super, try to add the special "super" send
5588   // completion.
5589   if (Super) {
5590     if (ObjCMethodDecl *SuperMethod
5591           = AddSuperSendCompletion(*this, false, SelIdents, Results))
5592       Results.Ignore(SuperMethod);
5593   }
5594 
5595   // If we're inside an Objective-C method definition, prefer its selector to
5596   // others.
5597   if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
5598     Results.setPreferredSelector(CurMethod->getSelector());
5599 
5600   // Keep track of the selectors we've already added.
5601   VisitedSelectorSet Selectors;
5602 
5603   // Handle messages to Class. This really isn't a message to an instance
5604   // method, so we treat it the same way we would treat a message send to a
5605   // class method.
5606   if (ReceiverType->isObjCClassType() ||
5607       ReceiverType->isObjCQualifiedClassType()) {
5608     if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
5609       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
5610         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents,
5611                        CurContext, Selectors, AtArgumentExpression, Results);
5612     }
5613   }
5614   // Handle messages to a qualified ID ("id<foo>").
5615   else if (const ObjCObjectPointerType *QualID
5616              = ReceiverType->getAsObjCQualifiedIdType()) {
5617     // Search protocols for instance methods.
5618     for (auto *I : QualID->quals())
5619       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext,
5620                      Selectors, AtArgumentExpression, Results);
5621   }
5622   // Handle messages to a pointer to interface type.
5623   else if (const ObjCObjectPointerType *IFacePtr
5624                               = ReceiverType->getAsObjCInterfacePointerType()) {
5625     // Search the class, its superclasses, etc., for instance methods.
5626     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
5627                    CurContext, Selectors, AtArgumentExpression,
5628                    Results);
5629 
5630     // Search protocols for instance methods.
5631     for (auto *I : IFacePtr->quals())
5632       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext,
5633                      Selectors, AtArgumentExpression, Results);
5634   }
5635   // Handle messages to "id".
5636   else if (ReceiverType->isObjCIdType()) {
5637     // We're messaging "id", so provide all instance methods we know
5638     // about as code-completion results.
5639 
5640     // If we have an external source, load the entire class method
5641     // pool from the AST file.
5642     if (ExternalSource) {
5643       for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
5644            I != N; ++I) {
5645         Selector Sel = ExternalSource->GetExternalSelector(I);
5646         if (Sel.isNull() || MethodPool.count(Sel))
5647           continue;
5648 
5649         ReadMethodPool(Sel);
5650       }
5651     }
5652 
5653     for (GlobalMethodPool::iterator M = MethodPool.begin(),
5654                                     MEnd = MethodPool.end();
5655          M != MEnd; ++M) {
5656       for (ObjCMethodList *MethList = &M->second.first;
5657            MethList && MethList->getMethod();
5658            MethList = MethList->getNext()) {
5659         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
5660           continue;
5661 
5662         if (!Selectors.insert(MethList->getMethod()->getSelector()).second)
5663           continue;
5664 
5665         Result R(MethList->getMethod(),
5666                  Results.getBasePriority(MethList->getMethod()), nullptr);
5667         R.StartParameter = SelIdents.size();
5668         R.AllParametersAreInformative = false;
5669         Results.MaybeAddResult(R, CurContext);
5670       }
5671     }
5672   }
5673   Results.ExitScope();
5674 
5675 
5676   // If we're actually at the argument expression (rather than prior to the
5677   // selector), we're actually performing code completion for an expression.
5678   // Determine whether we have a single, best method. If so, we can
5679   // code-complete the expression using the corresponding parameter type as
5680   // our preferred type, improving completion results.
5681   if (AtArgumentExpression) {
5682     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
5683                                                               SelIdents.size());
5684     if (PreferredType.isNull())
5685       CodeCompleteOrdinaryName(S, PCC_Expression);
5686     else
5687       CodeCompleteExpression(S, PreferredType);
5688     return;
5689   }
5690 
5691   HandleCodeCompleteResults(this, CodeCompleter,
5692                             Results.getCompletionContext(),
5693                             Results.data(),Results.size());
5694 }
5695 
5696 void Sema::CodeCompleteObjCForCollection(Scope *S,
5697                                          DeclGroupPtrTy IterationVar) {
5698   CodeCompleteExpressionData Data;
5699   Data.ObjCCollection = true;
5700 
5701   if (IterationVar.getAsOpaquePtr()) {
5702     DeclGroupRef DG = IterationVar.get();
5703     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
5704       if (*I)
5705         Data.IgnoreDecls.push_back(*I);
5706     }
5707   }
5708 
5709   CodeCompleteExpression(S, Data);
5710 }
5711 
5712 void Sema::CodeCompleteObjCSelector(Scope *S,
5713                                     ArrayRef<IdentifierInfo *> SelIdents) {
5714   // If we have an external source, load the entire class method
5715   // pool from the AST file.
5716   if (ExternalSource) {
5717     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
5718          I != N; ++I) {
5719       Selector Sel = ExternalSource->GetExternalSelector(I);
5720       if (Sel.isNull() || MethodPool.count(Sel))
5721         continue;
5722 
5723       ReadMethodPool(Sel);
5724     }
5725   }
5726 
5727   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5728                         CodeCompleter->getCodeCompletionTUInfo(),
5729                         CodeCompletionContext::CCC_SelectorName);
5730   Results.EnterNewScope();
5731   for (GlobalMethodPool::iterator M = MethodPool.begin(),
5732                                MEnd = MethodPool.end();
5733        M != MEnd; ++M) {
5734 
5735     Selector Sel = M->first;
5736     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents))
5737       continue;
5738 
5739     CodeCompletionBuilder Builder(Results.getAllocator(),
5740                                   Results.getCodeCompletionTUInfo());
5741     if (Sel.isUnarySelector()) {
5742       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
5743                                                        Sel.getNameForSlot(0)));
5744       Results.AddResult(Builder.TakeString());
5745       continue;
5746     }
5747 
5748     std::string Accumulator;
5749     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
5750       if (I == SelIdents.size()) {
5751         if (!Accumulator.empty()) {
5752           Builder.AddInformativeChunk(Builder.getAllocator().CopyString(
5753                                                  Accumulator));
5754           Accumulator.clear();
5755         }
5756       }
5757 
5758       Accumulator += Sel.getNameForSlot(I);
5759       Accumulator += ':';
5760     }
5761     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator));
5762     Results.AddResult(Builder.TakeString());
5763   }
5764   Results.ExitScope();
5765 
5766   HandleCodeCompleteResults(this, CodeCompleter,
5767                             CodeCompletionContext::CCC_SelectorName,
5768                             Results.data(), Results.size());
5769 }
5770 
5771 /// \brief Add all of the protocol declarations that we find in the given
5772 /// (translation unit) context.
5773 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
5774                                bool OnlyForwardDeclarations,
5775                                ResultBuilder &Results) {
5776   typedef CodeCompletionResult Result;
5777 
5778   for (const auto *D : Ctx->decls()) {
5779     // Record any protocols we find.
5780     if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D))
5781       if (!OnlyForwardDeclarations || !Proto->hasDefinition())
5782         Results.AddResult(Result(Proto, Results.getBasePriority(Proto),nullptr),
5783                           CurContext, nullptr, false);
5784   }
5785 }
5786 
5787 void Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols,
5788                                               unsigned NumProtocols) {
5789   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5790                         CodeCompleter->getCodeCompletionTUInfo(),
5791                         CodeCompletionContext::CCC_ObjCProtocolName);
5792 
5793   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5794     Results.EnterNewScope();
5795 
5796     // Tell the result set to ignore all of the protocols we have
5797     // already seen.
5798     // FIXME: This doesn't work when caching code-completion results.
5799     for (unsigned I = 0; I != NumProtocols; ++I)
5800       if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first,
5801                                                       Protocols[I].second))
5802         Results.Ignore(Protocol);
5803 
5804     // Add all protocols.
5805     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false,
5806                        Results);
5807 
5808     Results.ExitScope();
5809   }
5810 
5811   HandleCodeCompleteResults(this, CodeCompleter,
5812                             CodeCompletionContext::CCC_ObjCProtocolName,
5813                             Results.data(),Results.size());
5814 }
5815 
5816 void Sema::CodeCompleteObjCProtocolDecl(Scope *) {
5817   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5818                         CodeCompleter->getCodeCompletionTUInfo(),
5819                         CodeCompletionContext::CCC_ObjCProtocolName);
5820 
5821   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5822     Results.EnterNewScope();
5823 
5824     // Add all protocols.
5825     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true,
5826                        Results);
5827 
5828     Results.ExitScope();
5829   }
5830 
5831   HandleCodeCompleteResults(this, CodeCompleter,
5832                             CodeCompletionContext::CCC_ObjCProtocolName,
5833                             Results.data(),Results.size());
5834 }
5835 
5836 /// \brief Add all of the Objective-C interface declarations that we find in
5837 /// the given (translation unit) context.
5838 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
5839                                 bool OnlyForwardDeclarations,
5840                                 bool OnlyUnimplemented,
5841                                 ResultBuilder &Results) {
5842   typedef CodeCompletionResult Result;
5843 
5844   for (const auto *D : Ctx->decls()) {
5845     // Record any interfaces we find.
5846     if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
5847       if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
5848           (!OnlyUnimplemented || !Class->getImplementation()))
5849         Results.AddResult(Result(Class, Results.getBasePriority(Class),nullptr),
5850                           CurContext, nullptr, false);
5851   }
5852 }
5853 
5854 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
5855   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5856                         CodeCompleter->getCodeCompletionTUInfo(),
5857                         CodeCompletionContext::CCC_Other);
5858   Results.EnterNewScope();
5859 
5860   if (CodeCompleter->includeGlobals()) {
5861     // Add all classes.
5862     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5863                         false, Results);
5864   }
5865 
5866   Results.ExitScope();
5867 
5868   HandleCodeCompleteResults(this, CodeCompleter,
5869                             CodeCompletionContext::CCC_ObjCInterfaceName,
5870                             Results.data(),Results.size());
5871 }
5872 
5873 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
5874                                       SourceLocation ClassNameLoc) {
5875   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5876                         CodeCompleter->getCodeCompletionTUInfo(),
5877                         CodeCompletionContext::CCC_ObjCInterfaceName);
5878   Results.EnterNewScope();
5879 
5880   // Make sure that we ignore the class we're currently defining.
5881   NamedDecl *CurClass
5882     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5883   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
5884     Results.Ignore(CurClass);
5885 
5886   if (CodeCompleter->includeGlobals()) {
5887     // Add all classes.
5888     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5889                         false, Results);
5890   }
5891 
5892   Results.ExitScope();
5893 
5894   HandleCodeCompleteResults(this, CodeCompleter,
5895                             CodeCompletionContext::CCC_ObjCInterfaceName,
5896                             Results.data(),Results.size());
5897 }
5898 
5899 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
5900   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5901                         CodeCompleter->getCodeCompletionTUInfo(),
5902                         CodeCompletionContext::CCC_Other);
5903   Results.EnterNewScope();
5904 
5905   if (CodeCompleter->includeGlobals()) {
5906     // Add all unimplemented classes.
5907     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5908                         true, Results);
5909   }
5910 
5911   Results.ExitScope();
5912 
5913   HandleCodeCompleteResults(this, CodeCompleter,
5914                             CodeCompletionContext::CCC_ObjCInterfaceName,
5915                             Results.data(),Results.size());
5916 }
5917 
5918 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
5919                                              IdentifierInfo *ClassName,
5920                                              SourceLocation ClassNameLoc) {
5921   typedef CodeCompletionResult Result;
5922 
5923   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5924                         CodeCompleter->getCodeCompletionTUInfo(),
5925                         CodeCompletionContext::CCC_ObjCCategoryName);
5926 
5927   // Ignore any categories we find that have already been implemented by this
5928   // interface.
5929   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5930   NamedDecl *CurClass
5931     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5932   if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)){
5933     for (const auto *Cat : Class->visible_categories())
5934       CategoryNames.insert(Cat->getIdentifier());
5935   }
5936 
5937   // Add all of the categories we know about.
5938   Results.EnterNewScope();
5939   TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
5940   for (const auto *D : TU->decls())
5941     if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D))
5942       if (CategoryNames.insert(Category->getIdentifier()).second)
5943         Results.AddResult(Result(Category, Results.getBasePriority(Category),
5944                                  nullptr),
5945                           CurContext, nullptr, false);
5946   Results.ExitScope();
5947 
5948   HandleCodeCompleteResults(this, CodeCompleter,
5949                             CodeCompletionContext::CCC_ObjCCategoryName,
5950                             Results.data(),Results.size());
5951 }
5952 
5953 void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
5954                                                   IdentifierInfo *ClassName,
5955                                                   SourceLocation ClassNameLoc) {
5956   typedef CodeCompletionResult Result;
5957 
5958   // Find the corresponding interface. If we couldn't find the interface, the
5959   // program itself is ill-formed. However, we'll try to be helpful still by
5960   // providing the list of all of the categories we know about.
5961   NamedDecl *CurClass
5962     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5963   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
5964   if (!Class)
5965     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
5966 
5967   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5968                         CodeCompleter->getCodeCompletionTUInfo(),
5969                         CodeCompletionContext::CCC_ObjCCategoryName);
5970 
5971   // Add all of the categories that have have corresponding interface
5972   // declarations in this class and any of its superclasses, except for
5973   // already-implemented categories in the class itself.
5974   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5975   Results.EnterNewScope();
5976   bool IgnoreImplemented = true;
5977   while (Class) {
5978     for (const auto *Cat : Class->visible_categories()) {
5979       if ((!IgnoreImplemented || !Cat->getImplementation()) &&
5980           CategoryNames.insert(Cat->getIdentifier()).second)
5981         Results.AddResult(Result(Cat, Results.getBasePriority(Cat), nullptr),
5982                           CurContext, nullptr, false);
5983     }
5984 
5985     Class = Class->getSuperClass();
5986     IgnoreImplemented = false;
5987   }
5988   Results.ExitScope();
5989 
5990   HandleCodeCompleteResults(this, CodeCompleter,
5991                             CodeCompletionContext::CCC_ObjCCategoryName,
5992                             Results.data(),Results.size());
5993 }
5994 
5995 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) {
5996   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5997                         CodeCompleter->getCodeCompletionTUInfo(),
5998                         CodeCompletionContext::CCC_Other);
5999 
6000   // Figure out where this @synthesize lives.
6001   ObjCContainerDecl *Container
6002     = dyn_cast_or_null<ObjCContainerDecl>(CurContext);
6003   if (!Container ||
6004       (!isa<ObjCImplementationDecl>(Container) &&
6005        !isa<ObjCCategoryImplDecl>(Container)))
6006     return;
6007 
6008   // Ignore any properties that have already been implemented.
6009   Container = getContainerDef(Container);
6010   for (const auto *D : Container->decls())
6011     if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D))
6012       Results.Ignore(PropertyImpl->getPropertyDecl());
6013 
6014   // Add any properties that we find.
6015   AddedPropertiesSet AddedProperties;
6016   Results.EnterNewScope();
6017   if (ObjCImplementationDecl *ClassImpl
6018         = dyn_cast<ObjCImplementationDecl>(Container))
6019     AddObjCProperties(ClassImpl->getClassInterface(), false,
6020                       /*AllowNullaryMethods=*/false, CurContext,
6021                       AddedProperties, Results);
6022   else
6023     AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
6024                       false, /*AllowNullaryMethods=*/false, CurContext,
6025                       AddedProperties, Results);
6026   Results.ExitScope();
6027 
6028   HandleCodeCompleteResults(this, CodeCompleter,
6029                             CodeCompletionContext::CCC_Other,
6030                             Results.data(),Results.size());
6031 }
6032 
6033 void Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S,
6034                                                   IdentifierInfo *PropertyName) {
6035   typedef CodeCompletionResult Result;
6036   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6037                         CodeCompleter->getCodeCompletionTUInfo(),
6038                         CodeCompletionContext::CCC_Other);
6039 
6040   // Figure out where this @synthesize lives.
6041   ObjCContainerDecl *Container
6042     = dyn_cast_or_null<ObjCContainerDecl>(CurContext);
6043   if (!Container ||
6044       (!isa<ObjCImplementationDecl>(Container) &&
6045        !isa<ObjCCategoryImplDecl>(Container)))
6046     return;
6047 
6048   // Figure out which interface we're looking into.
6049   ObjCInterfaceDecl *Class = nullptr;
6050   if (ObjCImplementationDecl *ClassImpl
6051                                  = dyn_cast<ObjCImplementationDecl>(Container))
6052     Class = ClassImpl->getClassInterface();
6053   else
6054     Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl()
6055                                                           ->getClassInterface();
6056 
6057   // Determine the type of the property we're synthesizing.
6058   QualType PropertyType = Context.getObjCIdType();
6059   if (Class) {
6060     if (ObjCPropertyDecl *Property
6061                               = Class->FindPropertyDeclaration(PropertyName)) {
6062       PropertyType
6063         = Property->getType().getNonReferenceType().getUnqualifiedType();
6064 
6065       // Give preference to ivars
6066       Results.setPreferredType(PropertyType);
6067     }
6068   }
6069 
6070   // Add all of the instance variables in this class and its superclasses.
6071   Results.EnterNewScope();
6072   bool SawSimilarlyNamedIvar = false;
6073   std::string NameWithPrefix;
6074   NameWithPrefix += '_';
6075   NameWithPrefix += PropertyName->getName();
6076   std::string NameWithSuffix = PropertyName->getName().str();
6077   NameWithSuffix += '_';
6078   for(; Class; Class = Class->getSuperClass()) {
6079     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
6080          Ivar = Ivar->getNextIvar()) {
6081       Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), nullptr),
6082                         CurContext, nullptr, false);
6083 
6084       // Determine whether we've seen an ivar with a name similar to the
6085       // property.
6086       if ((PropertyName == Ivar->getIdentifier() ||
6087            NameWithPrefix == Ivar->getName() ||
6088            NameWithSuffix == Ivar->getName())) {
6089         SawSimilarlyNamedIvar = true;
6090 
6091         // Reduce the priority of this result by one, to give it a slight
6092         // advantage over other results whose names don't match so closely.
6093         if (Results.size() &&
6094             Results.data()[Results.size() - 1].Kind
6095                                       == CodeCompletionResult::RK_Declaration &&
6096             Results.data()[Results.size() - 1].Declaration == Ivar)
6097           Results.data()[Results.size() - 1].Priority--;
6098       }
6099     }
6100   }
6101 
6102   if (!SawSimilarlyNamedIvar) {
6103     // Create ivar result _propName, that the user can use to synthesize
6104     // an ivar of the appropriate type.
6105     unsigned Priority = CCP_MemberDeclaration + 1;
6106     typedef CodeCompletionResult Result;
6107     CodeCompletionAllocator &Allocator = Results.getAllocator();
6108     CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(),
6109                                   Priority,CXAvailability_Available);
6110 
6111     PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
6112     Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context,
6113                                                        Policy, Allocator));
6114     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
6115     Results.AddResult(Result(Builder.TakeString(), Priority,
6116                              CXCursor_ObjCIvarDecl));
6117   }
6118 
6119   Results.ExitScope();
6120 
6121   HandleCodeCompleteResults(this, CodeCompleter,
6122                             CodeCompletionContext::CCC_Other,
6123                             Results.data(),Results.size());
6124 }
6125 
6126 // Mapping from selectors to the methods that implement that selector, along
6127 // with the "in original class" flag.
6128 typedef llvm::DenseMap<
6129     Selector, llvm::PointerIntPair<ObjCMethodDecl *, 1, bool> > KnownMethodsMap;
6130 
6131 /// \brief Find all of the methods that reside in the given container
6132 /// (and its superclasses, protocols, etc.) that meet the given
6133 /// criteria. Insert those methods into the map of known methods,
6134 /// indexed by selector so they can be easily found.
6135 static void FindImplementableMethods(ASTContext &Context,
6136                                      ObjCContainerDecl *Container,
6137                                      bool WantInstanceMethods,
6138                                      QualType ReturnType,
6139                                      KnownMethodsMap &KnownMethods,
6140                                      bool InOriginalClass = true) {
6141   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
6142     // Make sure we have a definition; that's what we'll walk.
6143     if (!IFace->hasDefinition())
6144       return;
6145 
6146     IFace = IFace->getDefinition();
6147     Container = IFace;
6148 
6149     const ObjCList<ObjCProtocolDecl> &Protocols
6150       = IFace->getReferencedProtocols();
6151     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
6152                                               E = Protocols.end();
6153          I != E; ++I)
6154       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
6155                                KnownMethods, InOriginalClass);
6156 
6157     // Add methods from any class extensions and categories.
6158     for (auto *Cat : IFace->visible_categories()) {
6159       FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType,
6160                                KnownMethods, false);
6161     }
6162 
6163     // Visit the superclass.
6164     if (IFace->getSuperClass())
6165       FindImplementableMethods(Context, IFace->getSuperClass(),
6166                                WantInstanceMethods, ReturnType,
6167                                KnownMethods, false);
6168   }
6169 
6170   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
6171     // Recurse into protocols.
6172     const ObjCList<ObjCProtocolDecl> &Protocols
6173       = Category->getReferencedProtocols();
6174     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
6175                                               E = Protocols.end();
6176          I != E; ++I)
6177       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
6178                                KnownMethods, InOriginalClass);
6179 
6180     // If this category is the original class, jump to the interface.
6181     if (InOriginalClass && Category->getClassInterface())
6182       FindImplementableMethods(Context, Category->getClassInterface(),
6183                                WantInstanceMethods, ReturnType, KnownMethods,
6184                                false);
6185   }
6186 
6187   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
6188     // Make sure we have a definition; that's what we'll walk.
6189     if (!Protocol->hasDefinition())
6190       return;
6191     Protocol = Protocol->getDefinition();
6192     Container = Protocol;
6193 
6194     // Recurse into protocols.
6195     const ObjCList<ObjCProtocolDecl> &Protocols
6196       = Protocol->getReferencedProtocols();
6197     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
6198            E = Protocols.end();
6199          I != E; ++I)
6200       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
6201                                KnownMethods, false);
6202   }
6203 
6204   // Add methods in this container. This operation occurs last because
6205   // we want the methods from this container to override any methods
6206   // we've previously seen with the same selector.
6207   for (auto *M : Container->methods()) {
6208     if (M->isInstanceMethod() == WantInstanceMethods) {
6209       if (!ReturnType.isNull() &&
6210           !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType()))
6211         continue;
6212 
6213       KnownMethods[M->getSelector()] =
6214           KnownMethodsMap::mapped_type(M, InOriginalClass);
6215     }
6216   }
6217 }
6218 
6219 /// \brief Add the parenthesized return or parameter type chunk to a code
6220 /// completion string.
6221 static void AddObjCPassingTypeChunk(QualType Type,
6222                                     unsigned ObjCDeclQuals,
6223                                     ASTContext &Context,
6224                                     const PrintingPolicy &Policy,
6225                                     CodeCompletionBuilder &Builder) {
6226   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6227   std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals);
6228   if (!Quals.empty())
6229     Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
6230   Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy,
6231                                                Builder.getAllocator()));
6232   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6233 }
6234 
6235 /// \brief Determine whether the given class is or inherits from a class by
6236 /// the given name.
6237 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class,
6238                                    StringRef Name) {
6239   if (!Class)
6240     return false;
6241 
6242   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
6243     return true;
6244 
6245   return InheritsFromClassNamed(Class->getSuperClass(), Name);
6246 }
6247 
6248 /// \brief Add code completions for Objective-C Key-Value Coding (KVC) and
6249 /// Key-Value Observing (KVO).
6250 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
6251                                        bool IsInstanceMethod,
6252                                        QualType ReturnType,
6253                                        ASTContext &Context,
6254                                        VisitedSelectorSet &KnownSelectors,
6255                                        ResultBuilder &Results) {
6256   IdentifierInfo *PropName = Property->getIdentifier();
6257   if (!PropName || PropName->getLength() == 0)
6258     return;
6259 
6260   PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
6261 
6262   // Builder that will create each code completion.
6263   typedef CodeCompletionResult Result;
6264   CodeCompletionAllocator &Allocator = Results.getAllocator();
6265   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
6266 
6267   // The selector table.
6268   SelectorTable &Selectors = Context.Selectors;
6269 
6270   // The property name, copied into the code completion allocation region
6271   // on demand.
6272   struct KeyHolder {
6273     CodeCompletionAllocator &Allocator;
6274     StringRef Key;
6275     const char *CopiedKey;
6276 
6277     KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key)
6278     : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {}
6279 
6280     operator const char *() {
6281       if (CopiedKey)
6282         return CopiedKey;
6283 
6284       return CopiedKey = Allocator.CopyString(Key);
6285     }
6286   } Key(Allocator, PropName->getName());
6287 
6288   // The uppercased name of the property name.
6289   std::string UpperKey = PropName->getName();
6290   if (!UpperKey.empty())
6291     UpperKey[0] = toUppercase(UpperKey[0]);
6292 
6293   bool ReturnTypeMatchesProperty = ReturnType.isNull() ||
6294     Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
6295                                    Property->getType());
6296   bool ReturnTypeMatchesVoid
6297     = ReturnType.isNull() || ReturnType->isVoidType();
6298 
6299   // Add the normal accessor -(type)key.
6300   if (IsInstanceMethod &&
6301       KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second &&
6302       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
6303     if (ReturnType.isNull())
6304       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0,
6305                               Context, Policy, Builder);
6306 
6307     Builder.AddTypedTextChunk(Key);
6308     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6309                              CXCursor_ObjCInstanceMethodDecl));
6310   }
6311 
6312   // If we have an integral or boolean property (or the user has provided
6313   // an integral or boolean return type), add the accessor -(type)isKey.
6314   if (IsInstanceMethod &&
6315       ((!ReturnType.isNull() &&
6316         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
6317        (ReturnType.isNull() &&
6318         (Property->getType()->isIntegerType() ||
6319          Property->getType()->isBooleanType())))) {
6320     std::string SelectorName = (Twine("is") + UpperKey).str();
6321     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6322     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
6323             .second) {
6324       if (ReturnType.isNull()) {
6325         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6326         Builder.AddTextChunk("BOOL");
6327         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6328       }
6329 
6330       Builder.AddTypedTextChunk(
6331                                 Allocator.CopyString(SelectorId->getName()));
6332       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6333                                CXCursor_ObjCInstanceMethodDecl));
6334     }
6335   }
6336 
6337   // Add the normal mutator.
6338   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
6339       !Property->getSetterMethodDecl()) {
6340     std::string SelectorName = (Twine("set") + UpperKey).str();
6341     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6342     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
6343       if (ReturnType.isNull()) {
6344         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6345         Builder.AddTextChunk("void");
6346         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6347       }
6348 
6349       Builder.AddTypedTextChunk(
6350                                 Allocator.CopyString(SelectorId->getName()));
6351       Builder.AddTypedTextChunk(":");
6352       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0,
6353                               Context, Policy, Builder);
6354       Builder.AddTextChunk(Key);
6355       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6356                                CXCursor_ObjCInstanceMethodDecl));
6357     }
6358   }
6359 
6360   // Indexed and unordered accessors
6361   unsigned IndexedGetterPriority = CCP_CodePattern;
6362   unsigned IndexedSetterPriority = CCP_CodePattern;
6363   unsigned UnorderedGetterPriority = CCP_CodePattern;
6364   unsigned UnorderedSetterPriority = CCP_CodePattern;
6365   if (const ObjCObjectPointerType *ObjCPointer
6366                     = Property->getType()->getAs<ObjCObjectPointerType>()) {
6367     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
6368       // If this interface type is not provably derived from a known
6369       // collection, penalize the corresponding completions.
6370       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
6371         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
6372         if (!InheritsFromClassNamed(IFace, "NSArray"))
6373           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
6374       }
6375 
6376       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
6377         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
6378         if (!InheritsFromClassNamed(IFace, "NSSet"))
6379           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
6380       }
6381     }
6382   } else {
6383     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
6384     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
6385     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
6386     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
6387   }
6388 
6389   // Add -(NSUInteger)countOf<key>
6390   if (IsInstanceMethod &&
6391       (ReturnType.isNull() || ReturnType->isIntegerType())) {
6392     std::string SelectorName = (Twine("countOf") + UpperKey).str();
6393     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6394     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
6395             .second) {
6396       if (ReturnType.isNull()) {
6397         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6398         Builder.AddTextChunk("NSUInteger");
6399         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6400       }
6401 
6402       Builder.AddTypedTextChunk(
6403                                 Allocator.CopyString(SelectorId->getName()));
6404       Results.AddResult(Result(Builder.TakeString(),
6405                                std::min(IndexedGetterPriority,
6406                                         UnorderedGetterPriority),
6407                                CXCursor_ObjCInstanceMethodDecl));
6408     }
6409   }
6410 
6411   // Indexed getters
6412   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
6413   if (IsInstanceMethod &&
6414       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
6415     std::string SelectorName
6416       = (Twine("objectIn") + UpperKey + "AtIndex").str();
6417     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6418     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
6419       if (ReturnType.isNull()) {
6420         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6421         Builder.AddTextChunk("id");
6422         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6423       }
6424 
6425       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6426       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6427       Builder.AddTextChunk("NSUInteger");
6428       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6429       Builder.AddTextChunk("index");
6430       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6431                                CXCursor_ObjCInstanceMethodDecl));
6432     }
6433   }
6434 
6435   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
6436   if (IsInstanceMethod &&
6437       (ReturnType.isNull() ||
6438        (ReturnType->isObjCObjectPointerType() &&
6439         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6440         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6441                                                 ->getName() == "NSArray"))) {
6442     std::string SelectorName
6443       = (Twine(Property->getName()) + "AtIndexes").str();
6444     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6445     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
6446       if (ReturnType.isNull()) {
6447         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6448         Builder.AddTextChunk("NSArray *");
6449         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6450       }
6451 
6452       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6453       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6454       Builder.AddTextChunk("NSIndexSet *");
6455       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6456       Builder.AddTextChunk("indexes");
6457       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6458                                CXCursor_ObjCInstanceMethodDecl));
6459     }
6460   }
6461 
6462   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
6463   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6464     std::string SelectorName = (Twine("get") + UpperKey).str();
6465     IdentifierInfo *SelectorIds[2] = {
6466       &Context.Idents.get(SelectorName),
6467       &Context.Idents.get("range")
6468     };
6469 
6470     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
6471       if (ReturnType.isNull()) {
6472         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6473         Builder.AddTextChunk("void");
6474         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6475       }
6476 
6477       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6478       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6479       Builder.AddPlaceholderChunk("object-type");
6480       Builder.AddTextChunk(" **");
6481       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6482       Builder.AddTextChunk("buffer");
6483       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6484       Builder.AddTypedTextChunk("range:");
6485       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6486       Builder.AddTextChunk("NSRange");
6487       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6488       Builder.AddTextChunk("inRange");
6489       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6490                                CXCursor_ObjCInstanceMethodDecl));
6491     }
6492   }
6493 
6494   // Mutable indexed accessors
6495 
6496   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
6497   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6498     std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str();
6499     IdentifierInfo *SelectorIds[2] = {
6500       &Context.Idents.get("insertObject"),
6501       &Context.Idents.get(SelectorName)
6502     };
6503 
6504     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
6505       if (ReturnType.isNull()) {
6506         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6507         Builder.AddTextChunk("void");
6508         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6509       }
6510 
6511       Builder.AddTypedTextChunk("insertObject:");
6512       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6513       Builder.AddPlaceholderChunk("object-type");
6514       Builder.AddTextChunk(" *");
6515       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6516       Builder.AddTextChunk("object");
6517       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6518       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6519       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6520       Builder.AddPlaceholderChunk("NSUInteger");
6521       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6522       Builder.AddTextChunk("index");
6523       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6524                                CXCursor_ObjCInstanceMethodDecl));
6525     }
6526   }
6527 
6528   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
6529   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6530     std::string SelectorName = (Twine("insert") + UpperKey).str();
6531     IdentifierInfo *SelectorIds[2] = {
6532       &Context.Idents.get(SelectorName),
6533       &Context.Idents.get("atIndexes")
6534     };
6535 
6536     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
6537       if (ReturnType.isNull()) {
6538         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6539         Builder.AddTextChunk("void");
6540         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6541       }
6542 
6543       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6544       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6545       Builder.AddTextChunk("NSArray *");
6546       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6547       Builder.AddTextChunk("array");
6548       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6549       Builder.AddTypedTextChunk("atIndexes:");
6550       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6551       Builder.AddPlaceholderChunk("NSIndexSet *");
6552       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6553       Builder.AddTextChunk("indexes");
6554       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6555                                CXCursor_ObjCInstanceMethodDecl));
6556     }
6557   }
6558 
6559   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
6560   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6561     std::string SelectorName
6562       = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
6563     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6564     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
6565       if (ReturnType.isNull()) {
6566         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6567         Builder.AddTextChunk("void");
6568         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6569       }
6570 
6571       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6572       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6573       Builder.AddTextChunk("NSUInteger");
6574       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6575       Builder.AddTextChunk("index");
6576       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6577                                CXCursor_ObjCInstanceMethodDecl));
6578     }
6579   }
6580 
6581   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
6582   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6583     std::string SelectorName
6584       = (Twine("remove") + UpperKey + "AtIndexes").str();
6585     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6586     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
6587       if (ReturnType.isNull()) {
6588         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6589         Builder.AddTextChunk("void");
6590         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6591       }
6592 
6593       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6594       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6595       Builder.AddTextChunk("NSIndexSet *");
6596       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6597       Builder.AddTextChunk("indexes");
6598       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6599                                CXCursor_ObjCInstanceMethodDecl));
6600     }
6601   }
6602 
6603   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
6604   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6605     std::string SelectorName
6606       = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
6607     IdentifierInfo *SelectorIds[2] = {
6608       &Context.Idents.get(SelectorName),
6609       &Context.Idents.get("withObject")
6610     };
6611 
6612     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
6613       if (ReturnType.isNull()) {
6614         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6615         Builder.AddTextChunk("void");
6616         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6617       }
6618 
6619       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6620       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6621       Builder.AddPlaceholderChunk("NSUInteger");
6622       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6623       Builder.AddTextChunk("index");
6624       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6625       Builder.AddTypedTextChunk("withObject:");
6626       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6627       Builder.AddTextChunk("id");
6628       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6629       Builder.AddTextChunk("object");
6630       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6631                                CXCursor_ObjCInstanceMethodDecl));
6632     }
6633   }
6634 
6635   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
6636   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6637     std::string SelectorName1
6638       = (Twine("replace") + UpperKey + "AtIndexes").str();
6639     std::string SelectorName2 = (Twine("with") + UpperKey).str();
6640     IdentifierInfo *SelectorIds[2] = {
6641       &Context.Idents.get(SelectorName1),
6642       &Context.Idents.get(SelectorName2)
6643     };
6644 
6645     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
6646       if (ReturnType.isNull()) {
6647         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6648         Builder.AddTextChunk("void");
6649         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6650       }
6651 
6652       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
6653       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6654       Builder.AddPlaceholderChunk("NSIndexSet *");
6655       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6656       Builder.AddTextChunk("indexes");
6657       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6658       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
6659       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6660       Builder.AddTextChunk("NSArray *");
6661       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6662       Builder.AddTextChunk("array");
6663       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6664                                CXCursor_ObjCInstanceMethodDecl));
6665     }
6666   }
6667 
6668   // Unordered getters
6669   // - (NSEnumerator *)enumeratorOfKey
6670   if (IsInstanceMethod &&
6671       (ReturnType.isNull() ||
6672        (ReturnType->isObjCObjectPointerType() &&
6673         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6674         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6675           ->getName() == "NSEnumerator"))) {
6676     std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str();
6677     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6678     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
6679             .second) {
6680       if (ReturnType.isNull()) {
6681         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6682         Builder.AddTextChunk("NSEnumerator *");
6683         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6684       }
6685 
6686       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6687       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
6688                               CXCursor_ObjCInstanceMethodDecl));
6689     }
6690   }
6691 
6692   // - (type *)memberOfKey:(type *)object
6693   if (IsInstanceMethod &&
6694       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
6695     std::string SelectorName = (Twine("memberOf") + UpperKey).str();
6696     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6697     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
6698       if (ReturnType.isNull()) {
6699         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6700         Builder.AddPlaceholderChunk("object-type");
6701         Builder.AddTextChunk(" *");
6702         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6703       }
6704 
6705       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6706       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6707       if (ReturnType.isNull()) {
6708         Builder.AddPlaceholderChunk("object-type");
6709         Builder.AddTextChunk(" *");
6710       } else {
6711         Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context,
6712                                                      Policy,
6713                                                      Builder.getAllocator()));
6714       }
6715       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6716       Builder.AddTextChunk("object");
6717       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
6718                                CXCursor_ObjCInstanceMethodDecl));
6719     }
6720   }
6721 
6722   // Mutable unordered accessors
6723   // - (void)addKeyObject:(type *)object
6724   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6725     std::string SelectorName
6726       = (Twine("add") + UpperKey + Twine("Object")).str();
6727     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6728     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
6729       if (ReturnType.isNull()) {
6730         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6731         Builder.AddTextChunk("void");
6732         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6733       }
6734 
6735       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6736       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6737       Builder.AddPlaceholderChunk("object-type");
6738       Builder.AddTextChunk(" *");
6739       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6740       Builder.AddTextChunk("object");
6741       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6742                                CXCursor_ObjCInstanceMethodDecl));
6743     }
6744   }
6745 
6746   // - (void)addKey:(NSSet *)objects
6747   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6748     std::string SelectorName = (Twine("add") + UpperKey).str();
6749     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6750     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
6751       if (ReturnType.isNull()) {
6752         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6753         Builder.AddTextChunk("void");
6754         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6755       }
6756 
6757       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6758       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6759       Builder.AddTextChunk("NSSet *");
6760       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6761       Builder.AddTextChunk("objects");
6762       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6763                                CXCursor_ObjCInstanceMethodDecl));
6764     }
6765   }
6766 
6767   // - (void)removeKeyObject:(type *)object
6768   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6769     std::string SelectorName
6770       = (Twine("remove") + UpperKey + Twine("Object")).str();
6771     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6772     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
6773       if (ReturnType.isNull()) {
6774         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6775         Builder.AddTextChunk("void");
6776         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6777       }
6778 
6779       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6780       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6781       Builder.AddPlaceholderChunk("object-type");
6782       Builder.AddTextChunk(" *");
6783       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6784       Builder.AddTextChunk("object");
6785       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6786                                CXCursor_ObjCInstanceMethodDecl));
6787     }
6788   }
6789 
6790   // - (void)removeKey:(NSSet *)objects
6791   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6792     std::string SelectorName = (Twine("remove") + UpperKey).str();
6793     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6794     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
6795       if (ReturnType.isNull()) {
6796         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6797         Builder.AddTextChunk("void");
6798         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6799       }
6800 
6801       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6802       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6803       Builder.AddTextChunk("NSSet *");
6804       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6805       Builder.AddTextChunk("objects");
6806       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6807                                CXCursor_ObjCInstanceMethodDecl));
6808     }
6809   }
6810 
6811   // - (void)intersectKey:(NSSet *)objects
6812   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6813     std::string SelectorName = (Twine("intersect") + UpperKey).str();
6814     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6815     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
6816       if (ReturnType.isNull()) {
6817         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6818         Builder.AddTextChunk("void");
6819         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6820       }
6821 
6822       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6823       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6824       Builder.AddTextChunk("NSSet *");
6825       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6826       Builder.AddTextChunk("objects");
6827       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6828                                CXCursor_ObjCInstanceMethodDecl));
6829     }
6830   }
6831 
6832   // Key-Value Observing
6833   // + (NSSet *)keyPathsForValuesAffectingKey
6834   if (!IsInstanceMethod &&
6835       (ReturnType.isNull() ||
6836        (ReturnType->isObjCObjectPointerType() &&
6837         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6838         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6839                                                     ->getName() == "NSSet"))) {
6840     std::string SelectorName
6841       = (Twine("keyPathsForValuesAffecting") + UpperKey).str();
6842     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6843     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
6844             .second) {
6845       if (ReturnType.isNull()) {
6846         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6847         Builder.AddTextChunk("NSSet *");
6848         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6849       }
6850 
6851       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6852       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6853                               CXCursor_ObjCClassMethodDecl));
6854     }
6855   }
6856 
6857   // + (BOOL)automaticallyNotifiesObserversForKey
6858   if (!IsInstanceMethod &&
6859       (ReturnType.isNull() ||
6860        ReturnType->isIntegerType() ||
6861        ReturnType->isBooleanType())) {
6862     std::string SelectorName
6863       = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str();
6864     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6865     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
6866             .second) {
6867       if (ReturnType.isNull()) {
6868         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6869         Builder.AddTextChunk("BOOL");
6870         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6871       }
6872 
6873       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6874       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6875                               CXCursor_ObjCClassMethodDecl));
6876     }
6877   }
6878 }
6879 
6880 void Sema::CodeCompleteObjCMethodDecl(Scope *S,
6881                                       bool IsInstanceMethod,
6882                                       ParsedType ReturnTy) {
6883   // Determine the return type of the method we're declaring, if
6884   // provided.
6885   QualType ReturnType = GetTypeFromParser(ReturnTy);
6886   Decl *IDecl = nullptr;
6887   if (CurContext->isObjCContainer()) {
6888       ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext);
6889       IDecl = cast<Decl>(OCD);
6890   }
6891   // Determine where we should start searching for methods.
6892   ObjCContainerDecl *SearchDecl = nullptr;
6893   bool IsInImplementation = false;
6894   if (Decl *D = IDecl) {
6895     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
6896       SearchDecl = Impl->getClassInterface();
6897       IsInImplementation = true;
6898     } else if (ObjCCategoryImplDecl *CatImpl
6899                                          = dyn_cast<ObjCCategoryImplDecl>(D)) {
6900       SearchDecl = CatImpl->getCategoryDecl();
6901       IsInImplementation = true;
6902     } else
6903       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
6904   }
6905 
6906   if (!SearchDecl && S) {
6907     if (DeclContext *DC = S->getEntity())
6908       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
6909   }
6910 
6911   if (!SearchDecl) {
6912     HandleCodeCompleteResults(this, CodeCompleter,
6913                               CodeCompletionContext::CCC_Other,
6914                               nullptr, 0);
6915     return;
6916   }
6917 
6918   // Find all of the methods that we could declare/implement here.
6919   KnownMethodsMap KnownMethods;
6920   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod,
6921                            ReturnType, KnownMethods);
6922 
6923   // Add declarations or definitions for each of the known methods.
6924   typedef CodeCompletionResult Result;
6925   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6926                         CodeCompleter->getCodeCompletionTUInfo(),
6927                         CodeCompletionContext::CCC_Other);
6928   Results.EnterNewScope();
6929   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
6930   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
6931                               MEnd = KnownMethods.end();
6932        M != MEnd; ++M) {
6933     ObjCMethodDecl *Method = M->second.getPointer();
6934     CodeCompletionBuilder Builder(Results.getAllocator(),
6935                                   Results.getCodeCompletionTUInfo());
6936 
6937     // If the result type was not already provided, add it to the
6938     // pattern as (type).
6939     if (ReturnType.isNull())
6940       AddObjCPassingTypeChunk(Method->getReturnType(),
6941                               Method->getObjCDeclQualifier(), Context, Policy,
6942                               Builder);
6943 
6944     Selector Sel = Method->getSelector();
6945 
6946     // Add the first part of the selector to the pattern.
6947     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6948                                                        Sel.getNameForSlot(0)));
6949 
6950     // Add parameters to the pattern.
6951     unsigned I = 0;
6952     for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
6953                                      PEnd = Method->param_end();
6954          P != PEnd; (void)++P, ++I) {
6955       // Add the part of the selector name.
6956       if (I == 0)
6957         Builder.AddTypedTextChunk(":");
6958       else if (I < Sel.getNumArgs()) {
6959         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6960         Builder.AddTypedTextChunk(
6961                 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6962       } else
6963         break;
6964 
6965       // Add the parameter type.
6966       AddObjCPassingTypeChunk((*P)->getOriginalType(),
6967                               (*P)->getObjCDeclQualifier(),
6968                               Context, Policy,
6969                               Builder);
6970 
6971       if (IdentifierInfo *Id = (*P)->getIdentifier())
6972         Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName()));
6973     }
6974 
6975     if (Method->isVariadic()) {
6976       if (Method->param_size() > 0)
6977         Builder.AddChunk(CodeCompletionString::CK_Comma);
6978       Builder.AddTextChunk("...");
6979     }
6980 
6981     if (IsInImplementation && Results.includeCodePatterns()) {
6982       // We will be defining the method here, so add a compound statement.
6983       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6984       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6985       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6986       if (!Method->getReturnType()->isVoidType()) {
6987         // If the result type is not void, add a return clause.
6988         Builder.AddTextChunk("return");
6989         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6990         Builder.AddPlaceholderChunk("expression");
6991         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
6992       } else
6993         Builder.AddPlaceholderChunk("statements");
6994 
6995       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6996       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6997     }
6998 
6999     unsigned Priority = CCP_CodePattern;
7000     if (!M->second.getInt())
7001       Priority += CCD_InBaseClass;
7002 
7003     Results.AddResult(Result(Builder.TakeString(), Method, Priority));
7004   }
7005 
7006   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
7007   // the properties in this class and its categories.
7008   if (Context.getLangOpts().ObjC2) {
7009     SmallVector<ObjCContainerDecl *, 4> Containers;
7010     Containers.push_back(SearchDecl);
7011 
7012     VisitedSelectorSet KnownSelectors;
7013     for (KnownMethodsMap::iterator M = KnownMethods.begin(),
7014                                 MEnd = KnownMethods.end();
7015          M != MEnd; ++M)
7016       KnownSelectors.insert(M->first);
7017 
7018 
7019     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
7020     if (!IFace)
7021       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
7022         IFace = Category->getClassInterface();
7023 
7024     if (IFace)
7025       for (auto *Cat : IFace->visible_categories())
7026         Containers.push_back(Cat);
7027 
7028     for (unsigned I = 0, N = Containers.size(); I != N; ++I)
7029       for (auto *P : Containers[I]->properties())
7030         AddObjCKeyValueCompletions(P, IsInstanceMethod, ReturnType, Context,
7031                                    KnownSelectors, Results);
7032   }
7033 
7034   Results.ExitScope();
7035 
7036   HandleCodeCompleteResults(this, CodeCompleter,
7037                             CodeCompletionContext::CCC_Other,
7038                             Results.data(),Results.size());
7039 }
7040 
7041 void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S,
7042                                               bool IsInstanceMethod,
7043                                               bool AtParameterName,
7044                                               ParsedType ReturnTy,
7045                                          ArrayRef<IdentifierInfo *> SelIdents) {
7046   // If we have an external source, load the entire class method
7047   // pool from the AST file.
7048   if (ExternalSource) {
7049     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
7050          I != N; ++I) {
7051       Selector Sel = ExternalSource->GetExternalSelector(I);
7052       if (Sel.isNull() || MethodPool.count(Sel))
7053         continue;
7054 
7055       ReadMethodPool(Sel);
7056     }
7057   }
7058 
7059   // Build the set of methods we can see.
7060   typedef CodeCompletionResult Result;
7061   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7062                         CodeCompleter->getCodeCompletionTUInfo(),
7063                         CodeCompletionContext::CCC_Other);
7064 
7065   if (ReturnTy)
7066     Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType());
7067 
7068   Results.EnterNewScope();
7069   for (GlobalMethodPool::iterator M = MethodPool.begin(),
7070                                   MEnd = MethodPool.end();
7071        M != MEnd; ++M) {
7072     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first :
7073                                                        &M->second.second;
7074          MethList && MethList->getMethod();
7075          MethList = MethList->getNext()) {
7076       if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
7077         continue;
7078 
7079       if (AtParameterName) {
7080         // Suggest parameter names we've seen before.
7081         unsigned NumSelIdents = SelIdents.size();
7082         if (NumSelIdents &&
7083             NumSelIdents <= MethList->getMethod()->param_size()) {
7084           ParmVarDecl *Param =
7085               MethList->getMethod()->parameters()[NumSelIdents - 1];
7086           if (Param->getIdentifier()) {
7087             CodeCompletionBuilder Builder(Results.getAllocator(),
7088                                           Results.getCodeCompletionTUInfo());
7089             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
7090                                            Param->getIdentifier()->getName()));
7091             Results.AddResult(Builder.TakeString());
7092           }
7093         }
7094 
7095         continue;
7096       }
7097 
7098       Result R(MethList->getMethod(),
7099                Results.getBasePriority(MethList->getMethod()), nullptr);
7100       R.StartParameter = SelIdents.size();
7101       R.AllParametersAreInformative = false;
7102       R.DeclaringEntity = true;
7103       Results.MaybeAddResult(R, CurContext);
7104     }
7105   }
7106 
7107   Results.ExitScope();
7108   HandleCodeCompleteResults(this, CodeCompleter,
7109                             CodeCompletionContext::CCC_Other,
7110                             Results.data(),Results.size());
7111 }
7112 
7113 void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
7114   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7115                         CodeCompleter->getCodeCompletionTUInfo(),
7116                         CodeCompletionContext::CCC_PreprocessorDirective);
7117   Results.EnterNewScope();
7118 
7119   // #if <condition>
7120   CodeCompletionBuilder Builder(Results.getAllocator(),
7121                                 Results.getCodeCompletionTUInfo());
7122   Builder.AddTypedTextChunk("if");
7123   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7124   Builder.AddPlaceholderChunk("condition");
7125   Results.AddResult(Builder.TakeString());
7126 
7127   // #ifdef <macro>
7128   Builder.AddTypedTextChunk("ifdef");
7129   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7130   Builder.AddPlaceholderChunk("macro");
7131   Results.AddResult(Builder.TakeString());
7132 
7133   // #ifndef <macro>
7134   Builder.AddTypedTextChunk("ifndef");
7135   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7136   Builder.AddPlaceholderChunk("macro");
7137   Results.AddResult(Builder.TakeString());
7138 
7139   if (InConditional) {
7140     // #elif <condition>
7141     Builder.AddTypedTextChunk("elif");
7142     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7143     Builder.AddPlaceholderChunk("condition");
7144     Results.AddResult(Builder.TakeString());
7145 
7146     // #else
7147     Builder.AddTypedTextChunk("else");
7148     Results.AddResult(Builder.TakeString());
7149 
7150     // #endif
7151     Builder.AddTypedTextChunk("endif");
7152     Results.AddResult(Builder.TakeString());
7153   }
7154 
7155   // #include "header"
7156   Builder.AddTypedTextChunk("include");
7157   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7158   Builder.AddTextChunk("\"");
7159   Builder.AddPlaceholderChunk("header");
7160   Builder.AddTextChunk("\"");
7161   Results.AddResult(Builder.TakeString());
7162 
7163   // #include <header>
7164   Builder.AddTypedTextChunk("include");
7165   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7166   Builder.AddTextChunk("<");
7167   Builder.AddPlaceholderChunk("header");
7168   Builder.AddTextChunk(">");
7169   Results.AddResult(Builder.TakeString());
7170 
7171   // #define <macro>
7172   Builder.AddTypedTextChunk("define");
7173   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7174   Builder.AddPlaceholderChunk("macro");
7175   Results.AddResult(Builder.TakeString());
7176 
7177   // #define <macro>(<args>)
7178   Builder.AddTypedTextChunk("define");
7179   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7180   Builder.AddPlaceholderChunk("macro");
7181   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7182   Builder.AddPlaceholderChunk("args");
7183   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7184   Results.AddResult(Builder.TakeString());
7185 
7186   // #undef <macro>
7187   Builder.AddTypedTextChunk("undef");
7188   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7189   Builder.AddPlaceholderChunk("macro");
7190   Results.AddResult(Builder.TakeString());
7191 
7192   // #line <number>
7193   Builder.AddTypedTextChunk("line");
7194   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7195   Builder.AddPlaceholderChunk("number");
7196   Results.AddResult(Builder.TakeString());
7197 
7198   // #line <number> "filename"
7199   Builder.AddTypedTextChunk("line");
7200   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7201   Builder.AddPlaceholderChunk("number");
7202   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7203   Builder.AddTextChunk("\"");
7204   Builder.AddPlaceholderChunk("filename");
7205   Builder.AddTextChunk("\"");
7206   Results.AddResult(Builder.TakeString());
7207 
7208   // #error <message>
7209   Builder.AddTypedTextChunk("error");
7210   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7211   Builder.AddPlaceholderChunk("message");
7212   Results.AddResult(Builder.TakeString());
7213 
7214   // #pragma <arguments>
7215   Builder.AddTypedTextChunk("pragma");
7216   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7217   Builder.AddPlaceholderChunk("arguments");
7218   Results.AddResult(Builder.TakeString());
7219 
7220   if (getLangOpts().ObjC1) {
7221     // #import "header"
7222     Builder.AddTypedTextChunk("import");
7223     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7224     Builder.AddTextChunk("\"");
7225     Builder.AddPlaceholderChunk("header");
7226     Builder.AddTextChunk("\"");
7227     Results.AddResult(Builder.TakeString());
7228 
7229     // #import <header>
7230     Builder.AddTypedTextChunk("import");
7231     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7232     Builder.AddTextChunk("<");
7233     Builder.AddPlaceholderChunk("header");
7234     Builder.AddTextChunk(">");
7235     Results.AddResult(Builder.TakeString());
7236   }
7237 
7238   // #include_next "header"
7239   Builder.AddTypedTextChunk("include_next");
7240   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7241   Builder.AddTextChunk("\"");
7242   Builder.AddPlaceholderChunk("header");
7243   Builder.AddTextChunk("\"");
7244   Results.AddResult(Builder.TakeString());
7245 
7246   // #include_next <header>
7247   Builder.AddTypedTextChunk("include_next");
7248   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7249   Builder.AddTextChunk("<");
7250   Builder.AddPlaceholderChunk("header");
7251   Builder.AddTextChunk(">");
7252   Results.AddResult(Builder.TakeString());
7253 
7254   // #warning <message>
7255   Builder.AddTypedTextChunk("warning");
7256   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7257   Builder.AddPlaceholderChunk("message");
7258   Results.AddResult(Builder.TakeString());
7259 
7260   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
7261   // completions for them. And __include_macros is a Clang-internal extension
7262   // that we don't want to encourage anyone to use.
7263 
7264   // FIXME: we don't support #assert or #unassert, so don't suggest them.
7265   Results.ExitScope();
7266 
7267   HandleCodeCompleteResults(this, CodeCompleter,
7268                             CodeCompletionContext::CCC_PreprocessorDirective,
7269                             Results.data(), Results.size());
7270 }
7271 
7272 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
7273   CodeCompleteOrdinaryName(S,
7274                            S->getFnParent()? Sema::PCC_RecoveryInFunction
7275                                            : Sema::PCC_Namespace);
7276 }
7277 
7278 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
7279   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7280                         CodeCompleter->getCodeCompletionTUInfo(),
7281                         IsDefinition? CodeCompletionContext::CCC_MacroName
7282                                     : CodeCompletionContext::CCC_MacroNameUse);
7283   if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
7284     // Add just the names of macros, not their arguments.
7285     CodeCompletionBuilder Builder(Results.getAllocator(),
7286                                   Results.getCodeCompletionTUInfo());
7287     Results.EnterNewScope();
7288     for (Preprocessor::macro_iterator M = PP.macro_begin(),
7289                                    MEnd = PP.macro_end();
7290          M != MEnd; ++M) {
7291       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
7292                                            M->first->getName()));
7293       Results.AddResult(CodeCompletionResult(Builder.TakeString(),
7294                                              CCP_CodePattern,
7295                                              CXCursor_MacroDefinition));
7296     }
7297     Results.ExitScope();
7298   } else if (IsDefinition) {
7299     // FIXME: Can we detect when the user just wrote an include guard above?
7300   }
7301 
7302   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7303                             Results.data(), Results.size());
7304 }
7305 
7306 void Sema::CodeCompletePreprocessorExpression() {
7307   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7308                         CodeCompleter->getCodeCompletionTUInfo(),
7309                         CodeCompletionContext::CCC_PreprocessorExpression);
7310 
7311   if (!CodeCompleter || CodeCompleter->includeMacros())
7312     AddMacroResults(PP, Results, true);
7313 
7314     // defined (<macro>)
7315   Results.EnterNewScope();
7316   CodeCompletionBuilder Builder(Results.getAllocator(),
7317                                 Results.getCodeCompletionTUInfo());
7318   Builder.AddTypedTextChunk("defined");
7319   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7320   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7321   Builder.AddPlaceholderChunk("macro");
7322   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7323   Results.AddResult(Builder.TakeString());
7324   Results.ExitScope();
7325 
7326   HandleCodeCompleteResults(this, CodeCompleter,
7327                             CodeCompletionContext::CCC_PreprocessorExpression,
7328                             Results.data(), Results.size());
7329 }
7330 
7331 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
7332                                                  IdentifierInfo *Macro,
7333                                                  MacroInfo *MacroInfo,
7334                                                  unsigned Argument) {
7335   // FIXME: In the future, we could provide "overload" results, much like we
7336   // do for function calls.
7337 
7338   // Now just ignore this. There will be another code-completion callback
7339   // for the expanded tokens.
7340 }
7341 
7342 void Sema::CodeCompleteNaturalLanguage() {
7343   HandleCodeCompleteResults(this, CodeCompleter,
7344                             CodeCompletionContext::CCC_NaturalLanguage,
7345                             nullptr, 0);
7346 }
7347 
7348 void Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator,
7349                                        CodeCompletionTUInfo &CCTUInfo,
7350                  SmallVectorImpl<CodeCompletionResult> &Results) {
7351   ResultBuilder Builder(*this, Allocator, CCTUInfo,
7352                         CodeCompletionContext::CCC_Recovery);
7353   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
7354     CodeCompletionDeclConsumer Consumer(Builder,
7355                                         Context.getTranslationUnitDecl());
7356     LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName,
7357                        Consumer);
7358   }
7359 
7360   if (!CodeCompleter || CodeCompleter->includeMacros())
7361     AddMacroResults(PP, Builder, true);
7362 
7363   Results.clear();
7364   Results.insert(Results.end(),
7365                  Builder.data(), Builder.data() + Builder.size());
7366 }
7367