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