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