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