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   // Determine the type of the property we're synthesizing.
5374   QualType PropertyType = Context.getObjCIdType();
5375   if (Class) {
5376     if (ObjCPropertyDecl *Property
5377                               = Class->FindPropertyDeclaration(PropertyName)) {
5378       PropertyType
5379         = Property->getType().getNonReferenceType().getUnqualifiedType();
5380 
5381       // Give preference to ivars
5382       Results.setPreferredType(PropertyType);
5383     }
5384   }
5385 
5386   // Add all of the instance variables in this class and its superclasses.
5387   Results.EnterNewScope();
5388   bool SawSimilarlyNamedIvar = false;
5389   std::string NameWithPrefix;
5390   NameWithPrefix += '_';
5391   NameWithPrefix += PropertyName->getName().str();
5392   std::string NameWithSuffix = PropertyName->getName().str();
5393   NameWithSuffix += '_';
5394   for(; Class; Class = Class->getSuperClass()) {
5395     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
5396          Ivar = Ivar->getNextIvar()) {
5397       Results.AddResult(Result(Ivar, 0), CurContext, 0, false);
5398 
5399       // Determine whether we've seen an ivar with a name similar to the
5400       // property.
5401       if ((PropertyName == Ivar->getIdentifier() ||
5402            NameWithPrefix == Ivar->getName() ||
5403            NameWithSuffix == Ivar->getName())) {
5404         SawSimilarlyNamedIvar = true;
5405 
5406         // Reduce the priority of this result by one, to give it a slight
5407         // advantage over other results whose names don't match so closely.
5408         if (Results.size() &&
5409             Results.data()[Results.size() - 1].Kind
5410                                       == CodeCompletionResult::RK_Declaration &&
5411             Results.data()[Results.size() - 1].Declaration == Ivar)
5412           Results.data()[Results.size() - 1].Priority--;
5413       }
5414     }
5415   }
5416 
5417   if (!SawSimilarlyNamedIvar) {
5418     // Create ivar result _propName, that the user can use to synthesize
5419     // an ivar of the appropriate type.
5420     unsigned Priority = CCP_MemberDeclaration + 1;
5421     typedef CodeCompletionResult Result;
5422     CodeCompletionAllocator &Allocator = Results.getAllocator();
5423     CodeCompletionBuilder Builder(Allocator, Priority,CXAvailability_Available);
5424 
5425     Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context,
5426                                                        Allocator));
5427     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
5428     Results.AddResult(Result(Builder.TakeString(), Priority,
5429                              CXCursor_ObjCIvarDecl));
5430   }
5431 
5432   Results.ExitScope();
5433 
5434   HandleCodeCompleteResults(this, CodeCompleter,
5435                             CodeCompletionContext::CCC_Other,
5436                             Results.data(),Results.size());
5437 }
5438 
5439 // Mapping from selectors to the methods that implement that selector, along
5440 // with the "in original class" flag.
5441 typedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> >
5442   KnownMethodsMap;
5443 
5444 /// \brief Find all of the methods that reside in the given container
5445 /// (and its superclasses, protocols, etc.) that meet the given
5446 /// criteria. Insert those methods into the map of known methods,
5447 /// indexed by selector so they can be easily found.
5448 static void FindImplementableMethods(ASTContext &Context,
5449                                      ObjCContainerDecl *Container,
5450                                      bool WantInstanceMethods,
5451                                      QualType ReturnType,
5452                                      KnownMethodsMap &KnownMethods,
5453                                      bool InOriginalClass = true) {
5454   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
5455     // Recurse into protocols.
5456     const ObjCList<ObjCProtocolDecl> &Protocols
5457       = IFace->getReferencedProtocols();
5458     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5459                                               E = Protocols.end();
5460          I != E; ++I)
5461       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
5462                                KnownMethods, InOriginalClass);
5463 
5464     // Add methods from any class extensions and categories.
5465     for (const ObjCCategoryDecl *Cat = IFace->getCategoryList(); Cat;
5466          Cat = Cat->getNextClassCategory())
5467       FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat),
5468                                WantInstanceMethods, ReturnType,
5469                                KnownMethods, false);
5470 
5471     // Visit the superclass.
5472     if (IFace->getSuperClass())
5473       FindImplementableMethods(Context, IFace->getSuperClass(),
5474                                WantInstanceMethods, ReturnType,
5475                                KnownMethods, false);
5476   }
5477 
5478   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
5479     // Recurse into protocols.
5480     const ObjCList<ObjCProtocolDecl> &Protocols
5481       = Category->getReferencedProtocols();
5482     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5483                                               E = Protocols.end();
5484          I != E; ++I)
5485       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
5486                                KnownMethods, InOriginalClass);
5487 
5488     // If this category is the original class, jump to the interface.
5489     if (InOriginalClass && Category->getClassInterface())
5490       FindImplementableMethods(Context, Category->getClassInterface(),
5491                                WantInstanceMethods, ReturnType, KnownMethods,
5492                                false);
5493   }
5494 
5495   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
5496     // Recurse into protocols.
5497     const ObjCList<ObjCProtocolDecl> &Protocols
5498       = Protocol->getReferencedProtocols();
5499     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5500            E = Protocols.end();
5501          I != E; ++I)
5502       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
5503                                KnownMethods, false);
5504   }
5505 
5506   // Add methods in this container. This operation occurs last because
5507   // we want the methods from this container to override any methods
5508   // we've previously seen with the same selector.
5509   for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
5510                                        MEnd = Container->meth_end();
5511        M != MEnd; ++M) {
5512     if ((*M)->isInstanceMethod() == WantInstanceMethods) {
5513       if (!ReturnType.isNull() &&
5514           !Context.hasSameUnqualifiedType(ReturnType, (*M)->getResultType()))
5515         continue;
5516 
5517       KnownMethods[(*M)->getSelector()] = std::make_pair(*M, InOriginalClass);
5518     }
5519   }
5520 }
5521 
5522 /// \brief Add the parenthesized return or parameter type chunk to a code
5523 /// completion string.
5524 static void AddObjCPassingTypeChunk(QualType Type,
5525                                     ASTContext &Context,
5526                                     CodeCompletionBuilder &Builder) {
5527   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5528   Builder.AddTextChunk(GetCompletionTypeString(Type, Context,
5529                                                Builder.getAllocator()));
5530   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5531 }
5532 
5533 /// \brief Determine whether the given class is or inherits from a class by
5534 /// the given name.
5535 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class,
5536                                    llvm::StringRef Name) {
5537   if (!Class)
5538     return false;
5539 
5540   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
5541     return true;
5542 
5543   return InheritsFromClassNamed(Class->getSuperClass(), Name);
5544 }
5545 
5546 /// \brief Add code completions for Objective-C Key-Value Coding (KVC) and
5547 /// Key-Value Observing (KVO).
5548 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
5549                                        bool IsInstanceMethod,
5550                                        QualType ReturnType,
5551                                        ASTContext &Context,
5552                                        const KnownMethodsMap &KnownMethods,
5553                                        ResultBuilder &Results) {
5554   IdentifierInfo *PropName = Property->getIdentifier();
5555   if (!PropName || PropName->getLength() == 0)
5556     return;
5557 
5558 
5559   // Builder that will create each code completion.
5560   typedef CodeCompletionResult Result;
5561   CodeCompletionAllocator &Allocator = Results.getAllocator();
5562   CodeCompletionBuilder Builder(Allocator);
5563 
5564   // The selector table.
5565   SelectorTable &Selectors = Context.Selectors;
5566 
5567   // The property name, copied into the code completion allocation region
5568   // on demand.
5569   struct KeyHolder {
5570     CodeCompletionAllocator &Allocator;
5571     llvm::StringRef Key;
5572     const char *CopiedKey;
5573 
5574     KeyHolder(CodeCompletionAllocator &Allocator, llvm::StringRef Key)
5575     : Allocator(Allocator), Key(Key), CopiedKey(0) { }
5576 
5577     operator const char *() {
5578       if (CopiedKey)
5579         return CopiedKey;
5580 
5581       return CopiedKey = Allocator.CopyString(Key);
5582     }
5583   } Key(Allocator, PropName->getName());
5584 
5585   // The uppercased name of the property name.
5586   std::string UpperKey = PropName->getName();
5587   if (!UpperKey.empty())
5588     UpperKey[0] = toupper(UpperKey[0]);
5589 
5590   bool ReturnTypeMatchesProperty = ReturnType.isNull() ||
5591     Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
5592                                    Property->getType());
5593   bool ReturnTypeMatchesVoid
5594     = ReturnType.isNull() || ReturnType->isVoidType();
5595 
5596   // Add the normal accessor -(type)key.
5597   if (IsInstanceMethod &&
5598       !KnownMethods.count(Selectors.getNullarySelector(PropName)) &&
5599       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
5600     if (ReturnType.isNull())
5601       AddObjCPassingTypeChunk(Property->getType(), Context, Builder);
5602 
5603     Builder.AddTypedTextChunk(Key);
5604     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
5605                              CXCursor_ObjCInstanceMethodDecl));
5606   }
5607 
5608   // If we have an integral or boolean property (or the user has provided
5609   // an integral or boolean return type), add the accessor -(type)isKey.
5610   if (IsInstanceMethod &&
5611       ((!ReturnType.isNull() &&
5612         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
5613        (ReturnType.isNull() &&
5614         (Property->getType()->isIntegerType() ||
5615          Property->getType()->isBooleanType())))) {
5616     std::string SelectorName = (llvm::Twine("is") + UpperKey).str();
5617     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5618     if (!KnownMethods.count(Selectors.getNullarySelector(SelectorId))) {
5619       if (ReturnType.isNull()) {
5620         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5621         Builder.AddTextChunk("BOOL");
5622         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5623       }
5624 
5625       Builder.AddTypedTextChunk(
5626                                 Allocator.CopyString(SelectorId->getName()));
5627       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
5628                                CXCursor_ObjCInstanceMethodDecl));
5629     }
5630   }
5631 
5632   // Add the normal mutator.
5633   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
5634       !Property->getSetterMethodDecl()) {
5635     std::string SelectorName = (llvm::Twine("set") + UpperKey).str();
5636     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5637     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5638       if (ReturnType.isNull()) {
5639         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5640         Builder.AddTextChunk("void");
5641         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5642       }
5643 
5644       Builder.AddTypedTextChunk(
5645                                 Allocator.CopyString(SelectorId->getName()));
5646       Builder.AddTypedTextChunk(":");
5647       AddObjCPassingTypeChunk(Property->getType(), Context, Builder);
5648       Builder.AddTextChunk(Key);
5649       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
5650                                CXCursor_ObjCInstanceMethodDecl));
5651     }
5652   }
5653 
5654   // Indexed and unordered accessors
5655   unsigned IndexedGetterPriority = CCP_CodePattern;
5656   unsigned IndexedSetterPriority = CCP_CodePattern;
5657   unsigned UnorderedGetterPriority = CCP_CodePattern;
5658   unsigned UnorderedSetterPriority = CCP_CodePattern;
5659   if (const ObjCObjectPointerType *ObjCPointer
5660                     = Property->getType()->getAs<ObjCObjectPointerType>()) {
5661     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
5662       // If this interface type is not provably derived from a known
5663       // collection, penalize the corresponding completions.
5664       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
5665         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
5666         if (!InheritsFromClassNamed(IFace, "NSArray"))
5667           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
5668       }
5669 
5670       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
5671         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
5672         if (!InheritsFromClassNamed(IFace, "NSSet"))
5673           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
5674       }
5675     }
5676   } else {
5677     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
5678     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
5679     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
5680     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
5681   }
5682 
5683   // Add -(NSUInteger)countOf<key>
5684   if (IsInstanceMethod &&
5685       (ReturnType.isNull() || ReturnType->isIntegerType())) {
5686     std::string SelectorName = (llvm::Twine("countOf") + UpperKey).str();
5687     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5688     if (!KnownMethods.count(Selectors.getNullarySelector(SelectorId))) {
5689       if (ReturnType.isNull()) {
5690         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5691         Builder.AddTextChunk("NSUInteger");
5692         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5693       }
5694 
5695       Builder.AddTypedTextChunk(
5696                                 Allocator.CopyString(SelectorId->getName()));
5697       Results.AddResult(Result(Builder.TakeString(),
5698                                std::min(IndexedGetterPriority,
5699                                         UnorderedGetterPriority),
5700                                CXCursor_ObjCInstanceMethodDecl));
5701     }
5702   }
5703 
5704   // Indexed getters
5705   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
5706   if (IsInstanceMethod &&
5707       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
5708     std::string SelectorName
5709       = (llvm::Twine("objectIn") + UpperKey + "AtIndex").str();
5710     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5711     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5712       if (ReturnType.isNull()) {
5713         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5714         Builder.AddTextChunk("id");
5715         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5716       }
5717 
5718       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5719       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5720       Builder.AddTextChunk("NSUInteger");
5721       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5722       Builder.AddTextChunk("index");
5723       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
5724                                CXCursor_ObjCInstanceMethodDecl));
5725     }
5726   }
5727 
5728   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
5729   if (IsInstanceMethod &&
5730       (ReturnType.isNull() ||
5731        (ReturnType->isObjCObjectPointerType() &&
5732         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
5733         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
5734                                                 ->getName() == "NSArray"))) {
5735     std::string SelectorName
5736       = (llvm::Twine(Property->getName()) + "AtIndexes").str();
5737     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5738     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5739       if (ReturnType.isNull()) {
5740         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5741         Builder.AddTextChunk("NSArray *");
5742         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5743       }
5744 
5745       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5746       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5747       Builder.AddTextChunk("NSIndexSet *");
5748       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5749       Builder.AddTextChunk("indexes");
5750       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
5751                                CXCursor_ObjCInstanceMethodDecl));
5752     }
5753   }
5754 
5755   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
5756   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5757     std::string SelectorName = (llvm::Twine("get") + UpperKey).str();
5758     IdentifierInfo *SelectorIds[2] = {
5759       &Context.Idents.get(SelectorName),
5760       &Context.Idents.get("range")
5761     };
5762 
5763     if (!KnownMethods.count(Selectors.getSelector(2, SelectorIds))) {
5764       if (ReturnType.isNull()) {
5765         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5766         Builder.AddTextChunk("void");
5767         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5768       }
5769 
5770       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5771       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5772       Builder.AddPlaceholderChunk("object-type");
5773       Builder.AddTextChunk(" **");
5774       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5775       Builder.AddTextChunk("buffer");
5776       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5777       Builder.AddTypedTextChunk("range:");
5778       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5779       Builder.AddTextChunk("NSRange");
5780       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5781       Builder.AddTextChunk("inRange");
5782       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
5783                                CXCursor_ObjCInstanceMethodDecl));
5784     }
5785   }
5786 
5787   // Mutable indexed accessors
5788 
5789   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
5790   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5791     std::string SelectorName = (llvm::Twine("in") + UpperKey + "AtIndex").str();
5792     IdentifierInfo *SelectorIds[2] = {
5793       &Context.Idents.get("insertObject"),
5794       &Context.Idents.get(SelectorName)
5795     };
5796 
5797     if (!KnownMethods.count(Selectors.getSelector(2, SelectorIds))) {
5798       if (ReturnType.isNull()) {
5799         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5800         Builder.AddTextChunk("void");
5801         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5802       }
5803 
5804       Builder.AddTypedTextChunk("insertObject:");
5805       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5806       Builder.AddPlaceholderChunk("object-type");
5807       Builder.AddTextChunk(" *");
5808       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5809       Builder.AddTextChunk("object");
5810       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5811       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5812       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5813       Builder.AddPlaceholderChunk("NSUInteger");
5814       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5815       Builder.AddTextChunk("index");
5816       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5817                                CXCursor_ObjCInstanceMethodDecl));
5818     }
5819   }
5820 
5821   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
5822   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5823     std::string SelectorName = (llvm::Twine("insert") + UpperKey).str();
5824     IdentifierInfo *SelectorIds[2] = {
5825       &Context.Idents.get(SelectorName),
5826       &Context.Idents.get("atIndexes")
5827     };
5828 
5829     if (!KnownMethods.count(Selectors.getSelector(2, SelectorIds))) {
5830       if (ReturnType.isNull()) {
5831         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5832         Builder.AddTextChunk("void");
5833         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5834       }
5835 
5836       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5837       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5838       Builder.AddTextChunk("NSArray *");
5839       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5840       Builder.AddTextChunk("array");
5841       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5842       Builder.AddTypedTextChunk("atIndexes:");
5843       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5844       Builder.AddPlaceholderChunk("NSIndexSet *");
5845       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5846       Builder.AddTextChunk("indexes");
5847       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5848                                CXCursor_ObjCInstanceMethodDecl));
5849     }
5850   }
5851 
5852   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
5853   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5854     std::string SelectorName
5855       = (llvm::Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
5856     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5857     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5858       if (ReturnType.isNull()) {
5859         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5860         Builder.AddTextChunk("void");
5861         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5862       }
5863 
5864       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5865       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5866       Builder.AddTextChunk("NSUInteger");
5867       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5868       Builder.AddTextChunk("index");
5869       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5870                                CXCursor_ObjCInstanceMethodDecl));
5871     }
5872   }
5873 
5874   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
5875   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5876     std::string SelectorName
5877       = (llvm::Twine("remove") + UpperKey + "AtIndexes").str();
5878     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5879     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5880       if (ReturnType.isNull()) {
5881         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5882         Builder.AddTextChunk("void");
5883         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5884       }
5885 
5886       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5887       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5888       Builder.AddTextChunk("NSIndexSet *");
5889       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5890       Builder.AddTextChunk("indexes");
5891       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5892                                CXCursor_ObjCInstanceMethodDecl));
5893     }
5894   }
5895 
5896   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
5897   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5898     std::string SelectorName
5899       = (llvm::Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
5900     IdentifierInfo *SelectorIds[2] = {
5901       &Context.Idents.get(SelectorName),
5902       &Context.Idents.get("withObject")
5903     };
5904 
5905     if (!KnownMethods.count(Selectors.getSelector(2, SelectorIds))) {
5906       if (ReturnType.isNull()) {
5907         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5908         Builder.AddTextChunk("void");
5909         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5910       }
5911 
5912       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5913       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5914       Builder.AddPlaceholderChunk("NSUInteger");
5915       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5916       Builder.AddTextChunk("index");
5917       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5918       Builder.AddTypedTextChunk("withObject:");
5919       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5920       Builder.AddTextChunk("id");
5921       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5922       Builder.AddTextChunk("object");
5923       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5924                                CXCursor_ObjCInstanceMethodDecl));
5925     }
5926   }
5927 
5928   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
5929   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
5930     std::string SelectorName1
5931       = (llvm::Twine("replace") + UpperKey + "AtIndexes").str();
5932     std::string SelectorName2 = (llvm::Twine("with") + UpperKey).str();
5933     IdentifierInfo *SelectorIds[2] = {
5934       &Context.Idents.get(SelectorName1),
5935       &Context.Idents.get(SelectorName2)
5936     };
5937 
5938     if (!KnownMethods.count(Selectors.getSelector(2, SelectorIds))) {
5939       if (ReturnType.isNull()) {
5940         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5941         Builder.AddTextChunk("void");
5942         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5943       }
5944 
5945       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
5946       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5947       Builder.AddPlaceholderChunk("NSIndexSet *");
5948       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5949       Builder.AddTextChunk("indexes");
5950       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5951       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
5952       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5953       Builder.AddTextChunk("NSArray *");
5954       Builder.AddChunk(CodeCompletionString::CK_RightParen);
5955       Builder.AddTextChunk("array");
5956       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
5957                                CXCursor_ObjCInstanceMethodDecl));
5958     }
5959   }
5960 
5961   // Unordered getters
5962   // - (NSEnumerator *)enumeratorOfKey
5963   if (IsInstanceMethod &&
5964       (ReturnType.isNull() ||
5965        (ReturnType->isObjCObjectPointerType() &&
5966         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
5967         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
5968           ->getName() == "NSEnumerator"))) {
5969     std::string SelectorName = (llvm::Twine("enumeratorOf") + UpperKey).str();
5970     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5971     if (!KnownMethods.count(Selectors.getNullarySelector(SelectorId))) {
5972       if (ReturnType.isNull()) {
5973         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5974         Builder.AddTextChunk("NSEnumerator *");
5975         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5976       }
5977 
5978       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
5979       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
5980                               CXCursor_ObjCInstanceMethodDecl));
5981     }
5982   }
5983 
5984   // - (type *)memberOfKey:(type *)object
5985   if (IsInstanceMethod &&
5986       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
5987     std::string SelectorName = (llvm::Twine("memberOf") + UpperKey).str();
5988     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
5989     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
5990       if (ReturnType.isNull()) {
5991         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5992         Builder.AddPlaceholderChunk("object-type");
5993         Builder.AddTextChunk(" *");
5994         Builder.AddChunk(CodeCompletionString::CK_RightParen);
5995       }
5996 
5997       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
5998       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5999       if (ReturnType.isNull()) {
6000         Builder.AddPlaceholderChunk("object-type");
6001         Builder.AddTextChunk(" *");
6002       } else {
6003         Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context,
6004                                                      Builder.getAllocator()));
6005       }
6006       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6007       Builder.AddTextChunk("object");
6008       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
6009                                CXCursor_ObjCInstanceMethodDecl));
6010     }
6011   }
6012 
6013   // Mutable unordered accessors
6014   // - (void)addKeyObject:(type *)object
6015   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6016     std::string SelectorName
6017       = (llvm::Twine("add") + UpperKey + llvm::Twine("Object")).str();
6018     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6019     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
6020       if (ReturnType.isNull()) {
6021         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6022         Builder.AddTextChunk("void");
6023         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6024       }
6025 
6026       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6027       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6028       Builder.AddPlaceholderChunk("object-type");
6029       Builder.AddTextChunk(" *");
6030       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6031       Builder.AddTextChunk("object");
6032       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6033                                CXCursor_ObjCInstanceMethodDecl));
6034     }
6035   }
6036 
6037   // - (void)addKey:(NSSet *)objects
6038   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6039     std::string SelectorName = (llvm::Twine("add") + UpperKey).str();
6040     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6041     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
6042       if (ReturnType.isNull()) {
6043         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6044         Builder.AddTextChunk("void");
6045         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6046       }
6047 
6048       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6049       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6050       Builder.AddTextChunk("NSSet *");
6051       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6052       Builder.AddTextChunk("objects");
6053       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6054                                CXCursor_ObjCInstanceMethodDecl));
6055     }
6056   }
6057 
6058   // - (void)removeKeyObject:(type *)object
6059   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6060     std::string SelectorName
6061       = (llvm::Twine("remove") + UpperKey + llvm::Twine("Object")).str();
6062     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6063     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
6064       if (ReturnType.isNull()) {
6065         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6066         Builder.AddTextChunk("void");
6067         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6068       }
6069 
6070       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6071       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6072       Builder.AddPlaceholderChunk("object-type");
6073       Builder.AddTextChunk(" *");
6074       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6075       Builder.AddTextChunk("object");
6076       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6077                                CXCursor_ObjCInstanceMethodDecl));
6078     }
6079   }
6080 
6081   // - (void)removeKey:(NSSet *)objects
6082   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6083     std::string SelectorName = (llvm::Twine("remove") + UpperKey).str();
6084     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6085     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
6086       if (ReturnType.isNull()) {
6087         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6088         Builder.AddTextChunk("void");
6089         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6090       }
6091 
6092       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6093       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6094       Builder.AddTextChunk("NSSet *");
6095       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6096       Builder.AddTextChunk("objects");
6097       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6098                                CXCursor_ObjCInstanceMethodDecl));
6099     }
6100   }
6101 
6102   // - (void)intersectKey:(NSSet *)objects
6103   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6104     std::string SelectorName = (llvm::Twine("intersect") + UpperKey).str();
6105     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6106     if (!KnownMethods.count(Selectors.getUnarySelector(SelectorId))) {
6107       if (ReturnType.isNull()) {
6108         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6109         Builder.AddTextChunk("void");
6110         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6111       }
6112 
6113       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6114       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6115       Builder.AddTextChunk("NSSet *");
6116       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6117       Builder.AddTextChunk("objects");
6118       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6119                                CXCursor_ObjCInstanceMethodDecl));
6120     }
6121   }
6122 
6123   // Key-Value Observing
6124   // + (NSSet *)keyPathsForValuesAffectingKey
6125   if (!IsInstanceMethod &&
6126       (ReturnType.isNull() ||
6127        (ReturnType->isObjCObjectPointerType() &&
6128         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6129         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6130                                                     ->getName() == "NSSet"))) {
6131     std::string SelectorName
6132       = (llvm::Twine("keyPathsForValuesAffecting") + UpperKey).str();
6133     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6134     if (!KnownMethods.count(Selectors.getNullarySelector(SelectorId))) {
6135       if (ReturnType.isNull()) {
6136         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6137         Builder.AddTextChunk("NSSet *");
6138         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6139       }
6140 
6141       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6142       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6143                               CXCursor_ObjCInstanceMethodDecl));
6144     }
6145   }
6146 }
6147 
6148 void Sema::CodeCompleteObjCMethodDecl(Scope *S,
6149                                       bool IsInstanceMethod,
6150                                       ParsedType ReturnTy,
6151                                       Decl *IDecl) {
6152   // Determine the return type of the method we're declaring, if
6153   // provided.
6154   QualType ReturnType = GetTypeFromParser(ReturnTy);
6155 
6156   // Determine where we should start searching for methods.
6157   ObjCContainerDecl *SearchDecl = 0;
6158   bool IsInImplementation = false;
6159   if (Decl *D = IDecl) {
6160     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
6161       SearchDecl = Impl->getClassInterface();
6162       IsInImplementation = true;
6163     } else if (ObjCCategoryImplDecl *CatImpl
6164                                          = dyn_cast<ObjCCategoryImplDecl>(D)) {
6165       SearchDecl = CatImpl->getCategoryDecl();
6166       IsInImplementation = true;
6167     } else
6168       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
6169   }
6170 
6171   if (!SearchDecl && S) {
6172     if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity()))
6173       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
6174   }
6175 
6176   if (!SearchDecl) {
6177     HandleCodeCompleteResults(this, CodeCompleter,
6178                               CodeCompletionContext::CCC_Other,
6179                               0, 0);
6180     return;
6181   }
6182 
6183   // Find all of the methods that we could declare/implement here.
6184   KnownMethodsMap KnownMethods;
6185   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod,
6186                            ReturnType, KnownMethods);
6187 
6188   // Add declarations or definitions for each of the known methods.
6189   typedef CodeCompletionResult Result;
6190   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6191                         CodeCompletionContext::CCC_Other);
6192   Results.EnterNewScope();
6193   PrintingPolicy Policy(Context.PrintingPolicy);
6194   Policy.AnonymousTagLocations = false;
6195   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
6196                               MEnd = KnownMethods.end();
6197        M != MEnd; ++M) {
6198     ObjCMethodDecl *Method = M->second.first;
6199     CodeCompletionBuilder Builder(Results.getAllocator());
6200 
6201     // If the result type was not already provided, add it to the
6202     // pattern as (type).
6203     if (ReturnType.isNull())
6204       AddObjCPassingTypeChunk(Method->getResultType(), Context, Builder);
6205 
6206     Selector Sel = Method->getSelector();
6207 
6208     // Add the first part of the selector to the pattern.
6209     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6210                                                        Sel.getNameForSlot(0)));
6211 
6212     // Add parameters to the pattern.
6213     unsigned I = 0;
6214     for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
6215                                      PEnd = Method->param_end();
6216          P != PEnd; (void)++P, ++I) {
6217       // Add the part of the selector name.
6218       if (I == 0)
6219         Builder.AddTypedTextChunk(":");
6220       else if (I < Sel.getNumArgs()) {
6221         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6222         Builder.AddTypedTextChunk(
6223                 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6224       } else
6225         break;
6226 
6227       // Add the parameter type.
6228       AddObjCPassingTypeChunk((*P)->getOriginalType(), Context, Builder);
6229 
6230       if (IdentifierInfo *Id = (*P)->getIdentifier())
6231         Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName()));
6232     }
6233 
6234     if (Method->isVariadic()) {
6235       if (Method->param_size() > 0)
6236         Builder.AddChunk(CodeCompletionString::CK_Comma);
6237       Builder.AddTextChunk("...");
6238     }
6239 
6240     if (IsInImplementation && Results.includeCodePatterns()) {
6241       // We will be defining the method here, so add a compound statement.
6242       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6243       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6244       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6245       if (!Method->getResultType()->isVoidType()) {
6246         // If the result type is not void, add a return clause.
6247         Builder.AddTextChunk("return");
6248         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6249         Builder.AddPlaceholderChunk("expression");
6250         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
6251       } else
6252         Builder.AddPlaceholderChunk("statements");
6253 
6254       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6255       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6256     }
6257 
6258     unsigned Priority = CCP_CodePattern;
6259     if (!M->second.second)
6260       Priority += CCD_InBaseClass;
6261 
6262     Results.AddResult(Result(Builder.TakeString(), Priority,
6263                              Method->isInstanceMethod()
6264                                ? CXCursor_ObjCInstanceMethodDecl
6265                                : CXCursor_ObjCClassMethodDecl));
6266   }
6267 
6268   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
6269   // the properties in this class and its categories.
6270   if (Context.getLangOptions().ObjC2) {
6271     llvm::SmallVector<ObjCContainerDecl *, 4> Containers;
6272     Containers.push_back(SearchDecl);
6273 
6274     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
6275     if (!IFace)
6276       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
6277         IFace = Category->getClassInterface();
6278 
6279     if (IFace) {
6280       for (ObjCCategoryDecl *Category = IFace->getCategoryList(); Category;
6281            Category = Category->getNextClassCategory())
6282         Containers.push_back(Category);
6283     }
6284 
6285     for (unsigned I = 0, N = Containers.size(); I != N; ++I) {
6286       for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(),
6287                                          PEnd = Containers[I]->prop_end();
6288            P != PEnd; ++P) {
6289         AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context,
6290                                    KnownMethods, Results);
6291       }
6292     }
6293   }
6294 
6295   Results.ExitScope();
6296 
6297   HandleCodeCompleteResults(this, CodeCompleter,
6298                             CodeCompletionContext::CCC_Other,
6299                             Results.data(),Results.size());
6300 }
6301 
6302 void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S,
6303                                               bool IsInstanceMethod,
6304                                               bool AtParameterName,
6305                                               ParsedType ReturnTy,
6306                                               IdentifierInfo **SelIdents,
6307                                               unsigned NumSelIdents) {
6308   // If we have an external source, load the entire class method
6309   // pool from the AST file.
6310   if (ExternalSource) {
6311     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
6312          I != N; ++I) {
6313       Selector Sel = ExternalSource->GetExternalSelector(I);
6314       if (Sel.isNull() || MethodPool.count(Sel))
6315         continue;
6316 
6317       ReadMethodPool(Sel);
6318     }
6319   }
6320 
6321   // Build the set of methods we can see.
6322   typedef CodeCompletionResult Result;
6323   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6324                         CodeCompletionContext::CCC_Other);
6325 
6326   if (ReturnTy)
6327     Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType());
6328 
6329   Results.EnterNewScope();
6330   for (GlobalMethodPool::iterator M = MethodPool.begin(),
6331                                   MEnd = MethodPool.end();
6332        M != MEnd; ++M) {
6333     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first :
6334                                                        &M->second.second;
6335          MethList && MethList->Method;
6336          MethList = MethList->Next) {
6337       if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
6338                                   NumSelIdents))
6339         continue;
6340 
6341       if (AtParameterName) {
6342         // Suggest parameter names we've seen before.
6343         if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) {
6344           ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1];
6345           if (Param->getIdentifier()) {
6346             CodeCompletionBuilder Builder(Results.getAllocator());
6347             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6348                                            Param->getIdentifier()->getName()));
6349             Results.AddResult(Builder.TakeString());
6350           }
6351         }
6352 
6353         continue;
6354       }
6355 
6356       Result R(MethList->Method, 0);
6357       R.StartParameter = NumSelIdents;
6358       R.AllParametersAreInformative = false;
6359       R.DeclaringEntity = true;
6360       Results.MaybeAddResult(R, CurContext);
6361     }
6362   }
6363 
6364   Results.ExitScope();
6365   HandleCodeCompleteResults(this, CodeCompleter,
6366                             CodeCompletionContext::CCC_Other,
6367                             Results.data(),Results.size());
6368 }
6369 
6370 void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
6371   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6372                         CodeCompletionContext::CCC_PreprocessorDirective);
6373   Results.EnterNewScope();
6374 
6375   // #if <condition>
6376   CodeCompletionBuilder Builder(Results.getAllocator());
6377   Builder.AddTypedTextChunk("if");
6378   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6379   Builder.AddPlaceholderChunk("condition");
6380   Results.AddResult(Builder.TakeString());
6381 
6382   // #ifdef <macro>
6383   Builder.AddTypedTextChunk("ifdef");
6384   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6385   Builder.AddPlaceholderChunk("macro");
6386   Results.AddResult(Builder.TakeString());
6387 
6388   // #ifndef <macro>
6389   Builder.AddTypedTextChunk("ifndef");
6390   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6391   Builder.AddPlaceholderChunk("macro");
6392   Results.AddResult(Builder.TakeString());
6393 
6394   if (InConditional) {
6395     // #elif <condition>
6396     Builder.AddTypedTextChunk("elif");
6397     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6398     Builder.AddPlaceholderChunk("condition");
6399     Results.AddResult(Builder.TakeString());
6400 
6401     // #else
6402     Builder.AddTypedTextChunk("else");
6403     Results.AddResult(Builder.TakeString());
6404 
6405     // #endif
6406     Builder.AddTypedTextChunk("endif");
6407     Results.AddResult(Builder.TakeString());
6408   }
6409 
6410   // #include "header"
6411   Builder.AddTypedTextChunk("include");
6412   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6413   Builder.AddTextChunk("\"");
6414   Builder.AddPlaceholderChunk("header");
6415   Builder.AddTextChunk("\"");
6416   Results.AddResult(Builder.TakeString());
6417 
6418   // #include <header>
6419   Builder.AddTypedTextChunk("include");
6420   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6421   Builder.AddTextChunk("<");
6422   Builder.AddPlaceholderChunk("header");
6423   Builder.AddTextChunk(">");
6424   Results.AddResult(Builder.TakeString());
6425 
6426   // #define <macro>
6427   Builder.AddTypedTextChunk("define");
6428   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6429   Builder.AddPlaceholderChunk("macro");
6430   Results.AddResult(Builder.TakeString());
6431 
6432   // #define <macro>(<args>)
6433   Builder.AddTypedTextChunk("define");
6434   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6435   Builder.AddPlaceholderChunk("macro");
6436   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6437   Builder.AddPlaceholderChunk("args");
6438   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6439   Results.AddResult(Builder.TakeString());
6440 
6441   // #undef <macro>
6442   Builder.AddTypedTextChunk("undef");
6443   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6444   Builder.AddPlaceholderChunk("macro");
6445   Results.AddResult(Builder.TakeString());
6446 
6447   // #line <number>
6448   Builder.AddTypedTextChunk("line");
6449   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6450   Builder.AddPlaceholderChunk("number");
6451   Results.AddResult(Builder.TakeString());
6452 
6453   // #line <number> "filename"
6454   Builder.AddTypedTextChunk("line");
6455   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6456   Builder.AddPlaceholderChunk("number");
6457   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6458   Builder.AddTextChunk("\"");
6459   Builder.AddPlaceholderChunk("filename");
6460   Builder.AddTextChunk("\"");
6461   Results.AddResult(Builder.TakeString());
6462 
6463   // #error <message>
6464   Builder.AddTypedTextChunk("error");
6465   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6466   Builder.AddPlaceholderChunk("message");
6467   Results.AddResult(Builder.TakeString());
6468 
6469   // #pragma <arguments>
6470   Builder.AddTypedTextChunk("pragma");
6471   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6472   Builder.AddPlaceholderChunk("arguments");
6473   Results.AddResult(Builder.TakeString());
6474 
6475   if (getLangOptions().ObjC1) {
6476     // #import "header"
6477     Builder.AddTypedTextChunk("import");
6478     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6479     Builder.AddTextChunk("\"");
6480     Builder.AddPlaceholderChunk("header");
6481     Builder.AddTextChunk("\"");
6482     Results.AddResult(Builder.TakeString());
6483 
6484     // #import <header>
6485     Builder.AddTypedTextChunk("import");
6486     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6487     Builder.AddTextChunk("<");
6488     Builder.AddPlaceholderChunk("header");
6489     Builder.AddTextChunk(">");
6490     Results.AddResult(Builder.TakeString());
6491   }
6492 
6493   // #include_next "header"
6494   Builder.AddTypedTextChunk("include_next");
6495   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6496   Builder.AddTextChunk("\"");
6497   Builder.AddPlaceholderChunk("header");
6498   Builder.AddTextChunk("\"");
6499   Results.AddResult(Builder.TakeString());
6500 
6501   // #include_next <header>
6502   Builder.AddTypedTextChunk("include_next");
6503   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6504   Builder.AddTextChunk("<");
6505   Builder.AddPlaceholderChunk("header");
6506   Builder.AddTextChunk(">");
6507   Results.AddResult(Builder.TakeString());
6508 
6509   // #warning <message>
6510   Builder.AddTypedTextChunk("warning");
6511   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6512   Builder.AddPlaceholderChunk("message");
6513   Results.AddResult(Builder.TakeString());
6514 
6515   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
6516   // completions for them. And __include_macros is a Clang-internal extension
6517   // that we don't want to encourage anyone to use.
6518 
6519   // FIXME: we don't support #assert or #unassert, so don't suggest them.
6520   Results.ExitScope();
6521 
6522   HandleCodeCompleteResults(this, CodeCompleter,
6523                             CodeCompletionContext::CCC_PreprocessorDirective,
6524                             Results.data(), Results.size());
6525 }
6526 
6527 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
6528   CodeCompleteOrdinaryName(S,
6529                            S->getFnParent()? Sema::PCC_RecoveryInFunction
6530                                            : Sema::PCC_Namespace);
6531 }
6532 
6533 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
6534   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6535                         IsDefinition? CodeCompletionContext::CCC_MacroName
6536                                     : CodeCompletionContext::CCC_MacroNameUse);
6537   if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
6538     // Add just the names of macros, not their arguments.
6539     CodeCompletionBuilder Builder(Results.getAllocator());
6540     Results.EnterNewScope();
6541     for (Preprocessor::macro_iterator M = PP.macro_begin(),
6542                                    MEnd = PP.macro_end();
6543          M != MEnd; ++M) {
6544       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6545                                            M->first->getName()));
6546       Results.AddResult(Builder.TakeString());
6547     }
6548     Results.ExitScope();
6549   } else if (IsDefinition) {
6550     // FIXME: Can we detect when the user just wrote an include guard above?
6551   }
6552 
6553   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6554                             Results.data(), Results.size());
6555 }
6556 
6557 void Sema::CodeCompletePreprocessorExpression() {
6558   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6559                         CodeCompletionContext::CCC_PreprocessorExpression);
6560 
6561   if (!CodeCompleter || CodeCompleter->includeMacros())
6562     AddMacroResults(PP, Results);
6563 
6564     // defined (<macro>)
6565   Results.EnterNewScope();
6566   CodeCompletionBuilder Builder(Results.getAllocator());
6567   Builder.AddTypedTextChunk("defined");
6568   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6569   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6570   Builder.AddPlaceholderChunk("macro");
6571   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6572   Results.AddResult(Builder.TakeString());
6573   Results.ExitScope();
6574 
6575   HandleCodeCompleteResults(this, CodeCompleter,
6576                             CodeCompletionContext::CCC_PreprocessorExpression,
6577                             Results.data(), Results.size());
6578 }
6579 
6580 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
6581                                                  IdentifierInfo *Macro,
6582                                                  MacroInfo *MacroInfo,
6583                                                  unsigned Argument) {
6584   // FIXME: In the future, we could provide "overload" results, much like we
6585   // do for function calls.
6586 
6587   CodeCompleteOrdinaryName(S,
6588                            S->getFnParent()? Sema::PCC_RecoveryInFunction
6589                                            : Sema::PCC_Namespace);
6590 }
6591 
6592 void Sema::CodeCompleteNaturalLanguage() {
6593   HandleCodeCompleteResults(this, CodeCompleter,
6594                             CodeCompletionContext::CCC_NaturalLanguage,
6595                             0, 0);
6596 }
6597 
6598 void Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator,
6599                  llvm::SmallVectorImpl<CodeCompletionResult> &Results) {
6600   ResultBuilder Builder(*this, Allocator, CodeCompletionContext::CCC_Recovery);
6601   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
6602     CodeCompletionDeclConsumer Consumer(Builder,
6603                                         Context.getTranslationUnitDecl());
6604     LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName,
6605                        Consumer);
6606   }
6607 
6608   if (!CodeCompleter || CodeCompleter->includeMacros())
6609     AddMacroResults(PP, Builder);
6610 
6611   Results.clear();
6612   Results.insert(Results.end(),
6613                  Builder.data(), Builder.data() + Builder.size());
6614 }
6615