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     virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx,
1258                            bool InBaseClass) {
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       Results.AddResult(Result(M->first,
2992                              getMacroUsagePriority(M->first->getName(),
2993                                                    PP.getLangOpts(),
2994                                                    TargetTypeIsPointer)));
2995   }
2996 
2997   Results.ExitScope();
2998 
2999 }
3000 
3001 static void AddPrettyFunctionResults(const LangOptions &LangOpts,
3002                                      ResultBuilder &Results) {
3003   typedef CodeCompletionResult Result;
3004 
3005   Results.EnterNewScope();
3006 
3007   Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant));
3008   Results.AddResult(Result("__FUNCTION__", CCP_Constant));
3009   if (LangOpts.C99 || LangOpts.CPlusPlus11)
3010     Results.AddResult(Result("__func__", CCP_Constant));
3011   Results.ExitScope();
3012 }
3013 
3014 static void HandleCodeCompleteResults(Sema *S,
3015                                       CodeCompleteConsumer *CodeCompleter,
3016                                       CodeCompletionContext Context,
3017                                       CodeCompletionResult *Results,
3018                                       unsigned NumResults) {
3019   if (CodeCompleter)
3020     CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults);
3021 }
3022 
3023 static enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S,
3024                                             Sema::ParserCompletionContext PCC) {
3025   switch (PCC) {
3026   case Sema::PCC_Namespace:
3027     return CodeCompletionContext::CCC_TopLevel;
3028 
3029   case Sema::PCC_Class:
3030     return CodeCompletionContext::CCC_ClassStructUnion;
3031 
3032   case Sema::PCC_ObjCInterface:
3033     return CodeCompletionContext::CCC_ObjCInterface;
3034 
3035   case Sema::PCC_ObjCImplementation:
3036     return CodeCompletionContext::CCC_ObjCImplementation;
3037 
3038   case Sema::PCC_ObjCInstanceVariableList:
3039     return CodeCompletionContext::CCC_ObjCIvarList;
3040 
3041   case Sema::PCC_Template:
3042   case Sema::PCC_MemberTemplate:
3043     if (S.CurContext->isFileContext())
3044       return CodeCompletionContext::CCC_TopLevel;
3045     if (S.CurContext->isRecord())
3046       return CodeCompletionContext::CCC_ClassStructUnion;
3047     return CodeCompletionContext::CCC_Other;
3048 
3049   case Sema::PCC_RecoveryInFunction:
3050     return CodeCompletionContext::CCC_Recovery;
3051 
3052   case Sema::PCC_ForInit:
3053     if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 ||
3054         S.getLangOpts().ObjC1)
3055       return CodeCompletionContext::CCC_ParenthesizedExpression;
3056     else
3057       return CodeCompletionContext::CCC_Expression;
3058 
3059   case Sema::PCC_Expression:
3060   case Sema::PCC_Condition:
3061     return CodeCompletionContext::CCC_Expression;
3062 
3063   case Sema::PCC_Statement:
3064     return CodeCompletionContext::CCC_Statement;
3065 
3066   case Sema::PCC_Type:
3067     return CodeCompletionContext::CCC_Type;
3068 
3069   case Sema::PCC_ParenthesizedExpression:
3070     return CodeCompletionContext::CCC_ParenthesizedExpression;
3071 
3072   case Sema::PCC_LocalDeclarationSpecifiers:
3073     return CodeCompletionContext::CCC_Type;
3074   }
3075 
3076   llvm_unreachable("Invalid ParserCompletionContext!");
3077 }
3078 
3079 /// \brief If we're in a C++ virtual member function, add completion results
3080 /// that invoke the functions we override, since it's common to invoke the
3081 /// overridden function as well as adding new functionality.
3082 ///
3083 /// \param S The semantic analysis object for which we are generating results.
3084 ///
3085 /// \param InContext This context in which the nested-name-specifier preceding
3086 /// the code-completion point
3087 static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext,
3088                                   ResultBuilder &Results) {
3089   // Look through blocks.
3090   DeclContext *CurContext = S.CurContext;
3091   while (isa<BlockDecl>(CurContext))
3092     CurContext = CurContext->getParent();
3093 
3094 
3095   CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext);
3096   if (!Method || !Method->isVirtual())
3097     return;
3098 
3099   // We need to have names for all of the parameters, if we're going to
3100   // generate a forwarding call.
3101   for (auto P : Method->params())
3102     if (!P->getDeclName())
3103       return;
3104 
3105   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
3106   for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(),
3107                                    MEnd = Method->end_overridden_methods();
3108        M != MEnd; ++M) {
3109     CodeCompletionBuilder Builder(Results.getAllocator(),
3110                                   Results.getCodeCompletionTUInfo());
3111     const CXXMethodDecl *Overridden = *M;
3112     if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl())
3113       continue;
3114 
3115     // If we need a nested-name-specifier, add one now.
3116     if (!InContext) {
3117       NestedNameSpecifier *NNS
3118         = getRequiredQualification(S.Context, CurContext,
3119                                    Overridden->getDeclContext());
3120       if (NNS) {
3121         std::string Str;
3122         llvm::raw_string_ostream OS(Str);
3123         NNS->print(OS, Policy);
3124         Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str()));
3125       }
3126     } else if (!InContext->Equals(Overridden->getDeclContext()))
3127       continue;
3128 
3129     Builder.AddTypedTextChunk(Results.getAllocator().CopyString(
3130                                          Overridden->getNameAsString()));
3131     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3132     bool FirstParam = true;
3133     for (auto P : Method->params()) {
3134       if (FirstParam)
3135         FirstParam = false;
3136       else
3137         Builder.AddChunk(CodeCompletionString::CK_Comma);
3138 
3139       Builder.AddPlaceholderChunk(
3140           Results.getAllocator().CopyString(P->getIdentifier()->getName()));
3141     }
3142     Builder.AddChunk(CodeCompletionString::CK_RightParen);
3143     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
3144                                            CCP_SuperCompletion,
3145                                            CXCursor_CXXMethod,
3146                                            CXAvailability_Available,
3147                                            Overridden));
3148     Results.Ignore(Overridden);
3149   }
3150 }
3151 
3152 void Sema::CodeCompleteModuleImport(SourceLocation ImportLoc,
3153                                     ModuleIdPath Path) {
3154   typedef CodeCompletionResult Result;
3155   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3156                         CodeCompleter->getCodeCompletionTUInfo(),
3157                         CodeCompletionContext::CCC_Other);
3158   Results.EnterNewScope();
3159 
3160   CodeCompletionAllocator &Allocator = Results.getAllocator();
3161   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
3162   typedef CodeCompletionResult Result;
3163   if (Path.empty()) {
3164     // Enumerate all top-level modules.
3165     SmallVector<Module *, 8> Modules;
3166     PP.getHeaderSearchInfo().collectAllModules(Modules);
3167     for (unsigned I = 0, N = Modules.size(); I != N; ++I) {
3168       Builder.AddTypedTextChunk(
3169         Builder.getAllocator().CopyString(Modules[I]->Name));
3170       Results.AddResult(Result(Builder.TakeString(),
3171                                CCP_Declaration,
3172                                CXCursor_ModuleImportDecl,
3173                                Modules[I]->isAvailable()
3174                                  ? CXAvailability_Available
3175                                   : CXAvailability_NotAvailable));
3176     }
3177   } else if (getLangOpts().Modules) {
3178     // Load the named module.
3179     Module *Mod = PP.getModuleLoader().loadModule(ImportLoc, Path,
3180                                                   Module::AllVisible,
3181                                                 /*IsInclusionDirective=*/false);
3182     // Enumerate submodules.
3183     if (Mod) {
3184       for (Module::submodule_iterator Sub = Mod->submodule_begin(),
3185                                    SubEnd = Mod->submodule_end();
3186            Sub != SubEnd; ++Sub) {
3187 
3188         Builder.AddTypedTextChunk(
3189           Builder.getAllocator().CopyString((*Sub)->Name));
3190         Results.AddResult(Result(Builder.TakeString(),
3191                                  CCP_Declaration,
3192                                  CXCursor_ModuleImportDecl,
3193                                  (*Sub)->isAvailable()
3194                                    ? CXAvailability_Available
3195                                    : CXAvailability_NotAvailable));
3196       }
3197     }
3198   }
3199   Results.ExitScope();
3200   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
3201                             Results.data(),Results.size());
3202 }
3203 
3204 void Sema::CodeCompleteOrdinaryName(Scope *S,
3205                                     ParserCompletionContext CompletionContext) {
3206   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3207                         CodeCompleter->getCodeCompletionTUInfo(),
3208                         mapCodeCompletionContext(*this, CompletionContext));
3209   Results.EnterNewScope();
3210 
3211   // Determine how to filter results, e.g., so that the names of
3212   // values (functions, enumerators, function templates, etc.) are
3213   // only allowed where we can have an expression.
3214   switch (CompletionContext) {
3215   case PCC_Namespace:
3216   case PCC_Class:
3217   case PCC_ObjCInterface:
3218   case PCC_ObjCImplementation:
3219   case PCC_ObjCInstanceVariableList:
3220   case PCC_Template:
3221   case PCC_MemberTemplate:
3222   case PCC_Type:
3223   case PCC_LocalDeclarationSpecifiers:
3224     Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
3225     break;
3226 
3227   case PCC_Statement:
3228   case PCC_ParenthesizedExpression:
3229   case PCC_Expression:
3230   case PCC_ForInit:
3231   case PCC_Condition:
3232     if (WantTypesInContext(CompletionContext, getLangOpts()))
3233       Results.setFilter(&ResultBuilder::IsOrdinaryName);
3234     else
3235       Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
3236 
3237     if (getLangOpts().CPlusPlus)
3238       MaybeAddOverrideCalls(*this, /*InContext=*/0, Results);
3239     break;
3240 
3241   case PCC_RecoveryInFunction:
3242     // Unfiltered
3243     break;
3244   }
3245 
3246   // If we are in a C++ non-static member function, check the qualifiers on
3247   // the member function to filter/prioritize the results list.
3248   if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext))
3249     if (CurMethod->isInstance())
3250       Results.setObjectTypeQualifiers(
3251                       Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers()));
3252 
3253   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3254   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3255                      CodeCompleter->includeGlobals());
3256 
3257   AddOrdinaryNameResults(CompletionContext, S, *this, Results);
3258   Results.ExitScope();
3259 
3260   switch (CompletionContext) {
3261   case PCC_ParenthesizedExpression:
3262   case PCC_Expression:
3263   case PCC_Statement:
3264   case PCC_RecoveryInFunction:
3265     if (S->getFnParent())
3266       AddPrettyFunctionResults(PP.getLangOpts(), Results);
3267     break;
3268 
3269   case PCC_Namespace:
3270   case PCC_Class:
3271   case PCC_ObjCInterface:
3272   case PCC_ObjCImplementation:
3273   case PCC_ObjCInstanceVariableList:
3274   case PCC_Template:
3275   case PCC_MemberTemplate:
3276   case PCC_ForInit:
3277   case PCC_Condition:
3278   case PCC_Type:
3279   case PCC_LocalDeclarationSpecifiers:
3280     break;
3281   }
3282 
3283   if (CodeCompleter->includeMacros())
3284     AddMacroResults(PP, Results, false);
3285 
3286   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
3287                             Results.data(),Results.size());
3288 }
3289 
3290 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
3291                                        ParsedType Receiver,
3292                                        ArrayRef<IdentifierInfo *> SelIdents,
3293                                        bool AtArgumentExpression,
3294                                        bool IsSuper,
3295                                        ResultBuilder &Results);
3296 
3297 void Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS,
3298                                 bool AllowNonIdentifiers,
3299                                 bool AllowNestedNameSpecifiers) {
3300   typedef CodeCompletionResult Result;
3301   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3302                         CodeCompleter->getCodeCompletionTUInfo(),
3303                         AllowNestedNameSpecifiers
3304                           ? CodeCompletionContext::CCC_PotentiallyQualifiedName
3305                           : CodeCompletionContext::CCC_Name);
3306   Results.EnterNewScope();
3307 
3308   // Type qualifiers can come after names.
3309   Results.AddResult(Result("const"));
3310   Results.AddResult(Result("volatile"));
3311   if (getLangOpts().C99)
3312     Results.AddResult(Result("restrict"));
3313 
3314   if (getLangOpts().CPlusPlus) {
3315     if (AllowNonIdentifiers) {
3316       Results.AddResult(Result("operator"));
3317     }
3318 
3319     // Add nested-name-specifiers.
3320     if (AllowNestedNameSpecifiers) {
3321       Results.allowNestedNameSpecifiers();
3322       Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy);
3323       CodeCompletionDeclConsumer Consumer(Results, CurContext);
3324       LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer,
3325                          CodeCompleter->includeGlobals());
3326       Results.setFilter(0);
3327     }
3328   }
3329   Results.ExitScope();
3330 
3331   // If we're in a context where we might have an expression (rather than a
3332   // declaration), and what we've seen so far is an Objective-C type that could
3333   // be a receiver of a class message, this may be a class message send with
3334   // the initial opening bracket '[' missing. Add appropriate completions.
3335   if (AllowNonIdentifiers && !AllowNestedNameSpecifiers &&
3336       DS.getParsedSpecifiers() == DeclSpec::PQ_TypeSpecifier &&
3337       DS.getTypeSpecType() == DeclSpec::TST_typename &&
3338       DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified &&
3339       DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
3340       !DS.isTypeAltiVecVector() &&
3341       S &&
3342       (S->getFlags() & Scope::DeclScope) != 0 &&
3343       (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope |
3344                         Scope::FunctionPrototypeScope |
3345                         Scope::AtCatchScope)) == 0) {
3346     ParsedType T = DS.getRepAsType();
3347     if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType())
3348       AddClassMessageCompletions(*this, S, T, None, false, false, Results);
3349   }
3350 
3351   // Note that we intentionally suppress macro results here, since we do not
3352   // encourage using macros to produce the names of entities.
3353 
3354   HandleCodeCompleteResults(this, CodeCompleter,
3355                             Results.getCompletionContext(),
3356                             Results.data(), Results.size());
3357 }
3358 
3359 struct Sema::CodeCompleteExpressionData {
3360   CodeCompleteExpressionData(QualType PreferredType = QualType())
3361     : PreferredType(PreferredType), IntegralConstantExpression(false),
3362       ObjCCollection(false) { }
3363 
3364   QualType PreferredType;
3365   bool IntegralConstantExpression;
3366   bool ObjCCollection;
3367   SmallVector<Decl *, 4> IgnoreDecls;
3368 };
3369 
3370 /// \brief Perform code-completion in an expression context when we know what
3371 /// type we're looking for.
3372 void Sema::CodeCompleteExpression(Scope *S,
3373                                   const CodeCompleteExpressionData &Data) {
3374   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3375                         CodeCompleter->getCodeCompletionTUInfo(),
3376                         CodeCompletionContext::CCC_Expression);
3377   if (Data.ObjCCollection)
3378     Results.setFilter(&ResultBuilder::IsObjCCollection);
3379   else if (Data.IntegralConstantExpression)
3380     Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
3381   else if (WantTypesInContext(PCC_Expression, getLangOpts()))
3382     Results.setFilter(&ResultBuilder::IsOrdinaryName);
3383   else
3384     Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
3385 
3386   if (!Data.PreferredType.isNull())
3387     Results.setPreferredType(Data.PreferredType.getNonReferenceType());
3388 
3389   // Ignore any declarations that we were told that we don't care about.
3390   for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I)
3391     Results.Ignore(Data.IgnoreDecls[I]);
3392 
3393   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3394   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3395                      CodeCompleter->includeGlobals());
3396 
3397   Results.EnterNewScope();
3398   AddOrdinaryNameResults(PCC_Expression, S, *this, Results);
3399   Results.ExitScope();
3400 
3401   bool PreferredTypeIsPointer = false;
3402   if (!Data.PreferredType.isNull())
3403     PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType()
3404       || Data.PreferredType->isMemberPointerType()
3405       || Data.PreferredType->isBlockPointerType();
3406 
3407   if (S->getFnParent() &&
3408       !Data.ObjCCollection &&
3409       !Data.IntegralConstantExpression)
3410     AddPrettyFunctionResults(PP.getLangOpts(), Results);
3411 
3412   if (CodeCompleter->includeMacros())
3413     AddMacroResults(PP, Results, false, PreferredTypeIsPointer);
3414   HandleCodeCompleteResults(this, CodeCompleter,
3415                 CodeCompletionContext(CodeCompletionContext::CCC_Expression,
3416                                       Data.PreferredType),
3417                             Results.data(),Results.size());
3418 }
3419 
3420 void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) {
3421   if (E.isInvalid())
3422     CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction);
3423   else if (getLangOpts().ObjC1)
3424     CodeCompleteObjCInstanceMessage(S, E.take(), None, false);
3425 }
3426 
3427 /// \brief The set of properties that have already been added, referenced by
3428 /// property name.
3429 typedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet;
3430 
3431 /// \brief Retrieve the container definition, if any?
3432 static ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) {
3433   if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) {
3434     if (Interface->hasDefinition())
3435       return Interface->getDefinition();
3436 
3437     return Interface;
3438   }
3439 
3440   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
3441     if (Protocol->hasDefinition())
3442       return Protocol->getDefinition();
3443 
3444     return Protocol;
3445   }
3446   return Container;
3447 }
3448 
3449 static void AddObjCProperties(ObjCContainerDecl *Container,
3450                               bool AllowCategories,
3451                               bool AllowNullaryMethods,
3452                               DeclContext *CurContext,
3453                               AddedPropertiesSet &AddedProperties,
3454                               ResultBuilder &Results) {
3455   typedef CodeCompletionResult Result;
3456 
3457   // Retrieve the definition.
3458   Container = getContainerDef(Container);
3459 
3460   // Add properties in this container.
3461   for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(),
3462                                      PEnd = Container->prop_end();
3463        P != PEnd;
3464        ++P) {
3465     if (AddedProperties.insert(P->getIdentifier()))
3466       Results.MaybeAddResult(Result(*P, Results.getBasePriority(*P), 0),
3467                              CurContext);
3468   }
3469 
3470   // Add nullary methods
3471   if (AllowNullaryMethods) {
3472     ASTContext &Context = Container->getASTContext();
3473     PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
3474     for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
3475                                          MEnd = Container->meth_end();
3476          M != MEnd; ++M) {
3477       if (M->getSelector().isUnarySelector())
3478         if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0))
3479           if (AddedProperties.insert(Name)) {
3480             CodeCompletionBuilder Builder(Results.getAllocator(),
3481                                           Results.getCodeCompletionTUInfo());
3482             AddResultTypeChunk(Context, Policy, *M, Builder);
3483             Builder.AddTypedTextChunk(
3484                             Results.getAllocator().CopyString(Name->getName()));
3485 
3486             Results.MaybeAddResult(Result(Builder.TakeString(), *M,
3487                                   CCP_MemberDeclaration + CCD_MethodAsProperty),
3488                                           CurContext);
3489           }
3490     }
3491   }
3492 
3493 
3494   // Add properties in referenced protocols.
3495   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
3496     for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(),
3497                                           PEnd = Protocol->protocol_end();
3498          P != PEnd; ++P)
3499       AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext,
3500                         AddedProperties, Results);
3501   } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){
3502     if (AllowCategories) {
3503       // Look through categories.
3504       for (ObjCInterfaceDecl::known_categories_iterator
3505              Cat = IFace->known_categories_begin(),
3506              CatEnd = IFace->known_categories_end();
3507            Cat != CatEnd; ++Cat)
3508         AddObjCProperties(*Cat, AllowCategories, AllowNullaryMethods,
3509                           CurContext, AddedProperties, Results);
3510     }
3511 
3512     // Look through protocols.
3513     for (ObjCInterfaceDecl::all_protocol_iterator
3514          I = IFace->all_referenced_protocol_begin(),
3515          E = IFace->all_referenced_protocol_end(); I != E; ++I)
3516       AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext,
3517                         AddedProperties, Results);
3518 
3519     // Look in the superclass.
3520     if (IFace->getSuperClass())
3521       AddObjCProperties(IFace->getSuperClass(), AllowCategories,
3522                         AllowNullaryMethods, CurContext,
3523                         AddedProperties, Results);
3524   } else if (const ObjCCategoryDecl *Category
3525                                     = dyn_cast<ObjCCategoryDecl>(Container)) {
3526     // Look through protocols.
3527     for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(),
3528                                           PEnd = Category->protocol_end();
3529          P != PEnd; ++P)
3530       AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext,
3531                         AddedProperties, Results);
3532   }
3533 }
3534 
3535 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base,
3536                                            SourceLocation OpLoc,
3537                                            bool IsArrow) {
3538   if (!Base || !CodeCompleter)
3539     return;
3540 
3541   ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow);
3542   if (ConvertedBase.isInvalid())
3543     return;
3544   Base = ConvertedBase.get();
3545 
3546   typedef CodeCompletionResult Result;
3547 
3548   QualType BaseType = Base->getType();
3549 
3550   if (IsArrow) {
3551     if (const PointerType *Ptr = BaseType->getAs<PointerType>())
3552       BaseType = Ptr->getPointeeType();
3553     else if (BaseType->isObjCObjectPointerType())
3554       /*Do nothing*/ ;
3555     else
3556       return;
3557   }
3558 
3559   enum CodeCompletionContext::Kind contextKind;
3560 
3561   if (IsArrow) {
3562     contextKind = CodeCompletionContext::CCC_ArrowMemberAccess;
3563   }
3564   else {
3565     if (BaseType->isObjCObjectPointerType() ||
3566         BaseType->isObjCObjectOrInterfaceType()) {
3567       contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess;
3568     }
3569     else {
3570       contextKind = CodeCompletionContext::CCC_DotMemberAccess;
3571     }
3572   }
3573 
3574   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3575                         CodeCompleter->getCodeCompletionTUInfo(),
3576                   CodeCompletionContext(contextKind,
3577                                         BaseType),
3578                         &ResultBuilder::IsMember);
3579   Results.EnterNewScope();
3580   if (const RecordType *Record = BaseType->getAs<RecordType>()) {
3581     // Indicate that we are performing a member access, and the cv-qualifiers
3582     // for the base object type.
3583     Results.setObjectTypeQualifiers(BaseType.getQualifiers());
3584 
3585     // Access to a C/C++ class, struct, or union.
3586     Results.allowNestedNameSpecifiers();
3587     CodeCompletionDeclConsumer Consumer(Results, CurContext);
3588     LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer,
3589                        CodeCompleter->includeGlobals());
3590 
3591     if (getLangOpts().CPlusPlus) {
3592       if (!Results.empty()) {
3593         // The "template" keyword can follow "->" or "." in the grammar.
3594         // However, we only want to suggest the template keyword if something
3595         // is dependent.
3596         bool IsDependent = BaseType->isDependentType();
3597         if (!IsDependent) {
3598           for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent())
3599             if (DeclContext *Ctx = DepScope->getEntity()) {
3600               IsDependent = Ctx->isDependentContext();
3601               break;
3602             }
3603         }
3604 
3605         if (IsDependent)
3606           Results.AddResult(Result("template"));
3607       }
3608     }
3609   } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) {
3610     // Objective-C property reference.
3611     AddedPropertiesSet AddedProperties;
3612 
3613     // Add property results based on our interface.
3614     const ObjCObjectPointerType *ObjCPtr
3615       = BaseType->getAsObjCInterfacePointerType();
3616     assert(ObjCPtr && "Non-NULL pointer guaranteed above!");
3617     AddObjCProperties(ObjCPtr->getInterfaceDecl(), true,
3618                       /*AllowNullaryMethods=*/true, CurContext,
3619                       AddedProperties, Results);
3620 
3621     // Add properties from the protocols in a qualified interface.
3622     for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(),
3623                                               E = ObjCPtr->qual_end();
3624          I != E; ++I)
3625       AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext,
3626                         AddedProperties, Results);
3627   } else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
3628              (!IsArrow && BaseType->isObjCObjectType())) {
3629     // Objective-C instance variable access.
3630     ObjCInterfaceDecl *Class = 0;
3631     if (const ObjCObjectPointerType *ObjCPtr
3632                                     = BaseType->getAs<ObjCObjectPointerType>())
3633       Class = ObjCPtr->getInterfaceDecl();
3634     else
3635       Class = BaseType->getAs<ObjCObjectType>()->getInterface();
3636 
3637     // Add all ivars from this class and its superclasses.
3638     if (Class) {
3639       CodeCompletionDeclConsumer Consumer(Results, CurContext);
3640       Results.setFilter(&ResultBuilder::IsObjCIvar);
3641       LookupVisibleDecls(Class, LookupMemberName, Consumer,
3642                          CodeCompleter->includeGlobals());
3643     }
3644   }
3645 
3646   // FIXME: How do we cope with isa?
3647 
3648   Results.ExitScope();
3649 
3650   // Hand off the results found for code completion.
3651   HandleCodeCompleteResults(this, CodeCompleter,
3652                             Results.getCompletionContext(),
3653                             Results.data(),Results.size());
3654 }
3655 
3656 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) {
3657   if (!CodeCompleter)
3658     return;
3659 
3660   ResultBuilder::LookupFilter Filter = 0;
3661   enum CodeCompletionContext::Kind ContextKind
3662     = CodeCompletionContext::CCC_Other;
3663   switch ((DeclSpec::TST)TagSpec) {
3664   case DeclSpec::TST_enum:
3665     Filter = &ResultBuilder::IsEnum;
3666     ContextKind = CodeCompletionContext::CCC_EnumTag;
3667     break;
3668 
3669   case DeclSpec::TST_union:
3670     Filter = &ResultBuilder::IsUnion;
3671     ContextKind = CodeCompletionContext::CCC_UnionTag;
3672     break;
3673 
3674   case DeclSpec::TST_struct:
3675   case DeclSpec::TST_class:
3676   case DeclSpec::TST_interface:
3677     Filter = &ResultBuilder::IsClassOrStruct;
3678     ContextKind = CodeCompletionContext::CCC_ClassOrStructTag;
3679     break;
3680 
3681   default:
3682     llvm_unreachable("Unknown type specifier kind in CodeCompleteTag");
3683   }
3684 
3685   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3686                         CodeCompleter->getCodeCompletionTUInfo(), ContextKind);
3687   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3688 
3689   // First pass: look for tags.
3690   Results.setFilter(Filter);
3691   LookupVisibleDecls(S, LookupTagName, Consumer,
3692                      CodeCompleter->includeGlobals());
3693 
3694   if (CodeCompleter->includeGlobals()) {
3695     // Second pass: look for nested name specifiers.
3696     Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
3697     LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer);
3698   }
3699 
3700   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
3701                             Results.data(),Results.size());
3702 }
3703 
3704 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) {
3705   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3706                         CodeCompleter->getCodeCompletionTUInfo(),
3707                         CodeCompletionContext::CCC_TypeQualifiers);
3708   Results.EnterNewScope();
3709   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const))
3710     Results.AddResult("const");
3711   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile))
3712     Results.AddResult("volatile");
3713   if (getLangOpts().C99 &&
3714       !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict))
3715     Results.AddResult("restrict");
3716   if (getLangOpts().C11 &&
3717       !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic))
3718     Results.AddResult("_Atomic");
3719   Results.ExitScope();
3720   HandleCodeCompleteResults(this, CodeCompleter,
3721                             Results.getCompletionContext(),
3722                             Results.data(), Results.size());
3723 }
3724 
3725 void Sema::CodeCompleteCase(Scope *S) {
3726   if (getCurFunction()->SwitchStack.empty() || !CodeCompleter)
3727     return;
3728 
3729   SwitchStmt *Switch = getCurFunction()->SwitchStack.back();
3730   QualType type = Switch->getCond()->IgnoreImplicit()->getType();
3731   if (!type->isEnumeralType()) {
3732     CodeCompleteExpressionData Data(type);
3733     Data.IntegralConstantExpression = true;
3734     CodeCompleteExpression(S, Data);
3735     return;
3736   }
3737 
3738   // Code-complete the cases of a switch statement over an enumeration type
3739   // by providing the list of
3740   EnumDecl *Enum = type->castAs<EnumType>()->getDecl();
3741   if (EnumDecl *Def = Enum->getDefinition())
3742     Enum = Def;
3743 
3744   // Determine which enumerators we have already seen in the switch statement.
3745   // FIXME: Ideally, we would also be able to look *past* the code-completion
3746   // token, in case we are code-completing in the middle of the switch and not
3747   // at the end. However, we aren't able to do so at the moment.
3748   llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen;
3749   NestedNameSpecifier *Qualifier = 0;
3750   for (SwitchCase *SC = Switch->getSwitchCaseList(); SC;
3751        SC = SC->getNextSwitchCase()) {
3752     CaseStmt *Case = dyn_cast<CaseStmt>(SC);
3753     if (!Case)
3754       continue;
3755 
3756     Expr *CaseVal = Case->getLHS()->IgnoreParenCasts();
3757     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal))
3758       if (EnumConstantDecl *Enumerator
3759             = dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
3760         // We look into the AST of the case statement to determine which
3761         // enumerator was named. Alternatively, we could compute the value of
3762         // the integral constant expression, then compare it against the
3763         // values of each enumerator. However, value-based approach would not
3764         // work as well with C++ templates where enumerators declared within a
3765         // template are type- and value-dependent.
3766         EnumeratorsSeen.insert(Enumerator);
3767 
3768         // If this is a qualified-id, keep track of the nested-name-specifier
3769         // so that we can reproduce it as part of code completion, e.g.,
3770         //
3771         //   switch (TagD.getKind()) {
3772         //     case TagDecl::TK_enum:
3773         //       break;
3774         //     case XXX
3775         //
3776         // At the XXX, our completions are TagDecl::TK_union,
3777         // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union,
3778         // TK_struct, and TK_class.
3779         Qualifier = DRE->getQualifier();
3780       }
3781   }
3782 
3783   if (getLangOpts().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) {
3784     // If there are no prior enumerators in C++, check whether we have to
3785     // qualify the names of the enumerators that we suggest, because they
3786     // may not be visible in this scope.
3787     Qualifier = getRequiredQualification(Context, CurContext, Enum);
3788   }
3789 
3790   // Add any enumerators that have not yet been mentioned.
3791   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3792                         CodeCompleter->getCodeCompletionTUInfo(),
3793                         CodeCompletionContext::CCC_Expression);
3794   Results.EnterNewScope();
3795   for (auto *E : Enum->enumerators()) {
3796     if (EnumeratorsSeen.count(E))
3797       continue;
3798 
3799     CodeCompletionResult R(E, CCP_EnumInCase, Qualifier);
3800     Results.AddResult(R, CurContext, 0, false);
3801   }
3802   Results.ExitScope();
3803 
3804   //We need to make sure we're setting the right context,
3805   //so only say we include macros if the code completer says we do
3806   enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other;
3807   if (CodeCompleter->includeMacros()) {
3808     AddMacroResults(PP, Results, false);
3809     kind = CodeCompletionContext::CCC_OtherWithMacros;
3810   }
3811 
3812   HandleCodeCompleteResults(this, CodeCompleter,
3813                             kind,
3814                             Results.data(),Results.size());
3815 }
3816 
3817 static bool anyNullArguments(ArrayRef<Expr *> Args) {
3818   if (Args.size() && !Args.data())
3819     return true;
3820 
3821   for (unsigned I = 0; I != Args.size(); ++I)
3822     if (!Args[I])
3823       return true;
3824 
3825   return false;
3826 }
3827 
3828 void Sema::CodeCompleteCall(Scope *S, Expr *FnIn, ArrayRef<Expr *> Args) {
3829   if (!CodeCompleter)
3830     return;
3831 
3832   // When we're code-completing for a call, we fall back to ordinary
3833   // name code-completion whenever we can't produce specific
3834   // results. We may want to revisit this strategy in the future,
3835   // e.g., by merging the two kinds of results.
3836 
3837   Expr *Fn = (Expr *)FnIn;
3838 
3839   // Ignore type-dependent call expressions entirely.
3840   if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) ||
3841       Expr::hasAnyTypeDependentArguments(Args)) {
3842     CodeCompleteOrdinaryName(S, PCC_Expression);
3843     return;
3844   }
3845 
3846   // Build an overload candidate set based on the functions we find.
3847   SourceLocation Loc = Fn->getExprLoc();
3848   OverloadCandidateSet CandidateSet(Loc);
3849 
3850   // FIXME: What if we're calling something that isn't a function declaration?
3851   // FIXME: What if we're calling a pseudo-destructor?
3852   // FIXME: What if we're calling a member function?
3853 
3854   typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate;
3855   SmallVector<ResultCandidate, 8> Results;
3856 
3857   Expr *NakedFn = Fn->IgnoreParenCasts();
3858   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn))
3859     AddOverloadedCallCandidates(ULE, Args, CandidateSet,
3860                                 /*PartialOverloading=*/ true);
3861   else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
3862     FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
3863     if (FDecl) {
3864       if (!getLangOpts().CPlusPlus ||
3865           !FDecl->getType()->getAs<FunctionProtoType>())
3866         Results.push_back(ResultCandidate(FDecl));
3867       else
3868         // FIXME: access?
3869         AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), Args,
3870                              CandidateSet, false, /*PartialOverloading*/true);
3871     }
3872   }
3873 
3874   QualType ParamType;
3875 
3876   if (!CandidateSet.empty()) {
3877     // Sort the overload candidate set by placing the best overloads first.
3878     std::stable_sort(
3879         CandidateSet.begin(), CandidateSet.end(),
3880         [&](const OverloadCandidate &X, const OverloadCandidate &Y) {
3881           return isBetterOverloadCandidate(*this, X, Y, Loc);
3882         });
3883 
3884     // Add the remaining viable overload candidates as code-completion reslults.
3885     for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(),
3886                                      CandEnd = CandidateSet.end();
3887          Cand != CandEnd; ++Cand) {
3888       if (Cand->Viable)
3889         Results.push_back(ResultCandidate(Cand->Function));
3890     }
3891 
3892     // From the viable candidates, try to determine the type of this parameter.
3893     for (unsigned I = 0, N = Results.size(); I != N; ++I) {
3894       if (const FunctionType *FType = Results[I].getFunctionType())
3895         if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType))
3896           if (Args.size() < Proto->getNumParams()) {
3897             if (ParamType.isNull())
3898               ParamType = Proto->getParamType(Args.size());
3899             else if (!Context.hasSameUnqualifiedType(
3900                           ParamType.getNonReferenceType(),
3901                           Proto->getParamType(Args.size())
3902                               .getNonReferenceType())) {
3903               ParamType = QualType();
3904               break;
3905             }
3906           }
3907     }
3908   } else {
3909     // Try to determine the parameter type from the type of the expression
3910     // being called.
3911     QualType FunctionType = Fn->getType();
3912     if (const PointerType *Ptr = FunctionType->getAs<PointerType>())
3913       FunctionType = Ptr->getPointeeType();
3914     else if (const BlockPointerType *BlockPtr
3915                                     = FunctionType->getAs<BlockPointerType>())
3916       FunctionType = BlockPtr->getPointeeType();
3917     else if (const MemberPointerType *MemPtr
3918                                     = FunctionType->getAs<MemberPointerType>())
3919       FunctionType = MemPtr->getPointeeType();
3920 
3921     if (const FunctionProtoType *Proto
3922                                   = FunctionType->getAs<FunctionProtoType>()) {
3923       if (Args.size() < Proto->getNumParams())
3924         ParamType = Proto->getParamType(Args.size());
3925     }
3926   }
3927 
3928   if (ParamType.isNull())
3929     CodeCompleteOrdinaryName(S, PCC_Expression);
3930   else
3931     CodeCompleteExpression(S, ParamType);
3932 
3933   if (!Results.empty())
3934     CodeCompleter->ProcessOverloadCandidates(*this, Args.size(), Results.data(),
3935                                              Results.size());
3936 }
3937 
3938 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) {
3939   ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
3940   if (!VD) {
3941     CodeCompleteOrdinaryName(S, PCC_Expression);
3942     return;
3943   }
3944 
3945   CodeCompleteExpression(S, VD->getType());
3946 }
3947 
3948 void Sema::CodeCompleteReturn(Scope *S) {
3949   QualType ResultType;
3950   if (isa<BlockDecl>(CurContext)) {
3951     if (BlockScopeInfo *BSI = getCurBlock())
3952       ResultType = BSI->ReturnType;
3953   } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext))
3954     ResultType = Function->getReturnType();
3955   else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext))
3956     ResultType = Method->getReturnType();
3957 
3958   if (ResultType.isNull())
3959     CodeCompleteOrdinaryName(S, PCC_Expression);
3960   else
3961     CodeCompleteExpression(S, ResultType);
3962 }
3963 
3964 void Sema::CodeCompleteAfterIf(Scope *S) {
3965   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3966                         CodeCompleter->getCodeCompletionTUInfo(),
3967                         mapCodeCompletionContext(*this, PCC_Statement));
3968   Results.setFilter(&ResultBuilder::IsOrdinaryName);
3969   Results.EnterNewScope();
3970 
3971   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3972   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3973                      CodeCompleter->includeGlobals());
3974 
3975   AddOrdinaryNameResults(PCC_Statement, S, *this, Results);
3976 
3977   // "else" block
3978   CodeCompletionBuilder Builder(Results.getAllocator(),
3979                                 Results.getCodeCompletionTUInfo());
3980   Builder.AddTypedTextChunk("else");
3981   if (Results.includeCodePatterns()) {
3982     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3983     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
3984     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
3985     Builder.AddPlaceholderChunk("statements");
3986     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
3987     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
3988   }
3989   Results.AddResult(Builder.TakeString());
3990 
3991   // "else if" block
3992   Builder.AddTypedTextChunk("else");
3993   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3994   Builder.AddTextChunk("if");
3995   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3996   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3997   if (getLangOpts().CPlusPlus)
3998     Builder.AddPlaceholderChunk("condition");
3999   else
4000     Builder.AddPlaceholderChunk("expression");
4001   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4002   if (Results.includeCodePatterns()) {
4003     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4004     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4005     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
4006     Builder.AddPlaceholderChunk("statements");
4007     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
4008     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4009   }
4010   Results.AddResult(Builder.TakeString());
4011 
4012   Results.ExitScope();
4013 
4014   if (S->getFnParent())
4015     AddPrettyFunctionResults(PP.getLangOpts(), Results);
4016 
4017   if (CodeCompleter->includeMacros())
4018     AddMacroResults(PP, Results, false);
4019 
4020   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4021                             Results.data(),Results.size());
4022 }
4023 
4024 void Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) {
4025   if (LHS)
4026     CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType());
4027   else
4028     CodeCompleteOrdinaryName(S, PCC_Expression);
4029 }
4030 
4031 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
4032                                    bool EnteringContext) {
4033   if (!SS.getScopeRep() || !CodeCompleter)
4034     return;
4035 
4036   DeclContext *Ctx = computeDeclContext(SS, EnteringContext);
4037   if (!Ctx)
4038     return;
4039 
4040   // Try to instantiate any non-dependent declaration contexts before
4041   // we look in them.
4042   if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx))
4043     return;
4044 
4045   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4046                         CodeCompleter->getCodeCompletionTUInfo(),
4047                         CodeCompletionContext::CCC_Name);
4048   Results.EnterNewScope();
4049 
4050   // The "template" keyword can follow "::" in the grammar, but only
4051   // put it into the grammar if the nested-name-specifier is dependent.
4052   NestedNameSpecifier *NNS = SS.getScopeRep();
4053   if (!Results.empty() && NNS->isDependent())
4054     Results.AddResult("template");
4055 
4056   // Add calls to overridden virtual functions, if there are any.
4057   //
4058   // FIXME: This isn't wonderful, because we don't know whether we're actually
4059   // in a context that permits expressions. This is a general issue with
4060   // qualified-id completions.
4061   if (!EnteringContext)
4062     MaybeAddOverrideCalls(*this, Ctx, Results);
4063   Results.ExitScope();
4064 
4065   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4066   LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer);
4067 
4068   HandleCodeCompleteResults(this, CodeCompleter,
4069                             Results.getCompletionContext(),
4070                             Results.data(),Results.size());
4071 }
4072 
4073 void Sema::CodeCompleteUsing(Scope *S) {
4074   if (!CodeCompleter)
4075     return;
4076 
4077   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4078                         CodeCompleter->getCodeCompletionTUInfo(),
4079                         CodeCompletionContext::CCC_PotentiallyQualifiedName,
4080                         &ResultBuilder::IsNestedNameSpecifier);
4081   Results.EnterNewScope();
4082 
4083   // If we aren't in class scope, we could see the "namespace" keyword.
4084   if (!S->isClassScope())
4085     Results.AddResult(CodeCompletionResult("namespace"));
4086 
4087   // After "using", we can see anything that would start a
4088   // nested-name-specifier.
4089   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4090   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4091                      CodeCompleter->includeGlobals());
4092   Results.ExitScope();
4093 
4094   HandleCodeCompleteResults(this, CodeCompleter,
4095                             CodeCompletionContext::CCC_PotentiallyQualifiedName,
4096                             Results.data(),Results.size());
4097 }
4098 
4099 void Sema::CodeCompleteUsingDirective(Scope *S) {
4100   if (!CodeCompleter)
4101     return;
4102 
4103   // After "using namespace", we expect to see a namespace name or namespace
4104   // alias.
4105   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4106                         CodeCompleter->getCodeCompletionTUInfo(),
4107                         CodeCompletionContext::CCC_Namespace,
4108                         &ResultBuilder::IsNamespaceOrAlias);
4109   Results.EnterNewScope();
4110   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4111   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4112                      CodeCompleter->includeGlobals());
4113   Results.ExitScope();
4114   HandleCodeCompleteResults(this, CodeCompleter,
4115                             CodeCompletionContext::CCC_Namespace,
4116                             Results.data(),Results.size());
4117 }
4118 
4119 void Sema::CodeCompleteNamespaceDecl(Scope *S)  {
4120   if (!CodeCompleter)
4121     return;
4122 
4123   DeclContext *Ctx = S->getEntity();
4124   if (!S->getParent())
4125     Ctx = Context.getTranslationUnitDecl();
4126 
4127   bool SuppressedGlobalResults
4128     = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
4129 
4130   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4131                         CodeCompleter->getCodeCompletionTUInfo(),
4132                         SuppressedGlobalResults
4133                           ? CodeCompletionContext::CCC_Namespace
4134                           : CodeCompletionContext::CCC_Other,
4135                         &ResultBuilder::IsNamespace);
4136 
4137   if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
4138     // We only want to see those namespaces that have already been defined
4139     // within this scope, because its likely that the user is creating an
4140     // extended namespace declaration. Keep track of the most recent
4141     // definition of each namespace.
4142     std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
4143     for (DeclContext::specific_decl_iterator<NamespaceDecl>
4144          NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end());
4145          NS != NSEnd; ++NS)
4146       OrigToLatest[NS->getOriginalNamespace()] = *NS;
4147 
4148     // Add the most recent definition (or extended definition) of each
4149     // namespace to the list of results.
4150     Results.EnterNewScope();
4151     for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
4152               NS = OrigToLatest.begin(),
4153            NSEnd = OrigToLatest.end();
4154          NS != NSEnd; ++NS)
4155       Results.AddResult(CodeCompletionResult(
4156                           NS->second, Results.getBasePriority(NS->second), 0),
4157                         CurContext, 0, false);
4158     Results.ExitScope();
4159   }
4160 
4161   HandleCodeCompleteResults(this, CodeCompleter,
4162                             Results.getCompletionContext(),
4163                             Results.data(),Results.size());
4164 }
4165 
4166 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S)  {
4167   if (!CodeCompleter)
4168     return;
4169 
4170   // After "namespace", we expect to see a namespace or alias.
4171   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4172                         CodeCompleter->getCodeCompletionTUInfo(),
4173                         CodeCompletionContext::CCC_Namespace,
4174                         &ResultBuilder::IsNamespaceOrAlias);
4175   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4176   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4177                      CodeCompleter->includeGlobals());
4178   HandleCodeCompleteResults(this, CodeCompleter,
4179                             Results.getCompletionContext(),
4180                             Results.data(),Results.size());
4181 }
4182 
4183 void Sema::CodeCompleteOperatorName(Scope *S) {
4184   if (!CodeCompleter)
4185     return;
4186 
4187   typedef CodeCompletionResult Result;
4188   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4189                         CodeCompleter->getCodeCompletionTUInfo(),
4190                         CodeCompletionContext::CCC_Type,
4191                         &ResultBuilder::IsType);
4192   Results.EnterNewScope();
4193 
4194   // Add the names of overloadable operators.
4195 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly)      \
4196   if (std::strcmp(Spelling, "?"))                                                  \
4197     Results.AddResult(Result(Spelling));
4198 #include "clang/Basic/OperatorKinds.def"
4199 
4200   // Add any type names visible from the current scope
4201   Results.allowNestedNameSpecifiers();
4202   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4203   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4204                      CodeCompleter->includeGlobals());
4205 
4206   // Add any type specifiers
4207   AddTypeSpecifierResults(getLangOpts(), Results);
4208   Results.ExitScope();
4209 
4210   HandleCodeCompleteResults(this, CodeCompleter,
4211                             CodeCompletionContext::CCC_Type,
4212                             Results.data(),Results.size());
4213 }
4214 
4215 void Sema::CodeCompleteConstructorInitializer(
4216                               Decl *ConstructorD,
4217                               ArrayRef <CXXCtorInitializer *> Initializers) {
4218   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
4219   CXXConstructorDecl *Constructor
4220     = static_cast<CXXConstructorDecl *>(ConstructorD);
4221   if (!Constructor)
4222     return;
4223 
4224   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4225                         CodeCompleter->getCodeCompletionTUInfo(),
4226                         CodeCompletionContext::CCC_PotentiallyQualifiedName);
4227   Results.EnterNewScope();
4228 
4229   // Fill in any already-initialized fields or base classes.
4230   llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
4231   llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
4232   for (unsigned I = 0, E = Initializers.size(); I != E; ++I) {
4233     if (Initializers[I]->isBaseInitializer())
4234       InitializedBases.insert(
4235         Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0)));
4236     else
4237       InitializedFields.insert(cast<FieldDecl>(
4238                                Initializers[I]->getAnyMember()));
4239   }
4240 
4241   // Add completions for base classes.
4242   CodeCompletionBuilder Builder(Results.getAllocator(),
4243                                 Results.getCodeCompletionTUInfo());
4244   bool SawLastInitializer = Initializers.empty();
4245   CXXRecordDecl *ClassDecl = Constructor->getParent();
4246   for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(),
4247                                        BaseEnd = ClassDecl->bases_end();
4248        Base != BaseEnd; ++Base) {
4249     if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {
4250       SawLastInitializer
4251         = !Initializers.empty() &&
4252           Initializers.back()->isBaseInitializer() &&
4253           Context.hasSameUnqualifiedType(Base->getType(),
4254                QualType(Initializers.back()->getBaseClass(), 0));
4255       continue;
4256     }
4257 
4258     Builder.AddTypedTextChunk(
4259                Results.getAllocator().CopyString(
4260                           Base->getType().getAsString(Policy)));
4261     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4262     Builder.AddPlaceholderChunk("args");
4263     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4264     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4265                                    SawLastInitializer? CCP_NextInitializer
4266                                                      : CCP_MemberDeclaration));
4267     SawLastInitializer = false;
4268   }
4269 
4270   // Add completions for virtual base classes.
4271   for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(),
4272                                        BaseEnd = ClassDecl->vbases_end();
4273        Base != BaseEnd; ++Base) {
4274     if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {
4275       SawLastInitializer
4276         = !Initializers.empty() &&
4277           Initializers.back()->isBaseInitializer() &&
4278           Context.hasSameUnqualifiedType(Base->getType(),
4279                QualType(Initializers.back()->getBaseClass(), 0));
4280       continue;
4281     }
4282 
4283     Builder.AddTypedTextChunk(
4284                Builder.getAllocator().CopyString(
4285                           Base->getType().getAsString(Policy)));
4286     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4287     Builder.AddPlaceholderChunk("args");
4288     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4289     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4290                                    SawLastInitializer? CCP_NextInitializer
4291                                                      : CCP_MemberDeclaration));
4292     SawLastInitializer = false;
4293   }
4294 
4295   // Add completions for members.
4296   for (auto *Field : ClassDecl->fields()) {
4297     if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) {
4298       SawLastInitializer
4299         = !Initializers.empty() &&
4300           Initializers.back()->isAnyMemberInitializer() &&
4301           Initializers.back()->getAnyMember() == Field;
4302       continue;
4303     }
4304 
4305     if (!Field->getDeclName())
4306       continue;
4307 
4308     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
4309                                          Field->getIdentifier()->getName()));
4310     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4311     Builder.AddPlaceholderChunk("args");
4312     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4313     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4314                                    SawLastInitializer? CCP_NextInitializer
4315                                                      : CCP_MemberDeclaration,
4316                                            CXCursor_MemberRef,
4317                                            CXAvailability_Available,
4318                                            Field));
4319     SawLastInitializer = false;
4320   }
4321   Results.ExitScope();
4322 
4323   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4324                             Results.data(), Results.size());
4325 }
4326 
4327 /// \brief Determine whether this scope denotes a namespace.
4328 static bool isNamespaceScope(Scope *S) {
4329   DeclContext *DC = S->getEntity();
4330   if (!DC)
4331     return false;
4332 
4333   return DC->isFileContext();
4334 }
4335 
4336 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro,
4337                                         bool AfterAmpersand) {
4338   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4339                         CodeCompleter->getCodeCompletionTUInfo(),
4340                         CodeCompletionContext::CCC_Other);
4341   Results.EnterNewScope();
4342 
4343   // Note what has already been captured.
4344   llvm::SmallPtrSet<IdentifierInfo *, 4> Known;
4345   bool IncludedThis = false;
4346   for (SmallVectorImpl<LambdaCapture>::iterator C = Intro.Captures.begin(),
4347                                              CEnd = Intro.Captures.end();
4348        C != CEnd; ++C) {
4349     if (C->Kind == LCK_This) {
4350       IncludedThis = true;
4351       continue;
4352     }
4353 
4354     Known.insert(C->Id);
4355   }
4356 
4357   // Look for other capturable variables.
4358   for (; S && !isNamespaceScope(S); S = S->getParent()) {
4359     for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
4360          D != DEnd; ++D) {
4361       VarDecl *Var = dyn_cast<VarDecl>(*D);
4362       if (!Var ||
4363           !Var->hasLocalStorage() ||
4364           Var->hasAttr<BlocksAttr>())
4365         continue;
4366 
4367       if (Known.insert(Var->getIdentifier()))
4368         Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration),
4369                           CurContext, 0, false);
4370     }
4371   }
4372 
4373   // Add 'this', if it would be valid.
4374   if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy)
4375     addThisCompletion(*this, Results);
4376 
4377   Results.ExitScope();
4378 
4379   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4380                             Results.data(), Results.size());
4381 }
4382 
4383 /// Macro that optionally prepends an "@" to the string literal passed in via
4384 /// Keyword, depending on whether NeedAt is true or false.
4385 #define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) ((NeedAt)? "@" Keyword : Keyword)
4386 
4387 static void AddObjCImplementationResults(const LangOptions &LangOpts,
4388                                          ResultBuilder &Results,
4389                                          bool NeedAt) {
4390   typedef CodeCompletionResult Result;
4391   // Since we have an implementation, we can end it.
4392   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end")));
4393 
4394   CodeCompletionBuilder Builder(Results.getAllocator(),
4395                                 Results.getCodeCompletionTUInfo());
4396   if (LangOpts.ObjC2) {
4397     // @dynamic
4398     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"dynamic"));
4399     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4400     Builder.AddPlaceholderChunk("property");
4401     Results.AddResult(Result(Builder.TakeString()));
4402 
4403     // @synthesize
4404     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synthesize"));
4405     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4406     Builder.AddPlaceholderChunk("property");
4407     Results.AddResult(Result(Builder.TakeString()));
4408   }
4409 }
4410 
4411 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
4412                                     ResultBuilder &Results,
4413                                     bool NeedAt) {
4414   typedef CodeCompletionResult Result;
4415 
4416   // Since we have an interface or protocol, we can end it.
4417   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end")));
4418 
4419   if (LangOpts.ObjC2) {
4420     // @property
4421     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"property")));
4422 
4423     // @required
4424     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"required")));
4425 
4426     // @optional
4427     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"optional")));
4428   }
4429 }
4430 
4431 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
4432   typedef CodeCompletionResult Result;
4433   CodeCompletionBuilder Builder(Results.getAllocator(),
4434                                 Results.getCodeCompletionTUInfo());
4435 
4436   // @class name ;
4437   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"class"));
4438   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4439   Builder.AddPlaceholderChunk("name");
4440   Results.AddResult(Result(Builder.TakeString()));
4441 
4442   if (Results.includeCodePatterns()) {
4443     // @interface name
4444     // FIXME: Could introduce the whole pattern, including superclasses and
4445     // such.
4446     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"interface"));
4447     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4448     Builder.AddPlaceholderChunk("class");
4449     Results.AddResult(Result(Builder.TakeString()));
4450 
4451     // @protocol name
4452     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol"));
4453     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4454     Builder.AddPlaceholderChunk("protocol");
4455     Results.AddResult(Result(Builder.TakeString()));
4456 
4457     // @implementation name
4458     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"implementation"));
4459     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4460     Builder.AddPlaceholderChunk("class");
4461     Results.AddResult(Result(Builder.TakeString()));
4462   }
4463 
4464   // @compatibility_alias name
4465   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"compatibility_alias"));
4466   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4467   Builder.AddPlaceholderChunk("alias");
4468   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4469   Builder.AddPlaceholderChunk("class");
4470   Results.AddResult(Result(Builder.TakeString()));
4471 
4472   if (Results.getSema().getLangOpts().Modules) {
4473     // @import name
4474     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import"));
4475     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4476     Builder.AddPlaceholderChunk("module");
4477     Results.AddResult(Result(Builder.TakeString()));
4478   }
4479 }
4480 
4481 void Sema::CodeCompleteObjCAtDirective(Scope *S) {
4482   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4483                         CodeCompleter->getCodeCompletionTUInfo(),
4484                         CodeCompletionContext::CCC_Other);
4485   Results.EnterNewScope();
4486   if (isa<ObjCImplDecl>(CurContext))
4487     AddObjCImplementationResults(getLangOpts(), Results, false);
4488   else if (CurContext->isObjCContainer())
4489     AddObjCInterfaceResults(getLangOpts(), Results, false);
4490   else
4491     AddObjCTopLevelResults(Results, false);
4492   Results.ExitScope();
4493   HandleCodeCompleteResults(this, CodeCompleter,
4494                             CodeCompletionContext::CCC_Other,
4495                             Results.data(),Results.size());
4496 }
4497 
4498 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
4499   typedef CodeCompletionResult Result;
4500   CodeCompletionBuilder Builder(Results.getAllocator(),
4501                                 Results.getCodeCompletionTUInfo());
4502 
4503   // @encode ( type-name )
4504   const char *EncodeType = "char[]";
4505   if (Results.getSema().getLangOpts().CPlusPlus ||
4506       Results.getSema().getLangOpts().ConstStrings)
4507     EncodeType = "const char[]";
4508   Builder.AddResultTypeChunk(EncodeType);
4509   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"encode"));
4510   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4511   Builder.AddPlaceholderChunk("type-name");
4512   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4513   Results.AddResult(Result(Builder.TakeString()));
4514 
4515   // @protocol ( protocol-name )
4516   Builder.AddResultTypeChunk("Protocol *");
4517   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol"));
4518   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4519   Builder.AddPlaceholderChunk("protocol-name");
4520   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4521   Results.AddResult(Result(Builder.TakeString()));
4522 
4523   // @selector ( selector )
4524   Builder.AddResultTypeChunk("SEL");
4525   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"selector"));
4526   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4527   Builder.AddPlaceholderChunk("selector");
4528   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4529   Results.AddResult(Result(Builder.TakeString()));
4530 
4531   // @"string"
4532   Builder.AddResultTypeChunk("NSString *");
4533   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"\""));
4534   Builder.AddPlaceholderChunk("string");
4535   Builder.AddTextChunk("\"");
4536   Results.AddResult(Result(Builder.TakeString()));
4537 
4538   // @[objects, ...]
4539   Builder.AddResultTypeChunk("NSArray *");
4540   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"["));
4541   Builder.AddPlaceholderChunk("objects, ...");
4542   Builder.AddChunk(CodeCompletionString::CK_RightBracket);
4543   Results.AddResult(Result(Builder.TakeString()));
4544 
4545   // @{key : object, ...}
4546   Builder.AddResultTypeChunk("NSDictionary *");
4547   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"{"));
4548   Builder.AddPlaceholderChunk("key");
4549   Builder.AddChunk(CodeCompletionString::CK_Colon);
4550   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4551   Builder.AddPlaceholderChunk("object, ...");
4552   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4553   Results.AddResult(Result(Builder.TakeString()));
4554 
4555   // @(expression)
4556   Builder.AddResultTypeChunk("id");
4557   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "("));
4558   Builder.AddPlaceholderChunk("expression");
4559   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4560   Results.AddResult(Result(Builder.TakeString()));
4561 }
4562 
4563 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
4564   typedef CodeCompletionResult Result;
4565   CodeCompletionBuilder Builder(Results.getAllocator(),
4566                                 Results.getCodeCompletionTUInfo());
4567 
4568   if (Results.includeCodePatterns()) {
4569     // @try { statements } @catch ( declaration ) { statements } @finally
4570     //   { statements }
4571     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"try"));
4572     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4573     Builder.AddPlaceholderChunk("statements");
4574     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4575     Builder.AddTextChunk("@catch");
4576     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4577     Builder.AddPlaceholderChunk("parameter");
4578     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4579     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4580     Builder.AddPlaceholderChunk("statements");
4581     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4582     Builder.AddTextChunk("@finally");
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   // @throw
4590   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"throw"));
4591   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4592   Builder.AddPlaceholderChunk("expression");
4593   Results.AddResult(Result(Builder.TakeString()));
4594 
4595   if (Results.includeCodePatterns()) {
4596     // @synchronized ( expression ) { statements }
4597     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synchronized"));
4598     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4599     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4600     Builder.AddPlaceholderChunk("expression");
4601     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4602     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4603     Builder.AddPlaceholderChunk("statements");
4604     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4605     Results.AddResult(Result(Builder.TakeString()));
4606   }
4607 }
4608 
4609 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
4610                                      ResultBuilder &Results,
4611                                      bool NeedAt) {
4612   typedef CodeCompletionResult Result;
4613   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"private")));
4614   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"protected")));
4615   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"public")));
4616   if (LangOpts.ObjC2)
4617     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"package")));
4618 }
4619 
4620 void Sema::CodeCompleteObjCAtVisibility(Scope *S) {
4621   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4622                         CodeCompleter->getCodeCompletionTUInfo(),
4623                         CodeCompletionContext::CCC_Other);
4624   Results.EnterNewScope();
4625   AddObjCVisibilityResults(getLangOpts(), Results, false);
4626   Results.ExitScope();
4627   HandleCodeCompleteResults(this, CodeCompleter,
4628                             CodeCompletionContext::CCC_Other,
4629                             Results.data(),Results.size());
4630 }
4631 
4632 void Sema::CodeCompleteObjCAtStatement(Scope *S) {
4633   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4634                         CodeCompleter->getCodeCompletionTUInfo(),
4635                         CodeCompletionContext::CCC_Other);
4636   Results.EnterNewScope();
4637   AddObjCStatementResults(Results, false);
4638   AddObjCExpressionResults(Results, false);
4639   Results.ExitScope();
4640   HandleCodeCompleteResults(this, CodeCompleter,
4641                             CodeCompletionContext::CCC_Other,
4642                             Results.data(),Results.size());
4643 }
4644 
4645 void Sema::CodeCompleteObjCAtExpression(Scope *S) {
4646   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4647                         CodeCompleter->getCodeCompletionTUInfo(),
4648                         CodeCompletionContext::CCC_Other);
4649   Results.EnterNewScope();
4650   AddObjCExpressionResults(Results, false);
4651   Results.ExitScope();
4652   HandleCodeCompleteResults(this, CodeCompleter,
4653                             CodeCompletionContext::CCC_Other,
4654                             Results.data(),Results.size());
4655 }
4656 
4657 /// \brief Determine whether the addition of the given flag to an Objective-C
4658 /// property's attributes will cause a conflict.
4659 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
4660   // Check if we've already added this flag.
4661   if (Attributes & NewFlag)
4662     return true;
4663 
4664   Attributes |= NewFlag;
4665 
4666   // Check for collisions with "readonly".
4667   if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
4668       (Attributes & ObjCDeclSpec::DQ_PR_readwrite))
4669     return true;
4670 
4671   // Check for more than one of { assign, copy, retain, strong, weak }.
4672   unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign |
4673                                          ObjCDeclSpec::DQ_PR_unsafe_unretained |
4674                                              ObjCDeclSpec::DQ_PR_copy |
4675                                              ObjCDeclSpec::DQ_PR_retain |
4676                                              ObjCDeclSpec::DQ_PR_strong |
4677                                              ObjCDeclSpec::DQ_PR_weak);
4678   if (AssignCopyRetMask &&
4679       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign &&
4680       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained &&
4681       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy &&
4682       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain &&
4683       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong &&
4684       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_weak)
4685     return true;
4686 
4687   return false;
4688 }
4689 
4690 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
4691   if (!CodeCompleter)
4692     return;
4693 
4694   unsigned Attributes = ODS.getPropertyAttributes();
4695 
4696   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4697                         CodeCompleter->getCodeCompletionTUInfo(),
4698                         CodeCompletionContext::CCC_Other);
4699   Results.EnterNewScope();
4700   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly))
4701     Results.AddResult(CodeCompletionResult("readonly"));
4702   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign))
4703     Results.AddResult(CodeCompletionResult("assign"));
4704   if (!ObjCPropertyFlagConflicts(Attributes,
4705                                  ObjCDeclSpec::DQ_PR_unsafe_unretained))
4706     Results.AddResult(CodeCompletionResult("unsafe_unretained"));
4707   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite))
4708     Results.AddResult(CodeCompletionResult("readwrite"));
4709   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain))
4710     Results.AddResult(CodeCompletionResult("retain"));
4711   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong))
4712     Results.AddResult(CodeCompletionResult("strong"));
4713   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy))
4714     Results.AddResult(CodeCompletionResult("copy"));
4715   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic))
4716     Results.AddResult(CodeCompletionResult("nonatomic"));
4717   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic))
4718     Results.AddResult(CodeCompletionResult("atomic"));
4719 
4720   // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC.
4721   if (getLangOpts().ObjCARCWeak || getLangOpts().getGC() != LangOptions::NonGC)
4722     if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_weak))
4723       Results.AddResult(CodeCompletionResult("weak"));
4724 
4725   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) {
4726     CodeCompletionBuilder Setter(Results.getAllocator(),
4727                                  Results.getCodeCompletionTUInfo());
4728     Setter.AddTypedTextChunk("setter");
4729     Setter.AddTextChunk("=");
4730     Setter.AddPlaceholderChunk("method");
4731     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
4732   }
4733   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) {
4734     CodeCompletionBuilder Getter(Results.getAllocator(),
4735                                  Results.getCodeCompletionTUInfo());
4736     Getter.AddTypedTextChunk("getter");
4737     Getter.AddTextChunk("=");
4738     Getter.AddPlaceholderChunk("method");
4739     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
4740   }
4741   Results.ExitScope();
4742   HandleCodeCompleteResults(this, CodeCompleter,
4743                             CodeCompletionContext::CCC_Other,
4744                             Results.data(),Results.size());
4745 }
4746 
4747 /// \brief Describes the kind of Objective-C method that we want to find
4748 /// via code completion.
4749 enum ObjCMethodKind {
4750   MK_Any, ///< Any kind of method, provided it means other specified criteria.
4751   MK_ZeroArgSelector, ///< Zero-argument (unary) selector.
4752   MK_OneArgSelector ///< One-argument selector.
4753 };
4754 
4755 static bool isAcceptableObjCSelector(Selector Sel,
4756                                      ObjCMethodKind WantKind,
4757                                      ArrayRef<IdentifierInfo *> SelIdents,
4758                                      bool AllowSameLength = true) {
4759   unsigned NumSelIdents = SelIdents.size();
4760   if (NumSelIdents > Sel.getNumArgs())
4761     return false;
4762 
4763   switch (WantKind) {
4764     case MK_Any:             break;
4765     case MK_ZeroArgSelector: return Sel.isUnarySelector();
4766     case MK_OneArgSelector:  return Sel.getNumArgs() == 1;
4767   }
4768 
4769   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
4770     return false;
4771 
4772   for (unsigned I = 0; I != NumSelIdents; ++I)
4773     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
4774       return false;
4775 
4776   return true;
4777 }
4778 
4779 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
4780                                    ObjCMethodKind WantKind,
4781                                    ArrayRef<IdentifierInfo *> SelIdents,
4782                                    bool AllowSameLength = true) {
4783   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
4784                                   AllowSameLength);
4785 }
4786 
4787 namespace {
4788   /// \brief A set of selectors, which is used to avoid introducing multiple
4789   /// completions with the same selector into the result set.
4790   typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
4791 }
4792 
4793 /// \brief Add all of the Objective-C methods in the given Objective-C
4794 /// container to the set of results.
4795 ///
4796 /// The container will be a class, protocol, category, or implementation of
4797 /// any of the above. This mether will recurse to include methods from
4798 /// the superclasses of classes along with their categories, protocols, and
4799 /// implementations.
4800 ///
4801 /// \param Container the container in which we'll look to find methods.
4802 ///
4803 /// \param WantInstanceMethods Whether to add instance methods (only); if
4804 /// false, this routine will add factory methods (only).
4805 ///
4806 /// \param CurContext the context in which we're performing the lookup that
4807 /// finds methods.
4808 ///
4809 /// \param AllowSameLength Whether we allow a method to be added to the list
4810 /// when it has the same number of parameters as we have selector identifiers.
4811 ///
4812 /// \param Results the structure into which we'll add results.
4813 static void AddObjCMethods(ObjCContainerDecl *Container,
4814                            bool WantInstanceMethods,
4815                            ObjCMethodKind WantKind,
4816                            ArrayRef<IdentifierInfo *> SelIdents,
4817                            DeclContext *CurContext,
4818                            VisitedSelectorSet &Selectors,
4819                            bool AllowSameLength,
4820                            ResultBuilder &Results,
4821                            bool InOriginalClass = true) {
4822   typedef CodeCompletionResult Result;
4823   Container = getContainerDef(Container);
4824   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
4825   bool isRootClass = IFace && !IFace->getSuperClass();
4826   for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
4827                                        MEnd = Container->meth_end();
4828        M != MEnd; ++M) {
4829     // The instance methods on the root class can be messaged via the
4830     // metaclass.
4831     if (M->isInstanceMethod() == WantInstanceMethods ||
4832         (isRootClass && !WantInstanceMethods)) {
4833       // Check whether the selector identifiers we've been given are a
4834       // subset of the identifiers for this particular method.
4835       if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, AllowSameLength))
4836         continue;
4837 
4838       if (!Selectors.insert(M->getSelector()))
4839         continue;
4840 
4841       Result R = Result(*M, Results.getBasePriority(*M), 0);
4842       R.StartParameter = SelIdents.size();
4843       R.AllParametersAreInformative = (WantKind != MK_Any);
4844       if (!InOriginalClass)
4845         R.Priority += CCD_InBaseClass;
4846       Results.MaybeAddResult(R, CurContext);
4847     }
4848   }
4849 
4850   // Visit the protocols of protocols.
4851   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
4852     if (Protocol->hasDefinition()) {
4853       const ObjCList<ObjCProtocolDecl> &Protocols
4854         = Protocol->getReferencedProtocols();
4855       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4856                                                 E = Protocols.end();
4857            I != E; ++I)
4858         AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,
4859                        CurContext, Selectors, AllowSameLength, Results, false);
4860     }
4861   }
4862 
4863   if (!IFace || !IFace->hasDefinition())
4864     return;
4865 
4866   // Add methods in protocols.
4867   for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(),
4868                                             E = IFace->protocol_end();
4869        I != E; ++I)
4870     AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,
4871                    CurContext, Selectors, AllowSameLength, Results, false);
4872 
4873   // Add methods in categories.
4874   for (ObjCInterfaceDecl::known_categories_iterator
4875          Cat = IFace->known_categories_begin(),
4876          CatEnd = IFace->known_categories_end();
4877        Cat != CatEnd; ++Cat) {
4878     ObjCCategoryDecl *CatDecl = *Cat;
4879 
4880     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
4881                    CurContext, Selectors, AllowSameLength,
4882                    Results, InOriginalClass);
4883 
4884     // Add a categories protocol methods.
4885     const ObjCList<ObjCProtocolDecl> &Protocols
4886       = CatDecl->getReferencedProtocols();
4887     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4888                                               E = Protocols.end();
4889          I != E; ++I)
4890       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,
4891                      CurContext, Selectors, AllowSameLength,
4892                      Results, false);
4893 
4894     // Add methods in category implementations.
4895     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
4896       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4897                      CurContext, Selectors, AllowSameLength,
4898                      Results, InOriginalClass);
4899   }
4900 
4901   // Add methods in superclass.
4902   if (IFace->getSuperClass())
4903     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
4904                    SelIdents, CurContext, Selectors,
4905                    AllowSameLength, Results, false);
4906 
4907   // Add methods in our implementation, if any.
4908   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
4909     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4910                    CurContext, Selectors, AllowSameLength,
4911                    Results, InOriginalClass);
4912 }
4913 
4914 
4915 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) {
4916   // Try to find the interface where getters might live.
4917   ObjCInterfaceDecl *Class = 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_ZeroArgSelector, None, CurContext, Selectors,
4935                  /*AllowSameLength=*/true, Results);
4936   Results.ExitScope();
4937   HandleCodeCompleteResults(this, CodeCompleter,
4938                             CodeCompletionContext::CCC_Other,
4939                             Results.data(),Results.size());
4940 }
4941 
4942 void Sema::CodeCompleteObjCPropertySetter(Scope *S) {
4943   // Try to find the interface where setters might live.
4944   ObjCInterfaceDecl *Class
4945     = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
4946   if (!Class) {
4947     if (ObjCCategoryDecl *Category
4948           = dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
4949       Class = Category->getClassInterface();
4950 
4951     if (!Class)
4952       return;
4953   }
4954 
4955   // Find all of the potential getters.
4956   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4957                         CodeCompleter->getCodeCompletionTUInfo(),
4958                         CodeCompletionContext::CCC_Other);
4959   Results.EnterNewScope();
4960 
4961   VisitedSelectorSet Selectors;
4962   AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext,
4963                  Selectors, /*AllowSameLength=*/true, Results);
4964 
4965   Results.ExitScope();
4966   HandleCodeCompleteResults(this, CodeCompleter,
4967                             CodeCompletionContext::CCC_Other,
4968                             Results.data(),Results.size());
4969 }
4970 
4971 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
4972                                        bool IsParameter) {
4973   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4974                         CodeCompleter->getCodeCompletionTUInfo(),
4975                         CodeCompletionContext::CCC_Type);
4976   Results.EnterNewScope();
4977 
4978   // Add context-sensitive, Objective-C parameter-passing keywords.
4979   bool AddedInOut = false;
4980   if ((DS.getObjCDeclQualifier() &
4981        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
4982     Results.AddResult("in");
4983     Results.AddResult("inout");
4984     AddedInOut = true;
4985   }
4986   if ((DS.getObjCDeclQualifier() &
4987        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
4988     Results.AddResult("out");
4989     if (!AddedInOut)
4990       Results.AddResult("inout");
4991   }
4992   if ((DS.getObjCDeclQualifier() &
4993        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
4994         ObjCDeclSpec::DQ_Oneway)) == 0) {
4995      Results.AddResult("bycopy");
4996      Results.AddResult("byref");
4997      Results.AddResult("oneway");
4998   }
4999 
5000   // If we're completing the return type of an Objective-C method and the
5001   // identifier IBAction refers to a macro, provide a completion item for
5002   // an action, e.g.,
5003   //   IBAction)<#selector#>:(id)sender
5004   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
5005       Context.Idents.get("IBAction").hasMacroDefinition()) {
5006     CodeCompletionBuilder Builder(Results.getAllocator(),
5007                                   Results.getCodeCompletionTUInfo(),
5008                                   CCP_CodePattern, CXAvailability_Available);
5009     Builder.AddTypedTextChunk("IBAction");
5010     Builder.AddChunk(CodeCompletionString::CK_RightParen);
5011     Builder.AddPlaceholderChunk("selector");
5012     Builder.AddChunk(CodeCompletionString::CK_Colon);
5013     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5014     Builder.AddTextChunk("id");
5015     Builder.AddChunk(CodeCompletionString::CK_RightParen);
5016     Builder.AddTextChunk("sender");
5017     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
5018   }
5019 
5020   // If we're completing the return type, provide 'instancetype'.
5021   if (!IsParameter) {
5022     Results.AddResult(CodeCompletionResult("instancetype"));
5023   }
5024 
5025   // Add various builtin type names and specifiers.
5026   AddOrdinaryNameResults(PCC_Type, S, *this, Results);
5027   Results.ExitScope();
5028 
5029   // Add the various type names
5030   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
5031   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5032   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5033                      CodeCompleter->includeGlobals());
5034 
5035   if (CodeCompleter->includeMacros())
5036     AddMacroResults(PP, Results, false);
5037 
5038   HandleCodeCompleteResults(this, CodeCompleter,
5039                             CodeCompletionContext::CCC_Type,
5040                             Results.data(), Results.size());
5041 }
5042 
5043 /// \brief When we have an expression with type "id", we may assume
5044 /// that it has some more-specific class type based on knowledge of
5045 /// common uses of Objective-C. This routine returns that class type,
5046 /// or NULL if no better result could be determined.
5047 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
5048   ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
5049   if (!Msg)
5050     return 0;
5051 
5052   Selector Sel = Msg->getSelector();
5053   if (Sel.isNull())
5054     return 0;
5055 
5056   IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
5057   if (!Id)
5058     return 0;
5059 
5060   ObjCMethodDecl *Method = Msg->getMethodDecl();
5061   if (!Method)
5062     return 0;
5063 
5064   // Determine the class that we're sending the message to.
5065   ObjCInterfaceDecl *IFace = 0;
5066   switch (Msg->getReceiverKind()) {
5067   case ObjCMessageExpr::Class:
5068     if (const ObjCObjectType *ObjType
5069                            = Msg->getClassReceiver()->getAs<ObjCObjectType>())
5070       IFace = ObjType->getInterface();
5071     break;
5072 
5073   case ObjCMessageExpr::Instance: {
5074     QualType T = Msg->getInstanceReceiver()->getType();
5075     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
5076       IFace = Ptr->getInterfaceDecl();
5077     break;
5078   }
5079 
5080   case ObjCMessageExpr::SuperInstance:
5081   case ObjCMessageExpr::SuperClass:
5082     break;
5083   }
5084 
5085   if (!IFace)
5086     return 0;
5087 
5088   ObjCInterfaceDecl *Super = IFace->getSuperClass();
5089   if (Method->isInstanceMethod())
5090     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
5091       .Case("retain", IFace)
5092       .Case("strong", IFace)
5093       .Case("autorelease", IFace)
5094       .Case("copy", IFace)
5095       .Case("copyWithZone", IFace)
5096       .Case("mutableCopy", IFace)
5097       .Case("mutableCopyWithZone", IFace)
5098       .Case("awakeFromCoder", IFace)
5099       .Case("replacementObjectFromCoder", IFace)
5100       .Case("class", IFace)
5101       .Case("classForCoder", IFace)
5102       .Case("superclass", Super)
5103       .Default(0);
5104 
5105   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
5106     .Case("new", IFace)
5107     .Case("alloc", IFace)
5108     .Case("allocWithZone", IFace)
5109     .Case("class", IFace)
5110     .Case("superclass", Super)
5111     .Default(0);
5112 }
5113 
5114 // Add a special completion for a message send to "super", which fills in the
5115 // most likely case of forwarding all of our arguments to the superclass
5116 // function.
5117 ///
5118 /// \param S The semantic analysis object.
5119 ///
5120 /// \param NeedSuperKeyword Whether we need to prefix this completion with
5121 /// the "super" keyword. Otherwise, we just need to provide the arguments.
5122 ///
5123 /// \param SelIdents The identifiers in the selector that have already been
5124 /// provided as arguments for a send to "super".
5125 ///
5126 /// \param Results The set of results to augment.
5127 ///
5128 /// \returns the Objective-C method declaration that would be invoked by
5129 /// this "super" completion. If NULL, no completion was added.
5130 static ObjCMethodDecl *AddSuperSendCompletion(
5131                                           Sema &S, bool NeedSuperKeyword,
5132                                           ArrayRef<IdentifierInfo *> SelIdents,
5133                                           ResultBuilder &Results) {
5134   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
5135   if (!CurMethod)
5136     return 0;
5137 
5138   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
5139   if (!Class)
5140     return 0;
5141 
5142   // Try to find a superclass method with the same selector.
5143   ObjCMethodDecl *SuperMethod = 0;
5144   while ((Class = Class->getSuperClass()) && !SuperMethod) {
5145     // Check in the class
5146     SuperMethod = Class->getMethod(CurMethod->getSelector(),
5147                                    CurMethod->isInstanceMethod());
5148 
5149     // Check in categories or class extensions.
5150     if (!SuperMethod) {
5151       for (ObjCInterfaceDecl::known_categories_iterator
5152              Cat = Class->known_categories_begin(),
5153              CatEnd = Class->known_categories_end();
5154            Cat != CatEnd; ++Cat) {
5155         if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(),
5156                                                CurMethod->isInstanceMethod())))
5157           break;
5158       }
5159     }
5160   }
5161 
5162   if (!SuperMethod)
5163     return 0;
5164 
5165   // Check whether the superclass method has the same signature.
5166   if (CurMethod->param_size() != SuperMethod->param_size() ||
5167       CurMethod->isVariadic() != SuperMethod->isVariadic())
5168     return 0;
5169 
5170   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
5171                                    CurPEnd = CurMethod->param_end(),
5172                                     SuperP = SuperMethod->param_begin();
5173        CurP != CurPEnd; ++CurP, ++SuperP) {
5174     // Make sure the parameter types are compatible.
5175     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
5176                                           (*SuperP)->getType()))
5177       return 0;
5178 
5179     // Make sure we have a parameter name to forward!
5180     if (!(*CurP)->getIdentifier())
5181       return 0;
5182   }
5183 
5184   // We have a superclass method. Now, form the send-to-super completion.
5185   CodeCompletionBuilder Builder(Results.getAllocator(),
5186                                 Results.getCodeCompletionTUInfo());
5187 
5188   // Give this completion a return type.
5189   AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod,
5190                      Builder);
5191 
5192   // If we need the "super" keyword, add it (plus some spacing).
5193   if (NeedSuperKeyword) {
5194     Builder.AddTypedTextChunk("super");
5195     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5196   }
5197 
5198   Selector Sel = CurMethod->getSelector();
5199   if (Sel.isUnarySelector()) {
5200     if (NeedSuperKeyword)
5201       Builder.AddTextChunk(Builder.getAllocator().CopyString(
5202                                   Sel.getNameForSlot(0)));
5203     else
5204       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
5205                                    Sel.getNameForSlot(0)));
5206   } else {
5207     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
5208     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
5209       if (I > SelIdents.size())
5210         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5211 
5212       if (I < SelIdents.size())
5213         Builder.AddInformativeChunk(
5214                    Builder.getAllocator().CopyString(
5215                                                  Sel.getNameForSlot(I) + ":"));
5216       else if (NeedSuperKeyword || I > SelIdents.size()) {
5217         Builder.AddTextChunk(
5218                  Builder.getAllocator().CopyString(
5219                                                   Sel.getNameForSlot(I) + ":"));
5220         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
5221                                          (*CurP)->getIdentifier()->getName()));
5222       } else {
5223         Builder.AddTypedTextChunk(
5224                   Builder.getAllocator().CopyString(
5225                                                   Sel.getNameForSlot(I) + ":"));
5226         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
5227                                          (*CurP)->getIdentifier()->getName()));
5228       }
5229     }
5230   }
5231 
5232   Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod,
5233                                          CCP_SuperCompletion));
5234   return SuperMethod;
5235 }
5236 
5237 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {
5238   typedef CodeCompletionResult Result;
5239   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5240                         CodeCompleter->getCodeCompletionTUInfo(),
5241                         CodeCompletionContext::CCC_ObjCMessageReceiver,
5242                         getLangOpts().CPlusPlus11
5243                           ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
5244                           : &ResultBuilder::IsObjCMessageReceiver);
5245 
5246   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5247   Results.EnterNewScope();
5248   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5249                      CodeCompleter->includeGlobals());
5250 
5251   // If we are in an Objective-C method inside a class that has a superclass,
5252   // add "super" as an option.
5253   if (ObjCMethodDecl *Method = getCurMethodDecl())
5254     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
5255       if (Iface->getSuperClass()) {
5256         Results.AddResult(Result("super"));
5257 
5258         AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results);
5259       }
5260 
5261   if (getLangOpts().CPlusPlus11)
5262     addThisCompletion(*this, Results);
5263 
5264   Results.ExitScope();
5265 
5266   if (CodeCompleter->includeMacros())
5267     AddMacroResults(PP, Results, false);
5268   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5269                             Results.data(), Results.size());
5270 
5271 }
5272 
5273 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
5274                                         ArrayRef<IdentifierInfo *> SelIdents,
5275                                         bool AtArgumentExpression) {
5276   ObjCInterfaceDecl *CDecl = 0;
5277   if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
5278     // Figure out which interface we're in.
5279     CDecl = CurMethod->getClassInterface();
5280     if (!CDecl)
5281       return;
5282 
5283     // Find the superclass of this class.
5284     CDecl = CDecl->getSuperClass();
5285     if (!CDecl)
5286       return;
5287 
5288     if (CurMethod->isInstanceMethod()) {
5289       // We are inside an instance method, which means that the message
5290       // send [super ...] is actually calling an instance method on the
5291       // current object.
5292       return CodeCompleteObjCInstanceMessage(S, 0, SelIdents,
5293                                              AtArgumentExpression,
5294                                              CDecl);
5295     }
5296 
5297     // Fall through to send to the superclass in CDecl.
5298   } else {
5299     // "super" may be the name of a type or variable. Figure out which
5300     // it is.
5301     IdentifierInfo *Super = getSuperIdentifier();
5302     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc,
5303                                      LookupOrdinaryName);
5304     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
5305       // "super" names an interface. Use it.
5306     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
5307       if (const ObjCObjectType *Iface
5308             = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>())
5309         CDecl = Iface->getInterface();
5310     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
5311       // "super" names an unresolved type; we can't be more specific.
5312     } else {
5313       // Assume that "super" names some kind of value and parse that way.
5314       CXXScopeSpec SS;
5315       SourceLocation TemplateKWLoc;
5316       UnqualifiedId id;
5317       id.setIdentifier(Super, SuperLoc);
5318       ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id,
5319                                                false, false);
5320       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
5321                                              SelIdents,
5322                                              AtArgumentExpression);
5323     }
5324 
5325     // Fall through
5326   }
5327 
5328   ParsedType Receiver;
5329   if (CDecl)
5330     Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));
5331   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
5332                                       AtArgumentExpression,
5333                                       /*IsSuper=*/true);
5334 }
5335 
5336 /// \brief Given a set of code-completion results for the argument of a message
5337 /// send, determine the preferred type (if any) for that argument expression.
5338 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
5339                                                        unsigned NumSelIdents) {
5340   typedef CodeCompletionResult Result;
5341   ASTContext &Context = Results.getSema().Context;
5342 
5343   QualType PreferredType;
5344   unsigned BestPriority = CCP_Unlikely * 2;
5345   Result *ResultsData = Results.data();
5346   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
5347     Result &R = ResultsData[I];
5348     if (R.Kind == Result::RK_Declaration &&
5349         isa<ObjCMethodDecl>(R.Declaration)) {
5350       if (R.Priority <= BestPriority) {
5351         const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
5352         if (NumSelIdents <= Method->param_size()) {
5353           QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1]
5354                                        ->getType();
5355           if (R.Priority < BestPriority || PreferredType.isNull()) {
5356             BestPriority = R.Priority;
5357             PreferredType = MyPreferredType;
5358           } else if (!Context.hasSameUnqualifiedType(PreferredType,
5359                                                      MyPreferredType)) {
5360             PreferredType = QualType();
5361           }
5362         }
5363       }
5364     }
5365   }
5366 
5367   return PreferredType;
5368 }
5369 
5370 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
5371                                        ParsedType Receiver,
5372                                        ArrayRef<IdentifierInfo *> SelIdents,
5373                                        bool AtArgumentExpression,
5374                                        bool IsSuper,
5375                                        ResultBuilder &Results) {
5376   typedef CodeCompletionResult Result;
5377   ObjCInterfaceDecl *CDecl = 0;
5378 
5379   // If the given name refers to an interface type, retrieve the
5380   // corresponding declaration.
5381   if (Receiver) {
5382     QualType T = SemaRef.GetTypeFromParser(Receiver, 0);
5383     if (!T.isNull())
5384       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
5385         CDecl = Interface->getInterface();
5386   }
5387 
5388   // Add all of the factory methods in this Objective-C class, its protocols,
5389   // superclasses, categories, implementation, etc.
5390   Results.EnterNewScope();
5391 
5392   // If this is a send-to-super, try to add the special "super" send
5393   // completion.
5394   if (IsSuper) {
5395     if (ObjCMethodDecl *SuperMethod
5396         = AddSuperSendCompletion(SemaRef, false, SelIdents, Results))
5397       Results.Ignore(SuperMethod);
5398   }
5399 
5400   // If we're inside an Objective-C method definition, prefer its selector to
5401   // others.
5402   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
5403     Results.setPreferredSelector(CurMethod->getSelector());
5404 
5405   VisitedSelectorSet Selectors;
5406   if (CDecl)
5407     AddObjCMethods(CDecl, false, MK_Any, SelIdents,
5408                    SemaRef.CurContext, Selectors, AtArgumentExpression,
5409                    Results);
5410   else {
5411     // We're messaging "id" as a type; provide all class/factory methods.
5412 
5413     // If we have an external source, load the entire class method
5414     // pool from the AST file.
5415     if (SemaRef.getExternalSource()) {
5416       for (uint32_t I = 0,
5417                     N = SemaRef.getExternalSource()->GetNumExternalSelectors();
5418            I != N; ++I) {
5419         Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I);
5420         if (Sel.isNull() || SemaRef.MethodPool.count(Sel))
5421           continue;
5422 
5423         SemaRef.ReadMethodPool(Sel);
5424       }
5425     }
5426 
5427     for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(),
5428                                        MEnd = SemaRef.MethodPool.end();
5429          M != MEnd; ++M) {
5430       for (ObjCMethodList *MethList = &M->second.second;
5431            MethList && MethList->Method;
5432            MethList = MethList->getNext()) {
5433         if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents))
5434           continue;
5435 
5436         Result R(MethList->Method, Results.getBasePriority(MethList->Method),0);
5437         R.StartParameter = SelIdents.size();
5438         R.AllParametersAreInformative = false;
5439         Results.MaybeAddResult(R, SemaRef.CurContext);
5440       }
5441     }
5442   }
5443 
5444   Results.ExitScope();
5445 }
5446 
5447 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
5448                                         ArrayRef<IdentifierInfo *> SelIdents,
5449                                         bool AtArgumentExpression,
5450                                         bool IsSuper) {
5451 
5452   QualType T = this->GetTypeFromParser(Receiver);
5453 
5454   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5455                         CodeCompleter->getCodeCompletionTUInfo(),
5456               CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage,
5457                                     T, SelIdents));
5458 
5459   AddClassMessageCompletions(*this, S, Receiver, SelIdents,
5460                              AtArgumentExpression, IsSuper, Results);
5461 
5462   // If we're actually at the argument expression (rather than prior to the
5463   // selector), we're actually performing code completion for an expression.
5464   // Determine whether we have a single, best method. If so, we can
5465   // code-complete the expression using the corresponding parameter type as
5466   // our preferred type, improving completion results.
5467   if (AtArgumentExpression) {
5468     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
5469                                                               SelIdents.size());
5470     if (PreferredType.isNull())
5471       CodeCompleteOrdinaryName(S, PCC_Expression);
5472     else
5473       CodeCompleteExpression(S, PreferredType);
5474     return;
5475   }
5476 
5477   HandleCodeCompleteResults(this, CodeCompleter,
5478                             Results.getCompletionContext(),
5479                             Results.data(), Results.size());
5480 }
5481 
5482 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,
5483                                            ArrayRef<IdentifierInfo *> SelIdents,
5484                                            bool AtArgumentExpression,
5485                                            ObjCInterfaceDecl *Super) {
5486   typedef CodeCompletionResult Result;
5487 
5488   Expr *RecExpr = static_cast<Expr *>(Receiver);
5489 
5490   // If necessary, apply function/array conversion to the receiver.
5491   // C99 6.7.5.3p[7,8].
5492   if (RecExpr) {
5493     ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr);
5494     if (Conv.isInvalid()) // conversion failed. bail.
5495       return;
5496     RecExpr = Conv.take();
5497   }
5498   QualType ReceiverType = RecExpr? RecExpr->getType()
5499                           : Super? Context.getObjCObjectPointerType(
5500                                             Context.getObjCInterfaceType(Super))
5501                                  : Context.getObjCIdType();
5502 
5503   // If we're messaging an expression with type "id" or "Class", check
5504   // whether we know something special about the receiver that allows
5505   // us to assume a more-specific receiver type.
5506   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) {
5507     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
5508       if (ReceiverType->isObjCClassType())
5509         return CodeCompleteObjCClassMessage(S,
5510                        ParsedType::make(Context.getObjCInterfaceType(IFace)),
5511                                             SelIdents,
5512                                             AtArgumentExpression, Super);
5513 
5514       ReceiverType = Context.getObjCObjectPointerType(
5515                                           Context.getObjCInterfaceType(IFace));
5516     }
5517   } else if (RecExpr && getLangOpts().CPlusPlus) {
5518     ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr);
5519     if (Conv.isUsable()) {
5520       RecExpr = Conv.take();
5521       ReceiverType = RecExpr->getType();
5522     }
5523   }
5524 
5525   // Build the set of methods we can see.
5526   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5527                         CodeCompleter->getCodeCompletionTUInfo(),
5528            CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
5529                                  ReceiverType, SelIdents));
5530 
5531   Results.EnterNewScope();
5532 
5533   // If this is a send-to-super, try to add the special "super" send
5534   // completion.
5535   if (Super) {
5536     if (ObjCMethodDecl *SuperMethod
5537           = AddSuperSendCompletion(*this, false, SelIdents, Results))
5538       Results.Ignore(SuperMethod);
5539   }
5540 
5541   // If we're inside an Objective-C method definition, prefer its selector to
5542   // others.
5543   if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
5544     Results.setPreferredSelector(CurMethod->getSelector());
5545 
5546   // Keep track of the selectors we've already added.
5547   VisitedSelectorSet Selectors;
5548 
5549   // Handle messages to Class. This really isn't a message to an instance
5550   // method, so we treat it the same way we would treat a message send to a
5551   // class method.
5552   if (ReceiverType->isObjCClassType() ||
5553       ReceiverType->isObjCQualifiedClassType()) {
5554     if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
5555       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
5556         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents,
5557                        CurContext, Selectors, AtArgumentExpression, Results);
5558     }
5559   }
5560   // Handle messages to a qualified ID ("id<foo>").
5561   else if (const ObjCObjectPointerType *QualID
5562              = ReceiverType->getAsObjCQualifiedIdType()) {
5563     // Search protocols for instance methods.
5564     for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(),
5565                                               E = QualID->qual_end();
5566          I != E; ++I)
5567       AddObjCMethods(*I, true, MK_Any, SelIdents, CurContext,
5568                      Selectors, AtArgumentExpression, Results);
5569   }
5570   // Handle messages to a pointer to interface type.
5571   else if (const ObjCObjectPointerType *IFacePtr
5572                               = ReceiverType->getAsObjCInterfacePointerType()) {
5573     // Search the class, its superclasses, etc., for instance methods.
5574     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
5575                    CurContext, Selectors, AtArgumentExpression,
5576                    Results);
5577 
5578     // Search protocols for instance methods.
5579     for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(),
5580          E = IFacePtr->qual_end();
5581          I != E; ++I)
5582       AddObjCMethods(*I, true, MK_Any, SelIdents, CurContext,
5583                      Selectors, AtArgumentExpression, Results);
5584   }
5585   // Handle messages to "id".
5586   else if (ReceiverType->isObjCIdType()) {
5587     // We're messaging "id", so provide all instance methods we know
5588     // about as code-completion results.
5589 
5590     // If we have an external source, load the entire class method
5591     // pool from the AST file.
5592     if (ExternalSource) {
5593       for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
5594            I != N; ++I) {
5595         Selector Sel = ExternalSource->GetExternalSelector(I);
5596         if (Sel.isNull() || MethodPool.count(Sel))
5597           continue;
5598 
5599         ReadMethodPool(Sel);
5600       }
5601     }
5602 
5603     for (GlobalMethodPool::iterator M = MethodPool.begin(),
5604                                     MEnd = MethodPool.end();
5605          M != MEnd; ++M) {
5606       for (ObjCMethodList *MethList = &M->second.first;
5607            MethList && MethList->Method;
5608            MethList = MethList->getNext()) {
5609         if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents))
5610           continue;
5611 
5612         if (!Selectors.insert(MethList->Method->getSelector()))
5613           continue;
5614 
5615         Result R(MethList->Method, Results.getBasePriority(MethList->Method),0);
5616         R.StartParameter = SelIdents.size();
5617         R.AllParametersAreInformative = false;
5618         Results.MaybeAddResult(R, CurContext);
5619       }
5620     }
5621   }
5622   Results.ExitScope();
5623 
5624 
5625   // If we're actually at the argument expression (rather than prior to the
5626   // selector), we're actually performing code completion for an expression.
5627   // Determine whether we have a single, best method. If so, we can
5628   // code-complete the expression using the corresponding parameter type as
5629   // our preferred type, improving completion results.
5630   if (AtArgumentExpression) {
5631     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
5632                                                               SelIdents.size());
5633     if (PreferredType.isNull())
5634       CodeCompleteOrdinaryName(S, PCC_Expression);
5635     else
5636       CodeCompleteExpression(S, PreferredType);
5637     return;
5638   }
5639 
5640   HandleCodeCompleteResults(this, CodeCompleter,
5641                             Results.getCompletionContext(),
5642                             Results.data(),Results.size());
5643 }
5644 
5645 void Sema::CodeCompleteObjCForCollection(Scope *S,
5646                                          DeclGroupPtrTy IterationVar) {
5647   CodeCompleteExpressionData Data;
5648   Data.ObjCCollection = true;
5649 
5650   if (IterationVar.getAsOpaquePtr()) {
5651     DeclGroupRef DG = IterationVar.get();
5652     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
5653       if (*I)
5654         Data.IgnoreDecls.push_back(*I);
5655     }
5656   }
5657 
5658   CodeCompleteExpression(S, Data);
5659 }
5660 
5661 void Sema::CodeCompleteObjCSelector(Scope *S,
5662                                     ArrayRef<IdentifierInfo *> SelIdents) {
5663   // If we have an external source, load the entire class method
5664   // pool from the AST file.
5665   if (ExternalSource) {
5666     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
5667          I != N; ++I) {
5668       Selector Sel = ExternalSource->GetExternalSelector(I);
5669       if (Sel.isNull() || MethodPool.count(Sel))
5670         continue;
5671 
5672       ReadMethodPool(Sel);
5673     }
5674   }
5675 
5676   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5677                         CodeCompleter->getCodeCompletionTUInfo(),
5678                         CodeCompletionContext::CCC_SelectorName);
5679   Results.EnterNewScope();
5680   for (GlobalMethodPool::iterator M = MethodPool.begin(),
5681                                MEnd = MethodPool.end();
5682        M != MEnd; ++M) {
5683 
5684     Selector Sel = M->first;
5685     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents))
5686       continue;
5687 
5688     CodeCompletionBuilder Builder(Results.getAllocator(),
5689                                   Results.getCodeCompletionTUInfo());
5690     if (Sel.isUnarySelector()) {
5691       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
5692                                                        Sel.getNameForSlot(0)));
5693       Results.AddResult(Builder.TakeString());
5694       continue;
5695     }
5696 
5697     std::string Accumulator;
5698     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
5699       if (I == SelIdents.size()) {
5700         if (!Accumulator.empty()) {
5701           Builder.AddInformativeChunk(Builder.getAllocator().CopyString(
5702                                                  Accumulator));
5703           Accumulator.clear();
5704         }
5705       }
5706 
5707       Accumulator += Sel.getNameForSlot(I);
5708       Accumulator += ':';
5709     }
5710     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator));
5711     Results.AddResult(Builder.TakeString());
5712   }
5713   Results.ExitScope();
5714 
5715   HandleCodeCompleteResults(this, CodeCompleter,
5716                             CodeCompletionContext::CCC_SelectorName,
5717                             Results.data(), Results.size());
5718 }
5719 
5720 /// \brief Add all of the protocol declarations that we find in the given
5721 /// (translation unit) context.
5722 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
5723                                bool OnlyForwardDeclarations,
5724                                ResultBuilder &Results) {
5725   typedef CodeCompletionResult Result;
5726 
5727   for (const auto *D : Ctx->decls()) {
5728     // Record any protocols we find.
5729     if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D))
5730       if (!OnlyForwardDeclarations || !Proto->hasDefinition())
5731         Results.AddResult(Result(Proto, Results.getBasePriority(Proto), 0),
5732                           CurContext, 0, false);
5733   }
5734 }
5735 
5736 void Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols,
5737                                               unsigned NumProtocols) {
5738   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5739                         CodeCompleter->getCodeCompletionTUInfo(),
5740                         CodeCompletionContext::CCC_ObjCProtocolName);
5741 
5742   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5743     Results.EnterNewScope();
5744 
5745     // Tell the result set to ignore all of the protocols we have
5746     // already seen.
5747     // FIXME: This doesn't work when caching code-completion results.
5748     for (unsigned I = 0; I != NumProtocols; ++I)
5749       if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first,
5750                                                       Protocols[I].second))
5751         Results.Ignore(Protocol);
5752 
5753     // Add all protocols.
5754     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false,
5755                        Results);
5756 
5757     Results.ExitScope();
5758   }
5759 
5760   HandleCodeCompleteResults(this, CodeCompleter,
5761                             CodeCompletionContext::CCC_ObjCProtocolName,
5762                             Results.data(),Results.size());
5763 }
5764 
5765 void Sema::CodeCompleteObjCProtocolDecl(Scope *) {
5766   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5767                         CodeCompleter->getCodeCompletionTUInfo(),
5768                         CodeCompletionContext::CCC_ObjCProtocolName);
5769 
5770   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5771     Results.EnterNewScope();
5772 
5773     // Add all protocols.
5774     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true,
5775                        Results);
5776 
5777     Results.ExitScope();
5778   }
5779 
5780   HandleCodeCompleteResults(this, CodeCompleter,
5781                             CodeCompletionContext::CCC_ObjCProtocolName,
5782                             Results.data(),Results.size());
5783 }
5784 
5785 /// \brief Add all of the Objective-C interface declarations that we find in
5786 /// the given (translation unit) context.
5787 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
5788                                 bool OnlyForwardDeclarations,
5789                                 bool OnlyUnimplemented,
5790                                 ResultBuilder &Results) {
5791   typedef CodeCompletionResult Result;
5792 
5793   for (const auto *D : Ctx->decls()) {
5794     // Record any interfaces we find.
5795     if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
5796       if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
5797           (!OnlyUnimplemented || !Class->getImplementation()))
5798         Results.AddResult(Result(Class, Results.getBasePriority(Class), 0),
5799                           CurContext, 0, false);
5800   }
5801 }
5802 
5803 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
5804   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5805                         CodeCompleter->getCodeCompletionTUInfo(),
5806                         CodeCompletionContext::CCC_Other);
5807   Results.EnterNewScope();
5808 
5809   if (CodeCompleter->includeGlobals()) {
5810     // Add all classes.
5811     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5812                         false, Results);
5813   }
5814 
5815   Results.ExitScope();
5816 
5817   HandleCodeCompleteResults(this, CodeCompleter,
5818                             CodeCompletionContext::CCC_ObjCInterfaceName,
5819                             Results.data(),Results.size());
5820 }
5821 
5822 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
5823                                       SourceLocation ClassNameLoc) {
5824   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5825                         CodeCompleter->getCodeCompletionTUInfo(),
5826                         CodeCompletionContext::CCC_ObjCInterfaceName);
5827   Results.EnterNewScope();
5828 
5829   // Make sure that we ignore the class we're currently defining.
5830   NamedDecl *CurClass
5831     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5832   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
5833     Results.Ignore(CurClass);
5834 
5835   if (CodeCompleter->includeGlobals()) {
5836     // Add all classes.
5837     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5838                         false, Results);
5839   }
5840 
5841   Results.ExitScope();
5842 
5843   HandleCodeCompleteResults(this, CodeCompleter,
5844                             CodeCompletionContext::CCC_ObjCInterfaceName,
5845                             Results.data(),Results.size());
5846 }
5847 
5848 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
5849   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5850                         CodeCompleter->getCodeCompletionTUInfo(),
5851                         CodeCompletionContext::CCC_Other);
5852   Results.EnterNewScope();
5853 
5854   if (CodeCompleter->includeGlobals()) {
5855     // Add all unimplemented classes.
5856     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5857                         true, Results);
5858   }
5859 
5860   Results.ExitScope();
5861 
5862   HandleCodeCompleteResults(this, CodeCompleter,
5863                             CodeCompletionContext::CCC_ObjCInterfaceName,
5864                             Results.data(),Results.size());
5865 }
5866 
5867 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
5868                                              IdentifierInfo *ClassName,
5869                                              SourceLocation ClassNameLoc) {
5870   typedef CodeCompletionResult Result;
5871 
5872   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5873                         CodeCompleter->getCodeCompletionTUInfo(),
5874                         CodeCompletionContext::CCC_ObjCCategoryName);
5875 
5876   // Ignore any categories we find that have already been implemented by this
5877   // interface.
5878   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5879   NamedDecl *CurClass
5880     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5881   if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)){
5882     for (ObjCInterfaceDecl::visible_categories_iterator
5883            Cat = Class->visible_categories_begin(),
5884            CatEnd = Class->visible_categories_end();
5885          Cat != CatEnd; ++Cat) {
5886       CategoryNames.insert(Cat->getIdentifier());
5887     }
5888   }
5889 
5890   // Add all of the categories we know about.
5891   Results.EnterNewScope();
5892   TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
5893   for (const auto *D : TU->decls())
5894     if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D))
5895       if (CategoryNames.insert(Category->getIdentifier()))
5896         Results.AddResult(Result(Category, Results.getBasePriority(Category),0),
5897                           CurContext, 0, false);
5898   Results.ExitScope();
5899 
5900   HandleCodeCompleteResults(this, CodeCompleter,
5901                             CodeCompletionContext::CCC_ObjCCategoryName,
5902                             Results.data(),Results.size());
5903 }
5904 
5905 void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
5906                                                   IdentifierInfo *ClassName,
5907                                                   SourceLocation ClassNameLoc) {
5908   typedef CodeCompletionResult Result;
5909 
5910   // Find the corresponding interface. If we couldn't find the interface, the
5911   // program itself is ill-formed. However, we'll try to be helpful still by
5912   // providing the list of all of the categories we know about.
5913   NamedDecl *CurClass
5914     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5915   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
5916   if (!Class)
5917     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
5918 
5919   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5920                         CodeCompleter->getCodeCompletionTUInfo(),
5921                         CodeCompletionContext::CCC_ObjCCategoryName);
5922 
5923   // Add all of the categories that have have corresponding interface
5924   // declarations in this class and any of its superclasses, except for
5925   // already-implemented categories in the class itself.
5926   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5927   Results.EnterNewScope();
5928   bool IgnoreImplemented = true;
5929   while (Class) {
5930     for (ObjCInterfaceDecl::visible_categories_iterator
5931            Cat = Class->visible_categories_begin(),
5932            CatEnd = Class->visible_categories_end();
5933          Cat != CatEnd; ++Cat) {
5934       if ((!IgnoreImplemented || !Cat->getImplementation()) &&
5935           CategoryNames.insert(Cat->getIdentifier()))
5936         Results.AddResult(Result(*Cat, Results.getBasePriority(*Cat), 0),
5937                           CurContext, 0, false);
5938     }
5939 
5940     Class = Class->getSuperClass();
5941     IgnoreImplemented = false;
5942   }
5943   Results.ExitScope();
5944 
5945   HandleCodeCompleteResults(this, CodeCompleter,
5946                             CodeCompletionContext::CCC_ObjCCategoryName,
5947                             Results.data(),Results.size());
5948 }
5949 
5950 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) {
5951   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5952                         CodeCompleter->getCodeCompletionTUInfo(),
5953                         CodeCompletionContext::CCC_Other);
5954 
5955   // Figure out where this @synthesize lives.
5956   ObjCContainerDecl *Container
5957     = dyn_cast_or_null<ObjCContainerDecl>(CurContext);
5958   if (!Container ||
5959       (!isa<ObjCImplementationDecl>(Container) &&
5960        !isa<ObjCCategoryImplDecl>(Container)))
5961     return;
5962 
5963   // Ignore any properties that have already been implemented.
5964   Container = getContainerDef(Container);
5965   for (const auto *D : Container->decls())
5966     if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D))
5967       Results.Ignore(PropertyImpl->getPropertyDecl());
5968 
5969   // Add any properties that we find.
5970   AddedPropertiesSet AddedProperties;
5971   Results.EnterNewScope();
5972   if (ObjCImplementationDecl *ClassImpl
5973         = dyn_cast<ObjCImplementationDecl>(Container))
5974     AddObjCProperties(ClassImpl->getClassInterface(), false,
5975                       /*AllowNullaryMethods=*/false, CurContext,
5976                       AddedProperties, Results);
5977   else
5978     AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
5979                       false, /*AllowNullaryMethods=*/false, CurContext,
5980                       AddedProperties, Results);
5981   Results.ExitScope();
5982 
5983   HandleCodeCompleteResults(this, CodeCompleter,
5984                             CodeCompletionContext::CCC_Other,
5985                             Results.data(),Results.size());
5986 }
5987 
5988 void Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S,
5989                                                   IdentifierInfo *PropertyName) {
5990   typedef CodeCompletionResult Result;
5991   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5992                         CodeCompleter->getCodeCompletionTUInfo(),
5993                         CodeCompletionContext::CCC_Other);
5994 
5995   // Figure out where this @synthesize lives.
5996   ObjCContainerDecl *Container
5997     = dyn_cast_or_null<ObjCContainerDecl>(CurContext);
5998   if (!Container ||
5999       (!isa<ObjCImplementationDecl>(Container) &&
6000        !isa<ObjCCategoryImplDecl>(Container)))
6001     return;
6002 
6003   // Figure out which interface we're looking into.
6004   ObjCInterfaceDecl *Class = 0;
6005   if (ObjCImplementationDecl *ClassImpl
6006                                  = dyn_cast<ObjCImplementationDecl>(Container))
6007     Class = ClassImpl->getClassInterface();
6008   else
6009     Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl()
6010                                                           ->getClassInterface();
6011 
6012   // Determine the type of the property we're synthesizing.
6013   QualType PropertyType = Context.getObjCIdType();
6014   if (Class) {
6015     if (ObjCPropertyDecl *Property
6016                               = Class->FindPropertyDeclaration(PropertyName)) {
6017       PropertyType
6018         = Property->getType().getNonReferenceType().getUnqualifiedType();
6019 
6020       // Give preference to ivars
6021       Results.setPreferredType(PropertyType);
6022     }
6023   }
6024 
6025   // Add all of the instance variables in this class and its superclasses.
6026   Results.EnterNewScope();
6027   bool SawSimilarlyNamedIvar = false;
6028   std::string NameWithPrefix;
6029   NameWithPrefix += '_';
6030   NameWithPrefix += PropertyName->getName();
6031   std::string NameWithSuffix = PropertyName->getName().str();
6032   NameWithSuffix += '_';
6033   for(; Class; Class = Class->getSuperClass()) {
6034     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
6035          Ivar = Ivar->getNextIvar()) {
6036       Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), 0),
6037                         CurContext, 0, false);
6038 
6039       // Determine whether we've seen an ivar with a name similar to the
6040       // property.
6041       if ((PropertyName == Ivar->getIdentifier() ||
6042            NameWithPrefix == Ivar->getName() ||
6043            NameWithSuffix == Ivar->getName())) {
6044         SawSimilarlyNamedIvar = true;
6045 
6046         // Reduce the priority of this result by one, to give it a slight
6047         // advantage over other results whose names don't match so closely.
6048         if (Results.size() &&
6049             Results.data()[Results.size() - 1].Kind
6050                                       == CodeCompletionResult::RK_Declaration &&
6051             Results.data()[Results.size() - 1].Declaration == Ivar)
6052           Results.data()[Results.size() - 1].Priority--;
6053       }
6054     }
6055   }
6056 
6057   if (!SawSimilarlyNamedIvar) {
6058     // Create ivar result _propName, that the user can use to synthesize
6059     // an ivar of the appropriate type.
6060     unsigned Priority = CCP_MemberDeclaration + 1;
6061     typedef CodeCompletionResult Result;
6062     CodeCompletionAllocator &Allocator = Results.getAllocator();
6063     CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(),
6064                                   Priority,CXAvailability_Available);
6065 
6066     PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
6067     Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context,
6068                                                        Policy, Allocator));
6069     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
6070     Results.AddResult(Result(Builder.TakeString(), Priority,
6071                              CXCursor_ObjCIvarDecl));
6072   }
6073 
6074   Results.ExitScope();
6075 
6076   HandleCodeCompleteResults(this, CodeCompleter,
6077                             CodeCompletionContext::CCC_Other,
6078                             Results.data(),Results.size());
6079 }
6080 
6081 // Mapping from selectors to the methods that implement that selector, along
6082 // with the "in original class" flag.
6083 typedef llvm::DenseMap<
6084     Selector, llvm::PointerIntPair<ObjCMethodDecl *, 1, bool> > KnownMethodsMap;
6085 
6086 /// \brief Find all of the methods that reside in the given container
6087 /// (and its superclasses, protocols, etc.) that meet the given
6088 /// criteria. Insert those methods into the map of known methods,
6089 /// indexed by selector so they can be easily found.
6090 static void FindImplementableMethods(ASTContext &Context,
6091                                      ObjCContainerDecl *Container,
6092                                      bool WantInstanceMethods,
6093                                      QualType ReturnType,
6094                                      KnownMethodsMap &KnownMethods,
6095                                      bool InOriginalClass = true) {
6096   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
6097     // Make sure we have a definition; that's what we'll walk.
6098     if (!IFace->hasDefinition())
6099       return;
6100 
6101     IFace = IFace->getDefinition();
6102     Container = IFace;
6103 
6104     const ObjCList<ObjCProtocolDecl> &Protocols
6105       = IFace->getReferencedProtocols();
6106     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
6107                                               E = Protocols.end();
6108          I != E; ++I)
6109       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
6110                                KnownMethods, InOriginalClass);
6111 
6112     // Add methods from any class extensions and categories.
6113     for (ObjCInterfaceDecl::visible_categories_iterator
6114            Cat = IFace->visible_categories_begin(),
6115            CatEnd = IFace->visible_categories_end();
6116          Cat != CatEnd; ++Cat) {
6117       FindImplementableMethods(Context, *Cat, WantInstanceMethods, ReturnType,
6118                                KnownMethods, false);
6119     }
6120 
6121     // Visit the superclass.
6122     if (IFace->getSuperClass())
6123       FindImplementableMethods(Context, IFace->getSuperClass(),
6124                                WantInstanceMethods, ReturnType,
6125                                KnownMethods, false);
6126   }
6127 
6128   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
6129     // Recurse into protocols.
6130     const ObjCList<ObjCProtocolDecl> &Protocols
6131       = Category->getReferencedProtocols();
6132     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
6133                                               E = Protocols.end();
6134          I != E; ++I)
6135       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
6136                                KnownMethods, InOriginalClass);
6137 
6138     // If this category is the original class, jump to the interface.
6139     if (InOriginalClass && Category->getClassInterface())
6140       FindImplementableMethods(Context, Category->getClassInterface(),
6141                                WantInstanceMethods, ReturnType, KnownMethods,
6142                                false);
6143   }
6144 
6145   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
6146     // Make sure we have a definition; that's what we'll walk.
6147     if (!Protocol->hasDefinition())
6148       return;
6149     Protocol = Protocol->getDefinition();
6150     Container = Protocol;
6151 
6152     // Recurse into protocols.
6153     const ObjCList<ObjCProtocolDecl> &Protocols
6154       = Protocol->getReferencedProtocols();
6155     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
6156            E = Protocols.end();
6157          I != E; ++I)
6158       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
6159                                KnownMethods, false);
6160   }
6161 
6162   // Add methods in this container. This operation occurs last because
6163   // we want the methods from this container to override any methods
6164   // we've previously seen with the same selector.
6165   for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
6166                                        MEnd = Container->meth_end();
6167        M != MEnd; ++M) {
6168     if (M->isInstanceMethod() == WantInstanceMethods) {
6169       if (!ReturnType.isNull() &&
6170           !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType()))
6171         continue;
6172 
6173       KnownMethods[M->getSelector()] =
6174           KnownMethodsMap::mapped_type(*M, InOriginalClass);
6175     }
6176   }
6177 }
6178 
6179 /// \brief Add the parenthesized return or parameter type chunk to a code
6180 /// completion string.
6181 static void AddObjCPassingTypeChunk(QualType Type,
6182                                     unsigned ObjCDeclQuals,
6183                                     ASTContext &Context,
6184                                     const PrintingPolicy &Policy,
6185                                     CodeCompletionBuilder &Builder) {
6186   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6187   std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals);
6188   if (!Quals.empty())
6189     Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
6190   Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy,
6191                                                Builder.getAllocator()));
6192   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6193 }
6194 
6195 /// \brief Determine whether the given class is or inherits from a class by
6196 /// the given name.
6197 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class,
6198                                    StringRef Name) {
6199   if (!Class)
6200     return false;
6201 
6202   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
6203     return true;
6204 
6205   return InheritsFromClassNamed(Class->getSuperClass(), Name);
6206 }
6207 
6208 /// \brief Add code completions for Objective-C Key-Value Coding (KVC) and
6209 /// Key-Value Observing (KVO).
6210 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
6211                                        bool IsInstanceMethod,
6212                                        QualType ReturnType,
6213                                        ASTContext &Context,
6214                                        VisitedSelectorSet &KnownSelectors,
6215                                        ResultBuilder &Results) {
6216   IdentifierInfo *PropName = Property->getIdentifier();
6217   if (!PropName || PropName->getLength() == 0)
6218     return;
6219 
6220   PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
6221 
6222   // Builder that will create each code completion.
6223   typedef CodeCompletionResult Result;
6224   CodeCompletionAllocator &Allocator = Results.getAllocator();
6225   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
6226 
6227   // The selector table.
6228   SelectorTable &Selectors = Context.Selectors;
6229 
6230   // The property name, copied into the code completion allocation region
6231   // on demand.
6232   struct KeyHolder {
6233     CodeCompletionAllocator &Allocator;
6234     StringRef Key;
6235     const char *CopiedKey;
6236 
6237     KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key)
6238     : Allocator(Allocator), Key(Key), CopiedKey(0) { }
6239 
6240     operator const char *() {
6241       if (CopiedKey)
6242         return CopiedKey;
6243 
6244       return CopiedKey = Allocator.CopyString(Key);
6245     }
6246   } Key(Allocator, PropName->getName());
6247 
6248   // The uppercased name of the property name.
6249   std::string UpperKey = PropName->getName();
6250   if (!UpperKey.empty())
6251     UpperKey[0] = toUppercase(UpperKey[0]);
6252 
6253   bool ReturnTypeMatchesProperty = ReturnType.isNull() ||
6254     Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
6255                                    Property->getType());
6256   bool ReturnTypeMatchesVoid
6257     = ReturnType.isNull() || ReturnType->isVoidType();
6258 
6259   // Add the normal accessor -(type)key.
6260   if (IsInstanceMethod &&
6261       KnownSelectors.insert(Selectors.getNullarySelector(PropName)) &&
6262       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
6263     if (ReturnType.isNull())
6264       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0,
6265                               Context, Policy, Builder);
6266 
6267     Builder.AddTypedTextChunk(Key);
6268     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6269                              CXCursor_ObjCInstanceMethodDecl));
6270   }
6271 
6272   // If we have an integral or boolean property (or the user has provided
6273   // an integral or boolean return type), add the accessor -(type)isKey.
6274   if (IsInstanceMethod &&
6275       ((!ReturnType.isNull() &&
6276         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
6277        (ReturnType.isNull() &&
6278         (Property->getType()->isIntegerType() ||
6279          Property->getType()->isBooleanType())))) {
6280     std::string SelectorName = (Twine("is") + UpperKey).str();
6281     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6282     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6283       if (ReturnType.isNull()) {
6284         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6285         Builder.AddTextChunk("BOOL");
6286         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6287       }
6288 
6289       Builder.AddTypedTextChunk(
6290                                 Allocator.CopyString(SelectorId->getName()));
6291       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6292                                CXCursor_ObjCInstanceMethodDecl));
6293     }
6294   }
6295 
6296   // Add the normal mutator.
6297   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
6298       !Property->getSetterMethodDecl()) {
6299     std::string SelectorName = (Twine("set") + UpperKey).str();
6300     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6301     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6302       if (ReturnType.isNull()) {
6303         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6304         Builder.AddTextChunk("void");
6305         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6306       }
6307 
6308       Builder.AddTypedTextChunk(
6309                                 Allocator.CopyString(SelectorId->getName()));
6310       Builder.AddTypedTextChunk(":");
6311       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0,
6312                               Context, Policy, Builder);
6313       Builder.AddTextChunk(Key);
6314       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6315                                CXCursor_ObjCInstanceMethodDecl));
6316     }
6317   }
6318 
6319   // Indexed and unordered accessors
6320   unsigned IndexedGetterPriority = CCP_CodePattern;
6321   unsigned IndexedSetterPriority = CCP_CodePattern;
6322   unsigned UnorderedGetterPriority = CCP_CodePattern;
6323   unsigned UnorderedSetterPriority = CCP_CodePattern;
6324   if (const ObjCObjectPointerType *ObjCPointer
6325                     = Property->getType()->getAs<ObjCObjectPointerType>()) {
6326     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
6327       // If this interface type is not provably derived from a known
6328       // collection, penalize the corresponding completions.
6329       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
6330         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
6331         if (!InheritsFromClassNamed(IFace, "NSArray"))
6332           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
6333       }
6334 
6335       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
6336         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
6337         if (!InheritsFromClassNamed(IFace, "NSSet"))
6338           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
6339       }
6340     }
6341   } else {
6342     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
6343     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
6344     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
6345     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
6346   }
6347 
6348   // Add -(NSUInteger)countOf<key>
6349   if (IsInstanceMethod &&
6350       (ReturnType.isNull() || ReturnType->isIntegerType())) {
6351     std::string SelectorName = (Twine("countOf") + UpperKey).str();
6352     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6353     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6354       if (ReturnType.isNull()) {
6355         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6356         Builder.AddTextChunk("NSUInteger");
6357         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6358       }
6359 
6360       Builder.AddTypedTextChunk(
6361                                 Allocator.CopyString(SelectorId->getName()));
6362       Results.AddResult(Result(Builder.TakeString(),
6363                                std::min(IndexedGetterPriority,
6364                                         UnorderedGetterPriority),
6365                                CXCursor_ObjCInstanceMethodDecl));
6366     }
6367   }
6368 
6369   // Indexed getters
6370   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
6371   if (IsInstanceMethod &&
6372       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
6373     std::string SelectorName
6374       = (Twine("objectIn") + UpperKey + "AtIndex").str();
6375     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6376     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6377       if (ReturnType.isNull()) {
6378         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6379         Builder.AddTextChunk("id");
6380         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6381       }
6382 
6383       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6384       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6385       Builder.AddTextChunk("NSUInteger");
6386       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6387       Builder.AddTextChunk("index");
6388       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6389                                CXCursor_ObjCInstanceMethodDecl));
6390     }
6391   }
6392 
6393   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
6394   if (IsInstanceMethod &&
6395       (ReturnType.isNull() ||
6396        (ReturnType->isObjCObjectPointerType() &&
6397         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6398         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6399                                                 ->getName() == "NSArray"))) {
6400     std::string SelectorName
6401       = (Twine(Property->getName()) + "AtIndexes").str();
6402     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6403     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6404       if (ReturnType.isNull()) {
6405         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6406         Builder.AddTextChunk("NSArray *");
6407         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6408       }
6409 
6410       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6411       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6412       Builder.AddTextChunk("NSIndexSet *");
6413       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6414       Builder.AddTextChunk("indexes");
6415       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6416                                CXCursor_ObjCInstanceMethodDecl));
6417     }
6418   }
6419 
6420   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
6421   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6422     std::string SelectorName = (Twine("get") + UpperKey).str();
6423     IdentifierInfo *SelectorIds[2] = {
6424       &Context.Idents.get(SelectorName),
6425       &Context.Idents.get("range")
6426     };
6427 
6428     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6429       if (ReturnType.isNull()) {
6430         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6431         Builder.AddTextChunk("void");
6432         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6433       }
6434 
6435       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6436       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6437       Builder.AddPlaceholderChunk("object-type");
6438       Builder.AddTextChunk(" **");
6439       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6440       Builder.AddTextChunk("buffer");
6441       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6442       Builder.AddTypedTextChunk("range:");
6443       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6444       Builder.AddTextChunk("NSRange");
6445       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6446       Builder.AddTextChunk("inRange");
6447       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6448                                CXCursor_ObjCInstanceMethodDecl));
6449     }
6450   }
6451 
6452   // Mutable indexed accessors
6453 
6454   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
6455   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6456     std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str();
6457     IdentifierInfo *SelectorIds[2] = {
6458       &Context.Idents.get("insertObject"),
6459       &Context.Idents.get(SelectorName)
6460     };
6461 
6462     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6463       if (ReturnType.isNull()) {
6464         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6465         Builder.AddTextChunk("void");
6466         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6467       }
6468 
6469       Builder.AddTypedTextChunk("insertObject:");
6470       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6471       Builder.AddPlaceholderChunk("object-type");
6472       Builder.AddTextChunk(" *");
6473       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6474       Builder.AddTextChunk("object");
6475       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6476       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6477       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6478       Builder.AddPlaceholderChunk("NSUInteger");
6479       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6480       Builder.AddTextChunk("index");
6481       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6482                                CXCursor_ObjCInstanceMethodDecl));
6483     }
6484   }
6485 
6486   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
6487   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6488     std::string SelectorName = (Twine("insert") + UpperKey).str();
6489     IdentifierInfo *SelectorIds[2] = {
6490       &Context.Idents.get(SelectorName),
6491       &Context.Idents.get("atIndexes")
6492     };
6493 
6494     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6495       if (ReturnType.isNull()) {
6496         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6497         Builder.AddTextChunk("void");
6498         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6499       }
6500 
6501       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6502       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6503       Builder.AddTextChunk("NSArray *");
6504       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6505       Builder.AddTextChunk("array");
6506       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6507       Builder.AddTypedTextChunk("atIndexes:");
6508       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6509       Builder.AddPlaceholderChunk("NSIndexSet *");
6510       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6511       Builder.AddTextChunk("indexes");
6512       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6513                                CXCursor_ObjCInstanceMethodDecl));
6514     }
6515   }
6516 
6517   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
6518   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6519     std::string SelectorName
6520       = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
6521     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6522     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6523       if (ReturnType.isNull()) {
6524         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6525         Builder.AddTextChunk("void");
6526         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6527       }
6528 
6529       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6530       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6531       Builder.AddTextChunk("NSUInteger");
6532       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6533       Builder.AddTextChunk("index");
6534       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6535                                CXCursor_ObjCInstanceMethodDecl));
6536     }
6537   }
6538 
6539   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
6540   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6541     std::string SelectorName
6542       = (Twine("remove") + UpperKey + "AtIndexes").str();
6543     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6544     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6545       if (ReturnType.isNull()) {
6546         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6547         Builder.AddTextChunk("void");
6548         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6549       }
6550 
6551       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6552       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6553       Builder.AddTextChunk("NSIndexSet *");
6554       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6555       Builder.AddTextChunk("indexes");
6556       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6557                                CXCursor_ObjCInstanceMethodDecl));
6558     }
6559   }
6560 
6561   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
6562   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6563     std::string SelectorName
6564       = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
6565     IdentifierInfo *SelectorIds[2] = {
6566       &Context.Idents.get(SelectorName),
6567       &Context.Idents.get("withObject")
6568     };
6569 
6570     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6571       if (ReturnType.isNull()) {
6572         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6573         Builder.AddTextChunk("void");
6574         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6575       }
6576 
6577       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6578       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6579       Builder.AddPlaceholderChunk("NSUInteger");
6580       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6581       Builder.AddTextChunk("index");
6582       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6583       Builder.AddTypedTextChunk("withObject:");
6584       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6585       Builder.AddTextChunk("id");
6586       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6587       Builder.AddTextChunk("object");
6588       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6589                                CXCursor_ObjCInstanceMethodDecl));
6590     }
6591   }
6592 
6593   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
6594   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6595     std::string SelectorName1
6596       = (Twine("replace") + UpperKey + "AtIndexes").str();
6597     std::string SelectorName2 = (Twine("with") + UpperKey).str();
6598     IdentifierInfo *SelectorIds[2] = {
6599       &Context.Idents.get(SelectorName1),
6600       &Context.Idents.get(SelectorName2)
6601     };
6602 
6603     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6604       if (ReturnType.isNull()) {
6605         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6606         Builder.AddTextChunk("void");
6607         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6608       }
6609 
6610       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
6611       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6612       Builder.AddPlaceholderChunk("NSIndexSet *");
6613       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6614       Builder.AddTextChunk("indexes");
6615       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6616       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
6617       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6618       Builder.AddTextChunk("NSArray *");
6619       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6620       Builder.AddTextChunk("array");
6621       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6622                                CXCursor_ObjCInstanceMethodDecl));
6623     }
6624   }
6625 
6626   // Unordered getters
6627   // - (NSEnumerator *)enumeratorOfKey
6628   if (IsInstanceMethod &&
6629       (ReturnType.isNull() ||
6630        (ReturnType->isObjCObjectPointerType() &&
6631         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6632         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6633           ->getName() == "NSEnumerator"))) {
6634     std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str();
6635     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6636     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6637       if (ReturnType.isNull()) {
6638         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6639         Builder.AddTextChunk("NSEnumerator *");
6640         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6641       }
6642 
6643       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6644       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
6645                               CXCursor_ObjCInstanceMethodDecl));
6646     }
6647   }
6648 
6649   // - (type *)memberOfKey:(type *)object
6650   if (IsInstanceMethod &&
6651       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
6652     std::string SelectorName = (Twine("memberOf") + UpperKey).str();
6653     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6654     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6655       if (ReturnType.isNull()) {
6656         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6657         Builder.AddPlaceholderChunk("object-type");
6658         Builder.AddTextChunk(" *");
6659         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6660       }
6661 
6662       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6663       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6664       if (ReturnType.isNull()) {
6665         Builder.AddPlaceholderChunk("object-type");
6666         Builder.AddTextChunk(" *");
6667       } else {
6668         Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context,
6669                                                      Policy,
6670                                                      Builder.getAllocator()));
6671       }
6672       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6673       Builder.AddTextChunk("object");
6674       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
6675                                CXCursor_ObjCInstanceMethodDecl));
6676     }
6677   }
6678 
6679   // Mutable unordered accessors
6680   // - (void)addKeyObject:(type *)object
6681   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6682     std::string SelectorName
6683       = (Twine("add") + UpperKey + Twine("Object")).str();
6684     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6685     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6686       if (ReturnType.isNull()) {
6687         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6688         Builder.AddTextChunk("void");
6689         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6690       }
6691 
6692       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6693       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6694       Builder.AddPlaceholderChunk("object-type");
6695       Builder.AddTextChunk(" *");
6696       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6697       Builder.AddTextChunk("object");
6698       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6699                                CXCursor_ObjCInstanceMethodDecl));
6700     }
6701   }
6702 
6703   // - (void)addKey:(NSSet *)objects
6704   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6705     std::string SelectorName = (Twine("add") + UpperKey).str();
6706     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6707     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6708       if (ReturnType.isNull()) {
6709         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6710         Builder.AddTextChunk("void");
6711         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6712       }
6713 
6714       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6715       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6716       Builder.AddTextChunk("NSSet *");
6717       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6718       Builder.AddTextChunk("objects");
6719       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6720                                CXCursor_ObjCInstanceMethodDecl));
6721     }
6722   }
6723 
6724   // - (void)removeKeyObject:(type *)object
6725   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6726     std::string SelectorName
6727       = (Twine("remove") + UpperKey + Twine("Object")).str();
6728     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6729     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6730       if (ReturnType.isNull()) {
6731         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6732         Builder.AddTextChunk("void");
6733         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6734       }
6735 
6736       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6737       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6738       Builder.AddPlaceholderChunk("object-type");
6739       Builder.AddTextChunk(" *");
6740       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6741       Builder.AddTextChunk("object");
6742       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6743                                CXCursor_ObjCInstanceMethodDecl));
6744     }
6745   }
6746 
6747   // - (void)removeKey:(NSSet *)objects
6748   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6749     std::string SelectorName = (Twine("remove") + UpperKey).str();
6750     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6751     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6752       if (ReturnType.isNull()) {
6753         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6754         Builder.AddTextChunk("void");
6755         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6756       }
6757 
6758       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6759       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6760       Builder.AddTextChunk("NSSet *");
6761       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6762       Builder.AddTextChunk("objects");
6763       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6764                                CXCursor_ObjCInstanceMethodDecl));
6765     }
6766   }
6767 
6768   // - (void)intersectKey:(NSSet *)objects
6769   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6770     std::string SelectorName = (Twine("intersect") + UpperKey).str();
6771     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6772     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6773       if (ReturnType.isNull()) {
6774         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6775         Builder.AddTextChunk("void");
6776         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6777       }
6778 
6779       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6780       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6781       Builder.AddTextChunk("NSSet *");
6782       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6783       Builder.AddTextChunk("objects");
6784       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6785                                CXCursor_ObjCInstanceMethodDecl));
6786     }
6787   }
6788 
6789   // Key-Value Observing
6790   // + (NSSet *)keyPathsForValuesAffectingKey
6791   if (!IsInstanceMethod &&
6792       (ReturnType.isNull() ||
6793        (ReturnType->isObjCObjectPointerType() &&
6794         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6795         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6796                                                     ->getName() == "NSSet"))) {
6797     std::string SelectorName
6798       = (Twine("keyPathsForValuesAffecting") + UpperKey).str();
6799     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6800     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6801       if (ReturnType.isNull()) {
6802         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6803         Builder.AddTextChunk("NSSet *");
6804         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6805       }
6806 
6807       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6808       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6809                               CXCursor_ObjCClassMethodDecl));
6810     }
6811   }
6812 
6813   // + (BOOL)automaticallyNotifiesObserversForKey
6814   if (!IsInstanceMethod &&
6815       (ReturnType.isNull() ||
6816        ReturnType->isIntegerType() ||
6817        ReturnType->isBooleanType())) {
6818     std::string SelectorName
6819       = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str();
6820     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6821     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6822       if (ReturnType.isNull()) {
6823         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6824         Builder.AddTextChunk("BOOL");
6825         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6826       }
6827 
6828       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6829       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6830                               CXCursor_ObjCClassMethodDecl));
6831     }
6832   }
6833 }
6834 
6835 void Sema::CodeCompleteObjCMethodDecl(Scope *S,
6836                                       bool IsInstanceMethod,
6837                                       ParsedType ReturnTy) {
6838   // Determine the return type of the method we're declaring, if
6839   // provided.
6840   QualType ReturnType = GetTypeFromParser(ReturnTy);
6841   Decl *IDecl = 0;
6842   if (CurContext->isObjCContainer()) {
6843       ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext);
6844       IDecl = cast<Decl>(OCD);
6845   }
6846   // Determine where we should start searching for methods.
6847   ObjCContainerDecl *SearchDecl = 0;
6848   bool IsInImplementation = false;
6849   if (Decl *D = IDecl) {
6850     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
6851       SearchDecl = Impl->getClassInterface();
6852       IsInImplementation = true;
6853     } else if (ObjCCategoryImplDecl *CatImpl
6854                                          = dyn_cast<ObjCCategoryImplDecl>(D)) {
6855       SearchDecl = CatImpl->getCategoryDecl();
6856       IsInImplementation = true;
6857     } else
6858       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
6859   }
6860 
6861   if (!SearchDecl && S) {
6862     if (DeclContext *DC = S->getEntity())
6863       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
6864   }
6865 
6866   if (!SearchDecl) {
6867     HandleCodeCompleteResults(this, CodeCompleter,
6868                               CodeCompletionContext::CCC_Other,
6869                               0, 0);
6870     return;
6871   }
6872 
6873   // Find all of the methods that we could declare/implement here.
6874   KnownMethodsMap KnownMethods;
6875   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod,
6876                            ReturnType, KnownMethods);
6877 
6878   // Add declarations or definitions for each of the known methods.
6879   typedef CodeCompletionResult Result;
6880   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6881                         CodeCompleter->getCodeCompletionTUInfo(),
6882                         CodeCompletionContext::CCC_Other);
6883   Results.EnterNewScope();
6884   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
6885   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
6886                               MEnd = KnownMethods.end();
6887        M != MEnd; ++M) {
6888     ObjCMethodDecl *Method = M->second.getPointer();
6889     CodeCompletionBuilder Builder(Results.getAllocator(),
6890                                   Results.getCodeCompletionTUInfo());
6891 
6892     // If the result type was not already provided, add it to the
6893     // pattern as (type).
6894     if (ReturnType.isNull())
6895       AddObjCPassingTypeChunk(Method->getReturnType(),
6896                               Method->getObjCDeclQualifier(), Context, Policy,
6897                               Builder);
6898 
6899     Selector Sel = Method->getSelector();
6900 
6901     // Add the first part of the selector to the pattern.
6902     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6903                                                        Sel.getNameForSlot(0)));
6904 
6905     // Add parameters to the pattern.
6906     unsigned I = 0;
6907     for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
6908                                      PEnd = Method->param_end();
6909          P != PEnd; (void)++P, ++I) {
6910       // Add the part of the selector name.
6911       if (I == 0)
6912         Builder.AddTypedTextChunk(":");
6913       else if (I < Sel.getNumArgs()) {
6914         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6915         Builder.AddTypedTextChunk(
6916                 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6917       } else
6918         break;
6919 
6920       // Add the parameter type.
6921       AddObjCPassingTypeChunk((*P)->getOriginalType(),
6922                               (*P)->getObjCDeclQualifier(),
6923                               Context, Policy,
6924                               Builder);
6925 
6926       if (IdentifierInfo *Id = (*P)->getIdentifier())
6927         Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName()));
6928     }
6929 
6930     if (Method->isVariadic()) {
6931       if (Method->param_size() > 0)
6932         Builder.AddChunk(CodeCompletionString::CK_Comma);
6933       Builder.AddTextChunk("...");
6934     }
6935 
6936     if (IsInImplementation && Results.includeCodePatterns()) {
6937       // We will be defining the method here, so add a compound statement.
6938       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6939       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6940       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6941       if (!Method->getReturnType()->isVoidType()) {
6942         // If the result type is not void, add a return clause.
6943         Builder.AddTextChunk("return");
6944         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6945         Builder.AddPlaceholderChunk("expression");
6946         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
6947       } else
6948         Builder.AddPlaceholderChunk("statements");
6949 
6950       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6951       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6952     }
6953 
6954     unsigned Priority = CCP_CodePattern;
6955     if (!M->second.getInt())
6956       Priority += CCD_InBaseClass;
6957 
6958     Results.AddResult(Result(Builder.TakeString(), Method, Priority));
6959   }
6960 
6961   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
6962   // the properties in this class and its categories.
6963   if (Context.getLangOpts().ObjC2) {
6964     SmallVector<ObjCContainerDecl *, 4> Containers;
6965     Containers.push_back(SearchDecl);
6966 
6967     VisitedSelectorSet KnownSelectors;
6968     for (KnownMethodsMap::iterator M = KnownMethods.begin(),
6969                                 MEnd = KnownMethods.end();
6970          M != MEnd; ++M)
6971       KnownSelectors.insert(M->first);
6972 
6973 
6974     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
6975     if (!IFace)
6976       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
6977         IFace = Category->getClassInterface();
6978 
6979     if (IFace) {
6980       for (ObjCInterfaceDecl::visible_categories_iterator
6981              Cat = IFace->visible_categories_begin(),
6982              CatEnd = IFace->visible_categories_end();
6983            Cat != CatEnd; ++Cat) {
6984         Containers.push_back(*Cat);
6985       }
6986     }
6987 
6988     for (unsigned I = 0, N = Containers.size(); I != N; ++I) {
6989       for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(),
6990                                          PEnd = Containers[I]->prop_end();
6991            P != PEnd; ++P) {
6992         AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context,
6993                                    KnownSelectors, Results);
6994       }
6995     }
6996   }
6997 
6998   Results.ExitScope();
6999 
7000   HandleCodeCompleteResults(this, CodeCompleter,
7001                             CodeCompletionContext::CCC_Other,
7002                             Results.data(),Results.size());
7003 }
7004 
7005 void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S,
7006                                               bool IsInstanceMethod,
7007                                               bool AtParameterName,
7008                                               ParsedType ReturnTy,
7009                                          ArrayRef<IdentifierInfo *> SelIdents) {
7010   // If we have an external source, load the entire class method
7011   // pool from the AST file.
7012   if (ExternalSource) {
7013     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
7014          I != N; ++I) {
7015       Selector Sel = ExternalSource->GetExternalSelector(I);
7016       if (Sel.isNull() || MethodPool.count(Sel))
7017         continue;
7018 
7019       ReadMethodPool(Sel);
7020     }
7021   }
7022 
7023   // Build the set of methods we can see.
7024   typedef CodeCompletionResult Result;
7025   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7026                         CodeCompleter->getCodeCompletionTUInfo(),
7027                         CodeCompletionContext::CCC_Other);
7028 
7029   if (ReturnTy)
7030     Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType());
7031 
7032   Results.EnterNewScope();
7033   for (GlobalMethodPool::iterator M = MethodPool.begin(),
7034                                   MEnd = MethodPool.end();
7035        M != MEnd; ++M) {
7036     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first :
7037                                                        &M->second.second;
7038          MethList && MethList->Method;
7039          MethList = MethList->getNext()) {
7040       if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents))
7041         continue;
7042 
7043       if (AtParameterName) {
7044         // Suggest parameter names we've seen before.
7045         unsigned NumSelIdents = SelIdents.size();
7046         if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) {
7047           ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1];
7048           if (Param->getIdentifier()) {
7049             CodeCompletionBuilder Builder(Results.getAllocator(),
7050                                           Results.getCodeCompletionTUInfo());
7051             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
7052                                            Param->getIdentifier()->getName()));
7053             Results.AddResult(Builder.TakeString());
7054           }
7055         }
7056 
7057         continue;
7058       }
7059 
7060       Result R(MethList->Method, Results.getBasePriority(MethList->Method), 0);
7061       R.StartParameter = SelIdents.size();
7062       R.AllParametersAreInformative = false;
7063       R.DeclaringEntity = true;
7064       Results.MaybeAddResult(R, CurContext);
7065     }
7066   }
7067 
7068   Results.ExitScope();
7069   HandleCodeCompleteResults(this, CodeCompleter,
7070                             CodeCompletionContext::CCC_Other,
7071                             Results.data(),Results.size());
7072 }
7073 
7074 void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
7075   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7076                         CodeCompleter->getCodeCompletionTUInfo(),
7077                         CodeCompletionContext::CCC_PreprocessorDirective);
7078   Results.EnterNewScope();
7079 
7080   // #if <condition>
7081   CodeCompletionBuilder Builder(Results.getAllocator(),
7082                                 Results.getCodeCompletionTUInfo());
7083   Builder.AddTypedTextChunk("if");
7084   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7085   Builder.AddPlaceholderChunk("condition");
7086   Results.AddResult(Builder.TakeString());
7087 
7088   // #ifdef <macro>
7089   Builder.AddTypedTextChunk("ifdef");
7090   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7091   Builder.AddPlaceholderChunk("macro");
7092   Results.AddResult(Builder.TakeString());
7093 
7094   // #ifndef <macro>
7095   Builder.AddTypedTextChunk("ifndef");
7096   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7097   Builder.AddPlaceholderChunk("macro");
7098   Results.AddResult(Builder.TakeString());
7099 
7100   if (InConditional) {
7101     // #elif <condition>
7102     Builder.AddTypedTextChunk("elif");
7103     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7104     Builder.AddPlaceholderChunk("condition");
7105     Results.AddResult(Builder.TakeString());
7106 
7107     // #else
7108     Builder.AddTypedTextChunk("else");
7109     Results.AddResult(Builder.TakeString());
7110 
7111     // #endif
7112     Builder.AddTypedTextChunk("endif");
7113     Results.AddResult(Builder.TakeString());
7114   }
7115 
7116   // #include "header"
7117   Builder.AddTypedTextChunk("include");
7118   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7119   Builder.AddTextChunk("\"");
7120   Builder.AddPlaceholderChunk("header");
7121   Builder.AddTextChunk("\"");
7122   Results.AddResult(Builder.TakeString());
7123 
7124   // #include <header>
7125   Builder.AddTypedTextChunk("include");
7126   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7127   Builder.AddTextChunk("<");
7128   Builder.AddPlaceholderChunk("header");
7129   Builder.AddTextChunk(">");
7130   Results.AddResult(Builder.TakeString());
7131 
7132   // #define <macro>
7133   Builder.AddTypedTextChunk("define");
7134   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7135   Builder.AddPlaceholderChunk("macro");
7136   Results.AddResult(Builder.TakeString());
7137 
7138   // #define <macro>(<args>)
7139   Builder.AddTypedTextChunk("define");
7140   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7141   Builder.AddPlaceholderChunk("macro");
7142   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7143   Builder.AddPlaceholderChunk("args");
7144   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7145   Results.AddResult(Builder.TakeString());
7146 
7147   // #undef <macro>
7148   Builder.AddTypedTextChunk("undef");
7149   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7150   Builder.AddPlaceholderChunk("macro");
7151   Results.AddResult(Builder.TakeString());
7152 
7153   // #line <number>
7154   Builder.AddTypedTextChunk("line");
7155   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7156   Builder.AddPlaceholderChunk("number");
7157   Results.AddResult(Builder.TakeString());
7158 
7159   // #line <number> "filename"
7160   Builder.AddTypedTextChunk("line");
7161   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7162   Builder.AddPlaceholderChunk("number");
7163   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7164   Builder.AddTextChunk("\"");
7165   Builder.AddPlaceholderChunk("filename");
7166   Builder.AddTextChunk("\"");
7167   Results.AddResult(Builder.TakeString());
7168 
7169   // #error <message>
7170   Builder.AddTypedTextChunk("error");
7171   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7172   Builder.AddPlaceholderChunk("message");
7173   Results.AddResult(Builder.TakeString());
7174 
7175   // #pragma <arguments>
7176   Builder.AddTypedTextChunk("pragma");
7177   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7178   Builder.AddPlaceholderChunk("arguments");
7179   Results.AddResult(Builder.TakeString());
7180 
7181   if (getLangOpts().ObjC1) {
7182     // #import "header"
7183     Builder.AddTypedTextChunk("import");
7184     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7185     Builder.AddTextChunk("\"");
7186     Builder.AddPlaceholderChunk("header");
7187     Builder.AddTextChunk("\"");
7188     Results.AddResult(Builder.TakeString());
7189 
7190     // #import <header>
7191     Builder.AddTypedTextChunk("import");
7192     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7193     Builder.AddTextChunk("<");
7194     Builder.AddPlaceholderChunk("header");
7195     Builder.AddTextChunk(">");
7196     Results.AddResult(Builder.TakeString());
7197   }
7198 
7199   // #include_next "header"
7200   Builder.AddTypedTextChunk("include_next");
7201   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7202   Builder.AddTextChunk("\"");
7203   Builder.AddPlaceholderChunk("header");
7204   Builder.AddTextChunk("\"");
7205   Results.AddResult(Builder.TakeString());
7206 
7207   // #include_next <header>
7208   Builder.AddTypedTextChunk("include_next");
7209   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7210   Builder.AddTextChunk("<");
7211   Builder.AddPlaceholderChunk("header");
7212   Builder.AddTextChunk(">");
7213   Results.AddResult(Builder.TakeString());
7214 
7215   // #warning <message>
7216   Builder.AddTypedTextChunk("warning");
7217   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7218   Builder.AddPlaceholderChunk("message");
7219   Results.AddResult(Builder.TakeString());
7220 
7221   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
7222   // completions for them. And __include_macros is a Clang-internal extension
7223   // that we don't want to encourage anyone to use.
7224 
7225   // FIXME: we don't support #assert or #unassert, so don't suggest them.
7226   Results.ExitScope();
7227 
7228   HandleCodeCompleteResults(this, CodeCompleter,
7229                             CodeCompletionContext::CCC_PreprocessorDirective,
7230                             Results.data(), Results.size());
7231 }
7232 
7233 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
7234   CodeCompleteOrdinaryName(S,
7235                            S->getFnParent()? Sema::PCC_RecoveryInFunction
7236                                            : Sema::PCC_Namespace);
7237 }
7238 
7239 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
7240   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7241                         CodeCompleter->getCodeCompletionTUInfo(),
7242                         IsDefinition? CodeCompletionContext::CCC_MacroName
7243                                     : CodeCompletionContext::CCC_MacroNameUse);
7244   if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
7245     // Add just the names of macros, not their arguments.
7246     CodeCompletionBuilder Builder(Results.getAllocator(),
7247                                   Results.getCodeCompletionTUInfo());
7248     Results.EnterNewScope();
7249     for (Preprocessor::macro_iterator M = PP.macro_begin(),
7250                                    MEnd = PP.macro_end();
7251          M != MEnd; ++M) {
7252       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
7253                                            M->first->getName()));
7254       Results.AddResult(CodeCompletionResult(Builder.TakeString(),
7255                                              CCP_CodePattern,
7256                                              CXCursor_MacroDefinition));
7257     }
7258     Results.ExitScope();
7259   } else if (IsDefinition) {
7260     // FIXME: Can we detect when the user just wrote an include guard above?
7261   }
7262 
7263   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7264                             Results.data(), Results.size());
7265 }
7266 
7267 void Sema::CodeCompletePreprocessorExpression() {
7268   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7269                         CodeCompleter->getCodeCompletionTUInfo(),
7270                         CodeCompletionContext::CCC_PreprocessorExpression);
7271 
7272   if (!CodeCompleter || CodeCompleter->includeMacros())
7273     AddMacroResults(PP, Results, true);
7274 
7275     // defined (<macro>)
7276   Results.EnterNewScope();
7277   CodeCompletionBuilder Builder(Results.getAllocator(),
7278                                 Results.getCodeCompletionTUInfo());
7279   Builder.AddTypedTextChunk("defined");
7280   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7281   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7282   Builder.AddPlaceholderChunk("macro");
7283   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7284   Results.AddResult(Builder.TakeString());
7285   Results.ExitScope();
7286 
7287   HandleCodeCompleteResults(this, CodeCompleter,
7288                             CodeCompletionContext::CCC_PreprocessorExpression,
7289                             Results.data(), Results.size());
7290 }
7291 
7292 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
7293                                                  IdentifierInfo *Macro,
7294                                                  MacroInfo *MacroInfo,
7295                                                  unsigned Argument) {
7296   // FIXME: In the future, we could provide "overload" results, much like we
7297   // do for function calls.
7298 
7299   // Now just ignore this. There will be another code-completion callback
7300   // for the expanded tokens.
7301 }
7302 
7303 void Sema::CodeCompleteNaturalLanguage() {
7304   HandleCodeCompleteResults(this, CodeCompleter,
7305                             CodeCompletionContext::CCC_NaturalLanguage,
7306                             0, 0);
7307 }
7308 
7309 void Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator,
7310                                        CodeCompletionTUInfo &CCTUInfo,
7311                  SmallVectorImpl<CodeCompletionResult> &Results) {
7312   ResultBuilder Builder(*this, Allocator, CCTUInfo,
7313                         CodeCompletionContext::CCC_Recovery);
7314   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
7315     CodeCompletionDeclConsumer Consumer(Builder,
7316                                         Context.getTranslationUnitDecl());
7317     LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName,
7318                        Consumer);
7319   }
7320 
7321   if (!CodeCompleter || CodeCompleter->includeMacros())
7322     AddMacroResults(PP, Builder, true);
7323 
7324   Results.clear();
7325   Results.insert(Results.end(),
7326                  Builder.data(), Builder.data() + Builder.size());
7327 }
7328