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