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