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