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