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