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 llvm::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   llvm::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     if (isa<ObjCPropertyDecl>(ND) &&
994         SemaRef.canSynthesizeProvisionalIvar(cast<ObjCPropertyDecl>(ND)))
995       return true;
996   }
997 
998   return ND->getIdentifierNamespace() & IDNS;
999 }
1000 
1001 /// \brief Determines whether this given declaration will be found by
1002 /// ordinary name lookup but is not a type name.
1003 bool ResultBuilder::IsOrdinaryNonTypeName(NamedDecl *ND) const {
1004   ND = cast<NamedDecl>(ND->getUnderlyingDecl());
1005   if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND))
1006     return false;
1007 
1008   unsigned IDNS = Decl::IDNS_Ordinary;
1009   if (SemaRef.getLangOptions().CPlusPlus)
1010     IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member;
1011   else if (SemaRef.getLangOptions().ObjC1) {
1012     if (isa<ObjCIvarDecl>(ND))
1013       return true;
1014     if (isa<ObjCPropertyDecl>(ND) &&
1015         SemaRef.canSynthesizeProvisionalIvar(cast<ObjCPropertyDecl>(ND)))
1016       return true;
1017   }
1018 
1019   return ND->getIdentifierNamespace() & IDNS;
1020 }
1021 
1022 bool ResultBuilder::IsIntegralConstantValue(NamedDecl *ND) const {
1023   if (!IsOrdinaryNonTypeName(ND))
1024     return 0;
1025 
1026   if (ValueDecl *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl()))
1027     if (VD->getType()->isIntegralOrEnumerationType())
1028       return true;
1029 
1030   return false;
1031 }
1032 
1033 /// \brief Determines whether this given declaration will be found by
1034 /// ordinary name lookup.
1035 bool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const {
1036   ND = cast<NamedDecl>(ND->getUnderlyingDecl());
1037 
1038   unsigned IDNS = Decl::IDNS_Ordinary;
1039   if (SemaRef.getLangOptions().CPlusPlus)
1040     IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace;
1041 
1042   return (ND->getIdentifierNamespace() & IDNS) &&
1043     !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND) &&
1044     !isa<ObjCPropertyDecl>(ND);
1045 }
1046 
1047 /// \brief Determines whether the given declaration is suitable as the
1048 /// start of a C++ nested-name-specifier, e.g., a class or namespace.
1049 bool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const {
1050   // Allow us to find class templates, too.
1051   if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1052     ND = ClassTemplate->getTemplatedDecl();
1053 
1054   return SemaRef.isAcceptableNestedNameSpecifier(ND);
1055 }
1056 
1057 /// \brief Determines whether the given declaration is an enumeration.
1058 bool ResultBuilder::IsEnum(NamedDecl *ND) const {
1059   return isa<EnumDecl>(ND);
1060 }
1061 
1062 /// \brief Determines whether the given declaration is a class or struct.
1063 bool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const {
1064   // Allow us to find class templates, too.
1065   if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1066     ND = ClassTemplate->getTemplatedDecl();
1067 
1068   if (RecordDecl *RD = dyn_cast<RecordDecl>(ND))
1069     return RD->getTagKind() == TTK_Class ||
1070     RD->getTagKind() == TTK_Struct;
1071 
1072   return false;
1073 }
1074 
1075 /// \brief Determines whether the given declaration is a union.
1076 bool ResultBuilder::IsUnion(NamedDecl *ND) const {
1077   // Allow us to find class templates, too.
1078   if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1079     ND = ClassTemplate->getTemplatedDecl();
1080 
1081   if (RecordDecl *RD = dyn_cast<RecordDecl>(ND))
1082     return RD->getTagKind() == TTK_Union;
1083 
1084   return false;
1085 }
1086 
1087 /// \brief Determines whether the given declaration is a namespace.
1088 bool ResultBuilder::IsNamespace(NamedDecl *ND) const {
1089   return isa<NamespaceDecl>(ND);
1090 }
1091 
1092 /// \brief Determines whether the given declaration is a namespace or
1093 /// namespace alias.
1094 bool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const {
1095   return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND);
1096 }
1097 
1098 /// \brief Determines whether the given declaration is a type.
1099 bool ResultBuilder::IsType(NamedDecl *ND) const {
1100   if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND))
1101     ND = Using->getTargetDecl();
1102 
1103   return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND);
1104 }
1105 
1106 /// \brief Determines which members of a class should be visible via
1107 /// "." or "->".  Only value declarations, nested name specifiers, and
1108 /// using declarations thereof should show up.
1109 bool ResultBuilder::IsMember(NamedDecl *ND) const {
1110   if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND))
1111     ND = Using->getTargetDecl();
1112 
1113   return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) ||
1114     isa<ObjCPropertyDecl>(ND);
1115 }
1116 
1117 static bool isObjCReceiverType(ASTContext &C, QualType T) {
1118   T = C.getCanonicalType(T);
1119   switch (T->getTypeClass()) {
1120   case Type::ObjCObject:
1121   case Type::ObjCInterface:
1122   case Type::ObjCObjectPointer:
1123     return true;
1124 
1125   case Type::Builtin:
1126     switch (cast<BuiltinType>(T)->getKind()) {
1127     case BuiltinType::ObjCId:
1128     case BuiltinType::ObjCClass:
1129     case BuiltinType::ObjCSel:
1130       return true;
1131 
1132     default:
1133       break;
1134     }
1135     return false;
1136 
1137   default:
1138     break;
1139   }
1140 
1141   if (!C.getLangOptions().CPlusPlus)
1142     return false;
1143 
1144   // FIXME: We could perform more analysis here to determine whether a
1145   // particular class type has any conversions to Objective-C types. For now,
1146   // just accept all class types.
1147   return T->isDependentType() || T->isRecordType();
1148 }
1149 
1150 bool ResultBuilder::IsObjCMessageReceiver(NamedDecl *ND) const {
1151   QualType T = getDeclUsageType(SemaRef.Context, ND);
1152   if (T.isNull())
1153     return false;
1154 
1155   T = SemaRef.Context.getBaseElementType(T);
1156   return isObjCReceiverType(SemaRef.Context, T);
1157 }
1158 
1159 bool ResultBuilder::IsObjCCollection(NamedDecl *ND) const {
1160   if ((SemaRef.getLangOptions().CPlusPlus && !IsOrdinaryName(ND)) ||
1161       (!SemaRef.getLangOptions().CPlusPlus && !IsOrdinaryNonTypeName(ND)))
1162     return false;
1163 
1164   QualType T = getDeclUsageType(SemaRef.Context, ND);
1165   if (T.isNull())
1166     return false;
1167 
1168   T = SemaRef.Context.getBaseElementType(T);
1169   return T->isObjCObjectType() || T->isObjCObjectPointerType() ||
1170          T->isObjCIdType() ||
1171          (SemaRef.getLangOptions().CPlusPlus && T->isRecordType());
1172 }
1173 
1174 bool ResultBuilder::IsImpossibleToSatisfy(NamedDecl *ND) const {
1175   return false;
1176 }
1177 
1178 /// \rief Determines whether the given declaration is an Objective-C
1179 /// instance variable.
1180 bool ResultBuilder::IsObjCIvar(NamedDecl *ND) const {
1181   return isa<ObjCIvarDecl>(ND);
1182 }
1183 
1184 namespace {
1185   /// \brief Visible declaration consumer that adds a code-completion result
1186   /// for each visible declaration.
1187   class CodeCompletionDeclConsumer : public VisibleDeclConsumer {
1188     ResultBuilder &Results;
1189     DeclContext *CurContext;
1190 
1191   public:
1192     CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext)
1193       : Results(Results), CurContext(CurContext) { }
1194 
1195     virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, bool InBaseClass) {
1196       Results.AddResult(ND, 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 Add language constructs that show up for "ordinary" names.
1378 static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC,
1379                                    Scope *S,
1380                                    Sema &SemaRef,
1381                                    ResultBuilder &Results) {
1382   CodeCompletionBuilder Builder(Results.getAllocator());
1383 
1384   typedef CodeCompletionResult Result;
1385   switch (CCC) {
1386   case Sema::PCC_Namespace:
1387     if (SemaRef.getLangOptions().CPlusPlus) {
1388       if (Results.includeCodePatterns()) {
1389         // namespace <identifier> { declarations }
1390         Builder.AddTypedTextChunk("namespace");
1391         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1392         Builder.AddPlaceholderChunk("identifier");
1393         Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
1394         Builder.AddPlaceholderChunk("declarations");
1395         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
1396         Builder.AddChunk(CodeCompletionString::CK_RightBrace);
1397         Results.AddResult(Result(Builder.TakeString()));
1398       }
1399 
1400       // namespace identifier = identifier ;
1401       Builder.AddTypedTextChunk("namespace");
1402       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1403       Builder.AddPlaceholderChunk("name");
1404       Builder.AddChunk(CodeCompletionString::CK_Equal);
1405       Builder.AddPlaceholderChunk("namespace");
1406       Results.AddResult(Result(Builder.TakeString()));
1407 
1408       // Using directives
1409       Builder.AddTypedTextChunk("using");
1410       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1411       Builder.AddTextChunk("namespace");
1412       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1413       Builder.AddPlaceholderChunk("identifier");
1414       Results.AddResult(Result(Builder.TakeString()));
1415 
1416       // asm(string-literal)
1417       Builder.AddTypedTextChunk("asm");
1418       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1419       Builder.AddPlaceholderChunk("string-literal");
1420       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1421       Results.AddResult(Result(Builder.TakeString()));
1422 
1423       if (Results.includeCodePatterns()) {
1424         // Explicit template instantiation
1425         Builder.AddTypedTextChunk("template");
1426         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1427         Builder.AddPlaceholderChunk("declaration");
1428         Results.AddResult(Result(Builder.TakeString()));
1429       }
1430     }
1431 
1432     if (SemaRef.getLangOptions().ObjC1)
1433       AddObjCTopLevelResults(Results, true);
1434 
1435     AddTypedefResult(Results);
1436     // Fall through
1437 
1438   case Sema::PCC_Class:
1439     if (SemaRef.getLangOptions().CPlusPlus) {
1440       // Using declaration
1441       Builder.AddTypedTextChunk("using");
1442       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1443       Builder.AddPlaceholderChunk("qualifier");
1444       Builder.AddTextChunk("::");
1445       Builder.AddPlaceholderChunk("name");
1446       Results.AddResult(Result(Builder.TakeString()));
1447 
1448       // using typename qualifier::name (only in a dependent context)
1449       if (SemaRef.CurContext->isDependentContext()) {
1450         Builder.AddTypedTextChunk("using");
1451         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1452         Builder.AddTextChunk("typename");
1453         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1454         Builder.AddPlaceholderChunk("qualifier");
1455         Builder.AddTextChunk("::");
1456         Builder.AddPlaceholderChunk("name");
1457         Results.AddResult(Result(Builder.TakeString()));
1458       }
1459 
1460       if (CCC == Sema::PCC_Class) {
1461         AddTypedefResult(Results);
1462 
1463         // public:
1464         Builder.AddTypedTextChunk("public");
1465         Builder.AddChunk(CodeCompletionString::CK_Colon);
1466         Results.AddResult(Result(Builder.TakeString()));
1467 
1468         // protected:
1469         Builder.AddTypedTextChunk("protected");
1470         Builder.AddChunk(CodeCompletionString::CK_Colon);
1471         Results.AddResult(Result(Builder.TakeString()));
1472 
1473         // private:
1474         Builder.AddTypedTextChunk("private");
1475         Builder.AddChunk(CodeCompletionString::CK_Colon);
1476         Results.AddResult(Result(Builder.TakeString()));
1477       }
1478     }
1479     // Fall through
1480 
1481   case Sema::PCC_Template:
1482   case Sema::PCC_MemberTemplate:
1483     if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) {
1484       // template < parameters >
1485       Builder.AddTypedTextChunk("template");
1486       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
1487       Builder.AddPlaceholderChunk("parameters");
1488       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
1489       Results.AddResult(Result(Builder.TakeString()));
1490     }
1491 
1492     AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results);
1493     AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results);
1494     break;
1495 
1496   case Sema::PCC_ObjCInterface:
1497     AddObjCInterfaceResults(SemaRef.getLangOptions(), Results, true);
1498     AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results);
1499     AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results);
1500     break;
1501 
1502   case Sema::PCC_ObjCImplementation:
1503     AddObjCImplementationResults(SemaRef.getLangOptions(), Results, true);
1504     AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results);
1505     AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results);
1506     break;
1507 
1508   case Sema::PCC_ObjCInstanceVariableList:
1509     AddObjCVisibilityResults(SemaRef.getLangOptions(), Results, true);
1510     break;
1511 
1512   case Sema::PCC_RecoveryInFunction:
1513   case Sema::PCC_Statement: {
1514     AddTypedefResult(Results);
1515 
1516     if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns() &&
1517         SemaRef.getLangOptions().CXXExceptions) {
1518       Builder.AddTypedTextChunk("try");
1519       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
1520       Builder.AddPlaceholderChunk("statements");
1521       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
1522       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
1523       Builder.AddTextChunk("catch");
1524       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1525       Builder.AddPlaceholderChunk("declaration");
1526       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1527       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
1528       Builder.AddPlaceholderChunk("statements");
1529       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
1530       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
1531       Results.AddResult(Result(Builder.TakeString()));
1532     }
1533     if (SemaRef.getLangOptions().ObjC1)
1534       AddObjCStatementResults(Results, true);
1535 
1536     if (Results.includeCodePatterns()) {
1537       // if (condition) { statements }
1538       Builder.AddTypedTextChunk("if");
1539       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1540       if (SemaRef.getLangOptions().CPlusPlus)
1541         Builder.AddPlaceholderChunk("condition");
1542       else
1543         Builder.AddPlaceholderChunk("expression");
1544       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1545       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
1546       Builder.AddPlaceholderChunk("statements");
1547       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
1548       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
1549       Results.AddResult(Result(Builder.TakeString()));
1550 
1551       // switch (condition) { }
1552       Builder.AddTypedTextChunk("switch");
1553       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1554       if (SemaRef.getLangOptions().CPlusPlus)
1555         Builder.AddPlaceholderChunk("condition");
1556       else
1557         Builder.AddPlaceholderChunk("expression");
1558       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1559       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
1560       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
1561       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
1562       Results.AddResult(Result(Builder.TakeString()));
1563     }
1564 
1565     // Switch-specific statements.
1566     if (!SemaRef.getCurFunction()->SwitchStack.empty()) {
1567       // case expression:
1568       Builder.AddTypedTextChunk("case");
1569       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1570       Builder.AddPlaceholderChunk("expression");
1571       Builder.AddChunk(CodeCompletionString::CK_Colon);
1572       Results.AddResult(Result(Builder.TakeString()));
1573 
1574       // default:
1575       Builder.AddTypedTextChunk("default");
1576       Builder.AddChunk(CodeCompletionString::CK_Colon);
1577       Results.AddResult(Result(Builder.TakeString()));
1578     }
1579 
1580     if (Results.includeCodePatterns()) {
1581       /// while (condition) { statements }
1582       Builder.AddTypedTextChunk("while");
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       // do { statements } while ( expression );
1596       Builder.AddTypedTextChunk("do");
1597       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
1598       Builder.AddPlaceholderChunk("statements");
1599       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
1600       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
1601       Builder.AddTextChunk("while");
1602       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1603       Builder.AddPlaceholderChunk("expression");
1604       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1605       Results.AddResult(Result(Builder.TakeString()));
1606 
1607       // for ( for-init-statement ; condition ; expression ) { statements }
1608       Builder.AddTypedTextChunk("for");
1609       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1610       if (SemaRef.getLangOptions().CPlusPlus || SemaRef.getLangOptions().C99)
1611         Builder.AddPlaceholderChunk("init-statement");
1612       else
1613         Builder.AddPlaceholderChunk("init-expression");
1614       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
1615       Builder.AddPlaceholderChunk("condition");
1616       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
1617       Builder.AddPlaceholderChunk("inc-expression");
1618       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1619       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
1620       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
1621       Builder.AddPlaceholderChunk("statements");
1622       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
1623       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
1624       Results.AddResult(Result(Builder.TakeString()));
1625     }
1626 
1627     if (S->getContinueParent()) {
1628       // continue ;
1629       Builder.AddTypedTextChunk("continue");
1630       Results.AddResult(Result(Builder.TakeString()));
1631     }
1632 
1633     if (S->getBreakParent()) {
1634       // break ;
1635       Builder.AddTypedTextChunk("break");
1636       Results.AddResult(Result(Builder.TakeString()));
1637     }
1638 
1639     // "return expression ;" or "return ;", depending on whether we
1640     // know the function is void or not.
1641     bool isVoid = false;
1642     if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext))
1643       isVoid = Function->getResultType()->isVoidType();
1644     else if (ObjCMethodDecl *Method
1645                                  = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext))
1646       isVoid = Method->getResultType()->isVoidType();
1647     else if (SemaRef.getCurBlock() &&
1648              !SemaRef.getCurBlock()->ReturnType.isNull())
1649       isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType();
1650     Builder.AddTypedTextChunk("return");
1651     if (!isVoid) {
1652       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1653       Builder.AddPlaceholderChunk("expression");
1654     }
1655     Results.AddResult(Result(Builder.TakeString()));
1656 
1657     // goto identifier ;
1658     Builder.AddTypedTextChunk("goto");
1659     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1660     Builder.AddPlaceholderChunk("label");
1661     Results.AddResult(Result(Builder.TakeString()));
1662 
1663     // Using directives
1664     Builder.AddTypedTextChunk("using");
1665     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1666     Builder.AddTextChunk("namespace");
1667     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1668     Builder.AddPlaceholderChunk("identifier");
1669     Results.AddResult(Result(Builder.TakeString()));
1670   }
1671 
1672   // Fall through (for statement expressions).
1673   case Sema::PCC_ForInit:
1674   case Sema::PCC_Condition:
1675     AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results);
1676     // Fall through: conditions and statements can have expressions.
1677 
1678   case Sema::PCC_ParenthesizedExpression:
1679   case Sema::PCC_Expression: {
1680     if (SemaRef.getLangOptions().CPlusPlus) {
1681       // 'this', if we're in a non-static member function.
1682       if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(SemaRef.CurContext))
1683         if (!Method->isStatic())
1684           Results.AddResult(Result("this"));
1685 
1686       // true, false
1687       Results.AddResult(Result("true"));
1688       Results.AddResult(Result("false"));
1689 
1690       if (SemaRef.getLangOptions().RTTI) {
1691         // dynamic_cast < type-id > ( expression )
1692         Builder.AddTypedTextChunk("dynamic_cast");
1693         Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
1694         Builder.AddPlaceholderChunk("type");
1695         Builder.AddChunk(CodeCompletionString::CK_RightAngle);
1696         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1697         Builder.AddPlaceholderChunk("expression");
1698         Builder.AddChunk(CodeCompletionString::CK_RightParen);
1699         Results.AddResult(Result(Builder.TakeString()));
1700       }
1701 
1702       // static_cast < type-id > ( expression )
1703       Builder.AddTypedTextChunk("static_cast");
1704       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
1705       Builder.AddPlaceholderChunk("type");
1706       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
1707       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1708       Builder.AddPlaceholderChunk("expression");
1709       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1710       Results.AddResult(Result(Builder.TakeString()));
1711 
1712       // reinterpret_cast < type-id > ( expression )
1713       Builder.AddTypedTextChunk("reinterpret_cast");
1714       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
1715       Builder.AddPlaceholderChunk("type");
1716       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
1717       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1718       Builder.AddPlaceholderChunk("expression");
1719       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1720       Results.AddResult(Result(Builder.TakeString()));
1721 
1722       // const_cast < type-id > ( expression )
1723       Builder.AddTypedTextChunk("const_cast");
1724       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
1725       Builder.AddPlaceholderChunk("type");
1726       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
1727       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1728       Builder.AddPlaceholderChunk("expression");
1729       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1730       Results.AddResult(Result(Builder.TakeString()));
1731 
1732       if (SemaRef.getLangOptions().RTTI) {
1733         // typeid ( expression-or-type )
1734         Builder.AddTypedTextChunk("typeid");
1735         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1736         Builder.AddPlaceholderChunk("expression-or-type");
1737         Builder.AddChunk(CodeCompletionString::CK_RightParen);
1738         Results.AddResult(Result(Builder.TakeString()));
1739       }
1740 
1741       // new T ( ... )
1742       Builder.AddTypedTextChunk("new");
1743       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1744       Builder.AddPlaceholderChunk("type");
1745       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1746       Builder.AddPlaceholderChunk("expressions");
1747       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1748       Results.AddResult(Result(Builder.TakeString()));
1749 
1750       // new T [ ] ( ... )
1751       Builder.AddTypedTextChunk("new");
1752       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1753       Builder.AddPlaceholderChunk("type");
1754       Builder.AddChunk(CodeCompletionString::CK_LeftBracket);
1755       Builder.AddPlaceholderChunk("size");
1756       Builder.AddChunk(CodeCompletionString::CK_RightBracket);
1757       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1758       Builder.AddPlaceholderChunk("expressions");
1759       Builder.AddChunk(CodeCompletionString::CK_RightParen);
1760       Results.AddResult(Result(Builder.TakeString()));
1761 
1762       // delete expression
1763       Builder.AddTypedTextChunk("delete");
1764       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1765       Builder.AddPlaceholderChunk("expression");
1766       Results.AddResult(Result(Builder.TakeString()));
1767 
1768       // delete [] expression
1769       Builder.AddTypedTextChunk("delete");
1770       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1771       Builder.AddChunk(CodeCompletionString::CK_LeftBracket);
1772       Builder.AddChunk(CodeCompletionString::CK_RightBracket);
1773       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1774       Builder.AddPlaceholderChunk("expression");
1775       Results.AddResult(Result(Builder.TakeString()));
1776 
1777       if (SemaRef.getLangOptions().CXXExceptions) {
1778         // throw expression
1779         Builder.AddTypedTextChunk("throw");
1780         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
1781         Builder.AddPlaceholderChunk("expression");
1782         Results.AddResult(Result(Builder.TakeString()));
1783       }
1784 
1785       // FIXME: Rethrow?
1786     }
1787 
1788     if (SemaRef.getLangOptions().ObjC1) {
1789       // Add "super", if we're in an Objective-C class with a superclass.
1790       if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) {
1791         // The interface can be NULL.
1792         if (ObjCInterfaceDecl *ID = Method->getClassInterface())
1793           if (ID->getSuperClass())
1794             Results.AddResult(Result("super"));
1795       }
1796 
1797       AddObjCExpressionResults(Results, true);
1798     }
1799 
1800     // sizeof expression
1801     Builder.AddTypedTextChunk("sizeof");
1802     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1803     Builder.AddPlaceholderChunk("expression-or-type");
1804     Builder.AddChunk(CodeCompletionString::CK_RightParen);
1805     Results.AddResult(Result(Builder.TakeString()));
1806     break;
1807   }
1808 
1809   case Sema::PCC_Type:
1810   case Sema::PCC_LocalDeclarationSpecifiers:
1811     break;
1812   }
1813 
1814   if (WantTypesInContext(CCC, SemaRef.getLangOptions()))
1815     AddTypeSpecifierResults(SemaRef.getLangOptions(), Results);
1816 
1817   if (SemaRef.getLangOptions().CPlusPlus && CCC != Sema::PCC_Type)
1818     Results.AddResult(Result("operator"));
1819 }
1820 
1821 /// \brief Retrieve the string representation of the given type as a string
1822 /// that has the appropriate lifetime for code completion.
1823 ///
1824 /// This routine provides a fast path where we provide constant strings for
1825 /// common type names.
1826 static const char *GetCompletionTypeString(QualType T,
1827                                            ASTContext &Context,
1828                                            CodeCompletionAllocator &Allocator) {
1829   PrintingPolicy Policy(Context.PrintingPolicy);
1830   Policy.AnonymousTagLocations = false;
1831 
1832   if (!T.getLocalQualifiers()) {
1833     // Built-in type names are constant strings.
1834     if (const BuiltinType *BT = dyn_cast<BuiltinType>(T))
1835       return BT->getName(Context.getLangOptions());
1836 
1837     // Anonymous tag types are constant strings.
1838     if (const TagType *TagT = dyn_cast<TagType>(T))
1839       if (TagDecl *Tag = TagT->getDecl())
1840         if (!Tag->getIdentifier() && !Tag->getTypedefNameForAnonDecl()) {
1841           switch (Tag->getTagKind()) {
1842           case TTK_Struct: return "struct <anonymous>";
1843           case TTK_Class:  return "class <anonymous>";
1844           case TTK_Union:  return "union <anonymous>";
1845           case TTK_Enum:   return "enum <anonymous>";
1846           }
1847         }
1848   }
1849 
1850   // Slow path: format the type as a string.
1851   std::string Result;
1852   T.getAsStringInternal(Result, Policy);
1853   return Allocator.CopyString(Result);
1854 }
1855 
1856 /// \brief If the given declaration has an associated type, add it as a result
1857 /// type chunk.
1858 static void AddResultTypeChunk(ASTContext &Context,
1859                                NamedDecl *ND,
1860                                CodeCompletionBuilder &Result) {
1861   if (!ND)
1862     return;
1863 
1864   // Skip constructors and conversion functions, which have their return types
1865   // built into their names.
1866   if (isa<CXXConstructorDecl>(ND) || isa<CXXConversionDecl>(ND))
1867     return;
1868 
1869   // Determine the type of the declaration (if it has a type).
1870   QualType T;
1871   if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND))
1872     T = Function->getResultType();
1873   else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND))
1874     T = Method->getResultType();
1875   else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND))
1876     T = FunTmpl->getTemplatedDecl()->getResultType();
1877   else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND))
1878     T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext()));
1879   else if (isa<UnresolvedUsingValueDecl>(ND)) {
1880     /* Do nothing: ignore unresolved using declarations*/
1881   } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND))
1882     T = Value->getType();
1883   else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND))
1884     T = Property->getType();
1885 
1886   if (T.isNull() || Context.hasSameType(T, Context.DependentTy))
1887     return;
1888 
1889   Result.AddResultTypeChunk(GetCompletionTypeString(T, Context,
1890                                                     Result.getAllocator()));
1891 }
1892 
1893 static void MaybeAddSentinel(ASTContext &Context, NamedDecl *FunctionOrMethod,
1894                              CodeCompletionBuilder &Result) {
1895   if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>())
1896     if (Sentinel->getSentinel() == 0) {
1897       if (Context.getLangOptions().ObjC1 &&
1898           Context.Idents.get("nil").hasMacroDefinition())
1899         Result.AddTextChunk(", nil");
1900       else if (Context.Idents.get("NULL").hasMacroDefinition())
1901         Result.AddTextChunk(", NULL");
1902       else
1903         Result.AddTextChunk(", (void*)0");
1904     }
1905 }
1906 
1907 static std::string FormatFunctionParameter(ASTContext &Context,
1908                                            ParmVarDecl *Param,
1909                                            bool SuppressName = false) {
1910   bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext());
1911   if (Param->getType()->isDependentType() ||
1912       !Param->getType()->isBlockPointerType()) {
1913     // The argument for a dependent or non-block parameter is a placeholder
1914     // containing that parameter's type.
1915     std::string Result;
1916 
1917     if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName)
1918       Result = Param->getIdentifier()->getName();
1919 
1920     Param->getType().getAsStringInternal(Result,
1921                                          Context.PrintingPolicy);
1922 
1923     if (ObjCMethodParam) {
1924       Result = "(" + Result;
1925       Result += ")";
1926       if (Param->getIdentifier() && !SuppressName)
1927         Result += Param->getIdentifier()->getName();
1928     }
1929     return Result;
1930   }
1931 
1932   // The argument for a block pointer parameter is a block literal with
1933   // the appropriate type.
1934   FunctionTypeLoc *Block = 0;
1935   FunctionProtoTypeLoc *BlockProto = 0;
1936   TypeLoc TL;
1937   if (TypeSourceInfo *TSInfo = Param->getTypeSourceInfo()) {
1938     TL = TSInfo->getTypeLoc().getUnqualifiedLoc();
1939     while (true) {
1940       // Look through typedefs.
1941       if (TypedefTypeLoc *TypedefTL = dyn_cast<TypedefTypeLoc>(&TL)) {
1942         if (TypeSourceInfo *InnerTSInfo
1943             = TypedefTL->getTypedefNameDecl()->getTypeSourceInfo()) {
1944           TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc();
1945           continue;
1946         }
1947       }
1948 
1949       // Look through qualified types
1950       if (QualifiedTypeLoc *QualifiedTL = dyn_cast<QualifiedTypeLoc>(&TL)) {
1951         TL = QualifiedTL->getUnqualifiedLoc();
1952         continue;
1953       }
1954 
1955       // Try to get the function prototype behind the block pointer type,
1956       // then we're done.
1957       if (BlockPointerTypeLoc *BlockPtr
1958           = dyn_cast<BlockPointerTypeLoc>(&TL)) {
1959         TL = BlockPtr->getPointeeLoc().IgnoreParens();
1960         Block = dyn_cast<FunctionTypeLoc>(&TL);
1961         BlockProto = dyn_cast<FunctionProtoTypeLoc>(&TL);
1962       }
1963       break;
1964     }
1965   }
1966 
1967   if (!Block) {
1968     // We were unable to find a FunctionProtoTypeLoc with parameter names
1969     // for the block; just use the parameter type as a placeholder.
1970     std::string Result;
1971     Param->getType().getUnqualifiedType().
1972                             getAsStringInternal(Result, Context.PrintingPolicy);
1973 
1974     if (ObjCMethodParam) {
1975       Result = "(" + Result;
1976       Result += ")";
1977       if (Param->getIdentifier())
1978         Result += Param->getIdentifier()->getName();
1979     }
1980 
1981     return Result;
1982   }
1983 
1984   // We have the function prototype behind the block pointer type, as it was
1985   // written in the source.
1986   std::string Result;
1987   QualType ResultType = Block->getTypePtr()->getResultType();
1988   if (!ResultType->isVoidType())
1989     ResultType.getAsStringInternal(Result, Context.PrintingPolicy);
1990 
1991   Result = '^' + Result;
1992   if (!BlockProto || Block->getNumArgs() == 0) {
1993     if (BlockProto && BlockProto->getTypePtr()->isVariadic())
1994       Result += "(...)";
1995     else
1996       Result += "(void)";
1997   } else {
1998     Result += "(";
1999     for (unsigned I = 0, N = Block->getNumArgs(); I != N; ++I) {
2000       if (I)
2001         Result += ", ";
2002       Result += FormatFunctionParameter(Context, Block->getArg(I));
2003 
2004       if (I == N - 1 && BlockProto->getTypePtr()->isVariadic())
2005         Result += ", ...";
2006     }
2007     Result += ")";
2008   }
2009 
2010   if (Param->getIdentifier())
2011     Result += Param->getIdentifier()->getName();
2012 
2013   return Result;
2014 }
2015 
2016 /// \brief Add function parameter chunks to the given code completion string.
2017 static void AddFunctionParameterChunks(ASTContext &Context,
2018                                        FunctionDecl *Function,
2019                                        CodeCompletionBuilder &Result,
2020                                        unsigned Start = 0,
2021                                        bool InOptional = false) {
2022   typedef CodeCompletionString::Chunk Chunk;
2023   bool FirstParameter = true;
2024 
2025   for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) {
2026     ParmVarDecl *Param = Function->getParamDecl(P);
2027 
2028     if (Param->hasDefaultArg() && !InOptional) {
2029       // When we see an optional default argument, put that argument and
2030       // the remaining default arguments into a new, optional string.
2031       CodeCompletionBuilder Opt(Result.getAllocator());
2032       if (!FirstParameter)
2033         Opt.AddChunk(Chunk(CodeCompletionString::CK_Comma));
2034       AddFunctionParameterChunks(Context, Function, Opt, P, true);
2035       Result.AddOptionalChunk(Opt.TakeString());
2036       break;
2037     }
2038 
2039     if (FirstParameter)
2040       FirstParameter = false;
2041     else
2042       Result.AddChunk(Chunk(CodeCompletionString::CK_Comma));
2043 
2044     InOptional = false;
2045 
2046     // Format the placeholder string.
2047     std::string PlaceholderStr = FormatFunctionParameter(Context, Param);
2048 
2049     if (Function->isVariadic() && P == N - 1)
2050       PlaceholderStr += ", ...";
2051 
2052     // Add the placeholder string.
2053     Result.AddPlaceholderChunk(
2054                              Result.getAllocator().CopyString(PlaceholderStr));
2055   }
2056 
2057   if (const FunctionProtoType *Proto
2058         = Function->getType()->getAs<FunctionProtoType>())
2059     if (Proto->isVariadic()) {
2060       if (Proto->getNumArgs() == 0)
2061         Result.AddPlaceholderChunk("...");
2062 
2063       MaybeAddSentinel(Context, Function, Result);
2064     }
2065 }
2066 
2067 /// \brief Add template parameter chunks to the given code completion string.
2068 static void AddTemplateParameterChunks(ASTContext &Context,
2069                                        TemplateDecl *Template,
2070                                        CodeCompletionBuilder &Result,
2071                                        unsigned MaxParameters = 0,
2072                                        unsigned Start = 0,
2073                                        bool InDefaultArg = false) {
2074   typedef CodeCompletionString::Chunk Chunk;
2075   bool FirstParameter = true;
2076 
2077   TemplateParameterList *Params = Template->getTemplateParameters();
2078   TemplateParameterList::iterator PEnd = Params->end();
2079   if (MaxParameters)
2080     PEnd = Params->begin() + MaxParameters;
2081   for (TemplateParameterList::iterator P = Params->begin() + Start;
2082        P != PEnd; ++P) {
2083     bool HasDefaultArg = false;
2084     std::string PlaceholderStr;
2085     if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
2086       if (TTP->wasDeclaredWithTypename())
2087         PlaceholderStr = "typename";
2088       else
2089         PlaceholderStr = "class";
2090 
2091       if (TTP->getIdentifier()) {
2092         PlaceholderStr += ' ';
2093         PlaceholderStr += TTP->getIdentifier()->getName();
2094       }
2095 
2096       HasDefaultArg = TTP->hasDefaultArgument();
2097     } else if (NonTypeTemplateParmDecl *NTTP
2098                                     = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
2099       if (NTTP->getIdentifier())
2100         PlaceholderStr = NTTP->getIdentifier()->getName();
2101       NTTP->getType().getAsStringInternal(PlaceholderStr,
2102                                           Context.PrintingPolicy);
2103       HasDefaultArg = NTTP->hasDefaultArgument();
2104     } else {
2105       assert(isa<TemplateTemplateParmDecl>(*P));
2106       TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P);
2107 
2108       // Since putting the template argument list into the placeholder would
2109       // be very, very long, we just use an abbreviation.
2110       PlaceholderStr = "template<...> class";
2111       if (TTP->getIdentifier()) {
2112         PlaceholderStr += ' ';
2113         PlaceholderStr += TTP->getIdentifier()->getName();
2114       }
2115 
2116       HasDefaultArg = TTP->hasDefaultArgument();
2117     }
2118 
2119     if (HasDefaultArg && !InDefaultArg) {
2120       // When we see an optional default argument, put that argument and
2121       // the remaining default arguments into a new, optional string.
2122       CodeCompletionBuilder Opt(Result.getAllocator());
2123       if (!FirstParameter)
2124         Opt.AddChunk(Chunk(CodeCompletionString::CK_Comma));
2125       AddTemplateParameterChunks(Context, Template, Opt, MaxParameters,
2126                                  P - Params->begin(), true);
2127       Result.AddOptionalChunk(Opt.TakeString());
2128       break;
2129     }
2130 
2131     InDefaultArg = false;
2132 
2133     if (FirstParameter)
2134       FirstParameter = false;
2135     else
2136       Result.AddChunk(Chunk(CodeCompletionString::CK_Comma));
2137 
2138     // Add the placeholder string.
2139     Result.AddPlaceholderChunk(
2140                               Result.getAllocator().CopyString(PlaceholderStr));
2141   }
2142 }
2143 
2144 /// \brief Add a qualifier to the given code-completion string, if the
2145 /// provided nested-name-specifier is non-NULL.
2146 static void
2147 AddQualifierToCompletionString(CodeCompletionBuilder &Result,
2148                                NestedNameSpecifier *Qualifier,
2149                                bool QualifierIsInformative,
2150                                ASTContext &Context) {
2151   if (!Qualifier)
2152     return;
2153 
2154   std::string PrintedNNS;
2155   {
2156     llvm::raw_string_ostream OS(PrintedNNS);
2157     Qualifier->print(OS, Context.PrintingPolicy);
2158   }
2159   if (QualifierIsInformative)
2160     Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS));
2161   else
2162     Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS));
2163 }
2164 
2165 static void
2166 AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result,
2167                                        FunctionDecl *Function) {
2168   const FunctionProtoType *Proto
2169     = Function->getType()->getAs<FunctionProtoType>();
2170   if (!Proto || !Proto->getTypeQuals())
2171     return;
2172 
2173   // FIXME: Add ref-qualifier!
2174 
2175   // Handle single qualifiers without copying
2176   if (Proto->getTypeQuals() == Qualifiers::Const) {
2177     Result.AddInformativeChunk(" const");
2178     return;
2179   }
2180 
2181   if (Proto->getTypeQuals() == Qualifiers::Volatile) {
2182     Result.AddInformativeChunk(" volatile");
2183     return;
2184   }
2185 
2186   if (Proto->getTypeQuals() == Qualifiers::Restrict) {
2187     Result.AddInformativeChunk(" restrict");
2188     return;
2189   }
2190 
2191   // Handle multiple qualifiers.
2192   std::string QualsStr;
2193   if (Proto->getTypeQuals() & Qualifiers::Const)
2194     QualsStr += " const";
2195   if (Proto->getTypeQuals() & Qualifiers::Volatile)
2196     QualsStr += " volatile";
2197   if (Proto->getTypeQuals() & Qualifiers::Restrict)
2198     QualsStr += " restrict";
2199   Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr));
2200 }
2201 
2202 /// \brief Add the name of the given declaration
2203 static void AddTypedNameChunk(ASTContext &Context, NamedDecl *ND,
2204                               CodeCompletionBuilder &Result) {
2205   typedef CodeCompletionString::Chunk Chunk;
2206 
2207   DeclarationName Name = ND->getDeclName();
2208   if (!Name)
2209     return;
2210 
2211   switch (Name.getNameKind()) {
2212     case DeclarationName::CXXOperatorName: {
2213       const char *OperatorName = 0;
2214       switch (Name.getCXXOverloadedOperator()) {
2215       case OO_None:
2216       case OO_Conditional:
2217       case NUM_OVERLOADED_OPERATORS:
2218         OperatorName = "operator";
2219         break;
2220 
2221 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
2222       case OO_##Name: OperatorName = "operator" Spelling; break;
2223 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
2224 #include "clang/Basic/OperatorKinds.def"
2225 
2226       case OO_New:          OperatorName = "operator new"; break;
2227       case OO_Delete:       OperatorName = "operator delete"; break;
2228       case OO_Array_New:    OperatorName = "operator new[]"; break;
2229       case OO_Array_Delete: OperatorName = "operator delete[]"; break;
2230       case OO_Call:         OperatorName = "operator()"; break;
2231       case OO_Subscript:    OperatorName = "operator[]"; break;
2232       }
2233       Result.AddTypedTextChunk(OperatorName);
2234       break;
2235     }
2236 
2237   case DeclarationName::Identifier:
2238   case DeclarationName::CXXConversionFunctionName:
2239   case DeclarationName::CXXDestructorName:
2240   case DeclarationName::CXXLiteralOperatorName:
2241     Result.AddTypedTextChunk(
2242                       Result.getAllocator().CopyString(ND->getNameAsString()));
2243     break;
2244 
2245   case DeclarationName::CXXUsingDirective:
2246   case DeclarationName::ObjCZeroArgSelector:
2247   case DeclarationName::ObjCOneArgSelector:
2248   case DeclarationName::ObjCMultiArgSelector:
2249     break;
2250 
2251   case DeclarationName::CXXConstructorName: {
2252     CXXRecordDecl *Record = 0;
2253     QualType Ty = Name.getCXXNameType();
2254     if (const RecordType *RecordTy = Ty->getAs<RecordType>())
2255       Record = cast<CXXRecordDecl>(RecordTy->getDecl());
2256     else if (const InjectedClassNameType *InjectedTy
2257                                         = Ty->getAs<InjectedClassNameType>())
2258       Record = InjectedTy->getDecl();
2259     else {
2260       Result.AddTypedTextChunk(
2261                       Result.getAllocator().CopyString(ND->getNameAsString()));
2262       break;
2263     }
2264 
2265     Result.AddTypedTextChunk(
2266                   Result.getAllocator().CopyString(Record->getNameAsString()));
2267     if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) {
2268       Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle));
2269       AddTemplateParameterChunks(Context, Template, Result);
2270       Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle));
2271     }
2272     break;
2273   }
2274   }
2275 }
2276 
2277 /// \brief If possible, create a new code completion string for the given
2278 /// result.
2279 ///
2280 /// \returns Either a new, heap-allocated code completion string describing
2281 /// how to use this result, or NULL to indicate that the string or name of the
2282 /// result is all that is needed.
2283 CodeCompletionString *
2284 CodeCompletionResult::CreateCodeCompletionString(Sema &S,
2285                                            CodeCompletionAllocator &Allocator) {
2286   typedef CodeCompletionString::Chunk Chunk;
2287   CodeCompletionBuilder Result(Allocator, Priority, Availability);
2288 
2289   if (Kind == RK_Pattern) {
2290     Pattern->Priority = Priority;
2291     Pattern->Availability = Availability;
2292     return Pattern;
2293   }
2294 
2295   if (Kind == RK_Keyword) {
2296     Result.AddTypedTextChunk(Keyword);
2297     return Result.TakeString();
2298   }
2299 
2300   if (Kind == RK_Macro) {
2301     MacroInfo *MI = S.PP.getMacroInfo(Macro);
2302     assert(MI && "Not a macro?");
2303 
2304     Result.AddTypedTextChunk(
2305                             Result.getAllocator().CopyString(Macro->getName()));
2306 
2307     if (!MI->isFunctionLike())
2308       return Result.TakeString();
2309 
2310     // Format a function-like macro with placeholders for the arguments.
2311     Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen));
2312     for (MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end();
2313          A != AEnd; ++A) {
2314       if (A != MI->arg_begin())
2315         Result.AddChunk(Chunk(CodeCompletionString::CK_Comma));
2316 
2317       if (!MI->isVariadic() || A != AEnd - 1) {
2318         // Non-variadic argument.
2319         Result.AddPlaceholderChunk(
2320                             Result.getAllocator().CopyString((*A)->getName()));
2321         continue;
2322       }
2323 
2324       // Variadic argument; cope with the different between GNU and C99
2325       // variadic macros, providing a single placeholder for the rest of the
2326       // arguments.
2327       if ((*A)->isStr("__VA_ARGS__"))
2328         Result.AddPlaceholderChunk("...");
2329       else {
2330         std::string Arg = (*A)->getName();
2331         Arg += "...";
2332         Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg));
2333       }
2334     }
2335     Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen));
2336     return Result.TakeString();
2337   }
2338 
2339   assert(Kind == RK_Declaration && "Missed a result kind?");
2340   NamedDecl *ND = Declaration;
2341 
2342   if (StartsNestedNameSpecifier) {
2343     Result.AddTypedTextChunk(
2344                       Result.getAllocator().CopyString(ND->getNameAsString()));
2345     Result.AddTextChunk("::");
2346     return Result.TakeString();
2347   }
2348 
2349   AddResultTypeChunk(S.Context, ND, Result);
2350 
2351   if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) {
2352     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
2353                                    S.Context);
2354     AddTypedNameChunk(S.Context, ND, Result);
2355     Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen));
2356     AddFunctionParameterChunks(S.Context, Function, Result);
2357     Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen));
2358     AddFunctionTypeQualsToCompletionString(Result, Function);
2359     return Result.TakeString();
2360   }
2361 
2362   if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) {
2363     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
2364                                    S.Context);
2365     FunctionDecl *Function = FunTmpl->getTemplatedDecl();
2366     AddTypedNameChunk(S.Context, Function, Result);
2367 
2368     // Figure out which template parameters are deduced (or have default
2369     // arguments).
2370     llvm::SmallVector<bool, 16> Deduced;
2371     S.MarkDeducedTemplateParameters(FunTmpl, Deduced);
2372     unsigned LastDeducibleArgument;
2373     for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0;
2374          --LastDeducibleArgument) {
2375       if (!Deduced[LastDeducibleArgument - 1]) {
2376         // C++0x: Figure out if the template argument has a default. If so,
2377         // the user doesn't need to type this argument.
2378         // FIXME: We need to abstract template parameters better!
2379         bool HasDefaultArg = false;
2380         NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam(
2381                                                     LastDeducibleArgument - 1);
2382         if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
2383           HasDefaultArg = TTP->hasDefaultArgument();
2384         else if (NonTypeTemplateParmDecl *NTTP
2385                  = dyn_cast<NonTypeTemplateParmDecl>(Param))
2386           HasDefaultArg = NTTP->hasDefaultArgument();
2387         else {
2388           assert(isa<TemplateTemplateParmDecl>(Param));
2389           HasDefaultArg
2390             = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument();
2391         }
2392 
2393         if (!HasDefaultArg)
2394           break;
2395       }
2396     }
2397 
2398     if (LastDeducibleArgument) {
2399       // Some of the function template arguments cannot be deduced from a
2400       // function call, so we introduce an explicit template argument list
2401       // containing all of the arguments up to the first deducible argument.
2402       Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle));
2403       AddTemplateParameterChunks(S.Context, FunTmpl, Result,
2404                                  LastDeducibleArgument);
2405       Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle));
2406     }
2407 
2408     // Add the function parameters
2409     Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen));
2410     AddFunctionParameterChunks(S.Context, Function, Result);
2411     Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen));
2412     AddFunctionTypeQualsToCompletionString(Result, Function);
2413     return Result.TakeString();
2414   }
2415 
2416   if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) {
2417     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
2418                                    S.Context);
2419     Result.AddTypedTextChunk(
2420                 Result.getAllocator().CopyString(Template->getNameAsString()));
2421     Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle));
2422     AddTemplateParameterChunks(S.Context, Template, Result);
2423     Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle));
2424     return Result.TakeString();
2425   }
2426 
2427   if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) {
2428     Selector Sel = Method->getSelector();
2429     if (Sel.isUnarySelector()) {
2430       Result.AddTypedTextChunk(Result.getAllocator().CopyString(
2431                                   Sel.getNameForSlot(0)));
2432       return Result.TakeString();
2433     }
2434 
2435     std::string SelName = Sel.getNameForSlot(0).str();
2436     SelName += ':';
2437     if (StartParameter == 0)
2438       Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName));
2439     else {
2440       Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName));
2441 
2442       // If there is only one parameter, and we're past it, add an empty
2443       // typed-text chunk since there is nothing to type.
2444       if (Method->param_size() == 1)
2445         Result.AddTypedTextChunk("");
2446     }
2447     unsigned Idx = 0;
2448     for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
2449                                      PEnd = Method->param_end();
2450          P != PEnd; (void)++P, ++Idx) {
2451       if (Idx > 0) {
2452         std::string Keyword;
2453         if (Idx > StartParameter)
2454           Result.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2455         if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx))
2456           Keyword += II->getName().str();
2457         Keyword += ":";
2458         if (Idx < StartParameter || AllParametersAreInformative)
2459           Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword));
2460         else
2461           Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword));
2462       }
2463 
2464       // If we're before the starting parameter, skip the placeholder.
2465       if (Idx < StartParameter)
2466         continue;
2467 
2468       std::string Arg;
2469 
2470       if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity)
2471         Arg = FormatFunctionParameter(S.Context, *P, true);
2472       else {
2473         (*P)->getType().getAsStringInternal(Arg, S.Context.PrintingPolicy);
2474         Arg = "(" + Arg + ")";
2475         if (IdentifierInfo *II = (*P)->getIdentifier())
2476           if (DeclaringEntity || AllParametersAreInformative)
2477             Arg += II->getName().str();
2478       }
2479 
2480       if (Method->isVariadic() && (P + 1) == PEnd)
2481         Arg += ", ...";
2482 
2483       if (DeclaringEntity)
2484         Result.AddTextChunk(Result.getAllocator().CopyString(Arg));
2485       else if (AllParametersAreInformative)
2486         Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg));
2487       else
2488         Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg));
2489     }
2490 
2491     if (Method->isVariadic()) {
2492       if (Method->param_size() == 0) {
2493         if (DeclaringEntity)
2494           Result.AddTextChunk(", ...");
2495         else if (AllParametersAreInformative)
2496           Result.AddInformativeChunk(", ...");
2497         else
2498           Result.AddPlaceholderChunk(", ...");
2499       }
2500 
2501       MaybeAddSentinel(S.Context, Method, Result);
2502     }
2503 
2504     return Result.TakeString();
2505   }
2506 
2507   if (Qualifier)
2508     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
2509                                    S.Context);
2510 
2511   Result.AddTypedTextChunk(
2512                        Result.getAllocator().CopyString(ND->getNameAsString()));
2513   return Result.TakeString();
2514 }
2515 
2516 CodeCompletionString *
2517 CodeCompleteConsumer::OverloadCandidate::CreateSignatureString(
2518                                                           unsigned CurrentArg,
2519                                                                Sema &S,
2520                                      CodeCompletionAllocator &Allocator) const {
2521   typedef CodeCompletionString::Chunk Chunk;
2522 
2523   // FIXME: Set priority, availability appropriately.
2524   CodeCompletionBuilder Result(Allocator, 1, CXAvailability_Available);
2525   FunctionDecl *FDecl = getFunction();
2526   AddResultTypeChunk(S.Context, FDecl, Result);
2527   const FunctionProtoType *Proto
2528     = dyn_cast<FunctionProtoType>(getFunctionType());
2529   if (!FDecl && !Proto) {
2530     // Function without a prototype. Just give the return type and a
2531     // highlighted ellipsis.
2532     const FunctionType *FT = getFunctionType();
2533     Result.AddTextChunk(GetCompletionTypeString(FT->getResultType(),
2534                                                 S.Context,
2535                                                 Result.getAllocator()));
2536     Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen));
2537     Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "..."));
2538     Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen));
2539     return Result.TakeString();
2540   }
2541 
2542   if (FDecl)
2543     Result.AddTextChunk(
2544                     Result.getAllocator().CopyString(FDecl->getNameAsString()));
2545   else
2546     Result.AddTextChunk(
2547          Result.getAllocator().CopyString(
2548                 Proto->getResultType().getAsString(S.Context.PrintingPolicy)));
2549 
2550   Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen));
2551   unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs();
2552   for (unsigned I = 0; I != NumParams; ++I) {
2553     if (I)
2554       Result.AddChunk(Chunk(CodeCompletionString::CK_Comma));
2555 
2556     std::string ArgString;
2557     QualType ArgType;
2558 
2559     if (FDecl) {
2560       ArgString = FDecl->getParamDecl(I)->getNameAsString();
2561       ArgType = FDecl->getParamDecl(I)->getOriginalType();
2562     } else {
2563       ArgType = Proto->getArgType(I);
2564     }
2565 
2566     ArgType.getAsStringInternal(ArgString, S.Context.PrintingPolicy);
2567 
2568     if (I == CurrentArg)
2569       Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter,
2570                              Result.getAllocator().CopyString(ArgString)));
2571     else
2572       Result.AddTextChunk(Result.getAllocator().CopyString(ArgString));
2573   }
2574 
2575   if (Proto && Proto->isVariadic()) {
2576     Result.AddChunk(Chunk(CodeCompletionString::CK_Comma));
2577     if (CurrentArg < NumParams)
2578       Result.AddTextChunk("...");
2579     else
2580       Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "..."));
2581   }
2582   Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen));
2583 
2584   return Result.TakeString();
2585 }
2586 
2587 unsigned clang::getMacroUsagePriority(llvm::StringRef MacroName,
2588                                       const LangOptions &LangOpts,
2589                                       bool PreferredTypeIsPointer) {
2590   unsigned Priority = CCP_Macro;
2591 
2592   // Treat the "nil", "Nil" and "NULL" macros as null pointer constants.
2593   if (MacroName.equals("nil") || MacroName.equals("NULL") ||
2594       MacroName.equals("Nil")) {
2595     Priority = CCP_Constant;
2596     if (PreferredTypeIsPointer)
2597       Priority = Priority / CCF_SimilarTypeMatch;
2598   }
2599   // Treat "YES", "NO", "true", and "false" as constants.
2600   else if (MacroName.equals("YES") || MacroName.equals("NO") ||
2601            MacroName.equals("true") || MacroName.equals("false"))
2602     Priority = CCP_Constant;
2603   // Treat "bool" as a type.
2604   else if (MacroName.equals("bool"))
2605     Priority = CCP_Type + (LangOpts.ObjC1? CCD_bool_in_ObjC : 0);
2606 
2607 
2608   return Priority;
2609 }
2610 
2611 CXCursorKind clang::getCursorKindForDecl(Decl *D) {
2612   if (!D)
2613     return CXCursor_UnexposedDecl;
2614 
2615   switch (D->getKind()) {
2616     case Decl::Enum:               return CXCursor_EnumDecl;
2617     case Decl::EnumConstant:       return CXCursor_EnumConstantDecl;
2618     case Decl::Field:              return CXCursor_FieldDecl;
2619     case Decl::Function:
2620       return CXCursor_FunctionDecl;
2621     case Decl::ObjCCategory:       return CXCursor_ObjCCategoryDecl;
2622     case Decl::ObjCCategoryImpl:   return CXCursor_ObjCCategoryImplDecl;
2623     case Decl::ObjCClass:
2624       // FIXME
2625       return CXCursor_UnexposedDecl;
2626     case Decl::ObjCForwardProtocol:
2627       // FIXME
2628       return CXCursor_UnexposedDecl;
2629     case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl;
2630     case Decl::ObjCInterface:      return CXCursor_ObjCInterfaceDecl;
2631     case Decl::ObjCIvar:           return CXCursor_ObjCIvarDecl;
2632     case Decl::ObjCMethod:
2633       return cast<ObjCMethodDecl>(D)->isInstanceMethod()
2634       ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl;
2635     case Decl::CXXMethod:          return CXCursor_CXXMethod;
2636     case Decl::CXXConstructor:     return CXCursor_Constructor;
2637     case Decl::CXXDestructor:      return CXCursor_Destructor;
2638     case Decl::CXXConversion:      return CXCursor_ConversionFunction;
2639     case Decl::ObjCProperty:       return CXCursor_ObjCPropertyDecl;
2640     case Decl::ObjCProtocol:       return CXCursor_ObjCProtocolDecl;
2641     case Decl::ParmVar:            return CXCursor_ParmDecl;
2642     case Decl::Typedef:            return CXCursor_TypedefDecl;
2643     case Decl::TypeAlias:          return CXCursor_TypeAliasDecl;
2644     case Decl::Var:                return CXCursor_VarDecl;
2645     case Decl::Namespace:          return CXCursor_Namespace;
2646     case Decl::NamespaceAlias:     return CXCursor_NamespaceAlias;
2647     case Decl::TemplateTypeParm:   return CXCursor_TemplateTypeParameter;
2648     case Decl::NonTypeTemplateParm:return CXCursor_NonTypeTemplateParameter;
2649     case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter;
2650     case Decl::FunctionTemplate:   return CXCursor_FunctionTemplate;
2651     case Decl::ClassTemplate:      return CXCursor_ClassTemplate;
2652     case Decl::ClassTemplatePartialSpecialization:
2653       return CXCursor_ClassTemplatePartialSpecialization;
2654     case Decl::UsingDirective:     return CXCursor_UsingDirective;
2655 
2656     case Decl::Using:
2657     case Decl::UnresolvedUsingValue:
2658     case Decl::UnresolvedUsingTypename:
2659       return CXCursor_UsingDeclaration;
2660 
2661     default:
2662       if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
2663         switch (TD->getTagKind()) {
2664           case TTK_Struct: return CXCursor_StructDecl;
2665           case TTK_Class:  return CXCursor_ClassDecl;
2666           case TTK_Union:  return CXCursor_UnionDecl;
2667           case TTK_Enum:   return CXCursor_EnumDecl;
2668         }
2669       }
2670   }
2671 
2672   return CXCursor_UnexposedDecl;
2673 }
2674 
2675 static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results,
2676                             bool TargetTypeIsPointer = false) {
2677   typedef CodeCompletionResult Result;
2678 
2679   Results.EnterNewScope();
2680 
2681   for (Preprocessor::macro_iterator M = PP.macro_begin(),
2682                                  MEnd = PP.macro_end();
2683        M != MEnd; ++M) {
2684     Results.AddResult(Result(M->first,
2685                              getMacroUsagePriority(M->first->getName(),
2686                                                    PP.getLangOptions(),
2687                                                    TargetTypeIsPointer)));
2688   }
2689 
2690   Results.ExitScope();
2691 
2692 }
2693 
2694 static void AddPrettyFunctionResults(const LangOptions &LangOpts,
2695                                      ResultBuilder &Results) {
2696   typedef CodeCompletionResult Result;
2697 
2698   Results.EnterNewScope();
2699 
2700   Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant));
2701   Results.AddResult(Result("__FUNCTION__", CCP_Constant));
2702   if (LangOpts.C99 || LangOpts.CPlusPlus0x)
2703     Results.AddResult(Result("__func__", CCP_Constant));
2704   Results.ExitScope();
2705 }
2706 
2707 static void HandleCodeCompleteResults(Sema *S,
2708                                       CodeCompleteConsumer *CodeCompleter,
2709                                       CodeCompletionContext Context,
2710                                       CodeCompletionResult *Results,
2711                                       unsigned NumResults) {
2712   if (CodeCompleter)
2713     CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults);
2714 }
2715 
2716 static enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S,
2717                                             Sema::ParserCompletionContext PCC) {
2718   switch (PCC) {
2719   case Sema::PCC_Namespace:
2720     return CodeCompletionContext::CCC_TopLevel;
2721 
2722   case Sema::PCC_Class:
2723     return CodeCompletionContext::CCC_ClassStructUnion;
2724 
2725   case Sema::PCC_ObjCInterface:
2726     return CodeCompletionContext::CCC_ObjCInterface;
2727 
2728   case Sema::PCC_ObjCImplementation:
2729     return CodeCompletionContext::CCC_ObjCImplementation;
2730 
2731   case Sema::PCC_ObjCInstanceVariableList:
2732     return CodeCompletionContext::CCC_ObjCIvarList;
2733 
2734   case Sema::PCC_Template:
2735   case Sema::PCC_MemberTemplate:
2736     if (S.CurContext->isFileContext())
2737       return CodeCompletionContext::CCC_TopLevel;
2738     else if (S.CurContext->isRecord())
2739       return CodeCompletionContext::CCC_ClassStructUnion;
2740     else
2741       return CodeCompletionContext::CCC_Other;
2742 
2743   case Sema::PCC_RecoveryInFunction:
2744     return CodeCompletionContext::CCC_Recovery;
2745 
2746   case Sema::PCC_ForInit:
2747     if (S.getLangOptions().CPlusPlus || S.getLangOptions().C99 ||
2748         S.getLangOptions().ObjC1)
2749       return CodeCompletionContext::CCC_ParenthesizedExpression;
2750     else
2751       return CodeCompletionContext::CCC_Expression;
2752 
2753   case Sema::PCC_Expression:
2754   case Sema::PCC_Condition:
2755     return CodeCompletionContext::CCC_Expression;
2756 
2757   case Sema::PCC_Statement:
2758     return CodeCompletionContext::CCC_Statement;
2759 
2760   case Sema::PCC_Type:
2761     return CodeCompletionContext::CCC_Type;
2762 
2763   case Sema::PCC_ParenthesizedExpression:
2764     return CodeCompletionContext::CCC_ParenthesizedExpression;
2765 
2766   case Sema::PCC_LocalDeclarationSpecifiers:
2767     return CodeCompletionContext::CCC_Type;
2768   }
2769 
2770   return CodeCompletionContext::CCC_Other;
2771 }
2772 
2773 /// \brief If we're in a C++ virtual member function, add completion results
2774 /// that invoke the functions we override, since it's common to invoke the
2775 /// overridden function as well as adding new functionality.
2776 ///
2777 /// \param S The semantic analysis object for which we are generating results.
2778 ///
2779 /// \param InContext This context in which the nested-name-specifier preceding
2780 /// the code-completion point
2781 static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext,
2782                                   ResultBuilder &Results) {
2783   // Look through blocks.
2784   DeclContext *CurContext = S.CurContext;
2785   while (isa<BlockDecl>(CurContext))
2786     CurContext = CurContext->getParent();
2787 
2788 
2789   CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext);
2790   if (!Method || !Method->isVirtual())
2791     return;
2792 
2793   // We need to have names for all of the parameters, if we're going to
2794   // generate a forwarding call.
2795   for (CXXMethodDecl::param_iterator P = Method->param_begin(),
2796                                   PEnd = Method->param_end();
2797        P != PEnd;
2798        ++P) {
2799     if (!(*P)->getDeclName())
2800       return;
2801   }
2802 
2803   for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(),
2804                                    MEnd = Method->end_overridden_methods();
2805        M != MEnd; ++M) {
2806     CodeCompletionBuilder Builder(Results.getAllocator());
2807     CXXMethodDecl *Overridden = const_cast<CXXMethodDecl *>(*M);
2808     if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl())
2809       continue;
2810 
2811     // If we need a nested-name-specifier, add one now.
2812     if (!InContext) {
2813       NestedNameSpecifier *NNS
2814         = getRequiredQualification(S.Context, CurContext,
2815                                    Overridden->getDeclContext());
2816       if (NNS) {
2817         std::string Str;
2818         llvm::raw_string_ostream OS(Str);
2819         NNS->print(OS, S.Context.PrintingPolicy);
2820         Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str()));
2821       }
2822     } else if (!InContext->Equals(Overridden->getDeclContext()))
2823       continue;
2824 
2825     Builder.AddTypedTextChunk(Results.getAllocator().CopyString(
2826                                          Overridden->getNameAsString()));
2827     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2828     bool FirstParam = true;
2829     for (CXXMethodDecl::param_iterator P = Method->param_begin(),
2830                                     PEnd = Method->param_end();
2831          P != PEnd; ++P) {
2832       if (FirstParam)
2833         FirstParam = false;
2834       else
2835         Builder.AddChunk(CodeCompletionString::CK_Comma);
2836 
2837       Builder.AddPlaceholderChunk(Results.getAllocator().CopyString(
2838                                         (*P)->getIdentifier()->getName()));
2839     }
2840     Builder.AddChunk(CodeCompletionString::CK_RightParen);
2841     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
2842                                            CCP_SuperCompletion,
2843                                            CXCursor_CXXMethod));
2844     Results.Ignore(Overridden);
2845   }
2846 }
2847 
2848 void Sema::CodeCompleteOrdinaryName(Scope *S,
2849                                     ParserCompletionContext CompletionContext) {
2850   typedef CodeCompletionResult Result;
2851   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
2852                         mapCodeCompletionContext(*this, CompletionContext));
2853   Results.EnterNewScope();
2854 
2855   // Determine how to filter results, e.g., so that the names of
2856   // values (functions, enumerators, function templates, etc.) are
2857   // only allowed where we can have an expression.
2858   switch (CompletionContext) {
2859   case PCC_Namespace:
2860   case PCC_Class:
2861   case PCC_ObjCInterface:
2862   case PCC_ObjCImplementation:
2863   case PCC_ObjCInstanceVariableList:
2864   case PCC_Template:
2865   case PCC_MemberTemplate:
2866   case PCC_Type:
2867   case PCC_LocalDeclarationSpecifiers:
2868     Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
2869     break;
2870 
2871   case PCC_Statement:
2872   case PCC_ParenthesizedExpression:
2873   case PCC_Expression:
2874   case PCC_ForInit:
2875   case PCC_Condition:
2876     if (WantTypesInContext(CompletionContext, getLangOptions()))
2877       Results.setFilter(&ResultBuilder::IsOrdinaryName);
2878     else
2879       Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
2880 
2881     if (getLangOptions().CPlusPlus)
2882       MaybeAddOverrideCalls(*this, /*InContext=*/0, Results);
2883     break;
2884 
2885   case PCC_RecoveryInFunction:
2886     // Unfiltered
2887     break;
2888   }
2889 
2890   // If we are in a C++ non-static member function, check the qualifiers on
2891   // the member function to filter/prioritize the results list.
2892   if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext))
2893     if (CurMethod->isInstance())
2894       Results.setObjectTypeQualifiers(
2895                       Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers()));
2896 
2897   CodeCompletionDeclConsumer Consumer(Results, CurContext);
2898   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
2899                      CodeCompleter->includeGlobals());
2900 
2901   AddOrdinaryNameResults(CompletionContext, S, *this, Results);
2902   Results.ExitScope();
2903 
2904   switch (CompletionContext) {
2905   case PCC_ParenthesizedExpression:
2906   case PCC_Expression:
2907   case PCC_Statement:
2908   case PCC_RecoveryInFunction:
2909     if (S->getFnParent())
2910       AddPrettyFunctionResults(PP.getLangOptions(), Results);
2911     break;
2912 
2913   case PCC_Namespace:
2914   case PCC_Class:
2915   case PCC_ObjCInterface:
2916   case PCC_ObjCImplementation:
2917   case PCC_ObjCInstanceVariableList:
2918   case PCC_Template:
2919   case PCC_MemberTemplate:
2920   case PCC_ForInit:
2921   case PCC_Condition:
2922   case PCC_Type:
2923   case PCC_LocalDeclarationSpecifiers:
2924     break;
2925   }
2926 
2927   if (CodeCompleter->includeMacros())
2928     AddMacroResults(PP, Results);
2929 
2930   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
2931                             Results.data(),Results.size());
2932 }
2933 
2934 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
2935                                        ParsedType Receiver,
2936                                        IdentifierInfo **SelIdents,
2937                                        unsigned NumSelIdents,
2938                                        bool AtArgumentExpression,
2939                                        bool IsSuper,
2940                                        ResultBuilder &Results);
2941 
2942 void Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS,
2943                                 bool AllowNonIdentifiers,
2944                                 bool AllowNestedNameSpecifiers) {
2945   typedef CodeCompletionResult Result;
2946   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
2947                         AllowNestedNameSpecifiers
2948                           ? CodeCompletionContext::CCC_PotentiallyQualifiedName
2949                           : CodeCompletionContext::CCC_Name);
2950   Results.EnterNewScope();
2951 
2952   // Type qualifiers can come after names.
2953   Results.AddResult(Result("const"));
2954   Results.AddResult(Result("volatile"));
2955   if (getLangOptions().C99)
2956     Results.AddResult(Result("restrict"));
2957 
2958   if (getLangOptions().CPlusPlus) {
2959     if (AllowNonIdentifiers) {
2960       Results.AddResult(Result("operator"));
2961     }
2962 
2963     // Add nested-name-specifiers.
2964     if (AllowNestedNameSpecifiers) {
2965       Results.allowNestedNameSpecifiers();
2966       Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy);
2967       CodeCompletionDeclConsumer Consumer(Results, CurContext);
2968       LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer,
2969                          CodeCompleter->includeGlobals());
2970       Results.setFilter(0);
2971     }
2972   }
2973   Results.ExitScope();
2974 
2975   // If we're in a context where we might have an expression (rather than a
2976   // declaration), and what we've seen so far is an Objective-C type that could
2977   // be a receiver of a class message, this may be a class message send with
2978   // the initial opening bracket '[' missing. Add appropriate completions.
2979   if (AllowNonIdentifiers && !AllowNestedNameSpecifiers &&
2980       DS.getTypeSpecType() == DeclSpec::TST_typename &&
2981       DS.getStorageClassSpecAsWritten() == DeclSpec::SCS_unspecified &&
2982       !DS.isThreadSpecified() && !DS.isExternInLinkageSpec() &&
2983       DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified &&
2984       DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
2985       DS.getTypeQualifiers() == 0 &&
2986       S &&
2987       (S->getFlags() & Scope::DeclScope) != 0 &&
2988       (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope |
2989                         Scope::FunctionPrototypeScope |
2990                         Scope::AtCatchScope)) == 0) {
2991     ParsedType T = DS.getRepAsType();
2992     if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType())
2993       AddClassMessageCompletions(*this, S, T, 0, 0, false, false, Results);
2994   }
2995 
2996   // Note that we intentionally suppress macro results here, since we do not
2997   // encourage using macros to produce the names of entities.
2998 
2999   HandleCodeCompleteResults(this, CodeCompleter,
3000                             Results.getCompletionContext(),
3001                             Results.data(), Results.size());
3002 }
3003 
3004 struct Sema::CodeCompleteExpressionData {
3005   CodeCompleteExpressionData(QualType PreferredType = QualType())
3006     : PreferredType(PreferredType), IntegralConstantExpression(false),
3007       ObjCCollection(false) { }
3008 
3009   QualType PreferredType;
3010   bool IntegralConstantExpression;
3011   bool ObjCCollection;
3012   llvm::SmallVector<Decl *, 4> IgnoreDecls;
3013 };
3014 
3015 /// \brief Perform code-completion in an expression context when we know what
3016 /// type we're looking for.
3017 ///
3018 /// \param IntegralConstantExpression Only permit integral constant
3019 /// expressions.
3020 void Sema::CodeCompleteExpression(Scope *S,
3021                                   const CodeCompleteExpressionData &Data) {
3022   typedef CodeCompletionResult Result;
3023   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3024                         CodeCompletionContext::CCC_Expression);
3025   if (Data.ObjCCollection)
3026     Results.setFilter(&ResultBuilder::IsObjCCollection);
3027   else if (Data.IntegralConstantExpression)
3028     Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
3029   else if (WantTypesInContext(PCC_Expression, getLangOptions()))
3030     Results.setFilter(&ResultBuilder::IsOrdinaryName);
3031   else
3032     Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
3033 
3034   if (!Data.PreferredType.isNull())
3035     Results.setPreferredType(Data.PreferredType.getNonReferenceType());
3036 
3037   // Ignore any declarations that we were told that we don't care about.
3038   for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I)
3039     Results.Ignore(Data.IgnoreDecls[I]);
3040 
3041   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3042   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3043                      CodeCompleter->includeGlobals());
3044 
3045   Results.EnterNewScope();
3046   AddOrdinaryNameResults(PCC_Expression, S, *this, Results);
3047   Results.ExitScope();
3048 
3049   bool PreferredTypeIsPointer = false;
3050   if (!Data.PreferredType.isNull())
3051     PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType()
3052       || Data.PreferredType->isMemberPointerType()
3053       || Data.PreferredType->isBlockPointerType();
3054 
3055   if (S->getFnParent() &&
3056       !Data.ObjCCollection &&
3057       !Data.IntegralConstantExpression)
3058     AddPrettyFunctionResults(PP.getLangOptions(), Results);
3059 
3060   if (CodeCompleter->includeMacros())
3061     AddMacroResults(PP, Results, PreferredTypeIsPointer);
3062   HandleCodeCompleteResults(this, CodeCompleter,
3063                 CodeCompletionContext(CodeCompletionContext::CCC_Expression,
3064                                       Data.PreferredType),
3065                             Results.data(),Results.size());
3066 }
3067 
3068 void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) {
3069   if (E.isInvalid())
3070     CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction);
3071   else if (getLangOptions().ObjC1)
3072     CodeCompleteObjCInstanceMessage(S, E.take(), 0, 0, false);
3073 }
3074 
3075 /// \brief The set of properties that have already been added, referenced by
3076 /// property name.
3077 typedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet;
3078 
3079 static void AddObjCProperties(ObjCContainerDecl *Container,
3080                               bool AllowCategories,
3081                               DeclContext *CurContext,
3082                               AddedPropertiesSet &AddedProperties,
3083                               ResultBuilder &Results) {
3084   typedef CodeCompletionResult Result;
3085 
3086   // Add properties in this container.
3087   for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(),
3088                                      PEnd = Container->prop_end();
3089        P != PEnd;
3090        ++P) {
3091     if (AddedProperties.insert(P->getIdentifier()))
3092       Results.MaybeAddResult(Result(*P, 0), CurContext);
3093   }
3094 
3095   // Add properties in referenced protocols.
3096   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
3097     for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(),
3098                                           PEnd = Protocol->protocol_end();
3099          P != PEnd; ++P)
3100       AddObjCProperties(*P, AllowCategories, CurContext, AddedProperties,
3101                         Results);
3102   } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){
3103     if (AllowCategories) {
3104       // Look through categories.
3105       for (ObjCCategoryDecl *Category = IFace->getCategoryList();
3106            Category; Category = Category->getNextClassCategory())
3107         AddObjCProperties(Category, AllowCategories, CurContext,
3108                           AddedProperties, Results);
3109     }
3110 
3111     // Look through protocols.
3112     for (ObjCInterfaceDecl::all_protocol_iterator
3113          I = IFace->all_referenced_protocol_begin(),
3114          E = IFace->all_referenced_protocol_end(); I != E; ++I)
3115       AddObjCProperties(*I, AllowCategories, CurContext, AddedProperties,
3116                         Results);
3117 
3118     // Look in the superclass.
3119     if (IFace->getSuperClass())
3120       AddObjCProperties(IFace->getSuperClass(), AllowCategories, CurContext,
3121                         AddedProperties, Results);
3122   } else if (const ObjCCategoryDecl *Category
3123                                     = dyn_cast<ObjCCategoryDecl>(Container)) {
3124     // Look through protocols.
3125     for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(),
3126                                           PEnd = Category->protocol_end();
3127          P != PEnd; ++P)
3128       AddObjCProperties(*P, AllowCategories, CurContext, AddedProperties,
3129                         Results);
3130   }
3131 }
3132 
3133 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *BaseE,
3134                                            SourceLocation OpLoc,
3135                                            bool IsArrow) {
3136   if (!BaseE || !CodeCompleter)
3137     return;
3138 
3139   typedef CodeCompletionResult Result;
3140 
3141   Expr *Base = static_cast<Expr *>(BaseE);
3142   QualType BaseType = Base->getType();
3143 
3144   if (IsArrow) {
3145     if (const PointerType *Ptr = BaseType->getAs<PointerType>())
3146       BaseType = Ptr->getPointeeType();
3147     else if (BaseType->isObjCObjectPointerType())
3148       /*Do nothing*/ ;
3149     else
3150       return;
3151   }
3152 
3153   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3154                   CodeCompletionContext(CodeCompletionContext::CCC_MemberAccess,
3155                                         BaseType),
3156                         &ResultBuilder::IsMember);
3157   Results.EnterNewScope();
3158   if (const RecordType *Record = BaseType->getAs<RecordType>()) {
3159     // Indicate that we are performing a member access, and the cv-qualifiers
3160     // for the base object type.
3161     Results.setObjectTypeQualifiers(BaseType.getQualifiers());
3162 
3163     // Access to a C/C++ class, struct, or union.
3164     Results.allowNestedNameSpecifiers();
3165     CodeCompletionDeclConsumer Consumer(Results, CurContext);
3166     LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer,
3167                        CodeCompleter->includeGlobals());
3168 
3169     if (getLangOptions().CPlusPlus) {
3170       if (!Results.empty()) {
3171         // The "template" keyword can follow "->" or "." in the grammar.
3172         // However, we only want to suggest the template keyword if something
3173         // is dependent.
3174         bool IsDependent = BaseType->isDependentType();
3175         if (!IsDependent) {
3176           for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent())
3177             if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) {
3178               IsDependent = Ctx->isDependentContext();
3179               break;
3180             }
3181         }
3182 
3183         if (IsDependent)
3184           Results.AddResult(Result("template"));
3185       }
3186     }
3187   } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) {
3188     // Objective-C property reference.
3189     AddedPropertiesSet AddedProperties;
3190 
3191     // Add property results based on our interface.
3192     const ObjCObjectPointerType *ObjCPtr
3193       = BaseType->getAsObjCInterfacePointerType();
3194     assert(ObjCPtr && "Non-NULL pointer guaranteed above!");
3195     AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, CurContext,
3196                       AddedProperties, Results);
3197 
3198     // Add properties from the protocols in a qualified interface.
3199     for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(),
3200                                               E = ObjCPtr->qual_end();
3201          I != E; ++I)
3202       AddObjCProperties(*I, true, CurContext, AddedProperties, Results);
3203   } else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
3204              (!IsArrow && BaseType->isObjCObjectType())) {
3205     // Objective-C instance variable access.
3206     ObjCInterfaceDecl *Class = 0;
3207     if (const ObjCObjectPointerType *ObjCPtr
3208                                     = BaseType->getAs<ObjCObjectPointerType>())
3209       Class = ObjCPtr->getInterfaceDecl();
3210     else
3211       Class = BaseType->getAs<ObjCObjectType>()->getInterface();
3212 
3213     // Add all ivars from this class and its superclasses.
3214     if (Class) {
3215       CodeCompletionDeclConsumer Consumer(Results, CurContext);
3216       Results.setFilter(&ResultBuilder::IsObjCIvar);
3217       LookupVisibleDecls(Class, LookupMemberName, Consumer,
3218                          CodeCompleter->includeGlobals());
3219     }
3220   }
3221 
3222   // FIXME: How do we cope with isa?
3223 
3224   Results.ExitScope();
3225 
3226   // Hand off the results found for code completion.
3227   HandleCodeCompleteResults(this, CodeCompleter,
3228                             Results.getCompletionContext(),
3229                             Results.data(),Results.size());
3230 }
3231 
3232 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) {
3233   if (!CodeCompleter)
3234     return;
3235 
3236   typedef CodeCompletionResult Result;
3237   ResultBuilder::LookupFilter Filter = 0;
3238   enum CodeCompletionContext::Kind ContextKind
3239     = CodeCompletionContext::CCC_Other;
3240   switch ((DeclSpec::TST)TagSpec) {
3241   case DeclSpec::TST_enum:
3242     Filter = &ResultBuilder::IsEnum;
3243     ContextKind = CodeCompletionContext::CCC_EnumTag;
3244     break;
3245 
3246   case DeclSpec::TST_union:
3247     Filter = &ResultBuilder::IsUnion;
3248     ContextKind = CodeCompletionContext::CCC_UnionTag;
3249     break;
3250 
3251   case DeclSpec::TST_struct:
3252   case DeclSpec::TST_class:
3253     Filter = &ResultBuilder::IsClassOrStruct;
3254     ContextKind = CodeCompletionContext::CCC_ClassOrStructTag;
3255     break;
3256 
3257   default:
3258     assert(false && "Unknown type specifier kind in CodeCompleteTag");
3259     return;
3260   }
3261 
3262   ResultBuilder Results(*this, CodeCompleter->getAllocator(), ContextKind);
3263   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3264 
3265   // First pass: look for tags.
3266   Results.setFilter(Filter);
3267   LookupVisibleDecls(S, LookupTagName, Consumer,
3268                      CodeCompleter->includeGlobals());
3269 
3270   if (CodeCompleter->includeGlobals()) {
3271     // Second pass: look for nested name specifiers.
3272     Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
3273     LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer);
3274   }
3275 
3276   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
3277                             Results.data(),Results.size());
3278 }
3279 
3280 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) {
3281   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3282                         CodeCompletionContext::CCC_TypeQualifiers);
3283   Results.EnterNewScope();
3284   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const))
3285     Results.AddResult("const");
3286   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile))
3287     Results.AddResult("volatile");
3288   if (getLangOptions().C99 &&
3289       !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict))
3290     Results.AddResult("restrict");
3291   Results.ExitScope();
3292   HandleCodeCompleteResults(this, CodeCompleter,
3293                             Results.getCompletionContext(),
3294                             Results.data(), Results.size());
3295 }
3296 
3297 void Sema::CodeCompleteCase(Scope *S) {
3298   if (getCurFunction()->SwitchStack.empty() || !CodeCompleter)
3299     return;
3300 
3301   SwitchStmt *Switch = getCurFunction()->SwitchStack.back();
3302   if (!Switch->getCond()->getType()->isEnumeralType()) {
3303     CodeCompleteExpressionData Data(Switch->getCond()->getType());
3304     Data.IntegralConstantExpression = true;
3305     CodeCompleteExpression(S, Data);
3306     return;
3307   }
3308 
3309   // Code-complete the cases of a switch statement over an enumeration type
3310   // by providing the list of
3311   EnumDecl *Enum = Switch->getCond()->getType()->getAs<EnumType>()->getDecl();
3312 
3313   // Determine which enumerators we have already seen in the switch statement.
3314   // FIXME: Ideally, we would also be able to look *past* the code-completion
3315   // token, in case we are code-completing in the middle of the switch and not
3316   // at the end. However, we aren't able to do so at the moment.
3317   llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen;
3318   NestedNameSpecifier *Qualifier = 0;
3319   for (SwitchCase *SC = Switch->getSwitchCaseList(); SC;
3320        SC = SC->getNextSwitchCase()) {
3321     CaseStmt *Case = dyn_cast<CaseStmt>(SC);
3322     if (!Case)
3323       continue;
3324 
3325     Expr *CaseVal = Case->getLHS()->IgnoreParenCasts();
3326     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal))
3327       if (EnumConstantDecl *Enumerator
3328             = dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
3329         // We look into the AST of the case statement to determine which
3330         // enumerator was named. Alternatively, we could compute the value of
3331         // the integral constant expression, then compare it against the
3332         // values of each enumerator. However, value-based approach would not
3333         // work as well with C++ templates where enumerators declared within a
3334         // template are type- and value-dependent.
3335         EnumeratorsSeen.insert(Enumerator);
3336 
3337         // If this is a qualified-id, keep track of the nested-name-specifier
3338         // so that we can reproduce it as part of code completion, e.g.,
3339         //
3340         //   switch (TagD.getKind()) {
3341         //     case TagDecl::TK_enum:
3342         //       break;
3343         //     case XXX
3344         //
3345         // At the XXX, our completions are TagDecl::TK_union,
3346         // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union,
3347         // TK_struct, and TK_class.
3348         Qualifier = DRE->getQualifier();
3349       }
3350   }
3351 
3352   if (getLangOptions().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) {
3353     // If there are no prior enumerators in C++, check whether we have to
3354     // qualify the names of the enumerators that we suggest, because they
3355     // may not be visible in this scope.
3356     Qualifier = getRequiredQualification(Context, CurContext,
3357                                          Enum->getDeclContext());
3358 
3359     // FIXME: Scoped enums need to start with "EnumDecl" as the context!
3360   }
3361 
3362   // Add any enumerators that have not yet been mentioned.
3363   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3364                         CodeCompletionContext::CCC_Expression);
3365   Results.EnterNewScope();
3366   for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(),
3367                                   EEnd = Enum->enumerator_end();
3368        E != EEnd; ++E) {
3369     if (EnumeratorsSeen.count(*E))
3370       continue;
3371 
3372     CodeCompletionResult R(*E, Qualifier);
3373     R.Priority = CCP_EnumInCase;
3374     Results.AddResult(R, CurContext, 0, false);
3375   }
3376   Results.ExitScope();
3377 
3378   if (CodeCompleter->includeMacros())
3379     AddMacroResults(PP, Results);
3380   HandleCodeCompleteResults(this, CodeCompleter,
3381                             CodeCompletionContext::CCC_OtherWithMacros,
3382                             Results.data(),Results.size());
3383 }
3384 
3385 namespace {
3386   struct IsBetterOverloadCandidate {
3387     Sema &S;
3388     SourceLocation Loc;
3389 
3390   public:
3391     explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc)
3392       : S(S), Loc(Loc) { }
3393 
3394     bool
3395     operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const {
3396       return isBetterOverloadCandidate(S, X, Y, Loc);
3397     }
3398   };
3399 }
3400 
3401 static bool anyNullArguments(Expr **Args, unsigned NumArgs) {
3402   if (NumArgs && !Args)
3403     return true;
3404 
3405   for (unsigned I = 0; I != NumArgs; ++I)
3406     if (!Args[I])
3407       return true;
3408 
3409   return false;
3410 }
3411 
3412 void Sema::CodeCompleteCall(Scope *S, ExprTy *FnIn,
3413                             ExprTy **ArgsIn, unsigned NumArgs) {
3414   if (!CodeCompleter)
3415     return;
3416 
3417   // When we're code-completing for a call, we fall back to ordinary
3418   // name code-completion whenever we can't produce specific
3419   // results. We may want to revisit this strategy in the future,
3420   // e.g., by merging the two kinds of results.
3421 
3422   Expr *Fn = (Expr *)FnIn;
3423   Expr **Args = (Expr **)ArgsIn;
3424 
3425   // Ignore type-dependent call expressions entirely.
3426   if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args, NumArgs) ||
3427       Expr::hasAnyTypeDependentArguments(Args, NumArgs)) {
3428     CodeCompleteOrdinaryName(S, PCC_Expression);
3429     return;
3430   }
3431 
3432   // Build an overload candidate set based on the functions we find.
3433   SourceLocation Loc = Fn->getExprLoc();
3434   OverloadCandidateSet CandidateSet(Loc);
3435 
3436   // FIXME: What if we're calling something that isn't a function declaration?
3437   // FIXME: What if we're calling a pseudo-destructor?
3438   // FIXME: What if we're calling a member function?
3439 
3440   typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate;
3441   llvm::SmallVector<ResultCandidate, 8> Results;
3442 
3443   Expr *NakedFn = Fn->IgnoreParenCasts();
3444   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn))
3445     AddOverloadedCallCandidates(ULE, Args, NumArgs, CandidateSet,
3446                                 /*PartialOverloading=*/ true);
3447   else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
3448     FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
3449     if (FDecl) {
3450       if (!getLangOptions().CPlusPlus ||
3451           !FDecl->getType()->getAs<FunctionProtoType>())
3452         Results.push_back(ResultCandidate(FDecl));
3453       else
3454         // FIXME: access?
3455         AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none),
3456                              Args, NumArgs, CandidateSet,
3457                              false, /*PartialOverloading*/true);
3458     }
3459   }
3460 
3461   QualType ParamType;
3462 
3463   if (!CandidateSet.empty()) {
3464     // Sort the overload candidate set by placing the best overloads first.
3465     std::stable_sort(CandidateSet.begin(), CandidateSet.end(),
3466                      IsBetterOverloadCandidate(*this, Loc));
3467 
3468     // Add the remaining viable overload candidates as code-completion reslults.
3469     for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(),
3470                                      CandEnd = CandidateSet.end();
3471          Cand != CandEnd; ++Cand) {
3472       if (Cand->Viable)
3473         Results.push_back(ResultCandidate(Cand->Function));
3474     }
3475 
3476     // From the viable candidates, try to determine the type of this parameter.
3477     for (unsigned I = 0, N = Results.size(); I != N; ++I) {
3478       if (const FunctionType *FType = Results[I].getFunctionType())
3479         if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType))
3480           if (NumArgs < Proto->getNumArgs()) {
3481             if (ParamType.isNull())
3482               ParamType = Proto->getArgType(NumArgs);
3483             else if (!Context.hasSameUnqualifiedType(
3484                                             ParamType.getNonReferenceType(),
3485                            Proto->getArgType(NumArgs).getNonReferenceType())) {
3486               ParamType = QualType();
3487               break;
3488             }
3489           }
3490     }
3491   } else {
3492     // Try to determine the parameter type from the type of the expression
3493     // being called.
3494     QualType FunctionType = Fn->getType();
3495     if (const PointerType *Ptr = FunctionType->getAs<PointerType>())
3496       FunctionType = Ptr->getPointeeType();
3497     else if (const BlockPointerType *BlockPtr
3498                                     = FunctionType->getAs<BlockPointerType>())
3499       FunctionType = BlockPtr->getPointeeType();
3500     else if (const MemberPointerType *MemPtr
3501                                     = FunctionType->getAs<MemberPointerType>())
3502       FunctionType = MemPtr->getPointeeType();
3503 
3504     if (const FunctionProtoType *Proto
3505                                   = FunctionType->getAs<FunctionProtoType>()) {
3506       if (NumArgs < Proto->getNumArgs())
3507         ParamType = Proto->getArgType(NumArgs);
3508     }
3509   }
3510 
3511   if (ParamType.isNull())
3512     CodeCompleteOrdinaryName(S, PCC_Expression);
3513   else
3514     CodeCompleteExpression(S, ParamType);
3515 
3516   if (!Results.empty())
3517     CodeCompleter->ProcessOverloadCandidates(*this, NumArgs, Results.data(),
3518                                              Results.size());
3519 }
3520 
3521 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) {
3522   ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
3523   if (!VD) {
3524     CodeCompleteOrdinaryName(S, PCC_Expression);
3525     return;
3526   }
3527 
3528   CodeCompleteExpression(S, VD->getType());
3529 }
3530 
3531 void Sema::CodeCompleteReturn(Scope *S) {
3532   QualType ResultType;
3533   if (isa<BlockDecl>(CurContext)) {
3534     if (BlockScopeInfo *BSI = getCurBlock())
3535       ResultType = BSI->ReturnType;
3536   } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext))
3537     ResultType = Function->getResultType();
3538   else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext))
3539     ResultType = Method->getResultType();
3540 
3541   if (ResultType.isNull())
3542     CodeCompleteOrdinaryName(S, PCC_Expression);
3543   else
3544     CodeCompleteExpression(S, ResultType);
3545 }
3546 
3547 void Sema::CodeCompleteAssignmentRHS(Scope *S, ExprTy *LHS) {
3548   if (LHS)
3549     CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType());
3550   else
3551     CodeCompleteOrdinaryName(S, PCC_Expression);
3552 }
3553 
3554 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
3555                                    bool EnteringContext) {
3556   if (!SS.getScopeRep() || !CodeCompleter)
3557     return;
3558 
3559   DeclContext *Ctx = computeDeclContext(SS, EnteringContext);
3560   if (!Ctx)
3561     return;
3562 
3563   // Try to instantiate any non-dependent declaration contexts before
3564   // we look in them.
3565   if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx))
3566     return;
3567 
3568   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3569                         CodeCompletionContext::CCC_Name);
3570   Results.EnterNewScope();
3571 
3572   // The "template" keyword can follow "::" in the grammar, but only
3573   // put it into the grammar if the nested-name-specifier is dependent.
3574   NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep();
3575   if (!Results.empty() && NNS->isDependent())
3576     Results.AddResult("template");
3577 
3578   // Add calls to overridden virtual functions, if there are any.
3579   //
3580   // FIXME: This isn't wonderful, because we don't know whether we're actually
3581   // in a context that permits expressions. This is a general issue with
3582   // qualified-id completions.
3583   if (!EnteringContext)
3584     MaybeAddOverrideCalls(*this, Ctx, Results);
3585   Results.ExitScope();
3586 
3587   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3588   LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer);
3589 
3590   HandleCodeCompleteResults(this, CodeCompleter,
3591                             CodeCompletionContext::CCC_Name,
3592                             Results.data(),Results.size());
3593 }
3594 
3595 void Sema::CodeCompleteUsing(Scope *S) {
3596   if (!CodeCompleter)
3597     return;
3598 
3599   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3600                         CodeCompletionContext::CCC_PotentiallyQualifiedName,
3601                         &ResultBuilder::IsNestedNameSpecifier);
3602   Results.EnterNewScope();
3603 
3604   // If we aren't in class scope, we could see the "namespace" keyword.
3605   if (!S->isClassScope())
3606     Results.AddResult(CodeCompletionResult("namespace"));
3607 
3608   // After "using", we can see anything that would start a
3609   // nested-name-specifier.
3610   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3611   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3612                      CodeCompleter->includeGlobals());
3613   Results.ExitScope();
3614 
3615   HandleCodeCompleteResults(this, CodeCompleter,
3616                             CodeCompletionContext::CCC_PotentiallyQualifiedName,
3617                             Results.data(),Results.size());
3618 }
3619 
3620 void Sema::CodeCompleteUsingDirective(Scope *S) {
3621   if (!CodeCompleter)
3622     return;
3623 
3624   // After "using namespace", we expect to see a namespace name or namespace
3625   // alias.
3626   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3627                         CodeCompletionContext::CCC_Namespace,
3628                         &ResultBuilder::IsNamespaceOrAlias);
3629   Results.EnterNewScope();
3630   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3631   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3632                      CodeCompleter->includeGlobals());
3633   Results.ExitScope();
3634   HandleCodeCompleteResults(this, CodeCompleter,
3635                             CodeCompletionContext::CCC_Namespace,
3636                             Results.data(),Results.size());
3637 }
3638 
3639 void Sema::CodeCompleteNamespaceDecl(Scope *S)  {
3640   if (!CodeCompleter)
3641     return;
3642 
3643   DeclContext *Ctx = (DeclContext *)S->getEntity();
3644   if (!S->getParent())
3645     Ctx = Context.getTranslationUnitDecl();
3646 
3647   bool SuppressedGlobalResults
3648     = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
3649 
3650   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3651                         SuppressedGlobalResults
3652                           ? CodeCompletionContext::CCC_Namespace
3653                           : CodeCompletionContext::CCC_Other,
3654                         &ResultBuilder::IsNamespace);
3655 
3656   if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
3657     // We only want to see those namespaces that have already been defined
3658     // within this scope, because its likely that the user is creating an
3659     // extended namespace declaration. Keep track of the most recent
3660     // definition of each namespace.
3661     std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
3662     for (DeclContext::specific_decl_iterator<NamespaceDecl>
3663          NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end());
3664          NS != NSEnd; ++NS)
3665       OrigToLatest[NS->getOriginalNamespace()] = *NS;
3666 
3667     // Add the most recent definition (or extended definition) of each
3668     // namespace to the list of results.
3669     Results.EnterNewScope();
3670     for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
3671          NS = OrigToLatest.begin(), NSEnd = OrigToLatest.end();
3672          NS != NSEnd; ++NS)
3673       Results.AddResult(CodeCompletionResult(NS->second, 0),
3674                         CurContext, 0, false);
3675     Results.ExitScope();
3676   }
3677 
3678   HandleCodeCompleteResults(this, CodeCompleter,
3679                             Results.getCompletionContext(),
3680                             Results.data(),Results.size());
3681 }
3682 
3683 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S)  {
3684   if (!CodeCompleter)
3685     return;
3686 
3687   // After "namespace", we expect to see a namespace or alias.
3688   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3689                         CodeCompletionContext::CCC_Namespace,
3690                         &ResultBuilder::IsNamespaceOrAlias);
3691   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3692   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3693                      CodeCompleter->includeGlobals());
3694   HandleCodeCompleteResults(this, CodeCompleter,
3695                             Results.getCompletionContext(),
3696                             Results.data(),Results.size());
3697 }
3698 
3699 void Sema::CodeCompleteOperatorName(Scope *S) {
3700   if (!CodeCompleter)
3701     return;
3702 
3703   typedef CodeCompletionResult Result;
3704   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3705                         CodeCompletionContext::CCC_Type,
3706                         &ResultBuilder::IsType);
3707   Results.EnterNewScope();
3708 
3709   // Add the names of overloadable operators.
3710 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly)      \
3711   if (std::strcmp(Spelling, "?"))                                                  \
3712     Results.AddResult(Result(Spelling));
3713 #include "clang/Basic/OperatorKinds.def"
3714 
3715   // Add any type names visible from the current scope
3716   Results.allowNestedNameSpecifiers();
3717   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3718   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3719                      CodeCompleter->includeGlobals());
3720 
3721   // Add any type specifiers
3722   AddTypeSpecifierResults(getLangOptions(), Results);
3723   Results.ExitScope();
3724 
3725   HandleCodeCompleteResults(this, CodeCompleter,
3726                             CodeCompletionContext::CCC_Type,
3727                             Results.data(),Results.size());
3728 }
3729 
3730 void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,
3731                                               CXXCtorInitializer** Initializers,
3732                                               unsigned NumInitializers) {
3733   CXXConstructorDecl *Constructor
3734     = static_cast<CXXConstructorDecl *>(ConstructorD);
3735   if (!Constructor)
3736     return;
3737 
3738   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3739                         CodeCompletionContext::CCC_PotentiallyQualifiedName);
3740   Results.EnterNewScope();
3741 
3742   // Fill in any already-initialized fields or base classes.
3743   llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
3744   llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
3745   for (unsigned I = 0; I != NumInitializers; ++I) {
3746     if (Initializers[I]->isBaseInitializer())
3747       InitializedBases.insert(
3748         Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0)));
3749     else
3750       InitializedFields.insert(cast<FieldDecl>(
3751                                Initializers[I]->getAnyMember()));
3752   }
3753 
3754   // Add completions for base classes.
3755   CodeCompletionBuilder Builder(Results.getAllocator());
3756   bool SawLastInitializer = (NumInitializers == 0);
3757   CXXRecordDecl *ClassDecl = Constructor->getParent();
3758   for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(),
3759                                        BaseEnd = ClassDecl->bases_end();
3760        Base != BaseEnd; ++Base) {
3761     if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {
3762       SawLastInitializer
3763         = NumInitializers > 0 &&
3764           Initializers[NumInitializers - 1]->isBaseInitializer() &&
3765           Context.hasSameUnqualifiedType(Base->getType(),
3766                QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0));
3767       continue;
3768     }
3769 
3770     Builder.AddTypedTextChunk(
3771                Results.getAllocator().CopyString(
3772                           Base->getType().getAsString(Context.PrintingPolicy)));
3773     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3774     Builder.AddPlaceholderChunk("args");
3775     Builder.AddChunk(CodeCompletionString::CK_RightParen);
3776     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
3777                                    SawLastInitializer? CCP_NextInitializer
3778                                                      : CCP_MemberDeclaration));
3779     SawLastInitializer = false;
3780   }
3781 
3782   // Add completions for virtual base classes.
3783   for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(),
3784                                        BaseEnd = ClassDecl->vbases_end();
3785        Base != BaseEnd; ++Base) {
3786     if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {
3787       SawLastInitializer
3788         = NumInitializers > 0 &&
3789           Initializers[NumInitializers - 1]->isBaseInitializer() &&
3790           Context.hasSameUnqualifiedType(Base->getType(),
3791                QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0));
3792       continue;
3793     }
3794 
3795     Builder.AddTypedTextChunk(
3796                Builder.getAllocator().CopyString(
3797                           Base->getType().getAsString(Context.PrintingPolicy)));
3798     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3799     Builder.AddPlaceholderChunk("args");
3800     Builder.AddChunk(CodeCompletionString::CK_RightParen);
3801     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
3802                                    SawLastInitializer? CCP_NextInitializer
3803                                                      : CCP_MemberDeclaration));
3804     SawLastInitializer = false;
3805   }
3806 
3807   // Add completions for members.
3808   for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
3809                                   FieldEnd = ClassDecl->field_end();
3810        Field != FieldEnd; ++Field) {
3811     if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) {
3812       SawLastInitializer
3813         = NumInitializers > 0 &&
3814           Initializers[NumInitializers - 1]->isAnyMemberInitializer() &&
3815           Initializers[NumInitializers - 1]->getAnyMember() == *Field;
3816       continue;
3817     }
3818 
3819     if (!Field->getDeclName())
3820       continue;
3821 
3822     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
3823                                          Field->getIdentifier()->getName()));
3824     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3825     Builder.AddPlaceholderChunk("args");
3826     Builder.AddChunk(CodeCompletionString::CK_RightParen);
3827     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
3828                                    SawLastInitializer? CCP_NextInitializer
3829                                                      : CCP_MemberDeclaration,
3830                                            CXCursor_MemberRef));
3831     SawLastInitializer = false;
3832   }
3833   Results.ExitScope();
3834 
3835   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
3836                             Results.data(), Results.size());
3837 }
3838 
3839 // Macro that expands to @Keyword or Keyword, depending on whether NeedAt is
3840 // true or false.
3841 #define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) NeedAt? "@" #Keyword : #Keyword
3842 static void AddObjCImplementationResults(const LangOptions &LangOpts,
3843                                          ResultBuilder &Results,
3844                                          bool NeedAt) {
3845   typedef CodeCompletionResult Result;
3846   // Since we have an implementation, we can end it.
3847   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end)));
3848 
3849   CodeCompletionBuilder Builder(Results.getAllocator());
3850   if (LangOpts.ObjC2) {
3851     // @dynamic
3852     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,dynamic));
3853     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3854     Builder.AddPlaceholderChunk("property");
3855     Results.AddResult(Result(Builder.TakeString()));
3856 
3857     // @synthesize
3858     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synthesize));
3859     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3860     Builder.AddPlaceholderChunk("property");
3861     Results.AddResult(Result(Builder.TakeString()));
3862   }
3863 }
3864 
3865 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
3866                                     ResultBuilder &Results,
3867                                     bool NeedAt) {
3868   typedef CodeCompletionResult Result;
3869 
3870   // Since we have an interface or protocol, we can end it.
3871   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end)));
3872 
3873   if (LangOpts.ObjC2) {
3874     // @property
3875     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,property)));
3876 
3877     // @required
3878     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,required)));
3879 
3880     // @optional
3881     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,optional)));
3882   }
3883 }
3884 
3885 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
3886   typedef CodeCompletionResult Result;
3887   CodeCompletionBuilder Builder(Results.getAllocator());
3888 
3889   // @class name ;
3890   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,class));
3891   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3892   Builder.AddPlaceholderChunk("name");
3893   Results.AddResult(Result(Builder.TakeString()));
3894 
3895   if (Results.includeCodePatterns()) {
3896     // @interface name
3897     // FIXME: Could introduce the whole pattern, including superclasses and
3898     // such.
3899     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,interface));
3900     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3901     Builder.AddPlaceholderChunk("class");
3902     Results.AddResult(Result(Builder.TakeString()));
3903 
3904     // @protocol name
3905     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol));
3906     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3907     Builder.AddPlaceholderChunk("protocol");
3908     Results.AddResult(Result(Builder.TakeString()));
3909 
3910     // @implementation name
3911     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,implementation));
3912     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3913     Builder.AddPlaceholderChunk("class");
3914     Results.AddResult(Result(Builder.TakeString()));
3915   }
3916 
3917   // @compatibility_alias name
3918   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,compatibility_alias));
3919   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3920   Builder.AddPlaceholderChunk("alias");
3921   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3922   Builder.AddPlaceholderChunk("class");
3923   Results.AddResult(Result(Builder.TakeString()));
3924 }
3925 
3926 void Sema::CodeCompleteObjCAtDirective(Scope *S, Decl *ObjCImpDecl,
3927                                        bool InInterface) {
3928   typedef CodeCompletionResult Result;
3929   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3930                         CodeCompletionContext::CCC_Other);
3931   Results.EnterNewScope();
3932   if (ObjCImpDecl)
3933     AddObjCImplementationResults(getLangOptions(), Results, false);
3934   else if (InInterface)
3935     AddObjCInterfaceResults(getLangOptions(), Results, false);
3936   else
3937     AddObjCTopLevelResults(Results, false);
3938   Results.ExitScope();
3939   HandleCodeCompleteResults(this, CodeCompleter,
3940                             CodeCompletionContext::CCC_Other,
3941                             Results.data(),Results.size());
3942 }
3943 
3944 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
3945   typedef CodeCompletionResult Result;
3946   CodeCompletionBuilder Builder(Results.getAllocator());
3947 
3948   // @encode ( type-name )
3949   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,encode));
3950   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3951   Builder.AddPlaceholderChunk("type-name");
3952   Builder.AddChunk(CodeCompletionString::CK_RightParen);
3953   Results.AddResult(Result(Builder.TakeString()));
3954 
3955   // @protocol ( protocol-name )
3956   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol));
3957   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3958   Builder.AddPlaceholderChunk("protocol-name");
3959   Builder.AddChunk(CodeCompletionString::CK_RightParen);
3960   Results.AddResult(Result(Builder.TakeString()));
3961 
3962   // @selector ( selector )
3963   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,selector));
3964   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3965   Builder.AddPlaceholderChunk("selector");
3966   Builder.AddChunk(CodeCompletionString::CK_RightParen);
3967   Results.AddResult(Result(Builder.TakeString()));
3968 }
3969 
3970 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
3971   typedef CodeCompletionResult Result;
3972   CodeCompletionBuilder Builder(Results.getAllocator());
3973 
3974   if (Results.includeCodePatterns()) {
3975     // @try { statements } @catch ( declaration ) { statements } @finally
3976     //   { statements }
3977     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try));
3978     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
3979     Builder.AddPlaceholderChunk("statements");
3980     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
3981     Builder.AddTextChunk("@catch");
3982     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3983     Builder.AddPlaceholderChunk("parameter");
3984     Builder.AddChunk(CodeCompletionString::CK_RightParen);
3985     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
3986     Builder.AddPlaceholderChunk("statements");
3987     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
3988     Builder.AddTextChunk("@finally");
3989     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
3990     Builder.AddPlaceholderChunk("statements");
3991     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
3992     Results.AddResult(Result(Builder.TakeString()));
3993   }
3994 
3995   // @throw
3996   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw));
3997   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3998   Builder.AddPlaceholderChunk("expression");
3999   Results.AddResult(Result(Builder.TakeString()));
4000 
4001   if (Results.includeCodePatterns()) {
4002     // @synchronized ( expression ) { statements }
4003     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized));
4004     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4005     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4006     Builder.AddPlaceholderChunk("expression");
4007     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4008     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4009     Builder.AddPlaceholderChunk("statements");
4010     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4011     Results.AddResult(Result(Builder.TakeString()));
4012   }
4013 }
4014 
4015 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
4016                                      ResultBuilder &Results,
4017                                      bool NeedAt) {
4018   typedef CodeCompletionResult Result;
4019   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private)));
4020   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected)));
4021   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public)));
4022   if (LangOpts.ObjC2)
4023     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package)));
4024 }
4025 
4026 void Sema::CodeCompleteObjCAtVisibility(Scope *S) {
4027   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4028                         CodeCompletionContext::CCC_Other);
4029   Results.EnterNewScope();
4030   AddObjCVisibilityResults(getLangOptions(), Results, false);
4031   Results.ExitScope();
4032   HandleCodeCompleteResults(this, CodeCompleter,
4033                             CodeCompletionContext::CCC_Other,
4034                             Results.data(),Results.size());
4035 }
4036 
4037 void Sema::CodeCompleteObjCAtStatement(Scope *S) {
4038   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4039                         CodeCompletionContext::CCC_Other);
4040   Results.EnterNewScope();
4041   AddObjCStatementResults(Results, false);
4042   AddObjCExpressionResults(Results, false);
4043   Results.ExitScope();
4044   HandleCodeCompleteResults(this, CodeCompleter,
4045                             CodeCompletionContext::CCC_Other,
4046                             Results.data(),Results.size());
4047 }
4048 
4049 void Sema::CodeCompleteObjCAtExpression(Scope *S) {
4050   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4051                         CodeCompletionContext::CCC_Other);
4052   Results.EnterNewScope();
4053   AddObjCExpressionResults(Results, false);
4054   Results.ExitScope();
4055   HandleCodeCompleteResults(this, CodeCompleter,
4056                             CodeCompletionContext::CCC_Other,
4057                             Results.data(),Results.size());
4058 }
4059 
4060 /// \brief Determine whether the addition of the given flag to an Objective-C
4061 /// property's attributes will cause a conflict.
4062 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
4063   // Check if we've already added this flag.
4064   if (Attributes & NewFlag)
4065     return true;
4066 
4067   Attributes |= NewFlag;
4068 
4069   // Check for collisions with "readonly".
4070   if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
4071       (Attributes & (ObjCDeclSpec::DQ_PR_readwrite |
4072                      ObjCDeclSpec::DQ_PR_assign |
4073                      ObjCDeclSpec::DQ_PR_copy |
4074                      ObjCDeclSpec::DQ_PR_retain)))
4075     return true;
4076 
4077   // Check for more than one of { assign, copy, retain }.
4078   unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign |
4079                                              ObjCDeclSpec::DQ_PR_copy |
4080                                              ObjCDeclSpec::DQ_PR_retain);
4081   if (AssignCopyRetMask &&
4082       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign &&
4083       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy &&
4084       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain)
4085     return true;
4086 
4087   return false;
4088 }
4089 
4090 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
4091   if (!CodeCompleter)
4092     return;
4093 
4094   unsigned Attributes = ODS.getPropertyAttributes();
4095 
4096   typedef CodeCompletionResult Result;
4097   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4098                         CodeCompletionContext::CCC_Other);
4099   Results.EnterNewScope();
4100   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly))
4101     Results.AddResult(CodeCompletionResult("readonly"));
4102   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign))
4103     Results.AddResult(CodeCompletionResult("assign"));
4104   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite))
4105     Results.AddResult(CodeCompletionResult("readwrite"));
4106   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain))
4107     Results.AddResult(CodeCompletionResult("retain"));
4108   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy))
4109     Results.AddResult(CodeCompletionResult("copy"));
4110   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic))
4111     Results.AddResult(CodeCompletionResult("nonatomic"));
4112   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) {
4113     CodeCompletionBuilder Setter(Results.getAllocator());
4114     Setter.AddTypedTextChunk("setter");
4115     Setter.AddTextChunk(" = ");
4116     Setter.AddPlaceholderChunk("method");
4117     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
4118   }
4119   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) {
4120     CodeCompletionBuilder Getter(Results.getAllocator());
4121     Getter.AddTypedTextChunk("getter");
4122     Getter.AddTextChunk(" = ");
4123     Getter.AddPlaceholderChunk("method");
4124     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
4125   }
4126   Results.ExitScope();
4127   HandleCodeCompleteResults(this, CodeCompleter,
4128                             CodeCompletionContext::CCC_Other,
4129                             Results.data(),Results.size());
4130 }
4131 
4132 /// \brief Descripts the kind of Objective-C method that we want to find
4133 /// via code completion.
4134 enum ObjCMethodKind {
4135   MK_Any, //< Any kind of method, provided it means other specified criteria.
4136   MK_ZeroArgSelector, //< Zero-argument (unary) selector.
4137   MK_OneArgSelector //< One-argument selector.
4138 };
4139 
4140 static bool isAcceptableObjCSelector(Selector Sel,
4141                                      ObjCMethodKind WantKind,
4142                                      IdentifierInfo **SelIdents,
4143                                      unsigned NumSelIdents,
4144                                      bool AllowSameLength = true) {
4145   if (NumSelIdents > Sel.getNumArgs())
4146     return false;
4147 
4148   switch (WantKind) {
4149     case MK_Any:             break;
4150     case MK_ZeroArgSelector: return Sel.isUnarySelector();
4151     case MK_OneArgSelector:  return Sel.getNumArgs() == 1;
4152   }
4153 
4154   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
4155     return false;
4156 
4157   for (unsigned I = 0; I != NumSelIdents; ++I)
4158     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
4159       return false;
4160 
4161   return true;
4162 }
4163 
4164 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
4165                                    ObjCMethodKind WantKind,
4166                                    IdentifierInfo **SelIdents,
4167                                    unsigned NumSelIdents,
4168                                    bool AllowSameLength = true) {
4169   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
4170                                   NumSelIdents, AllowSameLength);
4171 }
4172 
4173 namespace {
4174   /// \brief A set of selectors, which is used to avoid introducing multiple
4175   /// completions with the same selector into the result set.
4176   typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
4177 }
4178 
4179 /// \brief Add all of the Objective-C methods in the given Objective-C
4180 /// container to the set of results.
4181 ///
4182 /// The container will be a class, protocol, category, or implementation of
4183 /// any of the above. This mether will recurse to include methods from
4184 /// the superclasses of classes along with their categories, protocols, and
4185 /// implementations.
4186 ///
4187 /// \param Container the container in which we'll look to find methods.
4188 ///
4189 /// \param WantInstance whether to add instance methods (only); if false, this
4190 /// routine will add factory methods (only).
4191 ///
4192 /// \param CurContext the context in which we're performing the lookup that
4193 /// finds methods.
4194 ///
4195 /// \param AllowSameLength Whether we allow a method to be added to the list
4196 /// when it has the same number of parameters as we have selector identifiers.
4197 ///
4198 /// \param Results the structure into which we'll add results.
4199 static void AddObjCMethods(ObjCContainerDecl *Container,
4200                            bool WantInstanceMethods,
4201                            ObjCMethodKind WantKind,
4202                            IdentifierInfo **SelIdents,
4203                            unsigned NumSelIdents,
4204                            DeclContext *CurContext,
4205                            VisitedSelectorSet &Selectors,
4206                            bool AllowSameLength,
4207                            ResultBuilder &Results,
4208                            bool InOriginalClass = true) {
4209   typedef CodeCompletionResult Result;
4210   for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
4211                                        MEnd = Container->meth_end();
4212        M != MEnd; ++M) {
4213     if ((*M)->isInstanceMethod() == WantInstanceMethods) {
4214       // Check whether the selector identifiers we've been given are a
4215       // subset of the identifiers for this particular method.
4216       if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents,
4217                                   AllowSameLength))
4218         continue;
4219 
4220       if (!Selectors.insert((*M)->getSelector()))
4221         continue;
4222 
4223       Result R = Result(*M, 0);
4224       R.StartParameter = NumSelIdents;
4225       R.AllParametersAreInformative = (WantKind != MK_Any);
4226       if (!InOriginalClass)
4227         R.Priority += CCD_InBaseClass;
4228       Results.MaybeAddResult(R, CurContext);
4229     }
4230   }
4231 
4232   // Visit the protocols of protocols.
4233   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
4234     const ObjCList<ObjCProtocolDecl> &Protocols
4235       = Protocol->getReferencedProtocols();
4236     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4237                                               E = Protocols.end();
4238          I != E; ++I)
4239       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents,
4240                      CurContext, Selectors, AllowSameLength, Results, false);
4241   }
4242 
4243   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
4244   if (!IFace)
4245     return;
4246 
4247   // Add methods in protocols.
4248   const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols();
4249   for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4250                                             E = Protocols.end();
4251        I != E; ++I)
4252     AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents,
4253                    CurContext, Selectors, AllowSameLength, Results, false);
4254 
4255   // Add methods in categories.
4256   for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl;
4257        CatDecl = CatDecl->getNextClassCategory()) {
4258     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
4259                    NumSelIdents, CurContext, Selectors, AllowSameLength,
4260                    Results, InOriginalClass);
4261 
4262     // Add a categories protocol methods.
4263     const ObjCList<ObjCProtocolDecl> &Protocols
4264       = CatDecl->getReferencedProtocols();
4265     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4266                                               E = Protocols.end();
4267          I != E; ++I)
4268       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,
4269                      NumSelIdents, CurContext, Selectors, AllowSameLength,
4270                      Results, false);
4271 
4272     // Add methods in category implementations.
4273     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
4274       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4275                      NumSelIdents, CurContext, Selectors, AllowSameLength,
4276                      Results, InOriginalClass);
4277   }
4278 
4279   // Add methods in superclass.
4280   if (IFace->getSuperClass())
4281     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
4282                    SelIdents, NumSelIdents, CurContext, Selectors,
4283                    AllowSameLength, Results, false);
4284 
4285   // Add methods in our implementation, if any.
4286   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
4287     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4288                    NumSelIdents, CurContext, Selectors, AllowSameLength,
4289                    Results, InOriginalClass);
4290 }
4291 
4292 
4293 void Sema::CodeCompleteObjCPropertyGetter(Scope *S, Decl *ClassDecl) {
4294   typedef CodeCompletionResult Result;
4295 
4296   // Try to find the interface where getters might live.
4297   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(ClassDecl);
4298   if (!Class) {
4299     if (ObjCCategoryDecl *Category
4300           = dyn_cast_or_null<ObjCCategoryDecl>(ClassDecl))
4301       Class = Category->getClassInterface();
4302 
4303     if (!Class)
4304       return;
4305   }
4306 
4307   // Find all of the potential getters.
4308   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4309                         CodeCompletionContext::CCC_Other);
4310   Results.EnterNewScope();
4311 
4312   VisitedSelectorSet Selectors;
4313   AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors,
4314                  /*AllowSameLength=*/true, Results);
4315   Results.ExitScope();
4316   HandleCodeCompleteResults(this, CodeCompleter,
4317                             CodeCompletionContext::CCC_Other,
4318                             Results.data(),Results.size());
4319 }
4320 
4321 void Sema::CodeCompleteObjCPropertySetter(Scope *S, Decl *ObjCImplDecl) {
4322   typedef CodeCompletionResult Result;
4323 
4324   // Try to find the interface where setters might live.
4325   ObjCInterfaceDecl *Class
4326     = dyn_cast_or_null<ObjCInterfaceDecl>(ObjCImplDecl);
4327   if (!Class) {
4328     if (ObjCCategoryDecl *Category
4329           = dyn_cast_or_null<ObjCCategoryDecl>(ObjCImplDecl))
4330       Class = Category->getClassInterface();
4331 
4332     if (!Class)
4333       return;
4334   }
4335 
4336   // Find all of the potential getters.
4337   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4338                         CodeCompletionContext::CCC_Other);
4339   Results.EnterNewScope();
4340 
4341   VisitedSelectorSet Selectors;
4342   AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext,
4343                  Selectors, /*AllowSameLength=*/true, Results);
4344 
4345   Results.ExitScope();
4346   HandleCodeCompleteResults(this, CodeCompleter,
4347                             CodeCompletionContext::CCC_Other,
4348                             Results.data(),Results.size());
4349 }
4350 
4351 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
4352                                        bool IsParameter) {
4353   typedef CodeCompletionResult Result;
4354   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4355                         CodeCompletionContext::CCC_Type);
4356   Results.EnterNewScope();
4357 
4358   // Add context-sensitive, Objective-C parameter-passing keywords.
4359   bool AddedInOut = false;
4360   if ((DS.getObjCDeclQualifier() &
4361        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
4362     Results.AddResult("in");
4363     Results.AddResult("inout");
4364     AddedInOut = true;
4365   }
4366   if ((DS.getObjCDeclQualifier() &
4367        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
4368     Results.AddResult("out");
4369     if (!AddedInOut)
4370       Results.AddResult("inout");
4371   }
4372   if ((DS.getObjCDeclQualifier() &
4373        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
4374         ObjCDeclSpec::DQ_Oneway)) == 0) {
4375      Results.AddResult("bycopy");
4376      Results.AddResult("byref");
4377      Results.AddResult("oneway");
4378   }
4379 
4380   // If we're completing the return type of an Objective-C method and the
4381   // identifier IBAction refers to a macro, provide a completion item for
4382   // an action, e.g.,
4383   //   IBAction)<#selector#>:(id)sender
4384   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
4385       Context.Idents.get("IBAction").hasMacroDefinition()) {
4386     typedef CodeCompletionString::Chunk Chunk;
4387     CodeCompletionBuilder Builder(Results.getAllocator(), CCP_CodePattern,
4388                                   CXAvailability_Available);
4389     Builder.AddTypedTextChunk("IBAction");
4390     Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen));
4391     Builder.AddPlaceholderChunk("selector");
4392     Builder.AddChunk(Chunk(CodeCompletionString::CK_Colon));
4393     Builder.AddChunk(Chunk(CodeCompletionString::CK_LeftParen));
4394     Builder.AddTextChunk("id");
4395     Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen));
4396     Builder.AddTextChunk("sender");
4397     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
4398   }
4399 
4400   // Add various builtin type names and specifiers.
4401   AddOrdinaryNameResults(PCC_Type, S, *this, Results);
4402   Results.ExitScope();
4403 
4404   // Add the various type names
4405   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
4406   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4407   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4408                      CodeCompleter->includeGlobals());
4409 
4410   if (CodeCompleter->includeMacros())
4411     AddMacroResults(PP, Results);
4412 
4413   HandleCodeCompleteResults(this, CodeCompleter,
4414                             CodeCompletionContext::CCC_Type,
4415                             Results.data(), Results.size());
4416 }
4417 
4418 /// \brief When we have an expression with type "id", we may assume
4419 /// that it has some more-specific class type based on knowledge of
4420 /// common uses of Objective-C. This routine returns that class type,
4421 /// or NULL if no better result could be determined.
4422 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
4423   ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
4424   if (!Msg)
4425     return 0;
4426 
4427   Selector Sel = Msg->getSelector();
4428   if (Sel.isNull())
4429     return 0;
4430 
4431   IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
4432   if (!Id)
4433     return 0;
4434 
4435   ObjCMethodDecl *Method = Msg->getMethodDecl();
4436   if (!Method)
4437     return 0;
4438 
4439   // Determine the class that we're sending the message to.
4440   ObjCInterfaceDecl *IFace = 0;
4441   switch (Msg->getReceiverKind()) {
4442   case ObjCMessageExpr::Class:
4443     if (const ObjCObjectType *ObjType
4444                            = Msg->getClassReceiver()->getAs<ObjCObjectType>())
4445       IFace = ObjType->getInterface();
4446     break;
4447 
4448   case ObjCMessageExpr::Instance: {
4449     QualType T = Msg->getInstanceReceiver()->getType();
4450     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
4451       IFace = Ptr->getInterfaceDecl();
4452     break;
4453   }
4454 
4455   case ObjCMessageExpr::SuperInstance:
4456   case ObjCMessageExpr::SuperClass:
4457     break;
4458   }
4459 
4460   if (!IFace)
4461     return 0;
4462 
4463   ObjCInterfaceDecl *Super = IFace->getSuperClass();
4464   if (Method->isInstanceMethod())
4465     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
4466       .Case("retain", IFace)
4467       .Case("autorelease", IFace)
4468       .Case("copy", IFace)
4469       .Case("copyWithZone", IFace)
4470       .Case("mutableCopy", IFace)
4471       .Case("mutableCopyWithZone", IFace)
4472       .Case("awakeFromCoder", IFace)
4473       .Case("replacementObjectFromCoder", IFace)
4474       .Case("class", IFace)
4475       .Case("classForCoder", IFace)
4476       .Case("superclass", Super)
4477       .Default(0);
4478 
4479   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
4480     .Case("new", IFace)
4481     .Case("alloc", IFace)
4482     .Case("allocWithZone", IFace)
4483     .Case("class", IFace)
4484     .Case("superclass", Super)
4485     .Default(0);
4486 }
4487 
4488 // Add a special completion for a message send to "super", which fills in the
4489 // most likely case of forwarding all of our arguments to the superclass
4490 // function.
4491 ///
4492 /// \param S The semantic analysis object.
4493 ///
4494 /// \param S NeedSuperKeyword Whether we need to prefix this completion with
4495 /// the "super" keyword. Otherwise, we just need to provide the arguments.
4496 ///
4497 /// \param SelIdents The identifiers in the selector that have already been
4498 /// provided as arguments for a send to "super".
4499 ///
4500 /// \param NumSelIdents The number of identifiers in \p SelIdents.
4501 ///
4502 /// \param Results The set of results to augment.
4503 ///
4504 /// \returns the Objective-C method declaration that would be invoked by
4505 /// this "super" completion. If NULL, no completion was added.
4506 static ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,
4507                                               IdentifierInfo **SelIdents,
4508                                               unsigned NumSelIdents,
4509                                               ResultBuilder &Results) {
4510   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
4511   if (!CurMethod)
4512     return 0;
4513 
4514   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
4515   if (!Class)
4516     return 0;
4517 
4518   // Try to find a superclass method with the same selector.
4519   ObjCMethodDecl *SuperMethod = 0;
4520   while ((Class = Class->getSuperClass()) && !SuperMethod) {
4521     // Check in the class
4522     SuperMethod = Class->getMethod(CurMethod->getSelector(),
4523                                    CurMethod->isInstanceMethod());
4524 
4525     // Check in categories or class extensions.
4526     if (!SuperMethod) {
4527       for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
4528            Category = Category->getNextClassCategory())
4529         if ((SuperMethod = Category->getMethod(CurMethod->getSelector(),
4530                                                CurMethod->isInstanceMethod())))
4531           break;
4532     }
4533   }
4534 
4535   if (!SuperMethod)
4536     return 0;
4537 
4538   // Check whether the superclass method has the same signature.
4539   if (CurMethod->param_size() != SuperMethod->param_size() ||
4540       CurMethod->isVariadic() != SuperMethod->isVariadic())
4541     return 0;
4542 
4543   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
4544                                    CurPEnd = CurMethod->param_end(),
4545                                     SuperP = SuperMethod->param_begin();
4546        CurP != CurPEnd; ++CurP, ++SuperP) {
4547     // Make sure the parameter types are compatible.
4548     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
4549                                           (*SuperP)->getType()))
4550       return 0;
4551 
4552     // Make sure we have a parameter name to forward!
4553     if (!(*CurP)->getIdentifier())
4554       return 0;
4555   }
4556 
4557   // We have a superclass method. Now, form the send-to-super completion.
4558   CodeCompletionBuilder Builder(Results.getAllocator());
4559 
4560   // Give this completion a return type.
4561   AddResultTypeChunk(S.Context, SuperMethod, Builder);
4562 
4563   // If we need the "super" keyword, add it (plus some spacing).
4564   if (NeedSuperKeyword) {
4565     Builder.AddTypedTextChunk("super");
4566     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4567   }
4568 
4569   Selector Sel = CurMethod->getSelector();
4570   if (Sel.isUnarySelector()) {
4571     if (NeedSuperKeyword)
4572       Builder.AddTextChunk(Builder.getAllocator().CopyString(
4573                                   Sel.getNameForSlot(0)));
4574     else
4575       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
4576                                    Sel.getNameForSlot(0)));
4577   } else {
4578     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
4579     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
4580       if (I > NumSelIdents)
4581         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4582 
4583       if (I < NumSelIdents)
4584         Builder.AddInformativeChunk(
4585                    Builder.getAllocator().CopyString(
4586                                                  Sel.getNameForSlot(I) + ":"));
4587       else if (NeedSuperKeyword || I > NumSelIdents) {
4588         Builder.AddTextChunk(
4589                  Builder.getAllocator().CopyString(
4590                                                   Sel.getNameForSlot(I) + ":"));
4591         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
4592                                          (*CurP)->getIdentifier()->getName()));
4593       } else {
4594         Builder.AddTypedTextChunk(
4595                   Builder.getAllocator().CopyString(
4596                                                   Sel.getNameForSlot(I) + ":"));
4597         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
4598                                          (*CurP)->getIdentifier()->getName()));
4599       }
4600     }
4601   }
4602 
4603   Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_SuperCompletion,
4604                                          SuperMethod->isInstanceMethod()
4605                                            ? CXCursor_ObjCInstanceMethodDecl
4606                                            : CXCursor_ObjCClassMethodDecl));
4607   return SuperMethod;
4608 }
4609 
4610 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {
4611   typedef CodeCompletionResult Result;
4612   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4613                         CodeCompletionContext::CCC_ObjCMessageReceiver,
4614                         &ResultBuilder::IsObjCMessageReceiver);
4615 
4616   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4617   Results.EnterNewScope();
4618   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4619                      CodeCompleter->includeGlobals());
4620 
4621   // If we are in an Objective-C method inside a class that has a superclass,
4622   // add "super" as an option.
4623   if (ObjCMethodDecl *Method = getCurMethodDecl())
4624     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
4625       if (Iface->getSuperClass()) {
4626         Results.AddResult(Result("super"));
4627 
4628         AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, 0, 0, Results);
4629       }
4630 
4631   Results.ExitScope();
4632 
4633   if (CodeCompleter->includeMacros())
4634     AddMacroResults(PP, Results);
4635   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4636                             Results.data(), Results.size());
4637 
4638 }
4639 
4640 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
4641                                         IdentifierInfo **SelIdents,
4642                                         unsigned NumSelIdents,
4643                                         bool AtArgumentExpression) {
4644   ObjCInterfaceDecl *CDecl = 0;
4645   if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
4646     // Figure out which interface we're in.
4647     CDecl = CurMethod->getClassInterface();
4648     if (!CDecl)
4649       return;
4650 
4651     // Find the superclass of this class.
4652     CDecl = CDecl->getSuperClass();
4653     if (!CDecl)
4654       return;
4655 
4656     if (CurMethod->isInstanceMethod()) {
4657       // We are inside an instance method, which means that the message
4658       // send [super ...] is actually calling an instance method on the
4659       // current object.
4660       return CodeCompleteObjCInstanceMessage(S, 0,
4661                                              SelIdents, NumSelIdents,
4662                                              AtArgumentExpression,
4663                                              CDecl);
4664     }
4665 
4666     // Fall through to send to the superclass in CDecl.
4667   } else {
4668     // "super" may be the name of a type or variable. Figure out which
4669     // it is.
4670     IdentifierInfo *Super = &Context.Idents.get("super");
4671     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc,
4672                                      LookupOrdinaryName);
4673     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
4674       // "super" names an interface. Use it.
4675     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
4676       if (const ObjCObjectType *Iface
4677             = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>())
4678         CDecl = Iface->getInterface();
4679     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
4680       // "super" names an unresolved type; we can't be more specific.
4681     } else {
4682       // Assume that "super" names some kind of value and parse that way.
4683       CXXScopeSpec SS;
4684       UnqualifiedId id;
4685       id.setIdentifier(Super, SuperLoc);
4686       ExprResult SuperExpr = ActOnIdExpression(S, SS, id, false, false);
4687       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
4688                                              SelIdents, NumSelIdents,
4689                                              AtArgumentExpression);
4690     }
4691 
4692     // Fall through
4693   }
4694 
4695   ParsedType Receiver;
4696   if (CDecl)
4697     Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));
4698   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
4699                                       NumSelIdents, AtArgumentExpression,
4700                                       /*IsSuper=*/true);
4701 }
4702 
4703 /// \brief Given a set of code-completion results for the argument of a message
4704 /// send, determine the preferred type (if any) for that argument expression.
4705 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
4706                                                        unsigned NumSelIdents) {
4707   typedef CodeCompletionResult Result;
4708   ASTContext &Context = Results.getSema().Context;
4709 
4710   QualType PreferredType;
4711   unsigned BestPriority = CCP_Unlikely * 2;
4712   Result *ResultsData = Results.data();
4713   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
4714     Result &R = ResultsData[I];
4715     if (R.Kind == Result::RK_Declaration &&
4716         isa<ObjCMethodDecl>(R.Declaration)) {
4717       if (R.Priority <= BestPriority) {
4718         ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
4719         if (NumSelIdents <= Method->param_size()) {
4720           QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1]
4721                                        ->getType();
4722           if (R.Priority < BestPriority || PreferredType.isNull()) {
4723             BestPriority = R.Priority;
4724             PreferredType = MyPreferredType;
4725           } else if (!Context.hasSameUnqualifiedType(PreferredType,
4726                                                      MyPreferredType)) {
4727             PreferredType = QualType();
4728           }
4729         }
4730       }
4731     }
4732   }
4733 
4734   return PreferredType;
4735 }
4736 
4737 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
4738                                        ParsedType Receiver,
4739                                        IdentifierInfo **SelIdents,
4740                                        unsigned NumSelIdents,
4741                                        bool AtArgumentExpression,
4742                                        bool IsSuper,
4743                                        ResultBuilder &Results) {
4744   typedef CodeCompletionResult Result;
4745   ObjCInterfaceDecl *CDecl = 0;
4746 
4747   // If the given name refers to an interface type, retrieve the
4748   // corresponding declaration.
4749   if (Receiver) {
4750     QualType T = SemaRef.GetTypeFromParser(Receiver, 0);
4751     if (!T.isNull())
4752       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
4753         CDecl = Interface->getInterface();
4754   }
4755 
4756   // Add all of the factory methods in this Objective-C class, its protocols,
4757   // superclasses, categories, implementation, etc.
4758   Results.EnterNewScope();
4759 
4760   // If this is a send-to-super, try to add the special "super" send
4761   // completion.
4762   if (IsSuper) {
4763     if (ObjCMethodDecl *SuperMethod
4764         = AddSuperSendCompletion(SemaRef, false, SelIdents, NumSelIdents,
4765                                  Results))
4766       Results.Ignore(SuperMethod);
4767   }
4768 
4769   // If we're inside an Objective-C method definition, prefer its selector to
4770   // others.
4771   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
4772     Results.setPreferredSelector(CurMethod->getSelector());
4773 
4774   VisitedSelectorSet Selectors;
4775   if (CDecl)
4776     AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents,
4777                    SemaRef.CurContext, Selectors, AtArgumentExpression,
4778                    Results);
4779   else {
4780     // We're messaging "id" as a type; provide all class/factory methods.
4781 
4782     // If we have an external source, load the entire class method
4783     // pool from the AST file.
4784     if (SemaRef.ExternalSource) {
4785       for (uint32_t I = 0,
4786                     N = SemaRef.ExternalSource->GetNumExternalSelectors();
4787            I != N; ++I) {
4788         Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I);
4789         if (Sel.isNull() || SemaRef.MethodPool.count(Sel))
4790           continue;
4791 
4792         SemaRef.ReadMethodPool(Sel);
4793       }
4794     }
4795 
4796     for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(),
4797                                        MEnd = SemaRef.MethodPool.end();
4798          M != MEnd; ++M) {
4799       for (ObjCMethodList *MethList = &M->second.second;
4800            MethList && MethList->Method;
4801            MethList = MethList->Next) {
4802         if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
4803                                     NumSelIdents))
4804           continue;
4805 
4806         Result R(MethList->Method, 0);
4807         R.StartParameter = NumSelIdents;
4808         R.AllParametersAreInformative = false;
4809         Results.MaybeAddResult(R, SemaRef.CurContext);
4810       }
4811     }
4812   }
4813 
4814   Results.ExitScope();
4815 }
4816 
4817 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
4818                                         IdentifierInfo **SelIdents,
4819                                         unsigned NumSelIdents,
4820                                         bool AtArgumentExpression,
4821                                         bool IsSuper) {
4822   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4823                         CodeCompletionContext::CCC_Other);
4824   AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents,
4825                              AtArgumentExpression, IsSuper, Results);
4826 
4827   // If we're actually at the argument expression (rather than prior to the
4828   // selector), we're actually performing code completion for an expression.
4829   // Determine whether we have a single, best method. If so, we can
4830   // code-complete the expression using the corresponding parameter type as
4831   // our preferred type, improving completion results.
4832   if (AtArgumentExpression) {
4833     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
4834                                                                     NumSelIdents);
4835     if (PreferredType.isNull())
4836       CodeCompleteOrdinaryName(S, PCC_Expression);
4837     else
4838       CodeCompleteExpression(S, PreferredType);
4839     return;
4840   }
4841 
4842   HandleCodeCompleteResults(this, CodeCompleter,
4843                             CodeCompletionContext::CCC_Other,
4844                             Results.data(), Results.size());
4845 }
4846 
4847 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, ExprTy *Receiver,
4848                                            IdentifierInfo **SelIdents,
4849                                            unsigned NumSelIdents,
4850                                            bool AtArgumentExpression,
4851                                            ObjCInterfaceDecl *Super) {
4852   typedef CodeCompletionResult Result;
4853 
4854   Expr *RecExpr = static_cast<Expr *>(Receiver);
4855 
4856   // If necessary, apply function/array conversion to the receiver.
4857   // C99 6.7.5.3p[7,8].
4858   if (RecExpr) {
4859     ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr);
4860     if (Conv.isInvalid()) // conversion failed. bail.
4861       return;
4862     RecExpr = Conv.take();
4863   }
4864   QualType ReceiverType = RecExpr? RecExpr->getType()
4865                           : Super? Context.getObjCObjectPointerType(
4866                                             Context.getObjCInterfaceType(Super))
4867                                  : Context.getObjCIdType();
4868 
4869   // If we're messaging an expression with type "id" or "Class", check
4870   // whether we know something special about the receiver that allows
4871   // us to assume a more-specific receiver type.
4872   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType())
4873     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
4874       if (ReceiverType->isObjCClassType())
4875         return CodeCompleteObjCClassMessage(S,
4876                        ParsedType::make(Context.getObjCInterfaceType(IFace)),
4877                                             SelIdents, NumSelIdents,
4878                                             AtArgumentExpression, Super);
4879 
4880       ReceiverType = Context.getObjCObjectPointerType(
4881                                           Context.getObjCInterfaceType(IFace));
4882     }
4883 
4884   // Build the set of methods we can see.
4885   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4886                         CodeCompletionContext::CCC_Other);
4887   Results.EnterNewScope();
4888 
4889   // If this is a send-to-super, try to add the special "super" send
4890   // completion.
4891   if (Super) {
4892     if (ObjCMethodDecl *SuperMethod
4893           = AddSuperSendCompletion(*this, false, SelIdents, NumSelIdents,
4894                                    Results))
4895       Results.Ignore(SuperMethod);
4896   }
4897 
4898   // If we're inside an Objective-C method definition, prefer its selector to
4899   // others.
4900   if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
4901     Results.setPreferredSelector(CurMethod->getSelector());
4902 
4903   // Keep track of the selectors we've already added.
4904   VisitedSelectorSet Selectors;
4905 
4906   // Handle messages to Class. This really isn't a message to an instance
4907   // method, so we treat it the same way we would treat a message send to a
4908   // class method.
4909   if (ReceiverType->isObjCClassType() ||
4910       ReceiverType->isObjCQualifiedClassType()) {
4911     if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
4912       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
4913         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents,
4914                        CurContext, Selectors, AtArgumentExpression, Results);
4915     }
4916   }
4917   // Handle messages to a qualified ID ("id<foo>").
4918   else if (const ObjCObjectPointerType *QualID
4919              = ReceiverType->getAsObjCQualifiedIdType()) {
4920     // Search protocols for instance methods.
4921     for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(),
4922                                               E = QualID->qual_end();
4923          I != E; ++I)
4924       AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext,
4925                      Selectors, AtArgumentExpression, Results);
4926   }
4927   // Handle messages to a pointer to interface type.
4928   else if (const ObjCObjectPointerType *IFacePtr
4929                               = ReceiverType->getAsObjCInterfacePointerType()) {
4930     // Search the class, its superclasses, etc., for instance methods.
4931     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
4932                    NumSelIdents, CurContext, Selectors, AtArgumentExpression,
4933                    Results);
4934 
4935     // Search protocols for instance methods.
4936     for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(),
4937          E = IFacePtr->qual_end();
4938          I != E; ++I)
4939       AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext,
4940                      Selectors, AtArgumentExpression, Results);
4941   }
4942   // Handle messages to "id".
4943   else if (ReceiverType->isObjCIdType()) {
4944     // We're messaging "id", so provide all instance methods we know
4945     // about as code-completion results.
4946 
4947     // If we have an external source, load the entire class method
4948     // pool from the AST file.
4949     if (ExternalSource) {
4950       for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
4951            I != N; ++I) {
4952         Selector Sel = ExternalSource->GetExternalSelector(I);
4953         if (Sel.isNull() || MethodPool.count(Sel))
4954           continue;
4955 
4956         ReadMethodPool(Sel);
4957       }
4958     }
4959 
4960     for (GlobalMethodPool::iterator M = MethodPool.begin(),
4961                                     MEnd = MethodPool.end();
4962          M != MEnd; ++M) {
4963       for (ObjCMethodList *MethList = &M->second.first;
4964            MethList && MethList->Method;
4965            MethList = MethList->Next) {
4966         if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
4967                                     NumSelIdents))
4968           continue;
4969 
4970         if (!Selectors.insert(MethList->Method->getSelector()))
4971           continue;
4972 
4973         Result R(MethList->Method, 0);
4974         R.StartParameter = NumSelIdents;
4975         R.AllParametersAreInformative = false;
4976         Results.MaybeAddResult(R, CurContext);
4977       }
4978     }
4979   }
4980   Results.ExitScope();
4981 
4982 
4983   // If we're actually at the argument expression (rather than prior to the
4984   // selector), we're actually performing code completion for an expression.
4985   // Determine whether we have a single, best method. If so, we can
4986   // code-complete the expression using the corresponding parameter type as
4987   // our preferred type, improving completion results.
4988   if (AtArgumentExpression) {
4989     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
4990                                                                   NumSelIdents);
4991     if (PreferredType.isNull())
4992       CodeCompleteOrdinaryName(S, PCC_Expression);
4993     else
4994       CodeCompleteExpression(S, PreferredType);
4995     return;
4996   }
4997 
4998   HandleCodeCompleteResults(this, CodeCompleter,
4999                             CodeCompletionContext::CCC_Other,
5000                             Results.data(),Results.size());
5001 }
5002 
5003 void Sema::CodeCompleteObjCForCollection(Scope *S,
5004                                          DeclGroupPtrTy IterationVar) {
5005   CodeCompleteExpressionData Data;
5006   Data.ObjCCollection = true;
5007 
5008   if (IterationVar.getAsOpaquePtr()) {
5009     DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>();
5010     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
5011       if (*I)
5012         Data.IgnoreDecls.push_back(*I);
5013     }
5014   }
5015 
5016   CodeCompleteExpression(S, Data);
5017 }
5018 
5019 void Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents,
5020                                     unsigned NumSelIdents) {
5021   // If we have an external source, load the entire class method
5022   // pool from the AST file.
5023   if (ExternalSource) {
5024     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
5025          I != N; ++I) {
5026       Selector Sel = ExternalSource->GetExternalSelector(I);
5027       if (Sel.isNull() || MethodPool.count(Sel))
5028         continue;
5029 
5030       ReadMethodPool(Sel);
5031     }
5032   }
5033 
5034   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5035                         CodeCompletionContext::CCC_SelectorName);
5036   Results.EnterNewScope();
5037   for (GlobalMethodPool::iterator M = MethodPool.begin(),
5038                                MEnd = MethodPool.end();
5039        M != MEnd; ++M) {
5040 
5041     Selector Sel = M->first;
5042     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents, NumSelIdents))
5043       continue;
5044 
5045     CodeCompletionBuilder Builder(Results.getAllocator());
5046     if (Sel.isUnarySelector()) {
5047       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
5048                                                        Sel.getNameForSlot(0)));
5049       Results.AddResult(Builder.TakeString());
5050       continue;
5051     }
5052 
5053     std::string Accumulator;
5054     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
5055       if (I == NumSelIdents) {
5056         if (!Accumulator.empty()) {
5057           Builder.AddInformativeChunk(Builder.getAllocator().CopyString(
5058                                                  Accumulator));
5059           Accumulator.clear();
5060         }
5061       }
5062 
5063       Accumulator += Sel.getNameForSlot(I).str();
5064       Accumulator += ':';
5065     }
5066     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator));
5067     Results.AddResult(Builder.TakeString());
5068   }
5069   Results.ExitScope();
5070 
5071   HandleCodeCompleteResults(this, CodeCompleter,
5072                             CodeCompletionContext::CCC_SelectorName,
5073                             Results.data(), Results.size());
5074 }
5075 
5076 /// \brief Add all of the protocol declarations that we find in the given
5077 /// (translation unit) context.
5078 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
5079                                bool OnlyForwardDeclarations,
5080                                ResultBuilder &Results) {
5081   typedef CodeCompletionResult Result;
5082 
5083   for (DeclContext::decl_iterator D = Ctx->decls_begin(),
5084                                DEnd = Ctx->decls_end();
5085        D != DEnd; ++D) {
5086     // Record any protocols we find.
5087     if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D))
5088       if (!OnlyForwardDeclarations || Proto->isForwardDecl())
5089         Results.AddResult(Result(Proto, 0), CurContext, 0, false);
5090 
5091     // Record any forward-declared protocols we find.
5092     if (ObjCForwardProtocolDecl *Forward
5093           = dyn_cast<ObjCForwardProtocolDecl>(*D)) {
5094       for (ObjCForwardProtocolDecl::protocol_iterator
5095              P = Forward->protocol_begin(),
5096              PEnd = Forward->protocol_end();
5097            P != PEnd; ++P)
5098         if (!OnlyForwardDeclarations || (*P)->isForwardDecl())
5099           Results.AddResult(Result(*P, 0), CurContext, 0, false);
5100     }
5101   }
5102 }
5103 
5104 void Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols,
5105                                               unsigned NumProtocols) {
5106   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5107                         CodeCompletionContext::CCC_ObjCProtocolName);
5108 
5109   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5110     Results.EnterNewScope();
5111 
5112     // Tell the result set to ignore all of the protocols we have
5113     // already seen.
5114     // FIXME: This doesn't work when caching code-completion results.
5115     for (unsigned I = 0; I != NumProtocols; ++I)
5116       if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first,
5117                                                       Protocols[I].second))
5118         Results.Ignore(Protocol);
5119 
5120     // Add all protocols.
5121     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false,
5122                        Results);
5123 
5124     Results.ExitScope();
5125   }
5126 
5127   HandleCodeCompleteResults(this, CodeCompleter,
5128                             CodeCompletionContext::CCC_ObjCProtocolName,
5129                             Results.data(),Results.size());
5130 }
5131 
5132 void Sema::CodeCompleteObjCProtocolDecl(Scope *) {
5133   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5134                         CodeCompletionContext::CCC_ObjCProtocolName);
5135 
5136   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5137     Results.EnterNewScope();
5138 
5139     // Add all protocols.
5140     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true,
5141                        Results);
5142 
5143     Results.ExitScope();
5144   }
5145 
5146   HandleCodeCompleteResults(this, CodeCompleter,
5147                             CodeCompletionContext::CCC_ObjCProtocolName,
5148                             Results.data(),Results.size());
5149 }
5150 
5151 /// \brief Add all of the Objective-C interface declarations that we find in
5152 /// the given (translation unit) context.
5153 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
5154                                 bool OnlyForwardDeclarations,
5155                                 bool OnlyUnimplemented,
5156                                 ResultBuilder &Results) {
5157   typedef CodeCompletionResult Result;
5158 
5159   for (DeclContext::decl_iterator D = Ctx->decls_begin(),
5160                                DEnd = Ctx->decls_end();
5161        D != DEnd; ++D) {
5162     // Record any interfaces we find.
5163     if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D))
5164       if ((!OnlyForwardDeclarations || Class->isForwardDecl()) &&
5165           (!OnlyUnimplemented || !Class->getImplementation()))
5166         Results.AddResult(Result(Class, 0), CurContext, 0, false);
5167 
5168     // Record any forward-declared interfaces we find.
5169     if (ObjCClassDecl *Forward = dyn_cast<ObjCClassDecl>(*D)) {
5170       for (ObjCClassDecl::iterator C = Forward->begin(), CEnd = Forward->end();
5171            C != CEnd; ++C)
5172         if ((!OnlyForwardDeclarations || C->getInterface()->isForwardDecl()) &&
5173             (!OnlyUnimplemented || !C->getInterface()->getImplementation()))
5174           Results.AddResult(Result(C->getInterface(), 0), CurContext,
5175                             0, false);
5176     }
5177   }
5178 }
5179 
5180 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
5181   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5182                         CodeCompletionContext::CCC_Other);
5183   Results.EnterNewScope();
5184 
5185   // Add all classes.
5186   AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, true,
5187                       false, Results);
5188 
5189   Results.ExitScope();
5190   // FIXME: Add a special context for this, use cached global completion
5191   // results.
5192   HandleCodeCompleteResults(this, CodeCompleter,
5193                             CodeCompletionContext::CCC_Other,
5194                             Results.data(),Results.size());
5195 }
5196 
5197 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
5198                                       SourceLocation ClassNameLoc) {
5199   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5200                         CodeCompletionContext::CCC_Other);
5201   Results.EnterNewScope();
5202 
5203   // Make sure that we ignore the class we're currently defining.
5204   NamedDecl *CurClass
5205     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5206   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
5207     Results.Ignore(CurClass);
5208 
5209   // Add all classes.
5210   AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5211                       false, Results);
5212 
5213   Results.ExitScope();
5214   // FIXME: Add a special context for this, use cached global completion
5215   // results.
5216   HandleCodeCompleteResults(this, CodeCompleter,
5217                             CodeCompletionContext::CCC_Other,
5218                             Results.data(),Results.size());
5219 }
5220 
5221 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
5222   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5223                         CodeCompletionContext::CCC_Other);
5224   Results.EnterNewScope();
5225 
5226   // Add all unimplemented classes.
5227   AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5228                       true, Results);
5229 
5230   Results.ExitScope();
5231   // FIXME: Add a special context for this, use cached global completion
5232   // results.
5233   HandleCodeCompleteResults(this, CodeCompleter,
5234                             CodeCompletionContext::CCC_Other,
5235                             Results.data(),Results.size());
5236 }
5237 
5238 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
5239                                              IdentifierInfo *ClassName,
5240                                              SourceLocation ClassNameLoc) {
5241   typedef CodeCompletionResult Result;
5242 
5243   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5244                         CodeCompletionContext::CCC_Other);
5245 
5246   // Ignore any categories we find that have already been implemented by this
5247   // interface.
5248   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5249   NamedDecl *CurClass
5250     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5251   if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass))
5252     for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
5253          Category = Category->getNextClassCategory())
5254       CategoryNames.insert(Category->getIdentifier());
5255 
5256   // Add all of the categories we know about.
5257   Results.EnterNewScope();
5258   TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
5259   for (DeclContext::decl_iterator D = TU->decls_begin(),
5260                                DEnd = TU->decls_end();
5261        D != DEnd; ++D)
5262     if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D))
5263       if (CategoryNames.insert(Category->getIdentifier()))
5264         Results.AddResult(Result(Category, 0), CurContext, 0, false);
5265   Results.ExitScope();
5266 
5267   HandleCodeCompleteResults(this, CodeCompleter,
5268                             CodeCompletionContext::CCC_Other,
5269                             Results.data(),Results.size());
5270 }
5271 
5272 void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
5273                                                   IdentifierInfo *ClassName,
5274                                                   SourceLocation ClassNameLoc) {
5275   typedef CodeCompletionResult Result;
5276 
5277   // Find the corresponding interface. If we couldn't find the interface, the
5278   // program itself is ill-formed. However, we'll try to be helpful still by
5279   // providing the list of all of the categories we know about.
5280   NamedDecl *CurClass
5281     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5282   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
5283   if (!Class)
5284     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
5285 
5286   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5287                         CodeCompletionContext::CCC_Other);
5288 
5289   // Add all of the categories that have have corresponding interface
5290   // declarations in this class and any of its superclasses, except for
5291   // already-implemented categories in the class itself.
5292   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5293   Results.EnterNewScope();
5294   bool IgnoreImplemented = true;
5295   while (Class) {
5296     for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
5297          Category = Category->getNextClassCategory())
5298       if ((!IgnoreImplemented || !Category->getImplementation()) &&
5299           CategoryNames.insert(Category->getIdentifier()))
5300         Results.AddResult(Result(Category, 0), CurContext, 0, false);
5301 
5302     Class = Class->getSuperClass();
5303     IgnoreImplemented = false;
5304   }
5305   Results.ExitScope();
5306 
5307   HandleCodeCompleteResults(this, CodeCompleter,
5308                             CodeCompletionContext::CCC_Other,
5309                             Results.data(),Results.size());
5310 }
5311 
5312 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S, Decl *ObjCImpDecl) {
5313   typedef CodeCompletionResult Result;
5314   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5315                         CodeCompletionContext::CCC_Other);
5316 
5317   // Figure out where this @synthesize lives.
5318   ObjCContainerDecl *Container
5319     = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl);
5320   if (!Container ||
5321       (!isa<ObjCImplementationDecl>(Container) &&
5322        !isa<ObjCCategoryImplDecl>(Container)))
5323     return;
5324 
5325   // Ignore any properties that have already been implemented.
5326   for (DeclContext::decl_iterator D = Container->decls_begin(),
5327                                DEnd = Container->decls_end();
5328        D != DEnd; ++D)
5329     if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D))
5330       Results.Ignore(PropertyImpl->getPropertyDecl());
5331 
5332   // Add any properties that we find.
5333   AddedPropertiesSet AddedProperties;
5334   Results.EnterNewScope();
5335   if (ObjCImplementationDecl *ClassImpl
5336         = dyn_cast<ObjCImplementationDecl>(Container))
5337     AddObjCProperties(ClassImpl->getClassInterface(), false, CurContext,
5338                       AddedProperties, Results);
5339   else
5340     AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
5341                       false, CurContext, AddedProperties, Results);
5342   Results.ExitScope();
5343 
5344   HandleCodeCompleteResults(this, CodeCompleter,
5345                             CodeCompletionContext::CCC_Other,
5346                             Results.data(),Results.size());
5347 }
5348 
5349 void Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S,
5350                                                   IdentifierInfo *PropertyName,
5351                                                   Decl *ObjCImpDecl) {
5352   typedef CodeCompletionResult Result;
5353   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5354                         CodeCompletionContext::CCC_Other);
5355 
5356   // Figure out where this @synthesize lives.
5357   ObjCContainerDecl *Container
5358     = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl);
5359   if (!Container ||
5360       (!isa<ObjCImplementationDecl>(Container) &&
5361        !isa<ObjCCategoryImplDecl>(Container)))
5362     return;
5363 
5364   // Figure out which interface we're looking into.
5365   ObjCInterfaceDecl *Class = 0;
5366   if (ObjCImplementationDecl *ClassImpl
5367                                  = dyn_cast<ObjCImplementationDecl>(Container))
5368     Class = ClassImpl->getClassInterface();
5369   else
5370     Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl()
5371                                                           ->getClassInterface();
5372 
5373   // Add all of the instance variables in this class and its superclasses.
5374   Results.EnterNewScope();
5375   for(; Class; Class = Class->getSuperClass()) {
5376     // FIXME: We could screen the type of each ivar for compatibility with
5377     // the property, but is that being too paternal?
5378     for (ObjCInterfaceDecl::ivar_iterator IVar = Class->ivar_begin(),
5379                                        IVarEnd = Class->ivar_end();
5380          IVar != IVarEnd; ++IVar)
5381       Results.AddResult(Result(*IVar, 0), CurContext, 0, false);
5382   }
5383   Results.ExitScope();
5384 
5385   HandleCodeCompleteResults(this, CodeCompleter,
5386                             CodeCompletionContext::CCC_Other,
5387                             Results.data(),Results.size());
5388 }
5389 
5390 // Mapping from selectors to the methods that implement that selector, along
5391 // with the "in original class" flag.
5392 typedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> >
5393   KnownMethodsMap;
5394 
5395 /// \brief Find all of the methods that reside in the given container
5396 /// (and its superclasses, protocols, etc.) that meet the given
5397 /// criteria. Insert those methods into the map of known methods,
5398 /// indexed by selector so they can be easily found.
5399 static void FindImplementableMethods(ASTContext &Context,
5400                                      ObjCContainerDecl *Container,
5401                                      bool WantInstanceMethods,
5402                                      QualType ReturnType,
5403                                      KnownMethodsMap &KnownMethods,
5404                                      bool InOriginalClass = true) {
5405   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
5406     // Recurse into protocols.
5407     const ObjCList<ObjCProtocolDecl> &Protocols
5408       = IFace->getReferencedProtocols();
5409     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5410                                               E = Protocols.end();
5411          I != E; ++I)
5412       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
5413                                KnownMethods, InOriginalClass);
5414 
5415     // Add methods from any class extensions and categories.
5416     for (const ObjCCategoryDecl *Cat = IFace->getCategoryList(); Cat;
5417          Cat = Cat->getNextClassCategory())
5418       FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat),
5419                                WantInstanceMethods, ReturnType,
5420                                KnownMethods, false);
5421 
5422     // Visit the superclass.
5423     if (IFace->getSuperClass())
5424       FindImplementableMethods(Context, IFace->getSuperClass(),
5425                                WantInstanceMethods, ReturnType,
5426                                KnownMethods, false);
5427   }
5428 
5429   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
5430     // Recurse into protocols.
5431     const ObjCList<ObjCProtocolDecl> &Protocols
5432       = Category->getReferencedProtocols();
5433     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5434                                               E = Protocols.end();
5435          I != E; ++I)
5436       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
5437                                KnownMethods, InOriginalClass);
5438 
5439     // If this category is the original class, jump to the interface.
5440     if (InOriginalClass && Category->getClassInterface())
5441       FindImplementableMethods(Context, Category->getClassInterface(),
5442                                WantInstanceMethods, ReturnType, KnownMethods,
5443                                false);
5444   }
5445 
5446   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
5447     // Recurse into protocols.
5448     const ObjCList<ObjCProtocolDecl> &Protocols
5449       = Protocol->getReferencedProtocols();
5450     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5451            E = Protocols.end();
5452          I != E; ++I)
5453       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
5454                                KnownMethods, false);
5455   }
5456 
5457   // Add methods in this container. This operation occurs last because
5458   // we want the methods from this container to override any methods
5459   // we've previously seen with the same selector.
5460   for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
5461                                        MEnd = Container->meth_end();
5462        M != MEnd; ++M) {
5463     if ((*M)->isInstanceMethod() == WantInstanceMethods) {
5464       if (!ReturnType.isNull() &&
5465           !Context.hasSameUnqualifiedType(ReturnType, (*M)->getResultType()))
5466         continue;
5467 
5468       KnownMethods[(*M)->getSelector()] = std::make_pair(*M, InOriginalClass);
5469     }
5470   }
5471 }
5472 
5473 /// \brief Add the parenthesized return or parameter type chunk to a code
5474 /// completion string.
5475 static void AddObjCPassingTypeChunk(QualType Type,
5476                                     ASTContext &Context,
5477                                     CodeCompletionBuilder &Builder) {
5478   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5479   Builder.AddTextChunk(GetCompletionTypeString(Type, Context,
5480                                                Builder.getAllocator()));
5481   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5482 }
5483 
5484 /// \brief Determine whether the given class is or inherits from a class by
5485 /// the given name.
5486 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class,
5487                                    llvm::StringRef Name) {
5488   if (!Class)
5489     return false;
5490 
5491   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
5492     return true;
5493 
5494   return InheritsFromClassNamed(Class->getSuperClass(), Name);
5495 }
5496 
5497 /// \brief Add code completions for Objective-C Key-Value Coding (KVC) and
5498 /// Key-Value Observing (KVO).
5499 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
5500                                        bool IsInstanceMethod,
5501                                        QualType ReturnType,
5502                                        ASTContext &Context,
5503                                        const KnownMethodsMap &KnownMethods,
5504                                        ResultBuilder &Results) {
5505   IdentifierInfo *PropName = Property->getIdentifier();
5506   if (!PropName || PropName->getLength() == 0)
5507     return;
5508 
5509 
5510   // Builder that will create each code completion.
5511   typedef CodeCompletionResult Result;
5512   CodeCompletionAllocator &Allocator = Results.getAllocator();
5513   CodeCompletionBuilder Builder(Allocator);
5514 
5515   // The selector table.
5516   SelectorTable &Selectors = Context.Selectors;
5517 
5518   // The property name, copied into the code completion allocation region
5519   // on demand.
5520   struct KeyHolder {
5521     CodeCompletionAllocator &Allocator;
5522     llvm::StringRef Key;
5523     const char *CopiedKey;
5524 
5525     KeyHolder(CodeCompletionAllocator &Allocator, llvm::StringRef Key)
5526     : Allocator(Allocator), Key(Key), CopiedKey(0) { }
5527 
5528     operator const char *() {
5529       if (CopiedKey)
5530         return CopiedKey;
5531 
5532       return CopiedKey = Allocator.CopyString(Key);
5533     }
5534   } Key(Allocator, PropName->getName());
5535 
5536   // The uppercased name of the property name.
5537   std::string UpperKey = PropName->getName();
5538   if (!UpperKey.empty())
5539     UpperKey[0] = toupper(UpperKey[0]);
5540 
5541   bool ReturnTypeMatchesProperty = ReturnType.isNull() ||
5542     Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
5543                                    Property->getType());
5544   bool ReturnTypeMatchesVoid
5545     = ReturnType.isNull() || ReturnType->isVoidType();
5546 
5547   // Add the normal accessor -(type)key.
5548   if (IsInstanceMethod &&
5549       !KnownMethods.count(Selectors.getNullarySelector(PropName)) &&
5550       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
5551     if (ReturnType.isNull())
5552       AddObjCPassingTypeChunk(Property->getType(), Context, Builder);
5553 
5554     Builder.AddTypedTextChunk(Key);
5555     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
5556                              CXCursor_ObjCInstanceMethodDecl));
5557   }
5558 
5559   // If we have an integral or boolean property (or the user has provided
5560   // an integral or boolean return type), add the accessor -(type)isKey.
5561   if (IsInstanceMethod &&
5562       ((!ReturnType.isNull() &&
5563         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
5564        (ReturnType.isNull() &&
5565         (Property->getType()->isIntegerType() ||
5566          Property->getType()->isBooleanType())))) {
5567     std::string SelectorName = (llvm::Twine("is") + UpperKey).str();
5568     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5569     if (!KnownMethods.count(Selectors.getNullarySelector(SelectorId))) {
5570       if (ReturnType.isNull()) {
5571         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5572         Builder.AddTextChunk("BOOL");
5573         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5574       }
5575 
5576       Builder.AddTypedTextChunk(
5577                                 Allocator.CopyString(SelectorId->getName()));
5578       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
5579                                CXCursor_ObjCInstanceMethodDecl));
5580     }
5581   }
5582 
5583   // Add the normal mutator.
5584   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
5585       !Property->getSetterMethodDecl()) {
5586     std::string SelectorName = (llvm::Twine("set") + UpperKey).str();
5587     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5588     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5589       if (ReturnType.isNull()) {
5590         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5591         Builder.AddTextChunk("void");
5592         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5593       }
5594 
5595       Builder.AddTypedTextChunk(
5596                                 Allocator.CopyString(SelectorId->getName()));
5597       Builder.AddTypedTextChunk(":");
5598       AddObjCPassingTypeChunk(Property->getType(), Context, Builder);
5599       Builder.AddTextChunk(Key);
5600       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
5601                                CXCursor_ObjCInstanceMethodDecl));
5602     }
5603   }
5604 
5605   // Indexed and unordered accessors
5606   unsigned IndexedGetterPriority = CCP_CodePattern;
5607   unsigned IndexedSetterPriority = CCP_CodePattern;
5608   unsigned UnorderedGetterPriority = CCP_CodePattern;
5609   unsigned UnorderedSetterPriority = CCP_CodePattern;
5610   if (const ObjCObjectPointerType *ObjCPointer
5611                     = Property->getType()->getAs<ObjCObjectPointerType>()) {
5612     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
5613       // If this interface type is not provably derived from a known
5614       // collection, penalize the corresponding completions.
5615       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
5616         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
5617         if (!InheritsFromClassNamed(IFace, "NSArray"))
5618           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
5619       }
5620 
5621       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
5622         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
5623         if (!InheritsFromClassNamed(IFace, "NSSet"))
5624           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
5625       }
5626     }
5627   } else {
5628     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
5629     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
5630     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
5631     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
5632   }
5633 
5634   // Add -(NSUInteger)countOf<key>
5635   if (IsInstanceMethod &&
5636       (ReturnType.isNull() || ReturnType->isIntegerType())) {
5637     std::string SelectorName = (llvm::Twine("countOf") + UpperKey).str();
5638     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5639     if (!KnownMethods.count(Selectors.getNullarySelector(SelectorId))) {
5640       if (ReturnType.isNull()) {
5641         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5642         Builder.AddTextChunk("NSUInteger");
5643         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5644       }
5645 
5646       Builder.AddTypedTextChunk(
5647                                 Allocator.CopyString(SelectorId->getName()));
5648       Results.AddResult(Result(Builder.TakeString(),
5649                                std::min(IndexedGetterPriority,
5650                                         UnorderedGetterPriority),
5651                                CXCursor_ObjCInstanceMethodDecl));
5652     }
5653   }
5654 
5655   // Indexed getters
5656   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
5657   if (IsInstanceMethod &&
5658       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
5659     std::string SelectorName
5660       = (llvm::Twine("objectIn") + UpperKey + "AtIndex").str();
5661     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5662     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5663       if (ReturnType.isNull()) {
5664         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5665         Builder.AddTextChunk("id");
5666         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5667       }
5668 
5669       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5670       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5671       Builder.AddTextChunk("NSUInteger");
5672       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5673       Builder.AddTextChunk("index");
5674       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
5675                                CXCursor_ObjCInstanceMethodDecl));
5676     }
5677   }
5678 
5679   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
5680   if (IsInstanceMethod &&
5681       (ReturnType.isNull() ||
5682        (ReturnType->isObjCObjectPointerType() &&
5683         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
5684         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
5685                                                 ->getName() == "NSArray"))) {
5686     std::string SelectorName
5687       = (llvm::Twine(Property->getName()) + "AtIndexes").str();
5688     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5689     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5690       if (ReturnType.isNull()) {
5691         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5692         Builder.AddTextChunk("NSArray *");
5693         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5694       }
5695 
5696       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5697       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5698       Builder.AddTextChunk("NSIndexSet *");
5699       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5700       Builder.AddTextChunk("indexes");
5701       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
5702                                CXCursor_ObjCInstanceMethodDecl));
5703     }
5704   }
5705 
5706   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
5707   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5708     std::string SelectorName = (llvm::Twine("get") + UpperKey).str();
5709     IdentifierInfo *SelectorIds[2] = {
5710       &Context.Idents.get(SelectorName),
5711       &Context.Idents.get("range")
5712     };
5713 
5714     if (!KnownMethods.count(Selectors.getSelector(2, SelectorIds))) {
5715       if (ReturnType.isNull()) {
5716         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5717         Builder.AddTextChunk("void");
5718         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5719       }
5720 
5721       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5722       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5723       Builder.AddPlaceholderChunk("object-type");
5724       Builder.AddTextChunk(" **");
5725       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5726       Builder.AddTextChunk("buffer");
5727       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5728       Builder.AddTypedTextChunk("range:");
5729       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5730       Builder.AddTextChunk("NSRange");
5731       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5732       Builder.AddTextChunk("inRange");
5733       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
5734                                CXCursor_ObjCInstanceMethodDecl));
5735     }
5736   }
5737 
5738   // Mutable indexed accessors
5739 
5740   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
5741   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5742     std::string SelectorName = (llvm::Twine("in") + UpperKey + "AtIndex").str();
5743     IdentifierInfo *SelectorIds[2] = {
5744       &Context.Idents.get("insertObject"),
5745       &Context.Idents.get(SelectorName)
5746     };
5747 
5748     if (!KnownMethods.count(Selectors.getSelector(2, SelectorIds))) {
5749       if (ReturnType.isNull()) {
5750         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5751         Builder.AddTextChunk("void");
5752         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5753       }
5754 
5755       Builder.AddTypedTextChunk("insertObject:");
5756       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5757       Builder.AddPlaceholderChunk("object-type");
5758       Builder.AddTextChunk(" *");
5759       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5760       Builder.AddTextChunk("object");
5761       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5762       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5763       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5764       Builder.AddPlaceholderChunk("NSUInteger");
5765       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5766       Builder.AddTextChunk("index");
5767       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5768                                CXCursor_ObjCInstanceMethodDecl));
5769     }
5770   }
5771 
5772   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
5773   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5774     std::string SelectorName = (llvm::Twine("insert") + UpperKey).str();
5775     IdentifierInfo *SelectorIds[2] = {
5776       &Context.Idents.get(SelectorName),
5777       &Context.Idents.get("atIndexes")
5778     };
5779 
5780     if (!KnownMethods.count(Selectors.getSelector(2, SelectorIds))) {
5781       if (ReturnType.isNull()) {
5782         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5783         Builder.AddTextChunk("void");
5784         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5785       }
5786 
5787       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5788       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5789       Builder.AddTextChunk("NSArray *");
5790       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5791       Builder.AddTextChunk("array");
5792       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5793       Builder.AddTypedTextChunk("atIndexes:");
5794       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5795       Builder.AddPlaceholderChunk("NSIndexSet *");
5796       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5797       Builder.AddTextChunk("indexes");
5798       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5799                                CXCursor_ObjCInstanceMethodDecl));
5800     }
5801   }
5802 
5803   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
5804   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5805     std::string SelectorName
5806       = (llvm::Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
5807     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5808     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5809       if (ReturnType.isNull()) {
5810         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5811         Builder.AddTextChunk("void");
5812         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5813       }
5814 
5815       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5816       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5817       Builder.AddTextChunk("NSUInteger");
5818       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5819       Builder.AddTextChunk("index");
5820       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5821                                CXCursor_ObjCInstanceMethodDecl));
5822     }
5823   }
5824 
5825   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
5826   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5827     std::string SelectorName
5828       = (llvm::Twine("remove") + UpperKey + "AtIndexes").str();
5829     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5830     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5831       if (ReturnType.isNull()) {
5832         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5833         Builder.AddTextChunk("void");
5834         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5835       }
5836 
5837       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5838       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5839       Builder.AddTextChunk("NSIndexSet *");
5840       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5841       Builder.AddTextChunk("indexes");
5842       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5843                                CXCursor_ObjCInstanceMethodDecl));
5844     }
5845   }
5846 
5847   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
5848   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5849     std::string SelectorName
5850       = (llvm::Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
5851     IdentifierInfo *SelectorIds[2] = {
5852       &Context.Idents.get(SelectorName),
5853       &Context.Idents.get("withObject")
5854     };
5855 
5856     if (!KnownMethods.count(Selectors.getSelector(2, SelectorIds))) {
5857       if (ReturnType.isNull()) {
5858         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5859         Builder.AddTextChunk("void");
5860         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5861       }
5862 
5863       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5864       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5865       Builder.AddPlaceholderChunk("NSUInteger");
5866       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5867       Builder.AddTextChunk("index");
5868       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5869       Builder.AddTypedTextChunk("withObject:");
5870       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5871       Builder.AddTextChunk("id");
5872       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5873       Builder.AddTextChunk("object");
5874       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5875                                CXCursor_ObjCInstanceMethodDecl));
5876     }
5877   }
5878 
5879   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
5880   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5881     std::string SelectorName1
5882       = (llvm::Twine("replace") + UpperKey + "AtIndexes").str();
5883     std::string SelectorName2 = (llvm::Twine("with") + UpperKey).str();
5884     IdentifierInfo *SelectorIds[2] = {
5885       &Context.Idents.get(SelectorName1),
5886       &Context.Idents.get(SelectorName2)
5887     };
5888 
5889     if (!KnownMethods.count(Selectors.getSelector(2, SelectorIds))) {
5890       if (ReturnType.isNull()) {
5891         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5892         Builder.AddTextChunk("void");
5893         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5894       }
5895 
5896       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
5897       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5898       Builder.AddPlaceholderChunk("NSIndexSet *");
5899       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5900       Builder.AddTextChunk("indexes");
5901       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5902       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
5903       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5904       Builder.AddTextChunk("NSArray *");
5905       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5906       Builder.AddTextChunk("array");
5907       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5908                                CXCursor_ObjCInstanceMethodDecl));
5909     }
5910   }
5911 
5912   // Unordered getters
5913   // - (NSEnumerator *)enumeratorOfKey
5914   if (IsInstanceMethod &&
5915       (ReturnType.isNull() ||
5916        (ReturnType->isObjCObjectPointerType() &&
5917         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
5918         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
5919           ->getName() == "NSEnumerator"))) {
5920     std::string SelectorName = (llvm::Twine("enumeratorOf") + UpperKey).str();
5921     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5922     if (!KnownMethods.count(Selectors.getNullarySelector(SelectorId))) {
5923       if (ReturnType.isNull()) {
5924         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5925         Builder.AddTextChunk("NSEnumerator *");
5926         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5927       }
5928 
5929       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
5930       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
5931                               CXCursor_ObjCInstanceMethodDecl));
5932     }
5933   }
5934 
5935   // - (type *)memberOfKey:(type *)object
5936   if (IsInstanceMethod &&
5937       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
5938     std::string SelectorName = (llvm::Twine("memberOf") + UpperKey).str();
5939     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5940     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5941       if (ReturnType.isNull()) {
5942         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5943         Builder.AddPlaceholderChunk("object-type");
5944         Builder.AddTextChunk(" *");
5945         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5946       }
5947 
5948       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5949       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5950       if (ReturnType.isNull()) {
5951         Builder.AddPlaceholderChunk("object-type");
5952         Builder.AddTextChunk(" *");
5953       } else {
5954         Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context,
5955                                                      Builder.getAllocator()));
5956       }
5957       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5958       Builder.AddTextChunk("object");
5959       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
5960                                CXCursor_ObjCInstanceMethodDecl));
5961     }
5962   }
5963 
5964   // Mutable unordered accessors
5965   // - (void)addKeyObject:(type *)object
5966   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5967     std::string SelectorName
5968       = (llvm::Twine("add") + UpperKey + llvm::Twine("Object")).str();
5969     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5970     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5971       if (ReturnType.isNull()) {
5972         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5973         Builder.AddTextChunk("void");
5974         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5975       }
5976 
5977       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5978       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5979       Builder.AddPlaceholderChunk("object-type");
5980       Builder.AddTextChunk(" *");
5981       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5982       Builder.AddTextChunk("object");
5983       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
5984                                CXCursor_ObjCInstanceMethodDecl));
5985     }
5986   }
5987 
5988   // - (void)addKey:(NSSet *)objects
5989   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5990     std::string SelectorName = (llvm::Twine("add") + UpperKey).str();
5991     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5992     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5993       if (ReturnType.isNull()) {
5994         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5995         Builder.AddTextChunk("void");
5996         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5997       }
5998 
5999       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6000       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6001       Builder.AddTextChunk("NSSet *");
6002       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6003       Builder.AddTextChunk("objects");
6004       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6005                                CXCursor_ObjCInstanceMethodDecl));
6006     }
6007   }
6008 
6009   // - (void)removeKeyObject:(type *)object
6010   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6011     std::string SelectorName
6012       = (llvm::Twine("remove") + UpperKey + llvm::Twine("Object")).str();
6013     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6014     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
6015       if (ReturnType.isNull()) {
6016         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6017         Builder.AddTextChunk("void");
6018         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6019       }
6020 
6021       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6022       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6023       Builder.AddPlaceholderChunk("object-type");
6024       Builder.AddTextChunk(" *");
6025       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6026       Builder.AddTextChunk("object");
6027       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6028                                CXCursor_ObjCInstanceMethodDecl));
6029     }
6030   }
6031 
6032   // - (void)removeKey:(NSSet *)objects
6033   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6034     std::string SelectorName = (llvm::Twine("remove") + UpperKey).str();
6035     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6036     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
6037       if (ReturnType.isNull()) {
6038         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6039         Builder.AddTextChunk("void");
6040         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6041       }
6042 
6043       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6044       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6045       Builder.AddTextChunk("NSSet *");
6046       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6047       Builder.AddTextChunk("objects");
6048       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6049                                CXCursor_ObjCInstanceMethodDecl));
6050     }
6051   }
6052 
6053   // - (void)intersectKey:(NSSet *)objects
6054   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6055     std::string SelectorName = (llvm::Twine("intersect") + UpperKey).str();
6056     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6057     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
6058       if (ReturnType.isNull()) {
6059         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6060         Builder.AddTextChunk("void");
6061         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6062       }
6063 
6064       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6065       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6066       Builder.AddTextChunk("NSSet *");
6067       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6068       Builder.AddTextChunk("objects");
6069       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6070                                CXCursor_ObjCInstanceMethodDecl));
6071     }
6072   }
6073 
6074   // Key-Value Observing
6075   // + (NSSet *)keyPathsForValuesAffectingKey
6076   if (!IsInstanceMethod &&
6077       (ReturnType.isNull() ||
6078        (ReturnType->isObjCObjectPointerType() &&
6079         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6080         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6081                                                     ->getName() == "NSSet"))) {
6082     std::string SelectorName
6083       = (llvm::Twine("keyPathsForValuesAffecting") + UpperKey).str();
6084     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6085     if (!KnownMethods.count(Selectors.getNullarySelector(SelectorId))) {
6086       if (ReturnType.isNull()) {
6087         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6088         Builder.AddTextChunk("NSSet *");
6089         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6090       }
6091 
6092       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6093       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6094                               CXCursor_ObjCInstanceMethodDecl));
6095     }
6096   }
6097 }
6098 
6099 void Sema::CodeCompleteObjCMethodDecl(Scope *S,
6100                                       bool IsInstanceMethod,
6101                                       ParsedType ReturnTy,
6102                                       Decl *IDecl) {
6103   // Determine the return type of the method we're declaring, if
6104   // provided.
6105   QualType ReturnType = GetTypeFromParser(ReturnTy);
6106 
6107   // Determine where we should start searching for methods.
6108   ObjCContainerDecl *SearchDecl = 0;
6109   bool IsInImplementation = false;
6110   if (Decl *D = IDecl) {
6111     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
6112       SearchDecl = Impl->getClassInterface();
6113       IsInImplementation = true;
6114     } else if (ObjCCategoryImplDecl *CatImpl
6115                                          = dyn_cast<ObjCCategoryImplDecl>(D)) {
6116       SearchDecl = CatImpl->getCategoryDecl();
6117       IsInImplementation = true;
6118     } else
6119       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
6120   }
6121 
6122   if (!SearchDecl && S) {
6123     if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity()))
6124       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
6125   }
6126 
6127   if (!SearchDecl) {
6128     HandleCodeCompleteResults(this, CodeCompleter,
6129                               CodeCompletionContext::CCC_Other,
6130                               0, 0);
6131     return;
6132   }
6133 
6134   // Find all of the methods that we could declare/implement here.
6135   KnownMethodsMap KnownMethods;
6136   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod,
6137                            ReturnType, KnownMethods);
6138 
6139   // Add declarations or definitions for each of the known methods.
6140   typedef CodeCompletionResult Result;
6141   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6142                         CodeCompletionContext::CCC_Other);
6143   Results.EnterNewScope();
6144   PrintingPolicy Policy(Context.PrintingPolicy);
6145   Policy.AnonymousTagLocations = false;
6146   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
6147                               MEnd = KnownMethods.end();
6148        M != MEnd; ++M) {
6149     ObjCMethodDecl *Method = M->second.first;
6150     CodeCompletionBuilder Builder(Results.getAllocator());
6151 
6152     // If the result type was not already provided, add it to the
6153     // pattern as (type).
6154     if (ReturnType.isNull())
6155       AddObjCPassingTypeChunk(Method->getResultType(), Context, Builder);
6156 
6157     Selector Sel = Method->getSelector();
6158 
6159     // Add the first part of the selector to the pattern.
6160     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6161                                                        Sel.getNameForSlot(0)));
6162 
6163     // Add parameters to the pattern.
6164     unsigned I = 0;
6165     for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
6166                                      PEnd = Method->param_end();
6167          P != PEnd; (void)++P, ++I) {
6168       // Add the part of the selector name.
6169       if (I == 0)
6170         Builder.AddTypedTextChunk(":");
6171       else if (I < Sel.getNumArgs()) {
6172         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6173         Builder.AddTypedTextChunk(
6174                 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6175       } else
6176         break;
6177 
6178       // Add the parameter type.
6179       AddObjCPassingTypeChunk((*P)->getOriginalType(), Context, Builder);
6180 
6181       if (IdentifierInfo *Id = (*P)->getIdentifier())
6182         Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName()));
6183     }
6184 
6185     if (Method->isVariadic()) {
6186       if (Method->param_size() > 0)
6187         Builder.AddChunk(CodeCompletionString::CK_Comma);
6188       Builder.AddTextChunk("...");
6189     }
6190 
6191     if (IsInImplementation && Results.includeCodePatterns()) {
6192       // We will be defining the method here, so add a compound statement.
6193       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6194       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6195       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6196       if (!Method->getResultType()->isVoidType()) {
6197         // If the result type is not void, add a return clause.
6198         Builder.AddTextChunk("return");
6199         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6200         Builder.AddPlaceholderChunk("expression");
6201         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
6202       } else
6203         Builder.AddPlaceholderChunk("statements");
6204 
6205       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6206       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6207     }
6208 
6209     unsigned Priority = CCP_CodePattern;
6210     if (!M->second.second)
6211       Priority += CCD_InBaseClass;
6212 
6213     Results.AddResult(Result(Builder.TakeString(), Priority,
6214                              Method->isInstanceMethod()
6215                                ? CXCursor_ObjCInstanceMethodDecl
6216                                : CXCursor_ObjCClassMethodDecl));
6217   }
6218 
6219   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
6220   // the properties in this class and its categories.
6221   if (Context.getLangOptions().ObjC2) {
6222     llvm::SmallVector<ObjCContainerDecl *, 4> Containers;
6223     Containers.push_back(SearchDecl);
6224 
6225     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
6226     if (!IFace)
6227       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
6228         IFace = Category->getClassInterface();
6229 
6230     if (IFace) {
6231       for (ObjCCategoryDecl *Category = IFace->getCategoryList(); Category;
6232            Category = Category->getNextClassCategory())
6233         Containers.push_back(Category);
6234     }
6235 
6236     for (unsigned I = 0, N = Containers.size(); I != N; ++I) {
6237       for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(),
6238                                          PEnd = Containers[I]->prop_end();
6239            P != PEnd; ++P) {
6240         AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context,
6241                                    KnownMethods, Results);
6242       }
6243     }
6244   }
6245 
6246   Results.ExitScope();
6247 
6248   HandleCodeCompleteResults(this, CodeCompleter,
6249                             CodeCompletionContext::CCC_Other,
6250                             Results.data(),Results.size());
6251 }
6252 
6253 void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S,
6254                                               bool IsInstanceMethod,
6255                                               bool AtParameterName,
6256                                               ParsedType ReturnTy,
6257                                               IdentifierInfo **SelIdents,
6258                                               unsigned NumSelIdents) {
6259   // If we have an external source, load the entire class method
6260   // pool from the AST file.
6261   if (ExternalSource) {
6262     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
6263          I != N; ++I) {
6264       Selector Sel = ExternalSource->GetExternalSelector(I);
6265       if (Sel.isNull() || MethodPool.count(Sel))
6266         continue;
6267 
6268       ReadMethodPool(Sel);
6269     }
6270   }
6271 
6272   // Build the set of methods we can see.
6273   typedef CodeCompletionResult Result;
6274   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6275                         CodeCompletionContext::CCC_Other);
6276 
6277   if (ReturnTy)
6278     Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType());
6279 
6280   Results.EnterNewScope();
6281   for (GlobalMethodPool::iterator M = MethodPool.begin(),
6282                                   MEnd = MethodPool.end();
6283        M != MEnd; ++M) {
6284     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first :
6285                                                        &M->second.second;
6286          MethList && MethList->Method;
6287          MethList = MethList->Next) {
6288       if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
6289                                   NumSelIdents))
6290         continue;
6291 
6292       if (AtParameterName) {
6293         // Suggest parameter names we've seen before.
6294         if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) {
6295           ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1];
6296           if (Param->getIdentifier()) {
6297             CodeCompletionBuilder Builder(Results.getAllocator());
6298             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6299                                            Param->getIdentifier()->getName()));
6300             Results.AddResult(Builder.TakeString());
6301           }
6302         }
6303 
6304         continue;
6305       }
6306 
6307       Result R(MethList->Method, 0);
6308       R.StartParameter = NumSelIdents;
6309       R.AllParametersAreInformative = false;
6310       R.DeclaringEntity = true;
6311       Results.MaybeAddResult(R, CurContext);
6312     }
6313   }
6314 
6315   Results.ExitScope();
6316   HandleCodeCompleteResults(this, CodeCompleter,
6317                             CodeCompletionContext::CCC_Other,
6318                             Results.data(),Results.size());
6319 }
6320 
6321 void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
6322   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6323                         CodeCompletionContext::CCC_PreprocessorDirective);
6324   Results.EnterNewScope();
6325 
6326   // #if <condition>
6327   CodeCompletionBuilder Builder(Results.getAllocator());
6328   Builder.AddTypedTextChunk("if");
6329   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6330   Builder.AddPlaceholderChunk("condition");
6331   Results.AddResult(Builder.TakeString());
6332 
6333   // #ifdef <macro>
6334   Builder.AddTypedTextChunk("ifdef");
6335   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6336   Builder.AddPlaceholderChunk("macro");
6337   Results.AddResult(Builder.TakeString());
6338 
6339   // #ifndef <macro>
6340   Builder.AddTypedTextChunk("ifndef");
6341   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6342   Builder.AddPlaceholderChunk("macro");
6343   Results.AddResult(Builder.TakeString());
6344 
6345   if (InConditional) {
6346     // #elif <condition>
6347     Builder.AddTypedTextChunk("elif");
6348     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6349     Builder.AddPlaceholderChunk("condition");
6350     Results.AddResult(Builder.TakeString());
6351 
6352     // #else
6353     Builder.AddTypedTextChunk("else");
6354     Results.AddResult(Builder.TakeString());
6355 
6356     // #endif
6357     Builder.AddTypedTextChunk("endif");
6358     Results.AddResult(Builder.TakeString());
6359   }
6360 
6361   // #include "header"
6362   Builder.AddTypedTextChunk("include");
6363   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6364   Builder.AddTextChunk("\"");
6365   Builder.AddPlaceholderChunk("header");
6366   Builder.AddTextChunk("\"");
6367   Results.AddResult(Builder.TakeString());
6368 
6369   // #include <header>
6370   Builder.AddTypedTextChunk("include");
6371   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6372   Builder.AddTextChunk("<");
6373   Builder.AddPlaceholderChunk("header");
6374   Builder.AddTextChunk(">");
6375   Results.AddResult(Builder.TakeString());
6376 
6377   // #define <macro>
6378   Builder.AddTypedTextChunk("define");
6379   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6380   Builder.AddPlaceholderChunk("macro");
6381   Results.AddResult(Builder.TakeString());
6382 
6383   // #define <macro>(<args>)
6384   Builder.AddTypedTextChunk("define");
6385   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6386   Builder.AddPlaceholderChunk("macro");
6387   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6388   Builder.AddPlaceholderChunk("args");
6389   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6390   Results.AddResult(Builder.TakeString());
6391 
6392   // #undef <macro>
6393   Builder.AddTypedTextChunk("undef");
6394   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6395   Builder.AddPlaceholderChunk("macro");
6396   Results.AddResult(Builder.TakeString());
6397 
6398   // #line <number>
6399   Builder.AddTypedTextChunk("line");
6400   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6401   Builder.AddPlaceholderChunk("number");
6402   Results.AddResult(Builder.TakeString());
6403 
6404   // #line <number> "filename"
6405   Builder.AddTypedTextChunk("line");
6406   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6407   Builder.AddPlaceholderChunk("number");
6408   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6409   Builder.AddTextChunk("\"");
6410   Builder.AddPlaceholderChunk("filename");
6411   Builder.AddTextChunk("\"");
6412   Results.AddResult(Builder.TakeString());
6413 
6414   // #error <message>
6415   Builder.AddTypedTextChunk("error");
6416   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6417   Builder.AddPlaceholderChunk("message");
6418   Results.AddResult(Builder.TakeString());
6419 
6420   // #pragma <arguments>
6421   Builder.AddTypedTextChunk("pragma");
6422   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6423   Builder.AddPlaceholderChunk("arguments");
6424   Results.AddResult(Builder.TakeString());
6425 
6426   if (getLangOptions().ObjC1) {
6427     // #import "header"
6428     Builder.AddTypedTextChunk("import");
6429     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6430     Builder.AddTextChunk("\"");
6431     Builder.AddPlaceholderChunk("header");
6432     Builder.AddTextChunk("\"");
6433     Results.AddResult(Builder.TakeString());
6434 
6435     // #import <header>
6436     Builder.AddTypedTextChunk("import");
6437     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6438     Builder.AddTextChunk("<");
6439     Builder.AddPlaceholderChunk("header");
6440     Builder.AddTextChunk(">");
6441     Results.AddResult(Builder.TakeString());
6442   }
6443 
6444   // #include_next "header"
6445   Builder.AddTypedTextChunk("include_next");
6446   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6447   Builder.AddTextChunk("\"");
6448   Builder.AddPlaceholderChunk("header");
6449   Builder.AddTextChunk("\"");
6450   Results.AddResult(Builder.TakeString());
6451 
6452   // #include_next <header>
6453   Builder.AddTypedTextChunk("include_next");
6454   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6455   Builder.AddTextChunk("<");
6456   Builder.AddPlaceholderChunk("header");
6457   Builder.AddTextChunk(">");
6458   Results.AddResult(Builder.TakeString());
6459 
6460   // #warning <message>
6461   Builder.AddTypedTextChunk("warning");
6462   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6463   Builder.AddPlaceholderChunk("message");
6464   Results.AddResult(Builder.TakeString());
6465 
6466   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
6467   // completions for them. And __include_macros is a Clang-internal extension
6468   // that we don't want to encourage anyone to use.
6469 
6470   // FIXME: we don't support #assert or #unassert, so don't suggest them.
6471   Results.ExitScope();
6472 
6473   HandleCodeCompleteResults(this, CodeCompleter,
6474                             CodeCompletionContext::CCC_PreprocessorDirective,
6475                             Results.data(), Results.size());
6476 }
6477 
6478 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
6479   CodeCompleteOrdinaryName(S,
6480                            S->getFnParent()? Sema::PCC_RecoveryInFunction
6481                                            : Sema::PCC_Namespace);
6482 }
6483 
6484 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
6485   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6486                         IsDefinition? CodeCompletionContext::CCC_MacroName
6487                                     : CodeCompletionContext::CCC_MacroNameUse);
6488   if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
6489     // Add just the names of macros, not their arguments.
6490     CodeCompletionBuilder Builder(Results.getAllocator());
6491     Results.EnterNewScope();
6492     for (Preprocessor::macro_iterator M = PP.macro_begin(),
6493                                    MEnd = PP.macro_end();
6494          M != MEnd; ++M) {
6495       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6496                                            M->first->getName()));
6497       Results.AddResult(Builder.TakeString());
6498     }
6499     Results.ExitScope();
6500   } else if (IsDefinition) {
6501     // FIXME: Can we detect when the user just wrote an include guard above?
6502   }
6503 
6504   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6505                             Results.data(), Results.size());
6506 }
6507 
6508 void Sema::CodeCompletePreprocessorExpression() {
6509   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6510                         CodeCompletionContext::CCC_PreprocessorExpression);
6511 
6512   if (!CodeCompleter || CodeCompleter->includeMacros())
6513     AddMacroResults(PP, Results);
6514 
6515     // defined (<macro>)
6516   Results.EnterNewScope();
6517   CodeCompletionBuilder Builder(Results.getAllocator());
6518   Builder.AddTypedTextChunk("defined");
6519   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6520   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6521   Builder.AddPlaceholderChunk("macro");
6522   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6523   Results.AddResult(Builder.TakeString());
6524   Results.ExitScope();
6525 
6526   HandleCodeCompleteResults(this, CodeCompleter,
6527                             CodeCompletionContext::CCC_PreprocessorExpression,
6528                             Results.data(), Results.size());
6529 }
6530 
6531 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
6532                                                  IdentifierInfo *Macro,
6533                                                  MacroInfo *MacroInfo,
6534                                                  unsigned Argument) {
6535   // FIXME: In the future, we could provide "overload" results, much like we
6536   // do for function calls.
6537 
6538   CodeCompleteOrdinaryName(S,
6539                            S->getFnParent()? Sema::PCC_RecoveryInFunction
6540                                            : Sema::PCC_Namespace);
6541 }
6542 
6543 void Sema::CodeCompleteNaturalLanguage() {
6544   HandleCodeCompleteResults(this, CodeCompleter,
6545                             CodeCompletionContext::CCC_NaturalLanguage,
6546                             0, 0);
6547 }
6548 
6549 void Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator,
6550                  llvm::SmallVectorImpl<CodeCompletionResult> &Results) {
6551   ResultBuilder Builder(*this, Allocator, CodeCompletionContext::CCC_Recovery);
6552   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
6553     CodeCompletionDeclConsumer Consumer(Builder,
6554                                         Context.getTranslationUnitDecl());
6555     LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName,
6556                        Consumer);
6557   }
6558 
6559   if (!CodeCompleter || CodeCompleter->includeMacros())
6560     AddMacroResults(PP, Builder);
6561 
6562   Results.clear();
6563   Results.insert(Results.end(),
6564                  Builder.data(), Builder.data() + Builder.size());
6565 }
6566