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       // FIXME
2785       return CXCursor_UnexposedDecl;
2786     case Decl::ObjCForwardProtocol:
2787       // FIXME
2788       return CXCursor_UnexposedDecl;
2789     case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl;
2790 
2791     case Decl::ObjCInterface:
2792       if (cast<ObjCInterfaceDecl>(D)->isThisDeclarationADefinition())
2793         return CXCursor_ObjCInterfaceDecl;
2794 
2795       // Forward declarations are not directly exposed.
2796       return CXCursor_UnexposedDecl;
2797 
2798     case Decl::ObjCIvar:           return CXCursor_ObjCIvarDecl;
2799     case Decl::ObjCMethod:
2800       return cast<ObjCMethodDecl>(D)->isInstanceMethod()
2801       ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl;
2802     case Decl::CXXMethod:          return CXCursor_CXXMethod;
2803     case Decl::CXXConstructor:     return CXCursor_Constructor;
2804     case Decl::CXXDestructor:      return CXCursor_Destructor;
2805     case Decl::CXXConversion:      return CXCursor_ConversionFunction;
2806     case Decl::ObjCProperty:       return CXCursor_ObjCPropertyDecl;
2807     case Decl::ObjCProtocol:       return CXCursor_ObjCProtocolDecl;
2808     case Decl::ParmVar:            return CXCursor_ParmDecl;
2809     case Decl::Typedef:            return CXCursor_TypedefDecl;
2810     case Decl::TypeAlias:          return CXCursor_TypeAliasDecl;
2811     case Decl::Var:                return CXCursor_VarDecl;
2812     case Decl::Namespace:          return CXCursor_Namespace;
2813     case Decl::NamespaceAlias:     return CXCursor_NamespaceAlias;
2814     case Decl::TemplateTypeParm:   return CXCursor_TemplateTypeParameter;
2815     case Decl::NonTypeTemplateParm:return CXCursor_NonTypeTemplateParameter;
2816     case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter;
2817     case Decl::FunctionTemplate:   return CXCursor_FunctionTemplate;
2818     case Decl::ClassTemplate:      return CXCursor_ClassTemplate;
2819     case Decl::AccessSpec:         return CXCursor_CXXAccessSpecifier;
2820     case Decl::ClassTemplatePartialSpecialization:
2821       return CXCursor_ClassTemplatePartialSpecialization;
2822     case Decl::UsingDirective:     return CXCursor_UsingDirective;
2823 
2824     case Decl::Using:
2825     case Decl::UnresolvedUsingValue:
2826     case Decl::UnresolvedUsingTypename:
2827       return CXCursor_UsingDeclaration;
2828 
2829     case Decl::ObjCPropertyImpl:
2830       switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) {
2831       case ObjCPropertyImplDecl::Dynamic:
2832         return CXCursor_ObjCDynamicDecl;
2833 
2834       case ObjCPropertyImplDecl::Synthesize:
2835         return CXCursor_ObjCSynthesizeDecl;
2836       }
2837       break;
2838 
2839     default:
2840       if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
2841         switch (TD->getTagKind()) {
2842           case TTK_Struct: return CXCursor_StructDecl;
2843           case TTK_Class:  return CXCursor_ClassDecl;
2844           case TTK_Union:  return CXCursor_UnionDecl;
2845           case TTK_Enum:   return CXCursor_EnumDecl;
2846         }
2847       }
2848   }
2849 
2850   return CXCursor_UnexposedDecl;
2851 }
2852 
2853 static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results,
2854                             bool TargetTypeIsPointer = false) {
2855   typedef CodeCompletionResult Result;
2856 
2857   Results.EnterNewScope();
2858 
2859   for (Preprocessor::macro_iterator M = PP.macro_begin(),
2860                                  MEnd = PP.macro_end();
2861        M != MEnd; ++M) {
2862     Results.AddResult(Result(M->first,
2863                              getMacroUsagePriority(M->first->getName(),
2864                                                    PP.getLangOptions(),
2865                                                    TargetTypeIsPointer)));
2866   }
2867 
2868   Results.ExitScope();
2869 
2870 }
2871 
2872 static void AddPrettyFunctionResults(const LangOptions &LangOpts,
2873                                      ResultBuilder &Results) {
2874   typedef CodeCompletionResult Result;
2875 
2876   Results.EnterNewScope();
2877 
2878   Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant));
2879   Results.AddResult(Result("__FUNCTION__", CCP_Constant));
2880   if (LangOpts.C99 || LangOpts.CPlusPlus0x)
2881     Results.AddResult(Result("__func__", CCP_Constant));
2882   Results.ExitScope();
2883 }
2884 
2885 static void HandleCodeCompleteResults(Sema *S,
2886                                       CodeCompleteConsumer *CodeCompleter,
2887                                       CodeCompletionContext Context,
2888                                       CodeCompletionResult *Results,
2889                                       unsigned NumResults) {
2890   if (CodeCompleter)
2891     CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults);
2892 }
2893 
2894 static enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S,
2895                                             Sema::ParserCompletionContext PCC) {
2896   switch (PCC) {
2897   case Sema::PCC_Namespace:
2898     return CodeCompletionContext::CCC_TopLevel;
2899 
2900   case Sema::PCC_Class:
2901     return CodeCompletionContext::CCC_ClassStructUnion;
2902 
2903   case Sema::PCC_ObjCInterface:
2904     return CodeCompletionContext::CCC_ObjCInterface;
2905 
2906   case Sema::PCC_ObjCImplementation:
2907     return CodeCompletionContext::CCC_ObjCImplementation;
2908 
2909   case Sema::PCC_ObjCInstanceVariableList:
2910     return CodeCompletionContext::CCC_ObjCIvarList;
2911 
2912   case Sema::PCC_Template:
2913   case Sema::PCC_MemberTemplate:
2914     if (S.CurContext->isFileContext())
2915       return CodeCompletionContext::CCC_TopLevel;
2916     else if (S.CurContext->isRecord())
2917       return CodeCompletionContext::CCC_ClassStructUnion;
2918     else
2919       return CodeCompletionContext::CCC_Other;
2920 
2921   case Sema::PCC_RecoveryInFunction:
2922     return CodeCompletionContext::CCC_Recovery;
2923 
2924   case Sema::PCC_ForInit:
2925     if (S.getLangOptions().CPlusPlus || S.getLangOptions().C99 ||
2926         S.getLangOptions().ObjC1)
2927       return CodeCompletionContext::CCC_ParenthesizedExpression;
2928     else
2929       return CodeCompletionContext::CCC_Expression;
2930 
2931   case Sema::PCC_Expression:
2932   case Sema::PCC_Condition:
2933     return CodeCompletionContext::CCC_Expression;
2934 
2935   case Sema::PCC_Statement:
2936     return CodeCompletionContext::CCC_Statement;
2937 
2938   case Sema::PCC_Type:
2939     return CodeCompletionContext::CCC_Type;
2940 
2941   case Sema::PCC_ParenthesizedExpression:
2942     return CodeCompletionContext::CCC_ParenthesizedExpression;
2943 
2944   case Sema::PCC_LocalDeclarationSpecifiers:
2945     return CodeCompletionContext::CCC_Type;
2946   }
2947 
2948   return CodeCompletionContext::CCC_Other;
2949 }
2950 
2951 /// \brief If we're in a C++ virtual member function, add completion results
2952 /// that invoke the functions we override, since it's common to invoke the
2953 /// overridden function as well as adding new functionality.
2954 ///
2955 /// \param S The semantic analysis object for which we are generating results.
2956 ///
2957 /// \param InContext This context in which the nested-name-specifier preceding
2958 /// the code-completion point
2959 static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext,
2960                                   ResultBuilder &Results) {
2961   // Look through blocks.
2962   DeclContext *CurContext = S.CurContext;
2963   while (isa<BlockDecl>(CurContext))
2964     CurContext = CurContext->getParent();
2965 
2966 
2967   CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext);
2968   if (!Method || !Method->isVirtual())
2969     return;
2970 
2971   // We need to have names for all of the parameters, if we're going to
2972   // generate a forwarding call.
2973   for (CXXMethodDecl::param_iterator P = Method->param_begin(),
2974                                   PEnd = Method->param_end();
2975        P != PEnd;
2976        ++P) {
2977     if (!(*P)->getDeclName())
2978       return;
2979   }
2980 
2981   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
2982   for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(),
2983                                    MEnd = Method->end_overridden_methods();
2984        M != MEnd; ++M) {
2985     CodeCompletionBuilder Builder(Results.getAllocator());
2986     CXXMethodDecl *Overridden = const_cast<CXXMethodDecl *>(*M);
2987     if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl())
2988       continue;
2989 
2990     // If we need a nested-name-specifier, add one now.
2991     if (!InContext) {
2992       NestedNameSpecifier *NNS
2993         = getRequiredQualification(S.Context, CurContext,
2994                                    Overridden->getDeclContext());
2995       if (NNS) {
2996         std::string Str;
2997         llvm::raw_string_ostream OS(Str);
2998         NNS->print(OS, Policy);
2999         Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str()));
3000       }
3001     } else if (!InContext->Equals(Overridden->getDeclContext()))
3002       continue;
3003 
3004     Builder.AddTypedTextChunk(Results.getAllocator().CopyString(
3005                                          Overridden->getNameAsString()));
3006     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3007     bool FirstParam = true;
3008     for (CXXMethodDecl::param_iterator P = Method->param_begin(),
3009                                     PEnd = Method->param_end();
3010          P != PEnd; ++P) {
3011       if (FirstParam)
3012         FirstParam = false;
3013       else
3014         Builder.AddChunk(CodeCompletionString::CK_Comma);
3015 
3016       Builder.AddPlaceholderChunk(Results.getAllocator().CopyString(
3017                                         (*P)->getIdentifier()->getName()));
3018     }
3019     Builder.AddChunk(CodeCompletionString::CK_RightParen);
3020     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
3021                                            CCP_SuperCompletion,
3022                                            CXCursor_CXXMethod));
3023     Results.Ignore(Overridden);
3024   }
3025 }
3026 
3027 void Sema::CodeCompleteOrdinaryName(Scope *S,
3028                                     ParserCompletionContext CompletionContext) {
3029   typedef CodeCompletionResult Result;
3030   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3031                         mapCodeCompletionContext(*this, CompletionContext));
3032   Results.EnterNewScope();
3033 
3034   // Determine how to filter results, e.g., so that the names of
3035   // values (functions, enumerators, function templates, etc.) are
3036   // only allowed where we can have an expression.
3037   switch (CompletionContext) {
3038   case PCC_Namespace:
3039   case PCC_Class:
3040   case PCC_ObjCInterface:
3041   case PCC_ObjCImplementation:
3042   case PCC_ObjCInstanceVariableList:
3043   case PCC_Template:
3044   case PCC_MemberTemplate:
3045   case PCC_Type:
3046   case PCC_LocalDeclarationSpecifiers:
3047     Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
3048     break;
3049 
3050   case PCC_Statement:
3051   case PCC_ParenthesizedExpression:
3052   case PCC_Expression:
3053   case PCC_ForInit:
3054   case PCC_Condition:
3055     if (WantTypesInContext(CompletionContext, getLangOptions()))
3056       Results.setFilter(&ResultBuilder::IsOrdinaryName);
3057     else
3058       Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
3059 
3060     if (getLangOptions().CPlusPlus)
3061       MaybeAddOverrideCalls(*this, /*InContext=*/0, Results);
3062     break;
3063 
3064   case PCC_RecoveryInFunction:
3065     // Unfiltered
3066     break;
3067   }
3068 
3069   // If we are in a C++ non-static member function, check the qualifiers on
3070   // the member function to filter/prioritize the results list.
3071   if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext))
3072     if (CurMethod->isInstance())
3073       Results.setObjectTypeQualifiers(
3074                       Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers()));
3075 
3076   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3077   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3078                      CodeCompleter->includeGlobals());
3079 
3080   AddOrdinaryNameResults(CompletionContext, S, *this, Results);
3081   Results.ExitScope();
3082 
3083   switch (CompletionContext) {
3084   case PCC_ParenthesizedExpression:
3085   case PCC_Expression:
3086   case PCC_Statement:
3087   case PCC_RecoveryInFunction:
3088     if (S->getFnParent())
3089       AddPrettyFunctionResults(PP.getLangOptions(), Results);
3090     break;
3091 
3092   case PCC_Namespace:
3093   case PCC_Class:
3094   case PCC_ObjCInterface:
3095   case PCC_ObjCImplementation:
3096   case PCC_ObjCInstanceVariableList:
3097   case PCC_Template:
3098   case PCC_MemberTemplate:
3099   case PCC_ForInit:
3100   case PCC_Condition:
3101   case PCC_Type:
3102   case PCC_LocalDeclarationSpecifiers:
3103     break;
3104   }
3105 
3106   if (CodeCompleter->includeMacros())
3107     AddMacroResults(PP, Results);
3108 
3109   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
3110                             Results.data(),Results.size());
3111 }
3112 
3113 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
3114                                        ParsedType Receiver,
3115                                        IdentifierInfo **SelIdents,
3116                                        unsigned NumSelIdents,
3117                                        bool AtArgumentExpression,
3118                                        bool IsSuper,
3119                                        ResultBuilder &Results);
3120 
3121 void Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS,
3122                                 bool AllowNonIdentifiers,
3123                                 bool AllowNestedNameSpecifiers) {
3124   typedef CodeCompletionResult Result;
3125   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3126                         AllowNestedNameSpecifiers
3127                           ? CodeCompletionContext::CCC_PotentiallyQualifiedName
3128                           : CodeCompletionContext::CCC_Name);
3129   Results.EnterNewScope();
3130 
3131   // Type qualifiers can come after names.
3132   Results.AddResult(Result("const"));
3133   Results.AddResult(Result("volatile"));
3134   if (getLangOptions().C99)
3135     Results.AddResult(Result("restrict"));
3136 
3137   if (getLangOptions().CPlusPlus) {
3138     if (AllowNonIdentifiers) {
3139       Results.AddResult(Result("operator"));
3140     }
3141 
3142     // Add nested-name-specifiers.
3143     if (AllowNestedNameSpecifiers) {
3144       Results.allowNestedNameSpecifiers();
3145       Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy);
3146       CodeCompletionDeclConsumer Consumer(Results, CurContext);
3147       LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer,
3148                          CodeCompleter->includeGlobals());
3149       Results.setFilter(0);
3150     }
3151   }
3152   Results.ExitScope();
3153 
3154   // If we're in a context where we might have an expression (rather than a
3155   // declaration), and what we've seen so far is an Objective-C type that could
3156   // be a receiver of a class message, this may be a class message send with
3157   // the initial opening bracket '[' missing. Add appropriate completions.
3158   if (AllowNonIdentifiers && !AllowNestedNameSpecifiers &&
3159       DS.getTypeSpecType() == DeclSpec::TST_typename &&
3160       DS.getStorageClassSpecAsWritten() == DeclSpec::SCS_unspecified &&
3161       !DS.isThreadSpecified() && !DS.isExternInLinkageSpec() &&
3162       DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified &&
3163       DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
3164       DS.getTypeQualifiers() == 0 &&
3165       S &&
3166       (S->getFlags() & Scope::DeclScope) != 0 &&
3167       (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope |
3168                         Scope::FunctionPrototypeScope |
3169                         Scope::AtCatchScope)) == 0) {
3170     ParsedType T = DS.getRepAsType();
3171     if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType())
3172       AddClassMessageCompletions(*this, S, T, 0, 0, false, false, Results);
3173   }
3174 
3175   // Note that we intentionally suppress macro results here, since we do not
3176   // encourage using macros to produce the names of entities.
3177 
3178   HandleCodeCompleteResults(this, CodeCompleter,
3179                             Results.getCompletionContext(),
3180                             Results.data(), Results.size());
3181 }
3182 
3183 struct Sema::CodeCompleteExpressionData {
3184   CodeCompleteExpressionData(QualType PreferredType = QualType())
3185     : PreferredType(PreferredType), IntegralConstantExpression(false),
3186       ObjCCollection(false) { }
3187 
3188   QualType PreferredType;
3189   bool IntegralConstantExpression;
3190   bool ObjCCollection;
3191   SmallVector<Decl *, 4> IgnoreDecls;
3192 };
3193 
3194 /// \brief Perform code-completion in an expression context when we know what
3195 /// type we're looking for.
3196 ///
3197 /// \param IntegralConstantExpression Only permit integral constant
3198 /// expressions.
3199 void Sema::CodeCompleteExpression(Scope *S,
3200                                   const CodeCompleteExpressionData &Data) {
3201   typedef CodeCompletionResult Result;
3202   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3203                         CodeCompletionContext::CCC_Expression);
3204   if (Data.ObjCCollection)
3205     Results.setFilter(&ResultBuilder::IsObjCCollection);
3206   else if (Data.IntegralConstantExpression)
3207     Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
3208   else if (WantTypesInContext(PCC_Expression, getLangOptions()))
3209     Results.setFilter(&ResultBuilder::IsOrdinaryName);
3210   else
3211     Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
3212 
3213   if (!Data.PreferredType.isNull())
3214     Results.setPreferredType(Data.PreferredType.getNonReferenceType());
3215 
3216   // Ignore any declarations that we were told that we don't care about.
3217   for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I)
3218     Results.Ignore(Data.IgnoreDecls[I]);
3219 
3220   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3221   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3222                      CodeCompleter->includeGlobals());
3223 
3224   Results.EnterNewScope();
3225   AddOrdinaryNameResults(PCC_Expression, S, *this, Results);
3226   Results.ExitScope();
3227 
3228   bool PreferredTypeIsPointer = false;
3229   if (!Data.PreferredType.isNull())
3230     PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType()
3231       || Data.PreferredType->isMemberPointerType()
3232       || Data.PreferredType->isBlockPointerType();
3233 
3234   if (S->getFnParent() &&
3235       !Data.ObjCCollection &&
3236       !Data.IntegralConstantExpression)
3237     AddPrettyFunctionResults(PP.getLangOptions(), Results);
3238 
3239   if (CodeCompleter->includeMacros())
3240     AddMacroResults(PP, Results, PreferredTypeIsPointer);
3241   HandleCodeCompleteResults(this, CodeCompleter,
3242                 CodeCompletionContext(CodeCompletionContext::CCC_Expression,
3243                                       Data.PreferredType),
3244                             Results.data(),Results.size());
3245 }
3246 
3247 void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) {
3248   if (E.isInvalid())
3249     CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction);
3250   else if (getLangOptions().ObjC1)
3251     CodeCompleteObjCInstanceMessage(S, E.take(), 0, 0, false);
3252 }
3253 
3254 /// \brief The set of properties that have already been added, referenced by
3255 /// property name.
3256 typedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet;
3257 
3258 static void AddObjCProperties(ObjCContainerDecl *Container,
3259                               bool AllowCategories,
3260                               bool AllowNullaryMethods,
3261                               DeclContext *CurContext,
3262                               AddedPropertiesSet &AddedProperties,
3263                               ResultBuilder &Results) {
3264   typedef CodeCompletionResult Result;
3265 
3266   // Add properties in this container.
3267   for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(),
3268                                      PEnd = Container->prop_end();
3269        P != PEnd;
3270        ++P) {
3271     if (AddedProperties.insert(P->getIdentifier()))
3272       Results.MaybeAddResult(Result(*P, 0), CurContext);
3273   }
3274 
3275   // Add nullary methods
3276   if (AllowNullaryMethods) {
3277     ASTContext &Context = Container->getASTContext();
3278     PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
3279     for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
3280                                          MEnd = Container->meth_end();
3281          M != MEnd; ++M) {
3282       if (M->getSelector().isUnarySelector())
3283         if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0))
3284           if (AddedProperties.insert(Name)) {
3285             CodeCompletionBuilder Builder(Results.getAllocator());
3286             AddResultTypeChunk(Context, Policy, *M, Builder);
3287             Builder.AddTypedTextChunk(
3288                             Results.getAllocator().CopyString(Name->getName()));
3289 
3290             CXAvailabilityKind Availability = CXAvailability_Available;
3291             switch (M->getAvailability()) {
3292             case AR_Available:
3293             case AR_NotYetIntroduced:
3294               Availability = CXAvailability_Available;
3295               break;
3296 
3297             case AR_Deprecated:
3298               Availability = CXAvailability_Deprecated;
3299               break;
3300 
3301             case AR_Unavailable:
3302               Availability = CXAvailability_NotAvailable;
3303               break;
3304             }
3305 
3306             Results.MaybeAddResult(Result(Builder.TakeString(),
3307                                   CCP_MemberDeclaration + CCD_MethodAsProperty,
3308                                           M->isInstanceMethod()
3309                                             ? CXCursor_ObjCInstanceMethodDecl
3310                                             : CXCursor_ObjCClassMethodDecl,
3311                                           Availability),
3312                                           CurContext);
3313           }
3314     }
3315   }
3316 
3317 
3318   // Add properties in referenced protocols.
3319   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
3320     for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(),
3321                                           PEnd = Protocol->protocol_end();
3322          P != PEnd; ++P)
3323       AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext,
3324                         AddedProperties, Results);
3325   } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){
3326     if (AllowCategories) {
3327       // Look through categories.
3328       for (ObjCCategoryDecl *Category = IFace->getCategoryList();
3329            Category; Category = Category->getNextClassCategory())
3330         AddObjCProperties(Category, AllowCategories, AllowNullaryMethods,
3331                           CurContext, AddedProperties, Results);
3332     }
3333 
3334     // Look through protocols.
3335     for (ObjCInterfaceDecl::all_protocol_iterator
3336          I = IFace->all_referenced_protocol_begin(),
3337          E = IFace->all_referenced_protocol_end(); I != E; ++I)
3338       AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext,
3339                         AddedProperties, Results);
3340 
3341     // Look in the superclass.
3342     if (IFace->getSuperClass())
3343       AddObjCProperties(IFace->getSuperClass(), AllowCategories,
3344                         AllowNullaryMethods, CurContext,
3345                         AddedProperties, Results);
3346   } else if (const ObjCCategoryDecl *Category
3347                                     = dyn_cast<ObjCCategoryDecl>(Container)) {
3348     // Look through protocols.
3349     for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(),
3350                                           PEnd = Category->protocol_end();
3351          P != PEnd; ++P)
3352       AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext,
3353                         AddedProperties, Results);
3354   }
3355 }
3356 
3357 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *BaseE,
3358                                            SourceLocation OpLoc,
3359                                            bool IsArrow) {
3360   if (!BaseE || !CodeCompleter)
3361     return;
3362 
3363   typedef CodeCompletionResult Result;
3364 
3365   Expr *Base = static_cast<Expr *>(BaseE);
3366   QualType BaseType = Base->getType();
3367 
3368   if (IsArrow) {
3369     if (const PointerType *Ptr = BaseType->getAs<PointerType>())
3370       BaseType = Ptr->getPointeeType();
3371     else if (BaseType->isObjCObjectPointerType())
3372       /*Do nothing*/ ;
3373     else
3374       return;
3375   }
3376 
3377   enum CodeCompletionContext::Kind contextKind;
3378 
3379   if (IsArrow) {
3380     contextKind = CodeCompletionContext::CCC_ArrowMemberAccess;
3381   }
3382   else {
3383     if (BaseType->isObjCObjectPointerType() ||
3384         BaseType->isObjCObjectOrInterfaceType()) {
3385       contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess;
3386     }
3387     else {
3388       contextKind = CodeCompletionContext::CCC_DotMemberAccess;
3389     }
3390   }
3391 
3392   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3393                   CodeCompletionContext(contextKind,
3394                                         BaseType),
3395                         &ResultBuilder::IsMember);
3396   Results.EnterNewScope();
3397   if (const RecordType *Record = BaseType->getAs<RecordType>()) {
3398     // Indicate that we are performing a member access, and the cv-qualifiers
3399     // for the base object type.
3400     Results.setObjectTypeQualifiers(BaseType.getQualifiers());
3401 
3402     // Access to a C/C++ class, struct, or union.
3403     Results.allowNestedNameSpecifiers();
3404     CodeCompletionDeclConsumer Consumer(Results, CurContext);
3405     LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer,
3406                        CodeCompleter->includeGlobals());
3407 
3408     if (getLangOptions().CPlusPlus) {
3409       if (!Results.empty()) {
3410         // The "template" keyword can follow "->" or "." in the grammar.
3411         // However, we only want to suggest the template keyword if something
3412         // is dependent.
3413         bool IsDependent = BaseType->isDependentType();
3414         if (!IsDependent) {
3415           for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent())
3416             if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) {
3417               IsDependent = Ctx->isDependentContext();
3418               break;
3419             }
3420         }
3421 
3422         if (IsDependent)
3423           Results.AddResult(Result("template"));
3424       }
3425     }
3426   } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) {
3427     // Objective-C property reference.
3428     AddedPropertiesSet AddedProperties;
3429 
3430     // Add property results based on our interface.
3431     const ObjCObjectPointerType *ObjCPtr
3432       = BaseType->getAsObjCInterfacePointerType();
3433     assert(ObjCPtr && "Non-NULL pointer guaranteed above!");
3434     AddObjCProperties(ObjCPtr->getInterfaceDecl(), true,
3435                       /*AllowNullaryMethods=*/true, CurContext,
3436                       AddedProperties, Results);
3437 
3438     // Add properties from the protocols in a qualified interface.
3439     for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(),
3440                                               E = ObjCPtr->qual_end();
3441          I != E; ++I)
3442       AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext,
3443                         AddedProperties, Results);
3444   } else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
3445              (!IsArrow && BaseType->isObjCObjectType())) {
3446     // Objective-C instance variable access.
3447     ObjCInterfaceDecl *Class = 0;
3448     if (const ObjCObjectPointerType *ObjCPtr
3449                                     = BaseType->getAs<ObjCObjectPointerType>())
3450       Class = ObjCPtr->getInterfaceDecl();
3451     else
3452       Class = BaseType->getAs<ObjCObjectType>()->getInterface();
3453 
3454     // Add all ivars from this class and its superclasses.
3455     if (Class) {
3456       CodeCompletionDeclConsumer Consumer(Results, CurContext);
3457       Results.setFilter(&ResultBuilder::IsObjCIvar);
3458       LookupVisibleDecls(Class, LookupMemberName, Consumer,
3459                          CodeCompleter->includeGlobals());
3460     }
3461   }
3462 
3463   // FIXME: How do we cope with isa?
3464 
3465   Results.ExitScope();
3466 
3467   // Hand off the results found for code completion.
3468   HandleCodeCompleteResults(this, CodeCompleter,
3469                             Results.getCompletionContext(),
3470                             Results.data(),Results.size());
3471 }
3472 
3473 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) {
3474   if (!CodeCompleter)
3475     return;
3476 
3477   typedef CodeCompletionResult Result;
3478   ResultBuilder::LookupFilter Filter = 0;
3479   enum CodeCompletionContext::Kind ContextKind
3480     = CodeCompletionContext::CCC_Other;
3481   switch ((DeclSpec::TST)TagSpec) {
3482   case DeclSpec::TST_enum:
3483     Filter = &ResultBuilder::IsEnum;
3484     ContextKind = CodeCompletionContext::CCC_EnumTag;
3485     break;
3486 
3487   case DeclSpec::TST_union:
3488     Filter = &ResultBuilder::IsUnion;
3489     ContextKind = CodeCompletionContext::CCC_UnionTag;
3490     break;
3491 
3492   case DeclSpec::TST_struct:
3493   case DeclSpec::TST_class:
3494     Filter = &ResultBuilder::IsClassOrStruct;
3495     ContextKind = CodeCompletionContext::CCC_ClassOrStructTag;
3496     break;
3497 
3498   default:
3499     llvm_unreachable("Unknown type specifier kind in CodeCompleteTag");
3500   }
3501 
3502   ResultBuilder Results(*this, CodeCompleter->getAllocator(), ContextKind);
3503   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3504 
3505   // First pass: look for tags.
3506   Results.setFilter(Filter);
3507   LookupVisibleDecls(S, LookupTagName, Consumer,
3508                      CodeCompleter->includeGlobals());
3509 
3510   if (CodeCompleter->includeGlobals()) {
3511     // Second pass: look for nested name specifiers.
3512     Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
3513     LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer);
3514   }
3515 
3516   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
3517                             Results.data(),Results.size());
3518 }
3519 
3520 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) {
3521   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3522                         CodeCompletionContext::CCC_TypeQualifiers);
3523   Results.EnterNewScope();
3524   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const))
3525     Results.AddResult("const");
3526   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile))
3527     Results.AddResult("volatile");
3528   if (getLangOptions().C99 &&
3529       !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict))
3530     Results.AddResult("restrict");
3531   Results.ExitScope();
3532   HandleCodeCompleteResults(this, CodeCompleter,
3533                             Results.getCompletionContext(),
3534                             Results.data(), Results.size());
3535 }
3536 
3537 void Sema::CodeCompleteCase(Scope *S) {
3538   if (getCurFunction()->SwitchStack.empty() || !CodeCompleter)
3539     return;
3540 
3541   SwitchStmt *Switch = getCurFunction()->SwitchStack.back();
3542   QualType type = Switch->getCond()->IgnoreImplicit()->getType();
3543   if (!type->isEnumeralType()) {
3544     CodeCompleteExpressionData Data(type);
3545     Data.IntegralConstantExpression = true;
3546     CodeCompleteExpression(S, Data);
3547     return;
3548   }
3549 
3550   // Code-complete the cases of a switch statement over an enumeration type
3551   // by providing the list of
3552   EnumDecl *Enum = type->castAs<EnumType>()->getDecl();
3553 
3554   // Determine which enumerators we have already seen in the switch statement.
3555   // FIXME: Ideally, we would also be able to look *past* the code-completion
3556   // token, in case we are code-completing in the middle of the switch and not
3557   // at the end. However, we aren't able to do so at the moment.
3558   llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen;
3559   NestedNameSpecifier *Qualifier = 0;
3560   for (SwitchCase *SC = Switch->getSwitchCaseList(); SC;
3561        SC = SC->getNextSwitchCase()) {
3562     CaseStmt *Case = dyn_cast<CaseStmt>(SC);
3563     if (!Case)
3564       continue;
3565 
3566     Expr *CaseVal = Case->getLHS()->IgnoreParenCasts();
3567     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal))
3568       if (EnumConstantDecl *Enumerator
3569             = dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
3570         // We look into the AST of the case statement to determine which
3571         // enumerator was named. Alternatively, we could compute the value of
3572         // the integral constant expression, then compare it against the
3573         // values of each enumerator. However, value-based approach would not
3574         // work as well with C++ templates where enumerators declared within a
3575         // template are type- and value-dependent.
3576         EnumeratorsSeen.insert(Enumerator);
3577 
3578         // If this is a qualified-id, keep track of the nested-name-specifier
3579         // so that we can reproduce it as part of code completion, e.g.,
3580         //
3581         //   switch (TagD.getKind()) {
3582         //     case TagDecl::TK_enum:
3583         //       break;
3584         //     case XXX
3585         //
3586         // At the XXX, our completions are TagDecl::TK_union,
3587         // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union,
3588         // TK_struct, and TK_class.
3589         Qualifier = DRE->getQualifier();
3590       }
3591   }
3592 
3593   if (getLangOptions().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) {
3594     // If there are no prior enumerators in C++, check whether we have to
3595     // qualify the names of the enumerators that we suggest, because they
3596     // may not be visible in this scope.
3597     Qualifier = getRequiredQualification(Context, CurContext,
3598                                          Enum->getDeclContext());
3599 
3600     // FIXME: Scoped enums need to start with "EnumDecl" as the context!
3601   }
3602 
3603   // Add any enumerators that have not yet been mentioned.
3604   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3605                         CodeCompletionContext::CCC_Expression);
3606   Results.EnterNewScope();
3607   for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(),
3608                                   EEnd = Enum->enumerator_end();
3609        E != EEnd; ++E) {
3610     if (EnumeratorsSeen.count(*E))
3611       continue;
3612 
3613     CodeCompletionResult R(*E, Qualifier);
3614     R.Priority = CCP_EnumInCase;
3615     Results.AddResult(R, CurContext, 0, false);
3616   }
3617   Results.ExitScope();
3618 
3619   //We need to make sure we're setting the right context,
3620   //so only say we include macros if the code completer says we do
3621   enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other;
3622   if (CodeCompleter->includeMacros()) {
3623     AddMacroResults(PP, Results);
3624     kind = CodeCompletionContext::CCC_OtherWithMacros;
3625   }
3626 
3627 
3628   HandleCodeCompleteResults(this, CodeCompleter,
3629                             kind,
3630                             Results.data(),Results.size());
3631 }
3632 
3633 namespace {
3634   struct IsBetterOverloadCandidate {
3635     Sema &S;
3636     SourceLocation Loc;
3637 
3638   public:
3639     explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc)
3640       : S(S), Loc(Loc) { }
3641 
3642     bool
3643     operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const {
3644       return isBetterOverloadCandidate(S, X, Y, Loc);
3645     }
3646   };
3647 }
3648 
3649 static bool anyNullArguments(Expr **Args, unsigned NumArgs) {
3650   if (NumArgs && !Args)
3651     return true;
3652 
3653   for (unsigned I = 0; I != NumArgs; ++I)
3654     if (!Args[I])
3655       return true;
3656 
3657   return false;
3658 }
3659 
3660 void Sema::CodeCompleteCall(Scope *S, Expr *FnIn,
3661                             Expr **ArgsIn, unsigned NumArgs) {
3662   if (!CodeCompleter)
3663     return;
3664 
3665   // When we're code-completing for a call, we fall back to ordinary
3666   // name code-completion whenever we can't produce specific
3667   // results. We may want to revisit this strategy in the future,
3668   // e.g., by merging the two kinds of results.
3669 
3670   Expr *Fn = (Expr *)FnIn;
3671   Expr **Args = (Expr **)ArgsIn;
3672 
3673   // Ignore type-dependent call expressions entirely.
3674   if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args, NumArgs) ||
3675       Expr::hasAnyTypeDependentArguments(Args, NumArgs)) {
3676     CodeCompleteOrdinaryName(S, PCC_Expression);
3677     return;
3678   }
3679 
3680   // Build an overload candidate set based on the functions we find.
3681   SourceLocation Loc = Fn->getExprLoc();
3682   OverloadCandidateSet CandidateSet(Loc);
3683 
3684   // FIXME: What if we're calling something that isn't a function declaration?
3685   // FIXME: What if we're calling a pseudo-destructor?
3686   // FIXME: What if we're calling a member function?
3687 
3688   typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate;
3689   SmallVector<ResultCandidate, 8> Results;
3690 
3691   Expr *NakedFn = Fn->IgnoreParenCasts();
3692   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn))
3693     AddOverloadedCallCandidates(ULE, Args, NumArgs, CandidateSet,
3694                                 /*PartialOverloading=*/ true);
3695   else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
3696     FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
3697     if (FDecl) {
3698       if (!getLangOptions().CPlusPlus ||
3699           !FDecl->getType()->getAs<FunctionProtoType>())
3700         Results.push_back(ResultCandidate(FDecl));
3701       else
3702         // FIXME: access?
3703         AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none),
3704                              Args, NumArgs, CandidateSet,
3705                              false, /*PartialOverloading*/true);
3706     }
3707   }
3708 
3709   QualType ParamType;
3710 
3711   if (!CandidateSet.empty()) {
3712     // Sort the overload candidate set by placing the best overloads first.
3713     std::stable_sort(CandidateSet.begin(), CandidateSet.end(),
3714                      IsBetterOverloadCandidate(*this, Loc));
3715 
3716     // Add the remaining viable overload candidates as code-completion reslults.
3717     for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(),
3718                                      CandEnd = CandidateSet.end();
3719          Cand != CandEnd; ++Cand) {
3720       if (Cand->Viable)
3721         Results.push_back(ResultCandidate(Cand->Function));
3722     }
3723 
3724     // From the viable candidates, try to determine the type of this parameter.
3725     for (unsigned I = 0, N = Results.size(); I != N; ++I) {
3726       if (const FunctionType *FType = Results[I].getFunctionType())
3727         if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType))
3728           if (NumArgs < Proto->getNumArgs()) {
3729             if (ParamType.isNull())
3730               ParamType = Proto->getArgType(NumArgs);
3731             else if (!Context.hasSameUnqualifiedType(
3732                                             ParamType.getNonReferenceType(),
3733                            Proto->getArgType(NumArgs).getNonReferenceType())) {
3734               ParamType = QualType();
3735               break;
3736             }
3737           }
3738     }
3739   } else {
3740     // Try to determine the parameter type from the type of the expression
3741     // being called.
3742     QualType FunctionType = Fn->getType();
3743     if (const PointerType *Ptr = FunctionType->getAs<PointerType>())
3744       FunctionType = Ptr->getPointeeType();
3745     else if (const BlockPointerType *BlockPtr
3746                                     = FunctionType->getAs<BlockPointerType>())
3747       FunctionType = BlockPtr->getPointeeType();
3748     else if (const MemberPointerType *MemPtr
3749                                     = FunctionType->getAs<MemberPointerType>())
3750       FunctionType = MemPtr->getPointeeType();
3751 
3752     if (const FunctionProtoType *Proto
3753                                   = FunctionType->getAs<FunctionProtoType>()) {
3754       if (NumArgs < Proto->getNumArgs())
3755         ParamType = Proto->getArgType(NumArgs);
3756     }
3757   }
3758 
3759   if (ParamType.isNull())
3760     CodeCompleteOrdinaryName(S, PCC_Expression);
3761   else
3762     CodeCompleteExpression(S, ParamType);
3763 
3764   if (!Results.empty())
3765     CodeCompleter->ProcessOverloadCandidates(*this, NumArgs, Results.data(),
3766                                              Results.size());
3767 }
3768 
3769 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) {
3770   ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
3771   if (!VD) {
3772     CodeCompleteOrdinaryName(S, PCC_Expression);
3773     return;
3774   }
3775 
3776   CodeCompleteExpression(S, VD->getType());
3777 }
3778 
3779 void Sema::CodeCompleteReturn(Scope *S) {
3780   QualType ResultType;
3781   if (isa<BlockDecl>(CurContext)) {
3782     if (BlockScopeInfo *BSI = getCurBlock())
3783       ResultType = BSI->ReturnType;
3784   } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext))
3785     ResultType = Function->getResultType();
3786   else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext))
3787     ResultType = Method->getResultType();
3788 
3789   if (ResultType.isNull())
3790     CodeCompleteOrdinaryName(S, PCC_Expression);
3791   else
3792     CodeCompleteExpression(S, ResultType);
3793 }
3794 
3795 void Sema::CodeCompleteAfterIf(Scope *S) {
3796   typedef CodeCompletionResult Result;
3797   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3798                         mapCodeCompletionContext(*this, PCC_Statement));
3799   Results.setFilter(&ResultBuilder::IsOrdinaryName);
3800   Results.EnterNewScope();
3801 
3802   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3803   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3804                      CodeCompleter->includeGlobals());
3805 
3806   AddOrdinaryNameResults(PCC_Statement, S, *this, Results);
3807 
3808   // "else" block
3809   CodeCompletionBuilder Builder(Results.getAllocator());
3810   Builder.AddTypedTextChunk("else");
3811   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3812   Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
3813   Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
3814   Builder.AddPlaceholderChunk("statements");
3815   Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
3816   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
3817   Results.AddResult(Builder.TakeString());
3818 
3819   // "else if" block
3820   Builder.AddTypedTextChunk("else");
3821   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3822   Builder.AddTextChunk("if");
3823   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3824   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3825   if (getLangOptions().CPlusPlus)
3826     Builder.AddPlaceholderChunk("condition");
3827   else
3828     Builder.AddPlaceholderChunk("expression");
3829   Builder.AddChunk(CodeCompletionString::CK_RightParen);
3830   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3831   Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
3832   Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
3833   Builder.AddPlaceholderChunk("statements");
3834   Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
3835   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
3836   Results.AddResult(Builder.TakeString());
3837 
3838   Results.ExitScope();
3839 
3840   if (S->getFnParent())
3841     AddPrettyFunctionResults(PP.getLangOptions(), Results);
3842 
3843   if (CodeCompleter->includeMacros())
3844     AddMacroResults(PP, Results);
3845 
3846   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
3847                             Results.data(),Results.size());
3848 }
3849 
3850 void Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) {
3851   if (LHS)
3852     CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType());
3853   else
3854     CodeCompleteOrdinaryName(S, PCC_Expression);
3855 }
3856 
3857 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
3858                                    bool EnteringContext) {
3859   if (!SS.getScopeRep() || !CodeCompleter)
3860     return;
3861 
3862   DeclContext *Ctx = computeDeclContext(SS, EnteringContext);
3863   if (!Ctx)
3864     return;
3865 
3866   // Try to instantiate any non-dependent declaration contexts before
3867   // we look in them.
3868   if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx))
3869     return;
3870 
3871   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3872                         CodeCompletionContext::CCC_Name);
3873   Results.EnterNewScope();
3874 
3875   // The "template" keyword can follow "::" in the grammar, but only
3876   // put it into the grammar if the nested-name-specifier is dependent.
3877   NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep();
3878   if (!Results.empty() && NNS->isDependent())
3879     Results.AddResult("template");
3880 
3881   // Add calls to overridden virtual functions, if there are any.
3882   //
3883   // FIXME: This isn't wonderful, because we don't know whether we're actually
3884   // in a context that permits expressions. This is a general issue with
3885   // qualified-id completions.
3886   if (!EnteringContext)
3887     MaybeAddOverrideCalls(*this, Ctx, Results);
3888   Results.ExitScope();
3889 
3890   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3891   LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer);
3892 
3893   HandleCodeCompleteResults(this, CodeCompleter,
3894                             Results.getCompletionContext(),
3895                             Results.data(),Results.size());
3896 }
3897 
3898 void Sema::CodeCompleteUsing(Scope *S) {
3899   if (!CodeCompleter)
3900     return;
3901 
3902   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3903                         CodeCompletionContext::CCC_PotentiallyQualifiedName,
3904                         &ResultBuilder::IsNestedNameSpecifier);
3905   Results.EnterNewScope();
3906 
3907   // If we aren't in class scope, we could see the "namespace" keyword.
3908   if (!S->isClassScope())
3909     Results.AddResult(CodeCompletionResult("namespace"));
3910 
3911   // After "using", we can see anything that would start a
3912   // nested-name-specifier.
3913   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3914   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3915                      CodeCompleter->includeGlobals());
3916   Results.ExitScope();
3917 
3918   HandleCodeCompleteResults(this, CodeCompleter,
3919                             CodeCompletionContext::CCC_PotentiallyQualifiedName,
3920                             Results.data(),Results.size());
3921 }
3922 
3923 void Sema::CodeCompleteUsingDirective(Scope *S) {
3924   if (!CodeCompleter)
3925     return;
3926 
3927   // After "using namespace", we expect to see a namespace name or namespace
3928   // alias.
3929   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3930                         CodeCompletionContext::CCC_Namespace,
3931                         &ResultBuilder::IsNamespaceOrAlias);
3932   Results.EnterNewScope();
3933   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3934   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3935                      CodeCompleter->includeGlobals());
3936   Results.ExitScope();
3937   HandleCodeCompleteResults(this, CodeCompleter,
3938                             CodeCompletionContext::CCC_Namespace,
3939                             Results.data(),Results.size());
3940 }
3941 
3942 void Sema::CodeCompleteNamespaceDecl(Scope *S)  {
3943   if (!CodeCompleter)
3944     return;
3945 
3946   DeclContext *Ctx = (DeclContext *)S->getEntity();
3947   if (!S->getParent())
3948     Ctx = Context.getTranslationUnitDecl();
3949 
3950   bool SuppressedGlobalResults
3951     = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
3952 
3953   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3954                         SuppressedGlobalResults
3955                           ? CodeCompletionContext::CCC_Namespace
3956                           : CodeCompletionContext::CCC_Other,
3957                         &ResultBuilder::IsNamespace);
3958 
3959   if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
3960     // We only want to see those namespaces that have already been defined
3961     // within this scope, because its likely that the user is creating an
3962     // extended namespace declaration. Keep track of the most recent
3963     // definition of each namespace.
3964     std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
3965     for (DeclContext::specific_decl_iterator<NamespaceDecl>
3966          NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end());
3967          NS != NSEnd; ++NS)
3968       OrigToLatest[NS->getOriginalNamespace()] = *NS;
3969 
3970     // Add the most recent definition (or extended definition) of each
3971     // namespace to the list of results.
3972     Results.EnterNewScope();
3973     for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
3974          NS = OrigToLatest.begin(), NSEnd = OrigToLatest.end();
3975          NS != NSEnd; ++NS)
3976       Results.AddResult(CodeCompletionResult(NS->second, 0),
3977                         CurContext, 0, false);
3978     Results.ExitScope();
3979   }
3980 
3981   HandleCodeCompleteResults(this, CodeCompleter,
3982                             Results.getCompletionContext(),
3983                             Results.data(),Results.size());
3984 }
3985 
3986 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S)  {
3987   if (!CodeCompleter)
3988     return;
3989 
3990   // After "namespace", we expect to see a namespace or alias.
3991   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3992                         CodeCompletionContext::CCC_Namespace,
3993                         &ResultBuilder::IsNamespaceOrAlias);
3994   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3995   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3996                      CodeCompleter->includeGlobals());
3997   HandleCodeCompleteResults(this, CodeCompleter,
3998                             Results.getCompletionContext(),
3999                             Results.data(),Results.size());
4000 }
4001 
4002 void Sema::CodeCompleteOperatorName(Scope *S) {
4003   if (!CodeCompleter)
4004     return;
4005 
4006   typedef CodeCompletionResult Result;
4007   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4008                         CodeCompletionContext::CCC_Type,
4009                         &ResultBuilder::IsType);
4010   Results.EnterNewScope();
4011 
4012   // Add the names of overloadable operators.
4013 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly)      \
4014   if (std::strcmp(Spelling, "?"))                                                  \
4015     Results.AddResult(Result(Spelling));
4016 #include "clang/Basic/OperatorKinds.def"
4017 
4018   // Add any type names visible from the current scope
4019   Results.allowNestedNameSpecifiers();
4020   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4021   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4022                      CodeCompleter->includeGlobals());
4023 
4024   // Add any type specifiers
4025   AddTypeSpecifierResults(getLangOptions(), Results);
4026   Results.ExitScope();
4027 
4028   HandleCodeCompleteResults(this, CodeCompleter,
4029                             CodeCompletionContext::CCC_Type,
4030                             Results.data(),Results.size());
4031 }
4032 
4033 void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,
4034                                               CXXCtorInitializer** Initializers,
4035                                               unsigned NumInitializers) {
4036   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
4037   CXXConstructorDecl *Constructor
4038     = static_cast<CXXConstructorDecl *>(ConstructorD);
4039   if (!Constructor)
4040     return;
4041 
4042   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4043                         CodeCompletionContext::CCC_PotentiallyQualifiedName);
4044   Results.EnterNewScope();
4045 
4046   // Fill in any already-initialized fields or base classes.
4047   llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
4048   llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
4049   for (unsigned I = 0; I != NumInitializers; ++I) {
4050     if (Initializers[I]->isBaseInitializer())
4051       InitializedBases.insert(
4052         Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0)));
4053     else
4054       InitializedFields.insert(cast<FieldDecl>(
4055                                Initializers[I]->getAnyMember()));
4056   }
4057 
4058   // Add completions for base classes.
4059   CodeCompletionBuilder Builder(Results.getAllocator());
4060   bool SawLastInitializer = (NumInitializers == 0);
4061   CXXRecordDecl *ClassDecl = Constructor->getParent();
4062   for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(),
4063                                        BaseEnd = ClassDecl->bases_end();
4064        Base != BaseEnd; ++Base) {
4065     if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {
4066       SawLastInitializer
4067         = NumInitializers > 0 &&
4068           Initializers[NumInitializers - 1]->isBaseInitializer() &&
4069           Context.hasSameUnqualifiedType(Base->getType(),
4070                QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0));
4071       continue;
4072     }
4073 
4074     Builder.AddTypedTextChunk(
4075                Results.getAllocator().CopyString(
4076                           Base->getType().getAsString(Policy)));
4077     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4078     Builder.AddPlaceholderChunk("args");
4079     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4080     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4081                                    SawLastInitializer? CCP_NextInitializer
4082                                                      : CCP_MemberDeclaration));
4083     SawLastInitializer = false;
4084   }
4085 
4086   // Add completions for virtual base classes.
4087   for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(),
4088                                        BaseEnd = ClassDecl->vbases_end();
4089        Base != BaseEnd; ++Base) {
4090     if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {
4091       SawLastInitializer
4092         = NumInitializers > 0 &&
4093           Initializers[NumInitializers - 1]->isBaseInitializer() &&
4094           Context.hasSameUnqualifiedType(Base->getType(),
4095                QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0));
4096       continue;
4097     }
4098 
4099     Builder.AddTypedTextChunk(
4100                Builder.getAllocator().CopyString(
4101                           Base->getType().getAsString(Policy)));
4102     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4103     Builder.AddPlaceholderChunk("args");
4104     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4105     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4106                                    SawLastInitializer? CCP_NextInitializer
4107                                                      : CCP_MemberDeclaration));
4108     SawLastInitializer = false;
4109   }
4110 
4111   // Add completions for members.
4112   for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
4113                                   FieldEnd = ClassDecl->field_end();
4114        Field != FieldEnd; ++Field) {
4115     if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) {
4116       SawLastInitializer
4117         = NumInitializers > 0 &&
4118           Initializers[NumInitializers - 1]->isAnyMemberInitializer() &&
4119           Initializers[NumInitializers - 1]->getAnyMember() == *Field;
4120       continue;
4121     }
4122 
4123     if (!Field->getDeclName())
4124       continue;
4125 
4126     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
4127                                          Field->getIdentifier()->getName()));
4128     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4129     Builder.AddPlaceholderChunk("args");
4130     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4131     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4132                                    SawLastInitializer? CCP_NextInitializer
4133                                                      : CCP_MemberDeclaration,
4134                                            CXCursor_MemberRef));
4135     SawLastInitializer = false;
4136   }
4137   Results.ExitScope();
4138 
4139   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4140                             Results.data(), Results.size());
4141 }
4142 
4143 // Macro that expands to @Keyword or Keyword, depending on whether NeedAt is
4144 // true or false.
4145 #define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) NeedAt? "@" #Keyword : #Keyword
4146 static void AddObjCImplementationResults(const LangOptions &LangOpts,
4147                                          ResultBuilder &Results,
4148                                          bool NeedAt) {
4149   typedef CodeCompletionResult Result;
4150   // Since we have an implementation, we can end it.
4151   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end)));
4152 
4153   CodeCompletionBuilder Builder(Results.getAllocator());
4154   if (LangOpts.ObjC2) {
4155     // @dynamic
4156     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,dynamic));
4157     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4158     Builder.AddPlaceholderChunk("property");
4159     Results.AddResult(Result(Builder.TakeString()));
4160 
4161     // @synthesize
4162     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synthesize));
4163     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4164     Builder.AddPlaceholderChunk("property");
4165     Results.AddResult(Result(Builder.TakeString()));
4166   }
4167 }
4168 
4169 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
4170                                     ResultBuilder &Results,
4171                                     bool NeedAt) {
4172   typedef CodeCompletionResult Result;
4173 
4174   // Since we have an interface or protocol, we can end it.
4175   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end)));
4176 
4177   if (LangOpts.ObjC2) {
4178     // @property
4179     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,property)));
4180 
4181     // @required
4182     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,required)));
4183 
4184     // @optional
4185     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,optional)));
4186   }
4187 }
4188 
4189 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
4190   typedef CodeCompletionResult Result;
4191   CodeCompletionBuilder Builder(Results.getAllocator());
4192 
4193   // @class name ;
4194   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,class));
4195   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4196   Builder.AddPlaceholderChunk("name");
4197   Results.AddResult(Result(Builder.TakeString()));
4198 
4199   if (Results.includeCodePatterns()) {
4200     // @interface name
4201     // FIXME: Could introduce the whole pattern, including superclasses and
4202     // such.
4203     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,interface));
4204     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4205     Builder.AddPlaceholderChunk("class");
4206     Results.AddResult(Result(Builder.TakeString()));
4207 
4208     // @protocol name
4209     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol));
4210     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4211     Builder.AddPlaceholderChunk("protocol");
4212     Results.AddResult(Result(Builder.TakeString()));
4213 
4214     // @implementation name
4215     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,implementation));
4216     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4217     Builder.AddPlaceholderChunk("class");
4218     Results.AddResult(Result(Builder.TakeString()));
4219   }
4220 
4221   // @compatibility_alias name
4222   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,compatibility_alias));
4223   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4224   Builder.AddPlaceholderChunk("alias");
4225   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4226   Builder.AddPlaceholderChunk("class");
4227   Results.AddResult(Result(Builder.TakeString()));
4228 }
4229 
4230 void Sema::CodeCompleteObjCAtDirective(Scope *S) {
4231   typedef CodeCompletionResult Result;
4232   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4233                         CodeCompletionContext::CCC_Other);
4234   Results.EnterNewScope();
4235   if (isa<ObjCImplDecl>(CurContext))
4236     AddObjCImplementationResults(getLangOptions(), Results, false);
4237   else if (CurContext->isObjCContainer())
4238     AddObjCInterfaceResults(getLangOptions(), Results, false);
4239   else
4240     AddObjCTopLevelResults(Results, false);
4241   Results.ExitScope();
4242   HandleCodeCompleteResults(this, CodeCompleter,
4243                             CodeCompletionContext::CCC_Other,
4244                             Results.data(),Results.size());
4245 }
4246 
4247 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
4248   typedef CodeCompletionResult Result;
4249   CodeCompletionBuilder Builder(Results.getAllocator());
4250 
4251   // @encode ( type-name )
4252   const char *EncodeType = "char[]";
4253   if (Results.getSema().getLangOptions().CPlusPlus ||
4254       Results.getSema().getLangOptions().ConstStrings)
4255     EncodeType = " const char[]";
4256   Builder.AddResultTypeChunk(EncodeType);
4257   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,encode));
4258   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4259   Builder.AddPlaceholderChunk("type-name");
4260   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4261   Results.AddResult(Result(Builder.TakeString()));
4262 
4263   // @protocol ( protocol-name )
4264   Builder.AddResultTypeChunk("Protocol *");
4265   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol));
4266   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4267   Builder.AddPlaceholderChunk("protocol-name");
4268   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4269   Results.AddResult(Result(Builder.TakeString()));
4270 
4271   // @selector ( selector )
4272   Builder.AddResultTypeChunk("SEL");
4273   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,selector));
4274   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4275   Builder.AddPlaceholderChunk("selector");
4276   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4277   Results.AddResult(Result(Builder.TakeString()));
4278 }
4279 
4280 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
4281   typedef CodeCompletionResult Result;
4282   CodeCompletionBuilder Builder(Results.getAllocator());
4283 
4284   if (Results.includeCodePatterns()) {
4285     // @try { statements } @catch ( declaration ) { statements } @finally
4286     //   { statements }
4287     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try));
4288     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4289     Builder.AddPlaceholderChunk("statements");
4290     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4291     Builder.AddTextChunk("@catch");
4292     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4293     Builder.AddPlaceholderChunk("parameter");
4294     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4295     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4296     Builder.AddPlaceholderChunk("statements");
4297     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4298     Builder.AddTextChunk("@finally");
4299     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4300     Builder.AddPlaceholderChunk("statements");
4301     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4302     Results.AddResult(Result(Builder.TakeString()));
4303   }
4304 
4305   // @throw
4306   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw));
4307   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4308   Builder.AddPlaceholderChunk("expression");
4309   Results.AddResult(Result(Builder.TakeString()));
4310 
4311   if (Results.includeCodePatterns()) {
4312     // @synchronized ( expression ) { statements }
4313     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized));
4314     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4315     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4316     Builder.AddPlaceholderChunk("expression");
4317     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4318     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4319     Builder.AddPlaceholderChunk("statements");
4320     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4321     Results.AddResult(Result(Builder.TakeString()));
4322   }
4323 }
4324 
4325 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
4326                                      ResultBuilder &Results,
4327                                      bool NeedAt) {
4328   typedef CodeCompletionResult Result;
4329   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private)));
4330   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected)));
4331   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public)));
4332   if (LangOpts.ObjC2)
4333     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package)));
4334 }
4335 
4336 void Sema::CodeCompleteObjCAtVisibility(Scope *S) {
4337   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4338                         CodeCompletionContext::CCC_Other);
4339   Results.EnterNewScope();
4340   AddObjCVisibilityResults(getLangOptions(), Results, false);
4341   Results.ExitScope();
4342   HandleCodeCompleteResults(this, CodeCompleter,
4343                             CodeCompletionContext::CCC_Other,
4344                             Results.data(),Results.size());
4345 }
4346 
4347 void Sema::CodeCompleteObjCAtStatement(Scope *S) {
4348   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4349                         CodeCompletionContext::CCC_Other);
4350   Results.EnterNewScope();
4351   AddObjCStatementResults(Results, false);
4352   AddObjCExpressionResults(Results, false);
4353   Results.ExitScope();
4354   HandleCodeCompleteResults(this, CodeCompleter,
4355                             CodeCompletionContext::CCC_Other,
4356                             Results.data(),Results.size());
4357 }
4358 
4359 void Sema::CodeCompleteObjCAtExpression(Scope *S) {
4360   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4361                         CodeCompletionContext::CCC_Other);
4362   Results.EnterNewScope();
4363   AddObjCExpressionResults(Results, false);
4364   Results.ExitScope();
4365   HandleCodeCompleteResults(this, CodeCompleter,
4366                             CodeCompletionContext::CCC_Other,
4367                             Results.data(),Results.size());
4368 }
4369 
4370 /// \brief Determine whether the addition of the given flag to an Objective-C
4371 /// property's attributes will cause a conflict.
4372 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
4373   // Check if we've already added this flag.
4374   if (Attributes & NewFlag)
4375     return true;
4376 
4377   Attributes |= NewFlag;
4378 
4379   // Check for collisions with "readonly".
4380   if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
4381       (Attributes & (ObjCDeclSpec::DQ_PR_readwrite |
4382                      ObjCDeclSpec::DQ_PR_assign |
4383                      ObjCDeclSpec::DQ_PR_unsafe_unretained |
4384                      ObjCDeclSpec::DQ_PR_copy |
4385                      ObjCDeclSpec::DQ_PR_retain |
4386                      ObjCDeclSpec::DQ_PR_strong)))
4387     return true;
4388 
4389   // Check for more than one of { assign, copy, retain, strong }.
4390   unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign |
4391                                          ObjCDeclSpec::DQ_PR_unsafe_unretained |
4392                                              ObjCDeclSpec::DQ_PR_copy |
4393                                              ObjCDeclSpec::DQ_PR_retain|
4394                                              ObjCDeclSpec::DQ_PR_strong);
4395   if (AssignCopyRetMask &&
4396       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign &&
4397       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained &&
4398       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy &&
4399       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain &&
4400       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong)
4401     return true;
4402 
4403   return false;
4404 }
4405 
4406 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
4407   if (!CodeCompleter)
4408     return;
4409 
4410   unsigned Attributes = ODS.getPropertyAttributes();
4411 
4412   typedef CodeCompletionResult Result;
4413   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4414                         CodeCompletionContext::CCC_Other);
4415   Results.EnterNewScope();
4416   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly))
4417     Results.AddResult(CodeCompletionResult("readonly"));
4418   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign))
4419     Results.AddResult(CodeCompletionResult("assign"));
4420   if (!ObjCPropertyFlagConflicts(Attributes,
4421                                  ObjCDeclSpec::DQ_PR_unsafe_unretained))
4422     Results.AddResult(CodeCompletionResult("unsafe_unretained"));
4423   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite))
4424     Results.AddResult(CodeCompletionResult("readwrite"));
4425   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain))
4426     Results.AddResult(CodeCompletionResult("retain"));
4427   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong))
4428     Results.AddResult(CodeCompletionResult("strong"));
4429   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy))
4430     Results.AddResult(CodeCompletionResult("copy"));
4431   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic))
4432     Results.AddResult(CodeCompletionResult("nonatomic"));
4433   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic))
4434     Results.AddResult(CodeCompletionResult("atomic"));
4435   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) {
4436     CodeCompletionBuilder Setter(Results.getAllocator());
4437     Setter.AddTypedTextChunk("setter");
4438     Setter.AddTextChunk(" = ");
4439     Setter.AddPlaceholderChunk("method");
4440     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
4441   }
4442   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) {
4443     CodeCompletionBuilder Getter(Results.getAllocator());
4444     Getter.AddTypedTextChunk("getter");
4445     Getter.AddTextChunk(" = ");
4446     Getter.AddPlaceholderChunk("method");
4447     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
4448   }
4449   Results.ExitScope();
4450   HandleCodeCompleteResults(this, CodeCompleter,
4451                             CodeCompletionContext::CCC_Other,
4452                             Results.data(),Results.size());
4453 }
4454 
4455 /// \brief Descripts the kind of Objective-C method that we want to find
4456 /// via code completion.
4457 enum ObjCMethodKind {
4458   MK_Any, //< Any kind of method, provided it means other specified criteria.
4459   MK_ZeroArgSelector, //< Zero-argument (unary) selector.
4460   MK_OneArgSelector //< One-argument selector.
4461 };
4462 
4463 static bool isAcceptableObjCSelector(Selector Sel,
4464                                      ObjCMethodKind WantKind,
4465                                      IdentifierInfo **SelIdents,
4466                                      unsigned NumSelIdents,
4467                                      bool AllowSameLength = true) {
4468   if (NumSelIdents > Sel.getNumArgs())
4469     return false;
4470 
4471   switch (WantKind) {
4472     case MK_Any:             break;
4473     case MK_ZeroArgSelector: return Sel.isUnarySelector();
4474     case MK_OneArgSelector:  return Sel.getNumArgs() == 1;
4475   }
4476 
4477   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
4478     return false;
4479 
4480   for (unsigned I = 0; I != NumSelIdents; ++I)
4481     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
4482       return false;
4483 
4484   return true;
4485 }
4486 
4487 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
4488                                    ObjCMethodKind WantKind,
4489                                    IdentifierInfo **SelIdents,
4490                                    unsigned NumSelIdents,
4491                                    bool AllowSameLength = true) {
4492   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
4493                                   NumSelIdents, AllowSameLength);
4494 }
4495 
4496 namespace {
4497   /// \brief A set of selectors, which is used to avoid introducing multiple
4498   /// completions with the same selector into the result set.
4499   typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
4500 }
4501 
4502 /// \brief Add all of the Objective-C methods in the given Objective-C
4503 /// container to the set of results.
4504 ///
4505 /// The container will be a class, protocol, category, or implementation of
4506 /// any of the above. This mether will recurse to include methods from
4507 /// the superclasses of classes along with their categories, protocols, and
4508 /// implementations.
4509 ///
4510 /// \param Container the container in which we'll look to find methods.
4511 ///
4512 /// \param WantInstance whether to add instance methods (only); if false, this
4513 /// routine will add factory methods (only).
4514 ///
4515 /// \param CurContext the context in which we're performing the lookup that
4516 /// finds methods.
4517 ///
4518 /// \param AllowSameLength Whether we allow a method to be added to the list
4519 /// when it has the same number of parameters as we have selector identifiers.
4520 ///
4521 /// \param Results the structure into which we'll add results.
4522 static void AddObjCMethods(ObjCContainerDecl *Container,
4523                            bool WantInstanceMethods,
4524                            ObjCMethodKind WantKind,
4525                            IdentifierInfo **SelIdents,
4526                            unsigned NumSelIdents,
4527                            DeclContext *CurContext,
4528                            VisitedSelectorSet &Selectors,
4529                            bool AllowSameLength,
4530                            ResultBuilder &Results,
4531                            bool InOriginalClass = true) {
4532   typedef CodeCompletionResult Result;
4533   for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
4534                                        MEnd = Container->meth_end();
4535        M != MEnd; ++M) {
4536     if ((*M)->isInstanceMethod() == WantInstanceMethods) {
4537       // Check whether the selector identifiers we've been given are a
4538       // subset of the identifiers for this particular method.
4539       if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents,
4540                                   AllowSameLength))
4541         continue;
4542 
4543       if (!Selectors.insert((*M)->getSelector()))
4544         continue;
4545 
4546       Result R = Result(*M, 0);
4547       R.StartParameter = NumSelIdents;
4548       R.AllParametersAreInformative = (WantKind != MK_Any);
4549       if (!InOriginalClass)
4550         R.Priority += CCD_InBaseClass;
4551       Results.MaybeAddResult(R, CurContext);
4552     }
4553   }
4554 
4555   // Visit the protocols of protocols.
4556   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
4557     const ObjCList<ObjCProtocolDecl> &Protocols
4558       = Protocol->getReferencedProtocols();
4559     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4560                                               E = Protocols.end();
4561          I != E; ++I)
4562       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents,
4563                      CurContext, Selectors, AllowSameLength, Results, false);
4564   }
4565 
4566   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
4567   if (!IFace || !IFace->hasDefinition())
4568     return;
4569 
4570   // Add methods in protocols.
4571   const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols();
4572   for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4573                                             E = Protocols.end();
4574        I != E; ++I)
4575     AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents,
4576                    CurContext, Selectors, AllowSameLength, Results, false);
4577 
4578   // Add methods in categories.
4579   for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl;
4580        CatDecl = CatDecl->getNextClassCategory()) {
4581     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
4582                    NumSelIdents, CurContext, Selectors, AllowSameLength,
4583                    Results, InOriginalClass);
4584 
4585     // Add a categories protocol methods.
4586     const ObjCList<ObjCProtocolDecl> &Protocols
4587       = CatDecl->getReferencedProtocols();
4588     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4589                                               E = Protocols.end();
4590          I != E; ++I)
4591       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,
4592                      NumSelIdents, CurContext, Selectors, AllowSameLength,
4593                      Results, false);
4594 
4595     // Add methods in category implementations.
4596     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
4597       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4598                      NumSelIdents, CurContext, Selectors, AllowSameLength,
4599                      Results, InOriginalClass);
4600   }
4601 
4602   // Add methods in superclass.
4603   if (IFace->getSuperClass())
4604     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
4605                    SelIdents, NumSelIdents, CurContext, Selectors,
4606                    AllowSameLength, Results, false);
4607 
4608   // Add methods in our implementation, if any.
4609   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
4610     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4611                    NumSelIdents, CurContext, Selectors, AllowSameLength,
4612                    Results, InOriginalClass);
4613 }
4614 
4615 
4616 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) {
4617   typedef CodeCompletionResult Result;
4618 
4619   // Try to find the interface where getters might live.
4620   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
4621   if (!Class) {
4622     if (ObjCCategoryDecl *Category
4623           = dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
4624       Class = Category->getClassInterface();
4625 
4626     if (!Class)
4627       return;
4628   }
4629 
4630   // Find all of the potential getters.
4631   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4632                         CodeCompletionContext::CCC_Other);
4633   Results.EnterNewScope();
4634 
4635   VisitedSelectorSet Selectors;
4636   AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors,
4637                  /*AllowSameLength=*/true, Results);
4638   Results.ExitScope();
4639   HandleCodeCompleteResults(this, CodeCompleter,
4640                             CodeCompletionContext::CCC_Other,
4641                             Results.data(),Results.size());
4642 }
4643 
4644 void Sema::CodeCompleteObjCPropertySetter(Scope *S) {
4645   typedef CodeCompletionResult Result;
4646 
4647   // Try to find the interface where setters might live.
4648   ObjCInterfaceDecl *Class
4649     = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
4650   if (!Class) {
4651     if (ObjCCategoryDecl *Category
4652           = dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
4653       Class = Category->getClassInterface();
4654 
4655     if (!Class)
4656       return;
4657   }
4658 
4659   // Find all of the potential getters.
4660   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4661                         CodeCompletionContext::CCC_Other);
4662   Results.EnterNewScope();
4663 
4664   VisitedSelectorSet Selectors;
4665   AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext,
4666                  Selectors, /*AllowSameLength=*/true, Results);
4667 
4668   Results.ExitScope();
4669   HandleCodeCompleteResults(this, CodeCompleter,
4670                             CodeCompletionContext::CCC_Other,
4671                             Results.data(),Results.size());
4672 }
4673 
4674 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
4675                                        bool IsParameter) {
4676   typedef CodeCompletionResult Result;
4677   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4678                         CodeCompletionContext::CCC_Type);
4679   Results.EnterNewScope();
4680 
4681   // Add context-sensitive, Objective-C parameter-passing keywords.
4682   bool AddedInOut = false;
4683   if ((DS.getObjCDeclQualifier() &
4684        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
4685     Results.AddResult("in");
4686     Results.AddResult("inout");
4687     AddedInOut = true;
4688   }
4689   if ((DS.getObjCDeclQualifier() &
4690        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
4691     Results.AddResult("out");
4692     if (!AddedInOut)
4693       Results.AddResult("inout");
4694   }
4695   if ((DS.getObjCDeclQualifier() &
4696        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
4697         ObjCDeclSpec::DQ_Oneway)) == 0) {
4698      Results.AddResult("bycopy");
4699      Results.AddResult("byref");
4700      Results.AddResult("oneway");
4701   }
4702 
4703   // If we're completing the return type of an Objective-C method and the
4704   // identifier IBAction refers to a macro, provide a completion item for
4705   // an action, e.g.,
4706   //   IBAction)<#selector#>:(id)sender
4707   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
4708       Context.Idents.get("IBAction").hasMacroDefinition()) {
4709     typedef CodeCompletionString::Chunk Chunk;
4710     CodeCompletionBuilder Builder(Results.getAllocator(), CCP_CodePattern,
4711                                   CXAvailability_Available);
4712     Builder.AddTypedTextChunk("IBAction");
4713     Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen));
4714     Builder.AddPlaceholderChunk("selector");
4715     Builder.AddChunk(Chunk(CodeCompletionString::CK_Colon));
4716     Builder.AddChunk(Chunk(CodeCompletionString::CK_LeftParen));
4717     Builder.AddTextChunk("id");
4718     Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen));
4719     Builder.AddTextChunk("sender");
4720     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
4721   }
4722 
4723   // Add various builtin type names and specifiers.
4724   AddOrdinaryNameResults(PCC_Type, S, *this, Results);
4725   Results.ExitScope();
4726 
4727   // Add the various type names
4728   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
4729   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4730   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4731                      CodeCompleter->includeGlobals());
4732 
4733   if (CodeCompleter->includeMacros())
4734     AddMacroResults(PP, Results);
4735 
4736   HandleCodeCompleteResults(this, CodeCompleter,
4737                             CodeCompletionContext::CCC_Type,
4738                             Results.data(), Results.size());
4739 }
4740 
4741 /// \brief When we have an expression with type "id", we may assume
4742 /// that it has some more-specific class type based on knowledge of
4743 /// common uses of Objective-C. This routine returns that class type,
4744 /// or NULL if no better result could be determined.
4745 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
4746   ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
4747   if (!Msg)
4748     return 0;
4749 
4750   Selector Sel = Msg->getSelector();
4751   if (Sel.isNull())
4752     return 0;
4753 
4754   IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
4755   if (!Id)
4756     return 0;
4757 
4758   ObjCMethodDecl *Method = Msg->getMethodDecl();
4759   if (!Method)
4760     return 0;
4761 
4762   // Determine the class that we're sending the message to.
4763   ObjCInterfaceDecl *IFace = 0;
4764   switch (Msg->getReceiverKind()) {
4765   case ObjCMessageExpr::Class:
4766     if (const ObjCObjectType *ObjType
4767                            = Msg->getClassReceiver()->getAs<ObjCObjectType>())
4768       IFace = ObjType->getInterface();
4769     break;
4770 
4771   case ObjCMessageExpr::Instance: {
4772     QualType T = Msg->getInstanceReceiver()->getType();
4773     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
4774       IFace = Ptr->getInterfaceDecl();
4775     break;
4776   }
4777 
4778   case ObjCMessageExpr::SuperInstance:
4779   case ObjCMessageExpr::SuperClass:
4780     break;
4781   }
4782 
4783   if (!IFace)
4784     return 0;
4785 
4786   ObjCInterfaceDecl *Super = IFace->getSuperClass();
4787   if (Method->isInstanceMethod())
4788     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
4789       .Case("retain", IFace)
4790       .Case("strong", IFace)
4791       .Case("autorelease", IFace)
4792       .Case("copy", IFace)
4793       .Case("copyWithZone", IFace)
4794       .Case("mutableCopy", IFace)
4795       .Case("mutableCopyWithZone", IFace)
4796       .Case("awakeFromCoder", IFace)
4797       .Case("replacementObjectFromCoder", IFace)
4798       .Case("class", IFace)
4799       .Case("classForCoder", IFace)
4800       .Case("superclass", Super)
4801       .Default(0);
4802 
4803   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
4804     .Case("new", IFace)
4805     .Case("alloc", IFace)
4806     .Case("allocWithZone", IFace)
4807     .Case("class", IFace)
4808     .Case("superclass", Super)
4809     .Default(0);
4810 }
4811 
4812 // Add a special completion for a message send to "super", which fills in the
4813 // most likely case of forwarding all of our arguments to the superclass
4814 // function.
4815 ///
4816 /// \param S The semantic analysis object.
4817 ///
4818 /// \param S NeedSuperKeyword Whether we need to prefix this completion with
4819 /// the "super" keyword. Otherwise, we just need to provide the arguments.
4820 ///
4821 /// \param SelIdents The identifiers in the selector that have already been
4822 /// provided as arguments for a send to "super".
4823 ///
4824 /// \param NumSelIdents The number of identifiers in \p SelIdents.
4825 ///
4826 /// \param Results The set of results to augment.
4827 ///
4828 /// \returns the Objective-C method declaration that would be invoked by
4829 /// this "super" completion. If NULL, no completion was added.
4830 static ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,
4831                                               IdentifierInfo **SelIdents,
4832                                               unsigned NumSelIdents,
4833                                               ResultBuilder &Results) {
4834   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
4835   if (!CurMethod)
4836     return 0;
4837 
4838   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
4839   if (!Class)
4840     return 0;
4841 
4842   // Try to find a superclass method with the same selector.
4843   ObjCMethodDecl *SuperMethod = 0;
4844   while ((Class = Class->getSuperClass()) && !SuperMethod) {
4845     // Check in the class
4846     SuperMethod = Class->getMethod(CurMethod->getSelector(),
4847                                    CurMethod->isInstanceMethod());
4848 
4849     // Check in categories or class extensions.
4850     if (!SuperMethod) {
4851       for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
4852            Category = Category->getNextClassCategory())
4853         if ((SuperMethod = Category->getMethod(CurMethod->getSelector(),
4854                                                CurMethod->isInstanceMethod())))
4855           break;
4856     }
4857   }
4858 
4859   if (!SuperMethod)
4860     return 0;
4861 
4862   // Check whether the superclass method has the same signature.
4863   if (CurMethod->param_size() != SuperMethod->param_size() ||
4864       CurMethod->isVariadic() != SuperMethod->isVariadic())
4865     return 0;
4866 
4867   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
4868                                    CurPEnd = CurMethod->param_end(),
4869                                     SuperP = SuperMethod->param_begin();
4870        CurP != CurPEnd; ++CurP, ++SuperP) {
4871     // Make sure the parameter types are compatible.
4872     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
4873                                           (*SuperP)->getType()))
4874       return 0;
4875 
4876     // Make sure we have a parameter name to forward!
4877     if (!(*CurP)->getIdentifier())
4878       return 0;
4879   }
4880 
4881   // We have a superclass method. Now, form the send-to-super completion.
4882   CodeCompletionBuilder Builder(Results.getAllocator());
4883 
4884   // Give this completion a return type.
4885   AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod,
4886                      Builder);
4887 
4888   // If we need the "super" keyword, add it (plus some spacing).
4889   if (NeedSuperKeyword) {
4890     Builder.AddTypedTextChunk("super");
4891     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4892   }
4893 
4894   Selector Sel = CurMethod->getSelector();
4895   if (Sel.isUnarySelector()) {
4896     if (NeedSuperKeyword)
4897       Builder.AddTextChunk(Builder.getAllocator().CopyString(
4898                                   Sel.getNameForSlot(0)));
4899     else
4900       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
4901                                    Sel.getNameForSlot(0)));
4902   } else {
4903     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
4904     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
4905       if (I > NumSelIdents)
4906         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4907 
4908       if (I < NumSelIdents)
4909         Builder.AddInformativeChunk(
4910                    Builder.getAllocator().CopyString(
4911                                                  Sel.getNameForSlot(I) + ":"));
4912       else if (NeedSuperKeyword || I > NumSelIdents) {
4913         Builder.AddTextChunk(
4914                  Builder.getAllocator().CopyString(
4915                                                   Sel.getNameForSlot(I) + ":"));
4916         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
4917                                          (*CurP)->getIdentifier()->getName()));
4918       } else {
4919         Builder.AddTypedTextChunk(
4920                   Builder.getAllocator().CopyString(
4921                                                   Sel.getNameForSlot(I) + ":"));
4922         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
4923                                          (*CurP)->getIdentifier()->getName()));
4924       }
4925     }
4926   }
4927 
4928   Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_SuperCompletion,
4929                                          SuperMethod->isInstanceMethod()
4930                                            ? CXCursor_ObjCInstanceMethodDecl
4931                                            : CXCursor_ObjCClassMethodDecl));
4932   return SuperMethod;
4933 }
4934 
4935 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {
4936   typedef CodeCompletionResult Result;
4937   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4938                         CodeCompletionContext::CCC_ObjCMessageReceiver,
4939                         &ResultBuilder::IsObjCMessageReceiver);
4940 
4941   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4942   Results.EnterNewScope();
4943   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4944                      CodeCompleter->includeGlobals());
4945 
4946   // If we are in an Objective-C method inside a class that has a superclass,
4947   // add "super" as an option.
4948   if (ObjCMethodDecl *Method = getCurMethodDecl())
4949     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
4950       if (Iface->getSuperClass()) {
4951         Results.AddResult(Result("super"));
4952 
4953         AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, 0, 0, Results);
4954       }
4955 
4956   Results.ExitScope();
4957 
4958   if (CodeCompleter->includeMacros())
4959     AddMacroResults(PP, Results);
4960   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4961                             Results.data(), Results.size());
4962 
4963 }
4964 
4965 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
4966                                         IdentifierInfo **SelIdents,
4967                                         unsigned NumSelIdents,
4968                                         bool AtArgumentExpression) {
4969   ObjCInterfaceDecl *CDecl = 0;
4970   if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
4971     // Figure out which interface we're in.
4972     CDecl = CurMethod->getClassInterface();
4973     if (!CDecl)
4974       return;
4975 
4976     // Find the superclass of this class.
4977     CDecl = CDecl->getSuperClass();
4978     if (!CDecl)
4979       return;
4980 
4981     if (CurMethod->isInstanceMethod()) {
4982       // We are inside an instance method, which means that the message
4983       // send [super ...] is actually calling an instance method on the
4984       // current object.
4985       return CodeCompleteObjCInstanceMessage(S, 0,
4986                                              SelIdents, NumSelIdents,
4987                                              AtArgumentExpression,
4988                                              CDecl);
4989     }
4990 
4991     // Fall through to send to the superclass in CDecl.
4992   } else {
4993     // "super" may be the name of a type or variable. Figure out which
4994     // it is.
4995     IdentifierInfo *Super = &Context.Idents.get("super");
4996     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc,
4997                                      LookupOrdinaryName);
4998     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
4999       // "super" names an interface. Use it.
5000     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
5001       if (const ObjCObjectType *Iface
5002             = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>())
5003         CDecl = Iface->getInterface();
5004     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
5005       // "super" names an unresolved type; we can't be more specific.
5006     } else {
5007       // Assume that "super" names some kind of value and parse that way.
5008       CXXScopeSpec SS;
5009       UnqualifiedId id;
5010       id.setIdentifier(Super, SuperLoc);
5011       ExprResult SuperExpr = ActOnIdExpression(S, SS, id, false, false);
5012       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
5013                                              SelIdents, NumSelIdents,
5014                                              AtArgumentExpression);
5015     }
5016 
5017     // Fall through
5018   }
5019 
5020   ParsedType Receiver;
5021   if (CDecl)
5022     Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));
5023   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
5024                                       NumSelIdents, AtArgumentExpression,
5025                                       /*IsSuper=*/true);
5026 }
5027 
5028 /// \brief Given a set of code-completion results for the argument of a message
5029 /// send, determine the preferred type (if any) for that argument expression.
5030 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
5031                                                        unsigned NumSelIdents) {
5032   typedef CodeCompletionResult Result;
5033   ASTContext &Context = Results.getSema().Context;
5034 
5035   QualType PreferredType;
5036   unsigned BestPriority = CCP_Unlikely * 2;
5037   Result *ResultsData = Results.data();
5038   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
5039     Result &R = ResultsData[I];
5040     if (R.Kind == Result::RK_Declaration &&
5041         isa<ObjCMethodDecl>(R.Declaration)) {
5042       if (R.Priority <= BestPriority) {
5043         ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
5044         if (NumSelIdents <= Method->param_size()) {
5045           QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1]
5046                                        ->getType();
5047           if (R.Priority < BestPriority || PreferredType.isNull()) {
5048             BestPriority = R.Priority;
5049             PreferredType = MyPreferredType;
5050           } else if (!Context.hasSameUnqualifiedType(PreferredType,
5051                                                      MyPreferredType)) {
5052             PreferredType = QualType();
5053           }
5054         }
5055       }
5056     }
5057   }
5058 
5059   return PreferredType;
5060 }
5061 
5062 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
5063                                        ParsedType Receiver,
5064                                        IdentifierInfo **SelIdents,
5065                                        unsigned NumSelIdents,
5066                                        bool AtArgumentExpression,
5067                                        bool IsSuper,
5068                                        ResultBuilder &Results) {
5069   typedef CodeCompletionResult Result;
5070   ObjCInterfaceDecl *CDecl = 0;
5071 
5072   // If the given name refers to an interface type, retrieve the
5073   // corresponding declaration.
5074   if (Receiver) {
5075     QualType T = SemaRef.GetTypeFromParser(Receiver, 0);
5076     if (!T.isNull())
5077       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
5078         CDecl = Interface->getInterface();
5079   }
5080 
5081   // Add all of the factory methods in this Objective-C class, its protocols,
5082   // superclasses, categories, implementation, etc.
5083   Results.EnterNewScope();
5084 
5085   // If this is a send-to-super, try to add the special "super" send
5086   // completion.
5087   if (IsSuper) {
5088     if (ObjCMethodDecl *SuperMethod
5089         = AddSuperSendCompletion(SemaRef, false, SelIdents, NumSelIdents,
5090                                  Results))
5091       Results.Ignore(SuperMethod);
5092   }
5093 
5094   // If we're inside an Objective-C method definition, prefer its selector to
5095   // others.
5096   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
5097     Results.setPreferredSelector(CurMethod->getSelector());
5098 
5099   VisitedSelectorSet Selectors;
5100   if (CDecl)
5101     AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents,
5102                    SemaRef.CurContext, Selectors, AtArgumentExpression,
5103                    Results);
5104   else {
5105     // We're messaging "id" as a type; provide all class/factory methods.
5106 
5107     // If we have an external source, load the entire class method
5108     // pool from the AST file.
5109     if (SemaRef.ExternalSource) {
5110       for (uint32_t I = 0,
5111                     N = SemaRef.ExternalSource->GetNumExternalSelectors();
5112            I != N; ++I) {
5113         Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I);
5114         if (Sel.isNull() || SemaRef.MethodPool.count(Sel))
5115           continue;
5116 
5117         SemaRef.ReadMethodPool(Sel);
5118       }
5119     }
5120 
5121     for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(),
5122                                        MEnd = SemaRef.MethodPool.end();
5123          M != MEnd; ++M) {
5124       for (ObjCMethodList *MethList = &M->second.second;
5125            MethList && MethList->Method;
5126            MethList = MethList->Next) {
5127         if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
5128                                     NumSelIdents))
5129           continue;
5130 
5131         Result R(MethList->Method, 0);
5132         R.StartParameter = NumSelIdents;
5133         R.AllParametersAreInformative = false;
5134         Results.MaybeAddResult(R, SemaRef.CurContext);
5135       }
5136     }
5137   }
5138 
5139   Results.ExitScope();
5140 }
5141 
5142 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
5143                                         IdentifierInfo **SelIdents,
5144                                         unsigned NumSelIdents,
5145                                         bool AtArgumentExpression,
5146                                         bool IsSuper) {
5147 
5148   QualType T = this->GetTypeFromParser(Receiver);
5149 
5150   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5151               CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage,
5152                                     T, SelIdents, NumSelIdents));
5153 
5154   AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents,
5155                              AtArgumentExpression, IsSuper, Results);
5156 
5157   // If we're actually at the argument expression (rather than prior to the
5158   // selector), we're actually performing code completion for an expression.
5159   // Determine whether we have a single, best method. If so, we can
5160   // code-complete the expression using the corresponding parameter type as
5161   // our preferred type, improving completion results.
5162   if (AtArgumentExpression) {
5163     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
5164                                                                   NumSelIdents);
5165     if (PreferredType.isNull())
5166       CodeCompleteOrdinaryName(S, PCC_Expression);
5167     else
5168       CodeCompleteExpression(S, PreferredType);
5169     return;
5170   }
5171 
5172   HandleCodeCompleteResults(this, CodeCompleter,
5173                             Results.getCompletionContext(),
5174                             Results.data(), Results.size());
5175 }
5176 
5177 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,
5178                                            IdentifierInfo **SelIdents,
5179                                            unsigned NumSelIdents,
5180                                            bool AtArgumentExpression,
5181                                            ObjCInterfaceDecl *Super) {
5182   typedef CodeCompletionResult Result;
5183 
5184   Expr *RecExpr = static_cast<Expr *>(Receiver);
5185 
5186   // If necessary, apply function/array conversion to the receiver.
5187   // C99 6.7.5.3p[7,8].
5188   if (RecExpr) {
5189     ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr);
5190     if (Conv.isInvalid()) // conversion failed. bail.
5191       return;
5192     RecExpr = Conv.take();
5193   }
5194   QualType ReceiverType = RecExpr? RecExpr->getType()
5195                           : Super? Context.getObjCObjectPointerType(
5196                                             Context.getObjCInterfaceType(Super))
5197                                  : Context.getObjCIdType();
5198 
5199   // If we're messaging an expression with type "id" or "Class", check
5200   // whether we know something special about the receiver that allows
5201   // us to assume a more-specific receiver type.
5202   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType())
5203     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
5204       if (ReceiverType->isObjCClassType())
5205         return CodeCompleteObjCClassMessage(S,
5206                        ParsedType::make(Context.getObjCInterfaceType(IFace)),
5207                                             SelIdents, NumSelIdents,
5208                                             AtArgumentExpression, Super);
5209 
5210       ReceiverType = Context.getObjCObjectPointerType(
5211                                           Context.getObjCInterfaceType(IFace));
5212     }
5213 
5214   // Build the set of methods we can see.
5215   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5216            CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
5217                                  ReceiverType, SelIdents, NumSelIdents));
5218 
5219   Results.EnterNewScope();
5220 
5221   // If this is a send-to-super, try to add the special "super" send
5222   // completion.
5223   if (Super) {
5224     if (ObjCMethodDecl *SuperMethod
5225           = AddSuperSendCompletion(*this, false, SelIdents, NumSelIdents,
5226                                    Results))
5227       Results.Ignore(SuperMethod);
5228   }
5229 
5230   // If we're inside an Objective-C method definition, prefer its selector to
5231   // others.
5232   if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
5233     Results.setPreferredSelector(CurMethod->getSelector());
5234 
5235   // Keep track of the selectors we've already added.
5236   VisitedSelectorSet Selectors;
5237 
5238   // Handle messages to Class. This really isn't a message to an instance
5239   // method, so we treat it the same way we would treat a message send to a
5240   // class method.
5241   if (ReceiverType->isObjCClassType() ||
5242       ReceiverType->isObjCQualifiedClassType()) {
5243     if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
5244       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
5245         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents,
5246                        CurContext, Selectors, AtArgumentExpression, Results);
5247     }
5248   }
5249   // Handle messages to a qualified ID ("id<foo>").
5250   else if (const ObjCObjectPointerType *QualID
5251              = ReceiverType->getAsObjCQualifiedIdType()) {
5252     // Search protocols for instance methods.
5253     for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(),
5254                                               E = QualID->qual_end();
5255          I != E; ++I)
5256       AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext,
5257                      Selectors, AtArgumentExpression, Results);
5258   }
5259   // Handle messages to a pointer to interface type.
5260   else if (const ObjCObjectPointerType *IFacePtr
5261                               = ReceiverType->getAsObjCInterfacePointerType()) {
5262     // Search the class, its superclasses, etc., for instance methods.
5263     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
5264                    NumSelIdents, CurContext, Selectors, AtArgumentExpression,
5265                    Results);
5266 
5267     // Search protocols for instance methods.
5268     for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(),
5269          E = IFacePtr->qual_end();
5270          I != E; ++I)
5271       AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext,
5272                      Selectors, AtArgumentExpression, Results);
5273   }
5274   // Handle messages to "id".
5275   else if (ReceiverType->isObjCIdType()) {
5276     // We're messaging "id", so provide all instance methods we know
5277     // about as code-completion results.
5278 
5279     // If we have an external source, load the entire class method
5280     // pool from the AST file.
5281     if (ExternalSource) {
5282       for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
5283            I != N; ++I) {
5284         Selector Sel = ExternalSource->GetExternalSelector(I);
5285         if (Sel.isNull() || MethodPool.count(Sel))
5286           continue;
5287 
5288         ReadMethodPool(Sel);
5289       }
5290     }
5291 
5292     for (GlobalMethodPool::iterator M = MethodPool.begin(),
5293                                     MEnd = MethodPool.end();
5294          M != MEnd; ++M) {
5295       for (ObjCMethodList *MethList = &M->second.first;
5296            MethList && MethList->Method;
5297            MethList = MethList->Next) {
5298         if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
5299                                     NumSelIdents))
5300           continue;
5301 
5302         if (!Selectors.insert(MethList->Method->getSelector()))
5303           continue;
5304 
5305         Result R(MethList->Method, 0);
5306         R.StartParameter = NumSelIdents;
5307         R.AllParametersAreInformative = false;
5308         Results.MaybeAddResult(R, CurContext);
5309       }
5310     }
5311   }
5312   Results.ExitScope();
5313 
5314 
5315   // If we're actually at the argument expression (rather than prior to the
5316   // selector), we're actually performing code completion for an expression.
5317   // Determine whether we have a single, best method. If so, we can
5318   // code-complete the expression using the corresponding parameter type as
5319   // our preferred type, improving completion results.
5320   if (AtArgumentExpression) {
5321     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
5322                                                                   NumSelIdents);
5323     if (PreferredType.isNull())
5324       CodeCompleteOrdinaryName(S, PCC_Expression);
5325     else
5326       CodeCompleteExpression(S, PreferredType);
5327     return;
5328   }
5329 
5330   HandleCodeCompleteResults(this, CodeCompleter,
5331                             Results.getCompletionContext(),
5332                             Results.data(),Results.size());
5333 }
5334 
5335 void Sema::CodeCompleteObjCForCollection(Scope *S,
5336                                          DeclGroupPtrTy IterationVar) {
5337   CodeCompleteExpressionData Data;
5338   Data.ObjCCollection = true;
5339 
5340   if (IterationVar.getAsOpaquePtr()) {
5341     DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>();
5342     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
5343       if (*I)
5344         Data.IgnoreDecls.push_back(*I);
5345     }
5346   }
5347 
5348   CodeCompleteExpression(S, Data);
5349 }
5350 
5351 void Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents,
5352                                     unsigned NumSelIdents) {
5353   // If we have an external source, load the entire class method
5354   // pool from the AST file.
5355   if (ExternalSource) {
5356     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
5357          I != N; ++I) {
5358       Selector Sel = ExternalSource->GetExternalSelector(I);
5359       if (Sel.isNull() || MethodPool.count(Sel))
5360         continue;
5361 
5362       ReadMethodPool(Sel);
5363     }
5364   }
5365 
5366   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5367                         CodeCompletionContext::CCC_SelectorName);
5368   Results.EnterNewScope();
5369   for (GlobalMethodPool::iterator M = MethodPool.begin(),
5370                                MEnd = MethodPool.end();
5371        M != MEnd; ++M) {
5372 
5373     Selector Sel = M->first;
5374     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents, NumSelIdents))
5375       continue;
5376 
5377     CodeCompletionBuilder Builder(Results.getAllocator());
5378     if (Sel.isUnarySelector()) {
5379       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
5380                                                        Sel.getNameForSlot(0)));
5381       Results.AddResult(Builder.TakeString());
5382       continue;
5383     }
5384 
5385     std::string Accumulator;
5386     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
5387       if (I == NumSelIdents) {
5388         if (!Accumulator.empty()) {
5389           Builder.AddInformativeChunk(Builder.getAllocator().CopyString(
5390                                                  Accumulator));
5391           Accumulator.clear();
5392         }
5393       }
5394 
5395       Accumulator += Sel.getNameForSlot(I);
5396       Accumulator += ':';
5397     }
5398     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator));
5399     Results.AddResult(Builder.TakeString());
5400   }
5401   Results.ExitScope();
5402 
5403   HandleCodeCompleteResults(this, CodeCompleter,
5404                             CodeCompletionContext::CCC_SelectorName,
5405                             Results.data(), Results.size());
5406 }
5407 
5408 /// \brief Add all of the protocol declarations that we find in the given
5409 /// (translation unit) context.
5410 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
5411                                bool OnlyForwardDeclarations,
5412                                ResultBuilder &Results) {
5413   typedef CodeCompletionResult Result;
5414 
5415   for (DeclContext::decl_iterator D = Ctx->decls_begin(),
5416                                DEnd = Ctx->decls_end();
5417        D != DEnd; ++D) {
5418     // Record any protocols we find.
5419     if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D))
5420       if (!OnlyForwardDeclarations || Proto->isForwardDecl())
5421         Results.AddResult(Result(Proto, 0), CurContext, 0, false);
5422 
5423     // Record any forward-declared protocols we find.
5424     if (ObjCForwardProtocolDecl *Forward
5425           = dyn_cast<ObjCForwardProtocolDecl>(*D)) {
5426       for (ObjCForwardProtocolDecl::protocol_iterator
5427              P = Forward->protocol_begin(),
5428              PEnd = Forward->protocol_end();
5429            P != PEnd; ++P)
5430         if (!OnlyForwardDeclarations || (*P)->isForwardDecl())
5431           Results.AddResult(Result(*P, 0), CurContext, 0, false);
5432     }
5433   }
5434 }
5435 
5436 void Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols,
5437                                               unsigned NumProtocols) {
5438   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5439                         CodeCompletionContext::CCC_ObjCProtocolName);
5440 
5441   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5442     Results.EnterNewScope();
5443 
5444     // Tell the result set to ignore all of the protocols we have
5445     // already seen.
5446     // FIXME: This doesn't work when caching code-completion results.
5447     for (unsigned I = 0; I != NumProtocols; ++I)
5448       if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first,
5449                                                       Protocols[I].second))
5450         Results.Ignore(Protocol);
5451 
5452     // Add all protocols.
5453     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false,
5454                        Results);
5455 
5456     Results.ExitScope();
5457   }
5458 
5459   HandleCodeCompleteResults(this, CodeCompleter,
5460                             CodeCompletionContext::CCC_ObjCProtocolName,
5461                             Results.data(),Results.size());
5462 }
5463 
5464 void Sema::CodeCompleteObjCProtocolDecl(Scope *) {
5465   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5466                         CodeCompletionContext::CCC_ObjCProtocolName);
5467 
5468   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5469     Results.EnterNewScope();
5470 
5471     // Add all protocols.
5472     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true,
5473                        Results);
5474 
5475     Results.ExitScope();
5476   }
5477 
5478   HandleCodeCompleteResults(this, CodeCompleter,
5479                             CodeCompletionContext::CCC_ObjCProtocolName,
5480                             Results.data(),Results.size());
5481 }
5482 
5483 /// \brief Add all of the Objective-C interface declarations that we find in
5484 /// the given (translation unit) context.
5485 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
5486                                 bool OnlyForwardDeclarations,
5487                                 bool OnlyUnimplemented,
5488                                 ResultBuilder &Results) {
5489   typedef CodeCompletionResult Result;
5490 
5491   for (DeclContext::decl_iterator D = Ctx->decls_begin(),
5492                                DEnd = Ctx->decls_end();
5493        D != DEnd; ++D) {
5494     // Record any interfaces we find.
5495     if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D))
5496       if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
5497           (!OnlyUnimplemented || !Class->getImplementation()))
5498         Results.AddResult(Result(Class, 0), CurContext, 0, false);
5499   }
5500 }
5501 
5502 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
5503   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5504                         CodeCompletionContext::CCC_Other);
5505   Results.EnterNewScope();
5506 
5507   if (CodeCompleter->includeGlobals()) {
5508     // Add all classes.
5509     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5510                         false, Results);
5511   }
5512 
5513   Results.ExitScope();
5514 
5515   HandleCodeCompleteResults(this, CodeCompleter,
5516                             CodeCompletionContext::CCC_ObjCInterfaceName,
5517                             Results.data(),Results.size());
5518 }
5519 
5520 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
5521                                       SourceLocation ClassNameLoc) {
5522   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5523                         CodeCompletionContext::CCC_ObjCInterfaceName);
5524   Results.EnterNewScope();
5525 
5526   // Make sure that we ignore the class we're currently defining.
5527   NamedDecl *CurClass
5528     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5529   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
5530     Results.Ignore(CurClass);
5531 
5532   if (CodeCompleter->includeGlobals()) {
5533     // Add all classes.
5534     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5535                         false, Results);
5536   }
5537 
5538   Results.ExitScope();
5539 
5540   HandleCodeCompleteResults(this, CodeCompleter,
5541                             CodeCompletionContext::CCC_ObjCInterfaceName,
5542                             Results.data(),Results.size());
5543 }
5544 
5545 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
5546   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5547                         CodeCompletionContext::CCC_Other);
5548   Results.EnterNewScope();
5549 
5550   if (CodeCompleter->includeGlobals()) {
5551     // Add all unimplemented classes.
5552     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5553                         true, Results);
5554   }
5555 
5556   Results.ExitScope();
5557 
5558   HandleCodeCompleteResults(this, CodeCompleter,
5559                             CodeCompletionContext::CCC_ObjCInterfaceName,
5560                             Results.data(),Results.size());
5561 }
5562 
5563 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
5564                                              IdentifierInfo *ClassName,
5565                                              SourceLocation ClassNameLoc) {
5566   typedef CodeCompletionResult Result;
5567 
5568   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5569                         CodeCompletionContext::CCC_ObjCCategoryName);
5570 
5571   // Ignore any categories we find that have already been implemented by this
5572   // interface.
5573   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5574   NamedDecl *CurClass
5575     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5576   if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass))
5577     for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
5578          Category = Category->getNextClassCategory())
5579       CategoryNames.insert(Category->getIdentifier());
5580 
5581   // Add all of the categories we know about.
5582   Results.EnterNewScope();
5583   TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
5584   for (DeclContext::decl_iterator D = TU->decls_begin(),
5585                                DEnd = TU->decls_end();
5586        D != DEnd; ++D)
5587     if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D))
5588       if (CategoryNames.insert(Category->getIdentifier()))
5589         Results.AddResult(Result(Category, 0), CurContext, 0, false);
5590   Results.ExitScope();
5591 
5592   HandleCodeCompleteResults(this, CodeCompleter,
5593                             CodeCompletionContext::CCC_ObjCCategoryName,
5594                             Results.data(),Results.size());
5595 }
5596 
5597 void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
5598                                                   IdentifierInfo *ClassName,
5599                                                   SourceLocation ClassNameLoc) {
5600   typedef CodeCompletionResult Result;
5601 
5602   // Find the corresponding interface. If we couldn't find the interface, the
5603   // program itself is ill-formed. However, we'll try to be helpful still by
5604   // providing the list of all of the categories we know about.
5605   NamedDecl *CurClass
5606     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5607   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
5608   if (!Class)
5609     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
5610 
5611   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5612                         CodeCompletionContext::CCC_ObjCCategoryName);
5613 
5614   // Add all of the categories that have have corresponding interface
5615   // declarations in this class and any of its superclasses, except for
5616   // already-implemented categories in the class itself.
5617   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5618   Results.EnterNewScope();
5619   bool IgnoreImplemented = true;
5620   while (Class) {
5621     for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
5622          Category = Category->getNextClassCategory())
5623       if ((!IgnoreImplemented || !Category->getImplementation()) &&
5624           CategoryNames.insert(Category->getIdentifier()))
5625         Results.AddResult(Result(Category, 0), CurContext, 0, false);
5626 
5627     Class = Class->getSuperClass();
5628     IgnoreImplemented = false;
5629   }
5630   Results.ExitScope();
5631 
5632   HandleCodeCompleteResults(this, CodeCompleter,
5633                             CodeCompletionContext::CCC_ObjCCategoryName,
5634                             Results.data(),Results.size());
5635 }
5636 
5637 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) {
5638   typedef CodeCompletionResult Result;
5639   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5640                         CodeCompletionContext::CCC_Other);
5641 
5642   // Figure out where this @synthesize lives.
5643   ObjCContainerDecl *Container
5644     = dyn_cast_or_null<ObjCContainerDecl>(CurContext);
5645   if (!Container ||
5646       (!isa<ObjCImplementationDecl>(Container) &&
5647        !isa<ObjCCategoryImplDecl>(Container)))
5648     return;
5649 
5650   // Ignore any properties that have already been implemented.
5651   for (DeclContext::decl_iterator D = Container->decls_begin(),
5652                                DEnd = Container->decls_end();
5653        D != DEnd; ++D)
5654     if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D))
5655       Results.Ignore(PropertyImpl->getPropertyDecl());
5656 
5657   // Add any properties that we find.
5658   AddedPropertiesSet AddedProperties;
5659   Results.EnterNewScope();
5660   if (ObjCImplementationDecl *ClassImpl
5661         = dyn_cast<ObjCImplementationDecl>(Container))
5662     AddObjCProperties(ClassImpl->getClassInterface(), false,
5663                       /*AllowNullaryMethods=*/false, CurContext,
5664                       AddedProperties, Results);
5665   else
5666     AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
5667                       false, /*AllowNullaryMethods=*/false, CurContext,
5668                       AddedProperties, Results);
5669   Results.ExitScope();
5670 
5671   HandleCodeCompleteResults(this, CodeCompleter,
5672                             CodeCompletionContext::CCC_Other,
5673                             Results.data(),Results.size());
5674 }
5675 
5676 void Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S,
5677                                                   IdentifierInfo *PropertyName) {
5678   typedef CodeCompletionResult Result;
5679   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5680                         CodeCompletionContext::CCC_Other);
5681 
5682   // Figure out where this @synthesize lives.
5683   ObjCContainerDecl *Container
5684     = dyn_cast_or_null<ObjCContainerDecl>(CurContext);
5685   if (!Container ||
5686       (!isa<ObjCImplementationDecl>(Container) &&
5687        !isa<ObjCCategoryImplDecl>(Container)))
5688     return;
5689 
5690   // Figure out which interface we're looking into.
5691   ObjCInterfaceDecl *Class = 0;
5692   if (ObjCImplementationDecl *ClassImpl
5693                                  = dyn_cast<ObjCImplementationDecl>(Container))
5694     Class = ClassImpl->getClassInterface();
5695   else
5696     Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl()
5697                                                           ->getClassInterface();
5698 
5699   // Determine the type of the property we're synthesizing.
5700   QualType PropertyType = Context.getObjCIdType();
5701   if (Class) {
5702     if (ObjCPropertyDecl *Property
5703                               = Class->FindPropertyDeclaration(PropertyName)) {
5704       PropertyType
5705         = Property->getType().getNonReferenceType().getUnqualifiedType();
5706 
5707       // Give preference to ivars
5708       Results.setPreferredType(PropertyType);
5709     }
5710   }
5711 
5712   // Add all of the instance variables in this class and its superclasses.
5713   Results.EnterNewScope();
5714   bool SawSimilarlyNamedIvar = false;
5715   std::string NameWithPrefix;
5716   NameWithPrefix += '_';
5717   NameWithPrefix += PropertyName->getName();
5718   std::string NameWithSuffix = PropertyName->getName().str();
5719   NameWithSuffix += '_';
5720   for(; Class; Class = Class->getSuperClass()) {
5721     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
5722          Ivar = Ivar->getNextIvar()) {
5723       Results.AddResult(Result(Ivar, 0), CurContext, 0, false);
5724 
5725       // Determine whether we've seen an ivar with a name similar to the
5726       // property.
5727       if ((PropertyName == Ivar->getIdentifier() ||
5728            NameWithPrefix == Ivar->getName() ||
5729            NameWithSuffix == Ivar->getName())) {
5730         SawSimilarlyNamedIvar = true;
5731 
5732         // Reduce the priority of this result by one, to give it a slight
5733         // advantage over other results whose names don't match so closely.
5734         if (Results.size() &&
5735             Results.data()[Results.size() - 1].Kind
5736                                       == CodeCompletionResult::RK_Declaration &&
5737             Results.data()[Results.size() - 1].Declaration == Ivar)
5738           Results.data()[Results.size() - 1].Priority--;
5739       }
5740     }
5741   }
5742 
5743   if (!SawSimilarlyNamedIvar) {
5744     // Create ivar result _propName, that the user can use to synthesize
5745     // an ivar of the appropriate type.
5746     unsigned Priority = CCP_MemberDeclaration + 1;
5747     typedef CodeCompletionResult Result;
5748     CodeCompletionAllocator &Allocator = Results.getAllocator();
5749     CodeCompletionBuilder Builder(Allocator, Priority,CXAvailability_Available);
5750 
5751     PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
5752     Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context,
5753                                                        Policy, Allocator));
5754     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
5755     Results.AddResult(Result(Builder.TakeString(), Priority,
5756                              CXCursor_ObjCIvarDecl));
5757   }
5758 
5759   Results.ExitScope();
5760 
5761   HandleCodeCompleteResults(this, CodeCompleter,
5762                             CodeCompletionContext::CCC_Other,
5763                             Results.data(),Results.size());
5764 }
5765 
5766 // Mapping from selectors to the methods that implement that selector, along
5767 // with the "in original class" flag.
5768 typedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> >
5769   KnownMethodsMap;
5770 
5771 /// \brief Find all of the methods that reside in the given container
5772 /// (and its superclasses, protocols, etc.) that meet the given
5773 /// criteria. Insert those methods into the map of known methods,
5774 /// indexed by selector so they can be easily found.
5775 static void FindImplementableMethods(ASTContext &Context,
5776                                      ObjCContainerDecl *Container,
5777                                      bool WantInstanceMethods,
5778                                      QualType ReturnType,
5779                                      KnownMethodsMap &KnownMethods,
5780                                      bool InOriginalClass = true) {
5781   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
5782     // Recurse into protocols.
5783     if (!IFace->hasDefinition())
5784       return;
5785 
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