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 /// \rief 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 ///
3275 /// \param IntegralConstantExpression Only permit integral constant
3276 /// expressions.
3277 void Sema::CodeCompleteExpression(Scope *S,
3278                                   const CodeCompleteExpressionData &Data) {
3279   typedef CodeCompletionResult Result;
3280   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3281                         CodeCompleter->getCodeCompletionTUInfo(),
3282                         CodeCompletionContext::CCC_Expression);
3283   if (Data.ObjCCollection)
3284     Results.setFilter(&ResultBuilder::IsObjCCollection);
3285   else if (Data.IntegralConstantExpression)
3286     Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
3287   else if (WantTypesInContext(PCC_Expression, getLangOpts()))
3288     Results.setFilter(&ResultBuilder::IsOrdinaryName);
3289   else
3290     Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
3291 
3292   if (!Data.PreferredType.isNull())
3293     Results.setPreferredType(Data.PreferredType.getNonReferenceType());
3294 
3295   // Ignore any declarations that we were told that we don't care about.
3296   for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I)
3297     Results.Ignore(Data.IgnoreDecls[I]);
3298 
3299   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3300   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3301                      CodeCompleter->includeGlobals());
3302 
3303   Results.EnterNewScope();
3304   AddOrdinaryNameResults(PCC_Expression, S, *this, Results);
3305   Results.ExitScope();
3306 
3307   bool PreferredTypeIsPointer = false;
3308   if (!Data.PreferredType.isNull())
3309     PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType()
3310       || Data.PreferredType->isMemberPointerType()
3311       || Data.PreferredType->isBlockPointerType();
3312 
3313   if (S->getFnParent() &&
3314       !Data.ObjCCollection &&
3315       !Data.IntegralConstantExpression)
3316     AddPrettyFunctionResults(PP.getLangOpts(), Results);
3317 
3318   if (CodeCompleter->includeMacros())
3319     AddMacroResults(PP, Results, PreferredTypeIsPointer);
3320   HandleCodeCompleteResults(this, CodeCompleter,
3321                 CodeCompletionContext(CodeCompletionContext::CCC_Expression,
3322                                       Data.PreferredType),
3323                             Results.data(),Results.size());
3324 }
3325 
3326 void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) {
3327   if (E.isInvalid())
3328     CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction);
3329   else if (getLangOpts().ObjC1)
3330     CodeCompleteObjCInstanceMessage(S, E.take(), 0, 0, false);
3331 }
3332 
3333 /// \brief The set of properties that have already been added, referenced by
3334 /// property name.
3335 typedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet;
3336 
3337 static void AddObjCProperties(ObjCContainerDecl *Container,
3338                               bool AllowCategories,
3339                               bool AllowNullaryMethods,
3340                               DeclContext *CurContext,
3341                               AddedPropertiesSet &AddedProperties,
3342                               ResultBuilder &Results) {
3343   typedef CodeCompletionResult Result;
3344 
3345   // Add properties in this container.
3346   for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(),
3347                                      PEnd = Container->prop_end();
3348        P != PEnd;
3349        ++P) {
3350     if (AddedProperties.insert(P->getIdentifier()))
3351       Results.MaybeAddResult(Result(&*P, 0), CurContext);
3352   }
3353 
3354   // Add nullary methods
3355   if (AllowNullaryMethods) {
3356     ASTContext &Context = Container->getASTContext();
3357     PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
3358     for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
3359                                          MEnd = Container->meth_end();
3360          M != MEnd; ++M) {
3361       if (M->getSelector().isUnarySelector())
3362         if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0))
3363           if (AddedProperties.insert(Name)) {
3364             CodeCompletionBuilder Builder(Results.getAllocator(),
3365                                           Results.getCodeCompletionTUInfo());
3366             AddResultTypeChunk(Context, Policy, &*M, Builder);
3367             Builder.AddTypedTextChunk(
3368                             Results.getAllocator().CopyString(Name->getName()));
3369 
3370             Results.MaybeAddResult(Result(Builder.TakeString(), &*M,
3371                                   CCP_MemberDeclaration + CCD_MethodAsProperty),
3372                                           CurContext);
3373           }
3374     }
3375   }
3376 
3377 
3378   // Add properties in referenced protocols.
3379   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
3380     for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(),
3381                                           PEnd = Protocol->protocol_end();
3382          P != PEnd; ++P)
3383       AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext,
3384                         AddedProperties, Results);
3385   } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){
3386     if (AllowCategories) {
3387       // Look through categories.
3388       for (ObjCCategoryDecl *Category = IFace->getCategoryList();
3389            Category; Category = Category->getNextClassCategory())
3390         AddObjCProperties(Category, AllowCategories, AllowNullaryMethods,
3391                           CurContext, AddedProperties, Results);
3392     }
3393 
3394     // Look through protocols.
3395     for (ObjCInterfaceDecl::all_protocol_iterator
3396          I = IFace->all_referenced_protocol_begin(),
3397          E = IFace->all_referenced_protocol_end(); I != E; ++I)
3398       AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext,
3399                         AddedProperties, Results);
3400 
3401     // Look in the superclass.
3402     if (IFace->getSuperClass())
3403       AddObjCProperties(IFace->getSuperClass(), AllowCategories,
3404                         AllowNullaryMethods, CurContext,
3405                         AddedProperties, Results);
3406   } else if (const ObjCCategoryDecl *Category
3407                                     = dyn_cast<ObjCCategoryDecl>(Container)) {
3408     // Look through protocols.
3409     for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(),
3410                                           PEnd = Category->protocol_end();
3411          P != PEnd; ++P)
3412       AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext,
3413                         AddedProperties, Results);
3414   }
3415 }
3416 
3417 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base,
3418                                            SourceLocation OpLoc,
3419                                            bool IsArrow) {
3420   if (!Base || !CodeCompleter)
3421     return;
3422 
3423   ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow);
3424   if (ConvertedBase.isInvalid())
3425     return;
3426   Base = ConvertedBase.get();
3427 
3428   typedef CodeCompletionResult Result;
3429 
3430   QualType BaseType = Base->getType();
3431 
3432   if (IsArrow) {
3433     if (const PointerType *Ptr = BaseType->getAs<PointerType>())
3434       BaseType = Ptr->getPointeeType();
3435     else if (BaseType->isObjCObjectPointerType())
3436       /*Do nothing*/ ;
3437     else
3438       return;
3439   }
3440 
3441   enum CodeCompletionContext::Kind contextKind;
3442 
3443   if (IsArrow) {
3444     contextKind = CodeCompletionContext::CCC_ArrowMemberAccess;
3445   }
3446   else {
3447     if (BaseType->isObjCObjectPointerType() ||
3448         BaseType->isObjCObjectOrInterfaceType()) {
3449       contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess;
3450     }
3451     else {
3452       contextKind = CodeCompletionContext::CCC_DotMemberAccess;
3453     }
3454   }
3455 
3456   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3457                         CodeCompleter->getCodeCompletionTUInfo(),
3458                   CodeCompletionContext(contextKind,
3459                                         BaseType),
3460                         &ResultBuilder::IsMember);
3461   Results.EnterNewScope();
3462   if (const RecordType *Record = BaseType->getAs<RecordType>()) {
3463     // Indicate that we are performing a member access, and the cv-qualifiers
3464     // for the base object type.
3465     Results.setObjectTypeQualifiers(BaseType.getQualifiers());
3466 
3467     // Access to a C/C++ class, struct, or union.
3468     Results.allowNestedNameSpecifiers();
3469     CodeCompletionDeclConsumer Consumer(Results, CurContext);
3470     LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer,
3471                        CodeCompleter->includeGlobals());
3472 
3473     if (getLangOpts().CPlusPlus) {
3474       if (!Results.empty()) {
3475         // The "template" keyword can follow "->" or "." in the grammar.
3476         // However, we only want to suggest the template keyword if something
3477         // is dependent.
3478         bool IsDependent = BaseType->isDependentType();
3479         if (!IsDependent) {
3480           for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent())
3481             if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) {
3482               IsDependent = Ctx->isDependentContext();
3483               break;
3484             }
3485         }
3486 
3487         if (IsDependent)
3488           Results.AddResult(Result("template"));
3489       }
3490     }
3491   } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) {
3492     // Objective-C property reference.
3493     AddedPropertiesSet AddedProperties;
3494 
3495     // Add property results based on our interface.
3496     const ObjCObjectPointerType *ObjCPtr
3497       = BaseType->getAsObjCInterfacePointerType();
3498     assert(ObjCPtr && "Non-NULL pointer guaranteed above!");
3499     AddObjCProperties(ObjCPtr->getInterfaceDecl(), true,
3500                       /*AllowNullaryMethods=*/true, CurContext,
3501                       AddedProperties, Results);
3502 
3503     // Add properties from the protocols in a qualified interface.
3504     for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(),
3505                                               E = ObjCPtr->qual_end();
3506          I != E; ++I)
3507       AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext,
3508                         AddedProperties, Results);
3509   } else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
3510              (!IsArrow && BaseType->isObjCObjectType())) {
3511     // Objective-C instance variable access.
3512     ObjCInterfaceDecl *Class = 0;
3513     if (const ObjCObjectPointerType *ObjCPtr
3514                                     = BaseType->getAs<ObjCObjectPointerType>())
3515       Class = ObjCPtr->getInterfaceDecl();
3516     else
3517       Class = BaseType->getAs<ObjCObjectType>()->getInterface();
3518 
3519     // Add all ivars from this class and its superclasses.
3520     if (Class) {
3521       CodeCompletionDeclConsumer Consumer(Results, CurContext);
3522       Results.setFilter(&ResultBuilder::IsObjCIvar);
3523       LookupVisibleDecls(Class, LookupMemberName, Consumer,
3524                          CodeCompleter->includeGlobals());
3525     }
3526   }
3527 
3528   // FIXME: How do we cope with isa?
3529 
3530   Results.ExitScope();
3531 
3532   // Hand off the results found for code completion.
3533   HandleCodeCompleteResults(this, CodeCompleter,
3534                             Results.getCompletionContext(),
3535                             Results.data(),Results.size());
3536 }
3537 
3538 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) {
3539   if (!CodeCompleter)
3540     return;
3541 
3542   typedef CodeCompletionResult Result;
3543   ResultBuilder::LookupFilter Filter = 0;
3544   enum CodeCompletionContext::Kind ContextKind
3545     = CodeCompletionContext::CCC_Other;
3546   switch ((DeclSpec::TST)TagSpec) {
3547   case DeclSpec::TST_enum:
3548     Filter = &ResultBuilder::IsEnum;
3549     ContextKind = CodeCompletionContext::CCC_EnumTag;
3550     break;
3551 
3552   case DeclSpec::TST_union:
3553     Filter = &ResultBuilder::IsUnion;
3554     ContextKind = CodeCompletionContext::CCC_UnionTag;
3555     break;
3556 
3557   case DeclSpec::TST_struct:
3558   case DeclSpec::TST_class:
3559     Filter = &ResultBuilder::IsClassOrStruct;
3560     ContextKind = CodeCompletionContext::CCC_ClassOrStructTag;
3561     break;
3562 
3563   default:
3564     llvm_unreachable("Unknown type specifier kind in CodeCompleteTag");
3565   }
3566 
3567   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3568                         CodeCompleter->getCodeCompletionTUInfo(), ContextKind);
3569   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3570 
3571   // First pass: look for tags.
3572   Results.setFilter(Filter);
3573   LookupVisibleDecls(S, LookupTagName, Consumer,
3574                      CodeCompleter->includeGlobals());
3575 
3576   if (CodeCompleter->includeGlobals()) {
3577     // Second pass: look for nested name specifiers.
3578     Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
3579     LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer);
3580   }
3581 
3582   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
3583                             Results.data(),Results.size());
3584 }
3585 
3586 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) {
3587   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3588                         CodeCompleter->getCodeCompletionTUInfo(),
3589                         CodeCompletionContext::CCC_TypeQualifiers);
3590   Results.EnterNewScope();
3591   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const))
3592     Results.AddResult("const");
3593   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile))
3594     Results.AddResult("volatile");
3595   if (getLangOpts().C99 &&
3596       !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict))
3597     Results.AddResult("restrict");
3598   Results.ExitScope();
3599   HandleCodeCompleteResults(this, CodeCompleter,
3600                             Results.getCompletionContext(),
3601                             Results.data(), Results.size());
3602 }
3603 
3604 void Sema::CodeCompleteCase(Scope *S) {
3605   if (getCurFunction()->SwitchStack.empty() || !CodeCompleter)
3606     return;
3607 
3608   SwitchStmt *Switch = getCurFunction()->SwitchStack.back();
3609   QualType type = Switch->getCond()->IgnoreImplicit()->getType();
3610   if (!type->isEnumeralType()) {
3611     CodeCompleteExpressionData Data(type);
3612     Data.IntegralConstantExpression = true;
3613     CodeCompleteExpression(S, Data);
3614     return;
3615   }
3616 
3617   // Code-complete the cases of a switch statement over an enumeration type
3618   // by providing the list of
3619   EnumDecl *Enum = type->castAs<EnumType>()->getDecl();
3620 
3621   // Determine which enumerators we have already seen in the switch statement.
3622   // FIXME: Ideally, we would also be able to look *past* the code-completion
3623   // token, in case we are code-completing in the middle of the switch and not
3624   // at the end. However, we aren't able to do so at the moment.
3625   llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen;
3626   NestedNameSpecifier *Qualifier = 0;
3627   for (SwitchCase *SC = Switch->getSwitchCaseList(); SC;
3628        SC = SC->getNextSwitchCase()) {
3629     CaseStmt *Case = dyn_cast<CaseStmt>(SC);
3630     if (!Case)
3631       continue;
3632 
3633     Expr *CaseVal = Case->getLHS()->IgnoreParenCasts();
3634     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal))
3635       if (EnumConstantDecl *Enumerator
3636             = dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
3637         // We look into the AST of the case statement to determine which
3638         // enumerator was named. Alternatively, we could compute the value of
3639         // the integral constant expression, then compare it against the
3640         // values of each enumerator. However, value-based approach would not
3641         // work as well with C++ templates where enumerators declared within a
3642         // template are type- and value-dependent.
3643         EnumeratorsSeen.insert(Enumerator);
3644 
3645         // If this is a qualified-id, keep track of the nested-name-specifier
3646         // so that we can reproduce it as part of code completion, e.g.,
3647         //
3648         //   switch (TagD.getKind()) {
3649         //     case TagDecl::TK_enum:
3650         //       break;
3651         //     case XXX
3652         //
3653         // At the XXX, our completions are TagDecl::TK_union,
3654         // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union,
3655         // TK_struct, and TK_class.
3656         Qualifier = DRE->getQualifier();
3657       }
3658   }
3659 
3660   if (getLangOpts().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) {
3661     // If there are no prior enumerators in C++, check whether we have to
3662     // qualify the names of the enumerators that we suggest, because they
3663     // may not be visible in this scope.
3664     Qualifier = getRequiredQualification(Context, CurContext, Enum);
3665   }
3666 
3667   // Add any enumerators that have not yet been mentioned.
3668   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3669                         CodeCompleter->getCodeCompletionTUInfo(),
3670                         CodeCompletionContext::CCC_Expression);
3671   Results.EnterNewScope();
3672   for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(),
3673                                   EEnd = Enum->enumerator_end();
3674        E != EEnd; ++E) {
3675     if (EnumeratorsSeen.count(&*E))
3676       continue;
3677 
3678     CodeCompletionResult R(&*E, Qualifier);
3679     R.Priority = CCP_EnumInCase;
3680     Results.AddResult(R, CurContext, 0, false);
3681   }
3682   Results.ExitScope();
3683 
3684   //We need to make sure we're setting the right context,
3685   //so only say we include macros if the code completer says we do
3686   enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other;
3687   if (CodeCompleter->includeMacros()) {
3688     AddMacroResults(PP, Results);
3689     kind = CodeCompletionContext::CCC_OtherWithMacros;
3690   }
3691 
3692   HandleCodeCompleteResults(this, CodeCompleter,
3693                             kind,
3694                             Results.data(),Results.size());
3695 }
3696 
3697 namespace {
3698   struct IsBetterOverloadCandidate {
3699     Sema &S;
3700     SourceLocation Loc;
3701 
3702   public:
3703     explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc)
3704       : S(S), Loc(Loc) { }
3705 
3706     bool
3707     operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const {
3708       return isBetterOverloadCandidate(S, X, Y, Loc);
3709     }
3710   };
3711 }
3712 
3713 static bool anyNullArguments(llvm::ArrayRef<Expr*> Args) {
3714   if (Args.size() && !Args.data())
3715     return true;
3716 
3717   for (unsigned I = 0; I != Args.size(); ++I)
3718     if (!Args[I])
3719       return true;
3720 
3721   return false;
3722 }
3723 
3724 void Sema::CodeCompleteCall(Scope *S, Expr *FnIn,
3725                             llvm::ArrayRef<Expr *> Args) {
3726   if (!CodeCompleter)
3727     return;
3728 
3729   // When we're code-completing for a call, we fall back to ordinary
3730   // name code-completion whenever we can't produce specific
3731   // results. We may want to revisit this strategy in the future,
3732   // e.g., by merging the two kinds of results.
3733 
3734   Expr *Fn = (Expr *)FnIn;
3735 
3736   // Ignore type-dependent call expressions entirely.
3737   if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) ||
3738       Expr::hasAnyTypeDependentArguments(Args)) {
3739     CodeCompleteOrdinaryName(S, PCC_Expression);
3740     return;
3741   }
3742 
3743   // Build an overload candidate set based on the functions we find.
3744   SourceLocation Loc = Fn->getExprLoc();
3745   OverloadCandidateSet CandidateSet(Loc);
3746 
3747   // FIXME: What if we're calling something that isn't a function declaration?
3748   // FIXME: What if we're calling a pseudo-destructor?
3749   // FIXME: What if we're calling a member function?
3750 
3751   typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate;
3752   SmallVector<ResultCandidate, 8> Results;
3753 
3754   Expr *NakedFn = Fn->IgnoreParenCasts();
3755   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn))
3756     AddOverloadedCallCandidates(ULE, Args, CandidateSet,
3757                                 /*PartialOverloading=*/ true);
3758   else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
3759     FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
3760     if (FDecl) {
3761       if (!getLangOpts().CPlusPlus ||
3762           !FDecl->getType()->getAs<FunctionProtoType>())
3763         Results.push_back(ResultCandidate(FDecl));
3764       else
3765         // FIXME: access?
3766         AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), Args,
3767                              CandidateSet, false, /*PartialOverloading*/true);
3768     }
3769   }
3770 
3771   QualType ParamType;
3772 
3773   if (!CandidateSet.empty()) {
3774     // Sort the overload candidate set by placing the best overloads first.
3775     std::stable_sort(CandidateSet.begin(), CandidateSet.end(),
3776                      IsBetterOverloadCandidate(*this, Loc));
3777 
3778     // Add the remaining viable overload candidates as code-completion reslults.
3779     for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(),
3780                                      CandEnd = CandidateSet.end();
3781          Cand != CandEnd; ++Cand) {
3782       if (Cand->Viable)
3783         Results.push_back(ResultCandidate(Cand->Function));
3784     }
3785 
3786     // From the viable candidates, try to determine the type of this parameter.
3787     for (unsigned I = 0, N = Results.size(); I != N; ++I) {
3788       if (const FunctionType *FType = Results[I].getFunctionType())
3789         if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType))
3790           if (Args.size() < Proto->getNumArgs()) {
3791             if (ParamType.isNull())
3792               ParamType = Proto->getArgType(Args.size());
3793             else if (!Context.hasSameUnqualifiedType(
3794                                             ParamType.getNonReferenceType(),
3795                        Proto->getArgType(Args.size()).getNonReferenceType())) {
3796               ParamType = QualType();
3797               break;
3798             }
3799           }
3800     }
3801   } else {
3802     // Try to determine the parameter type from the type of the expression
3803     // being called.
3804     QualType FunctionType = Fn->getType();
3805     if (const PointerType *Ptr = FunctionType->getAs<PointerType>())
3806       FunctionType = Ptr->getPointeeType();
3807     else if (const BlockPointerType *BlockPtr
3808                                     = FunctionType->getAs<BlockPointerType>())
3809       FunctionType = BlockPtr->getPointeeType();
3810     else if (const MemberPointerType *MemPtr
3811                                     = FunctionType->getAs<MemberPointerType>())
3812       FunctionType = MemPtr->getPointeeType();
3813 
3814     if (const FunctionProtoType *Proto
3815                                   = FunctionType->getAs<FunctionProtoType>()) {
3816       if (Args.size() < Proto->getNumArgs())
3817         ParamType = Proto->getArgType(Args.size());
3818     }
3819   }
3820 
3821   if (ParamType.isNull())
3822     CodeCompleteOrdinaryName(S, PCC_Expression);
3823   else
3824     CodeCompleteExpression(S, ParamType);
3825 
3826   if (!Results.empty())
3827     CodeCompleter->ProcessOverloadCandidates(*this, Args.size(), Results.data(),
3828                                              Results.size());
3829 }
3830 
3831 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) {
3832   ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
3833   if (!VD) {
3834     CodeCompleteOrdinaryName(S, PCC_Expression);
3835     return;
3836   }
3837 
3838   CodeCompleteExpression(S, VD->getType());
3839 }
3840 
3841 void Sema::CodeCompleteReturn(Scope *S) {
3842   QualType ResultType;
3843   if (isa<BlockDecl>(CurContext)) {
3844     if (BlockScopeInfo *BSI = getCurBlock())
3845       ResultType = BSI->ReturnType;
3846   } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext))
3847     ResultType = Function->getResultType();
3848   else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext))
3849     ResultType = Method->getResultType();
3850 
3851   if (ResultType.isNull())
3852     CodeCompleteOrdinaryName(S, PCC_Expression);
3853   else
3854     CodeCompleteExpression(S, ResultType);
3855 }
3856 
3857 void Sema::CodeCompleteAfterIf(Scope *S) {
3858   typedef CodeCompletionResult Result;
3859   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3860                         CodeCompleter->getCodeCompletionTUInfo(),
3861                         mapCodeCompletionContext(*this, PCC_Statement));
3862   Results.setFilter(&ResultBuilder::IsOrdinaryName);
3863   Results.EnterNewScope();
3864 
3865   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3866   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3867                      CodeCompleter->includeGlobals());
3868 
3869   AddOrdinaryNameResults(PCC_Statement, S, *this, Results);
3870 
3871   // "else" block
3872   CodeCompletionBuilder Builder(Results.getAllocator(),
3873                                 Results.getCodeCompletionTUInfo());
3874   Builder.AddTypedTextChunk("else");
3875   if (Results.includeCodePatterns()) {
3876     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3877     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
3878     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
3879     Builder.AddPlaceholderChunk("statements");
3880     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
3881     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
3882   }
3883   Results.AddResult(Builder.TakeString());
3884 
3885   // "else if" block
3886   Builder.AddTypedTextChunk("else");
3887   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3888   Builder.AddTextChunk("if");
3889   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3890   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
3891   if (getLangOpts().CPlusPlus)
3892     Builder.AddPlaceholderChunk("condition");
3893   else
3894     Builder.AddPlaceholderChunk("expression");
3895   Builder.AddChunk(CodeCompletionString::CK_RightParen);
3896   if (Results.includeCodePatterns()) {
3897     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3898     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
3899     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
3900     Builder.AddPlaceholderChunk("statements");
3901     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
3902     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
3903   }
3904   Results.AddResult(Builder.TakeString());
3905 
3906   Results.ExitScope();
3907 
3908   if (S->getFnParent())
3909     AddPrettyFunctionResults(PP.getLangOpts(), Results);
3910 
3911   if (CodeCompleter->includeMacros())
3912     AddMacroResults(PP, Results);
3913 
3914   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
3915                             Results.data(),Results.size());
3916 }
3917 
3918 void Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) {
3919   if (LHS)
3920     CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType());
3921   else
3922     CodeCompleteOrdinaryName(S, PCC_Expression);
3923 }
3924 
3925 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
3926                                    bool EnteringContext) {
3927   if (!SS.getScopeRep() || !CodeCompleter)
3928     return;
3929 
3930   DeclContext *Ctx = computeDeclContext(SS, EnteringContext);
3931   if (!Ctx)
3932     return;
3933 
3934   // Try to instantiate any non-dependent declaration contexts before
3935   // we look in them.
3936   if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx))
3937     return;
3938 
3939   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3940                         CodeCompleter->getCodeCompletionTUInfo(),
3941                         CodeCompletionContext::CCC_Name);
3942   Results.EnterNewScope();
3943 
3944   // The "template" keyword can follow "::" in the grammar, but only
3945   // put it into the grammar if the nested-name-specifier is dependent.
3946   NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep();
3947   if (!Results.empty() && NNS->isDependent())
3948     Results.AddResult("template");
3949 
3950   // Add calls to overridden virtual functions, if there are any.
3951   //
3952   // FIXME: This isn't wonderful, because we don't know whether we're actually
3953   // in a context that permits expressions. This is a general issue with
3954   // qualified-id completions.
3955   if (!EnteringContext)
3956     MaybeAddOverrideCalls(*this, Ctx, Results);
3957   Results.ExitScope();
3958 
3959   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3960   LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer);
3961 
3962   HandleCodeCompleteResults(this, CodeCompleter,
3963                             Results.getCompletionContext(),
3964                             Results.data(),Results.size());
3965 }
3966 
3967 void Sema::CodeCompleteUsing(Scope *S) {
3968   if (!CodeCompleter)
3969     return;
3970 
3971   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
3972                         CodeCompleter->getCodeCompletionTUInfo(),
3973                         CodeCompletionContext::CCC_PotentiallyQualifiedName,
3974                         &ResultBuilder::IsNestedNameSpecifier);
3975   Results.EnterNewScope();
3976 
3977   // If we aren't in class scope, we could see the "namespace" keyword.
3978   if (!S->isClassScope())
3979     Results.AddResult(CodeCompletionResult("namespace"));
3980 
3981   // After "using", we can see anything that would start a
3982   // nested-name-specifier.
3983   CodeCompletionDeclConsumer Consumer(Results, CurContext);
3984   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
3985                      CodeCompleter->includeGlobals());
3986   Results.ExitScope();
3987 
3988   HandleCodeCompleteResults(this, CodeCompleter,
3989                             CodeCompletionContext::CCC_PotentiallyQualifiedName,
3990                             Results.data(),Results.size());
3991 }
3992 
3993 void Sema::CodeCompleteUsingDirective(Scope *S) {
3994   if (!CodeCompleter)
3995     return;
3996 
3997   // After "using namespace", we expect to see a namespace name or namespace
3998   // alias.
3999   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4000                         CodeCompleter->getCodeCompletionTUInfo(),
4001                         CodeCompletionContext::CCC_Namespace,
4002                         &ResultBuilder::IsNamespaceOrAlias);
4003   Results.EnterNewScope();
4004   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4005   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4006                      CodeCompleter->includeGlobals());
4007   Results.ExitScope();
4008   HandleCodeCompleteResults(this, CodeCompleter,
4009                             CodeCompletionContext::CCC_Namespace,
4010                             Results.data(),Results.size());
4011 }
4012 
4013 void Sema::CodeCompleteNamespaceDecl(Scope *S)  {
4014   if (!CodeCompleter)
4015     return;
4016 
4017   DeclContext *Ctx = (DeclContext *)S->getEntity();
4018   if (!S->getParent())
4019     Ctx = Context.getTranslationUnitDecl();
4020 
4021   bool SuppressedGlobalResults
4022     = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
4023 
4024   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4025                         CodeCompleter->getCodeCompletionTUInfo(),
4026                         SuppressedGlobalResults
4027                           ? CodeCompletionContext::CCC_Namespace
4028                           : CodeCompletionContext::CCC_Other,
4029                         &ResultBuilder::IsNamespace);
4030 
4031   if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
4032     // We only want to see those namespaces that have already been defined
4033     // within this scope, because its likely that the user is creating an
4034     // extended namespace declaration. Keep track of the most recent
4035     // definition of each namespace.
4036     std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
4037     for (DeclContext::specific_decl_iterator<NamespaceDecl>
4038          NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end());
4039          NS != NSEnd; ++NS)
4040       OrigToLatest[NS->getOriginalNamespace()] = &*NS;
4041 
4042     // Add the most recent definition (or extended definition) of each
4043     // namespace to the list of results.
4044     Results.EnterNewScope();
4045     for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
4046               NS = OrigToLatest.begin(),
4047            NSEnd = OrigToLatest.end();
4048          NS != NSEnd; ++NS)
4049       Results.AddResult(CodeCompletionResult(NS->second, 0),
4050                         CurContext, 0, false);
4051     Results.ExitScope();
4052   }
4053 
4054   HandleCodeCompleteResults(this, CodeCompleter,
4055                             Results.getCompletionContext(),
4056                             Results.data(),Results.size());
4057 }
4058 
4059 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S)  {
4060   if (!CodeCompleter)
4061     return;
4062 
4063   // After "namespace", we expect to see a namespace or alias.
4064   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4065                         CodeCompleter->getCodeCompletionTUInfo(),
4066                         CodeCompletionContext::CCC_Namespace,
4067                         &ResultBuilder::IsNamespaceOrAlias);
4068   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4069   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4070                      CodeCompleter->includeGlobals());
4071   HandleCodeCompleteResults(this, CodeCompleter,
4072                             Results.getCompletionContext(),
4073                             Results.data(),Results.size());
4074 }
4075 
4076 void Sema::CodeCompleteOperatorName(Scope *S) {
4077   if (!CodeCompleter)
4078     return;
4079 
4080   typedef CodeCompletionResult Result;
4081   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4082                         CodeCompleter->getCodeCompletionTUInfo(),
4083                         CodeCompletionContext::CCC_Type,
4084                         &ResultBuilder::IsType);
4085   Results.EnterNewScope();
4086 
4087   // Add the names of overloadable operators.
4088 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly)      \
4089   if (std::strcmp(Spelling, "?"))                                                  \
4090     Results.AddResult(Result(Spelling));
4091 #include "clang/Basic/OperatorKinds.def"
4092 
4093   // Add any type names visible from the current scope
4094   Results.allowNestedNameSpecifiers();
4095   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4096   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4097                      CodeCompleter->includeGlobals());
4098 
4099   // Add any type specifiers
4100   AddTypeSpecifierResults(getLangOpts(), Results);
4101   Results.ExitScope();
4102 
4103   HandleCodeCompleteResults(this, CodeCompleter,
4104                             CodeCompletionContext::CCC_Type,
4105                             Results.data(),Results.size());
4106 }
4107 
4108 void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,
4109                                               CXXCtorInitializer** Initializers,
4110                                               unsigned NumInitializers) {
4111   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
4112   CXXConstructorDecl *Constructor
4113     = static_cast<CXXConstructorDecl *>(ConstructorD);
4114   if (!Constructor)
4115     return;
4116 
4117   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4118                         CodeCompleter->getCodeCompletionTUInfo(),
4119                         CodeCompletionContext::CCC_PotentiallyQualifiedName);
4120   Results.EnterNewScope();
4121 
4122   // Fill in any already-initialized fields or base classes.
4123   llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
4124   llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
4125   for (unsigned I = 0; I != NumInitializers; ++I) {
4126     if (Initializers[I]->isBaseInitializer())
4127       InitializedBases.insert(
4128         Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0)));
4129     else
4130       InitializedFields.insert(cast<FieldDecl>(
4131                                Initializers[I]->getAnyMember()));
4132   }
4133 
4134   // Add completions for base classes.
4135   CodeCompletionBuilder Builder(Results.getAllocator(),
4136                                 Results.getCodeCompletionTUInfo());
4137   bool SawLastInitializer = (NumInitializers == 0);
4138   CXXRecordDecl *ClassDecl = Constructor->getParent();
4139   for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(),
4140                                        BaseEnd = ClassDecl->bases_end();
4141        Base != BaseEnd; ++Base) {
4142     if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {
4143       SawLastInitializer
4144         = NumInitializers > 0 &&
4145           Initializers[NumInitializers - 1]->isBaseInitializer() &&
4146           Context.hasSameUnqualifiedType(Base->getType(),
4147                QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0));
4148       continue;
4149     }
4150 
4151     Builder.AddTypedTextChunk(
4152                Results.getAllocator().CopyString(
4153                           Base->getType().getAsString(Policy)));
4154     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4155     Builder.AddPlaceholderChunk("args");
4156     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4157     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4158                                    SawLastInitializer? CCP_NextInitializer
4159                                                      : CCP_MemberDeclaration));
4160     SawLastInitializer = false;
4161   }
4162 
4163   // Add completions for virtual base classes.
4164   for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(),
4165                                        BaseEnd = ClassDecl->vbases_end();
4166        Base != BaseEnd; ++Base) {
4167     if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {
4168       SawLastInitializer
4169         = NumInitializers > 0 &&
4170           Initializers[NumInitializers - 1]->isBaseInitializer() &&
4171           Context.hasSameUnqualifiedType(Base->getType(),
4172                QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0));
4173       continue;
4174     }
4175 
4176     Builder.AddTypedTextChunk(
4177                Builder.getAllocator().CopyString(
4178                           Base->getType().getAsString(Policy)));
4179     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4180     Builder.AddPlaceholderChunk("args");
4181     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4182     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4183                                    SawLastInitializer? CCP_NextInitializer
4184                                                      : CCP_MemberDeclaration));
4185     SawLastInitializer = false;
4186   }
4187 
4188   // Add completions for members.
4189   for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
4190                                   FieldEnd = ClassDecl->field_end();
4191        Field != FieldEnd; ++Field) {
4192     if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) {
4193       SawLastInitializer
4194         = NumInitializers > 0 &&
4195           Initializers[NumInitializers - 1]->isAnyMemberInitializer() &&
4196           Initializers[NumInitializers - 1]->getAnyMember() == &*Field;
4197       continue;
4198     }
4199 
4200     if (!Field->getDeclName())
4201       continue;
4202 
4203     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
4204                                          Field->getIdentifier()->getName()));
4205     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4206     Builder.AddPlaceholderChunk("args");
4207     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4208     Results.AddResult(CodeCompletionResult(Builder.TakeString(),
4209                                    SawLastInitializer? CCP_NextInitializer
4210                                                      : CCP_MemberDeclaration,
4211                                            CXCursor_MemberRef,
4212                                            CXAvailability_Available,
4213                                            &*Field));
4214     SawLastInitializer = false;
4215   }
4216   Results.ExitScope();
4217 
4218   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4219                             Results.data(), Results.size());
4220 }
4221 
4222 /// \brief Determine whether this scope denotes a namespace.
4223 static bool isNamespaceScope(Scope *S) {
4224   DeclContext *DC = static_cast<DeclContext *>(S->getEntity());
4225   if (!DC)
4226     return false;
4227 
4228   return DC->isFileContext();
4229 }
4230 
4231 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro,
4232                                         bool AfterAmpersand) {
4233   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4234                         CodeCompleter->getCodeCompletionTUInfo(),
4235                         CodeCompletionContext::CCC_Other);
4236   Results.EnterNewScope();
4237 
4238   // Note what has already been captured.
4239   llvm::SmallPtrSet<IdentifierInfo *, 4> Known;
4240   bool IncludedThis = false;
4241   for (SmallVectorImpl<LambdaCapture>::iterator C = Intro.Captures.begin(),
4242                                              CEnd = Intro.Captures.end();
4243        C != CEnd; ++C) {
4244     if (C->Kind == LCK_This) {
4245       IncludedThis = true;
4246       continue;
4247     }
4248 
4249     Known.insert(C->Id);
4250   }
4251 
4252   // Look for other capturable variables.
4253   for (; S && !isNamespaceScope(S); S = S->getParent()) {
4254     for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
4255          D != DEnd; ++D) {
4256       VarDecl *Var = dyn_cast<VarDecl>(*D);
4257       if (!Var ||
4258           !Var->hasLocalStorage() ||
4259           Var->hasAttr<BlocksAttr>())
4260         continue;
4261 
4262       if (Known.insert(Var->getIdentifier()))
4263         Results.AddResult(CodeCompletionResult(Var), CurContext, 0, false);
4264     }
4265   }
4266 
4267   // Add 'this', if it would be valid.
4268   if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy)
4269     addThisCompletion(*this, Results);
4270 
4271   Results.ExitScope();
4272 
4273   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4274                             Results.data(), Results.size());
4275 }
4276 
4277 // Macro that expands to @Keyword or Keyword, depending on whether NeedAt is
4278 // true or false.
4279 #define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) NeedAt? "@" #Keyword : #Keyword
4280 static void AddObjCImplementationResults(const LangOptions &LangOpts,
4281                                          ResultBuilder &Results,
4282                                          bool NeedAt) {
4283   typedef CodeCompletionResult Result;
4284   // Since we have an implementation, we can end it.
4285   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end)));
4286 
4287   CodeCompletionBuilder Builder(Results.getAllocator(),
4288                                 Results.getCodeCompletionTUInfo());
4289   if (LangOpts.ObjC2) {
4290     // @dynamic
4291     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,dynamic));
4292     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4293     Builder.AddPlaceholderChunk("property");
4294     Results.AddResult(Result(Builder.TakeString()));
4295 
4296     // @synthesize
4297     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synthesize));
4298     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4299     Builder.AddPlaceholderChunk("property");
4300     Results.AddResult(Result(Builder.TakeString()));
4301   }
4302 }
4303 
4304 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
4305                                     ResultBuilder &Results,
4306                                     bool NeedAt) {
4307   typedef CodeCompletionResult Result;
4308 
4309   // Since we have an interface or protocol, we can end it.
4310   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end)));
4311 
4312   if (LangOpts.ObjC2) {
4313     // @property
4314     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,property)));
4315 
4316     // @required
4317     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,required)));
4318 
4319     // @optional
4320     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,optional)));
4321   }
4322 }
4323 
4324 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
4325   typedef CodeCompletionResult Result;
4326   CodeCompletionBuilder Builder(Results.getAllocator(),
4327                                 Results.getCodeCompletionTUInfo());
4328 
4329   // @class name ;
4330   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,class));
4331   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4332   Builder.AddPlaceholderChunk("name");
4333   Results.AddResult(Result(Builder.TakeString()));
4334 
4335   if (Results.includeCodePatterns()) {
4336     // @interface name
4337     // FIXME: Could introduce the whole pattern, including superclasses and
4338     // such.
4339     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,interface));
4340     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4341     Builder.AddPlaceholderChunk("class");
4342     Results.AddResult(Result(Builder.TakeString()));
4343 
4344     // @protocol name
4345     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol));
4346     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4347     Builder.AddPlaceholderChunk("protocol");
4348     Results.AddResult(Result(Builder.TakeString()));
4349 
4350     // @implementation name
4351     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,implementation));
4352     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4353     Builder.AddPlaceholderChunk("class");
4354     Results.AddResult(Result(Builder.TakeString()));
4355   }
4356 
4357   // @compatibility_alias name
4358   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,compatibility_alias));
4359   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4360   Builder.AddPlaceholderChunk("alias");
4361   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4362   Builder.AddPlaceholderChunk("class");
4363   Results.AddResult(Result(Builder.TakeString()));
4364 }
4365 
4366 void Sema::CodeCompleteObjCAtDirective(Scope *S) {
4367   typedef CodeCompletionResult Result;
4368   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4369                         CodeCompleter->getCodeCompletionTUInfo(),
4370                         CodeCompletionContext::CCC_Other);
4371   Results.EnterNewScope();
4372   if (isa<ObjCImplDecl>(CurContext))
4373     AddObjCImplementationResults(getLangOpts(), Results, false);
4374   else if (CurContext->isObjCContainer())
4375     AddObjCInterfaceResults(getLangOpts(), Results, false);
4376   else
4377     AddObjCTopLevelResults(Results, false);
4378   Results.ExitScope();
4379   HandleCodeCompleteResults(this, CodeCompleter,
4380                             CodeCompletionContext::CCC_Other,
4381                             Results.data(),Results.size());
4382 }
4383 
4384 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
4385   typedef CodeCompletionResult Result;
4386   CodeCompletionBuilder Builder(Results.getAllocator(),
4387                                 Results.getCodeCompletionTUInfo());
4388 
4389   // @encode ( type-name )
4390   const char *EncodeType = "char[]";
4391   if (Results.getSema().getLangOpts().CPlusPlus ||
4392       Results.getSema().getLangOpts().ConstStrings)
4393     EncodeType = " const char[]";
4394   Builder.AddResultTypeChunk(EncodeType);
4395   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,encode));
4396   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4397   Builder.AddPlaceholderChunk("type-name");
4398   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4399   Results.AddResult(Result(Builder.TakeString()));
4400 
4401   // @protocol ( protocol-name )
4402   Builder.AddResultTypeChunk("Protocol *");
4403   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol));
4404   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4405   Builder.AddPlaceholderChunk("protocol-name");
4406   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4407   Results.AddResult(Result(Builder.TakeString()));
4408 
4409   // @selector ( selector )
4410   Builder.AddResultTypeChunk("SEL");
4411   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,selector));
4412   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4413   Builder.AddPlaceholderChunk("selector");
4414   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4415   Results.AddResult(Result(Builder.TakeString()));
4416 
4417   // @[ objects, ... ]
4418   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,[));
4419   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4420   Builder.AddPlaceholderChunk("objects, ...");
4421   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4422   Builder.AddChunk(CodeCompletionString::CK_RightBracket);
4423   Results.AddResult(Result(Builder.TakeString()));
4424 
4425   // @{ key : object, ... }
4426   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,{));
4427   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4428   Builder.AddPlaceholderChunk("key");
4429   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4430   Builder.AddChunk(CodeCompletionString::CK_Colon);
4431   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4432   Builder.AddPlaceholderChunk("object, ...");
4433   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4434   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4435   Results.AddResult(Result(Builder.TakeString()));
4436 }
4437 
4438 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
4439   typedef CodeCompletionResult Result;
4440   CodeCompletionBuilder Builder(Results.getAllocator(),
4441                                 Results.getCodeCompletionTUInfo());
4442 
4443   if (Results.includeCodePatterns()) {
4444     // @try { statements } @catch ( declaration ) { statements } @finally
4445     //   { statements }
4446     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try));
4447     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4448     Builder.AddPlaceholderChunk("statements");
4449     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4450     Builder.AddTextChunk("@catch");
4451     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4452     Builder.AddPlaceholderChunk("parameter");
4453     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4454     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4455     Builder.AddPlaceholderChunk("statements");
4456     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4457     Builder.AddTextChunk("@finally");
4458     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4459     Builder.AddPlaceholderChunk("statements");
4460     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4461     Results.AddResult(Result(Builder.TakeString()));
4462   }
4463 
4464   // @throw
4465   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw));
4466   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4467   Builder.AddPlaceholderChunk("expression");
4468   Results.AddResult(Result(Builder.TakeString()));
4469 
4470   if (Results.includeCodePatterns()) {
4471     // @synchronized ( expression ) { statements }
4472     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized));
4473     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4474     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4475     Builder.AddPlaceholderChunk("expression");
4476     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4477     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4478     Builder.AddPlaceholderChunk("statements");
4479     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4480     Results.AddResult(Result(Builder.TakeString()));
4481   }
4482 }
4483 
4484 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
4485                                      ResultBuilder &Results,
4486                                      bool NeedAt) {
4487   typedef CodeCompletionResult Result;
4488   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private)));
4489   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected)));
4490   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public)));
4491   if (LangOpts.ObjC2)
4492     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package)));
4493 }
4494 
4495 void Sema::CodeCompleteObjCAtVisibility(Scope *S) {
4496   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4497                         CodeCompleter->getCodeCompletionTUInfo(),
4498                         CodeCompletionContext::CCC_Other);
4499   Results.EnterNewScope();
4500   AddObjCVisibilityResults(getLangOpts(), Results, false);
4501   Results.ExitScope();
4502   HandleCodeCompleteResults(this, CodeCompleter,
4503                             CodeCompletionContext::CCC_Other,
4504                             Results.data(),Results.size());
4505 }
4506 
4507 void Sema::CodeCompleteObjCAtStatement(Scope *S) {
4508   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4509                         CodeCompleter->getCodeCompletionTUInfo(),
4510                         CodeCompletionContext::CCC_Other);
4511   Results.EnterNewScope();
4512   AddObjCStatementResults(Results, false);
4513   AddObjCExpressionResults(Results, false);
4514   Results.ExitScope();
4515   HandleCodeCompleteResults(this, CodeCompleter,
4516                             CodeCompletionContext::CCC_Other,
4517                             Results.data(),Results.size());
4518 }
4519 
4520 void Sema::CodeCompleteObjCAtExpression(Scope *S) {
4521   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4522                         CodeCompleter->getCodeCompletionTUInfo(),
4523                         CodeCompletionContext::CCC_Other);
4524   Results.EnterNewScope();
4525   AddObjCExpressionResults(Results, false);
4526   Results.ExitScope();
4527   HandleCodeCompleteResults(this, CodeCompleter,
4528                             CodeCompletionContext::CCC_Other,
4529                             Results.data(),Results.size());
4530 }
4531 
4532 /// \brief Determine whether the addition of the given flag to an Objective-C
4533 /// property's attributes will cause a conflict.
4534 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
4535   // Check if we've already added this flag.
4536   if (Attributes & NewFlag)
4537     return true;
4538 
4539   Attributes |= NewFlag;
4540 
4541   // Check for collisions with "readonly".
4542   if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
4543       (Attributes & (ObjCDeclSpec::DQ_PR_readwrite |
4544                      ObjCDeclSpec::DQ_PR_assign |
4545                      ObjCDeclSpec::DQ_PR_unsafe_unretained |
4546                      ObjCDeclSpec::DQ_PR_copy |
4547                      ObjCDeclSpec::DQ_PR_retain |
4548                      ObjCDeclSpec::DQ_PR_strong)))
4549     return true;
4550 
4551   // Check for more than one of { assign, copy, retain, strong }.
4552   unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign |
4553                                          ObjCDeclSpec::DQ_PR_unsafe_unretained |
4554                                              ObjCDeclSpec::DQ_PR_copy |
4555                                              ObjCDeclSpec::DQ_PR_retain|
4556                                              ObjCDeclSpec::DQ_PR_strong);
4557   if (AssignCopyRetMask &&
4558       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign &&
4559       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained &&
4560       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy &&
4561       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain &&
4562       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong)
4563     return true;
4564 
4565   return false;
4566 }
4567 
4568 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
4569   if (!CodeCompleter)
4570     return;
4571 
4572   unsigned Attributes = ODS.getPropertyAttributes();
4573 
4574   typedef CodeCompletionResult Result;
4575   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4576                         CodeCompleter->getCodeCompletionTUInfo(),
4577                         CodeCompletionContext::CCC_Other);
4578   Results.EnterNewScope();
4579   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly))
4580     Results.AddResult(CodeCompletionResult("readonly"));
4581   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign))
4582     Results.AddResult(CodeCompletionResult("assign"));
4583   if (!ObjCPropertyFlagConflicts(Attributes,
4584                                  ObjCDeclSpec::DQ_PR_unsafe_unretained))
4585     Results.AddResult(CodeCompletionResult("unsafe_unretained"));
4586   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite))
4587     Results.AddResult(CodeCompletionResult("readwrite"));
4588   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain))
4589     Results.AddResult(CodeCompletionResult("retain"));
4590   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong))
4591     Results.AddResult(CodeCompletionResult("strong"));
4592   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy))
4593     Results.AddResult(CodeCompletionResult("copy"));
4594   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic))
4595     Results.AddResult(CodeCompletionResult("nonatomic"));
4596   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic))
4597     Results.AddResult(CodeCompletionResult("atomic"));
4598   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) {
4599     CodeCompletionBuilder Setter(Results.getAllocator(),
4600                                  Results.getCodeCompletionTUInfo());
4601     Setter.AddTypedTextChunk("setter");
4602     Setter.AddTextChunk(" = ");
4603     Setter.AddPlaceholderChunk("method");
4604     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
4605   }
4606   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) {
4607     CodeCompletionBuilder Getter(Results.getAllocator(),
4608                                  Results.getCodeCompletionTUInfo());
4609     Getter.AddTypedTextChunk("getter");
4610     Getter.AddTextChunk(" = ");
4611     Getter.AddPlaceholderChunk("method");
4612     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
4613   }
4614   Results.ExitScope();
4615   HandleCodeCompleteResults(this, CodeCompleter,
4616                             CodeCompletionContext::CCC_Other,
4617                             Results.data(),Results.size());
4618 }
4619 
4620 /// \brief Descripts the kind of Objective-C method that we want to find
4621 /// via code completion.
4622 enum ObjCMethodKind {
4623   MK_Any, //< Any kind of method, provided it means other specified criteria.
4624   MK_ZeroArgSelector, //< Zero-argument (unary) selector.
4625   MK_OneArgSelector //< One-argument selector.
4626 };
4627 
4628 static bool isAcceptableObjCSelector(Selector Sel,
4629                                      ObjCMethodKind WantKind,
4630                                      IdentifierInfo **SelIdents,
4631                                      unsigned NumSelIdents,
4632                                      bool AllowSameLength = true) {
4633   if (NumSelIdents > Sel.getNumArgs())
4634     return false;
4635 
4636   switch (WantKind) {
4637     case MK_Any:             break;
4638     case MK_ZeroArgSelector: return Sel.isUnarySelector();
4639     case MK_OneArgSelector:  return Sel.getNumArgs() == 1;
4640   }
4641 
4642   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
4643     return false;
4644 
4645   for (unsigned I = 0; I != NumSelIdents; ++I)
4646     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
4647       return false;
4648 
4649   return true;
4650 }
4651 
4652 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
4653                                    ObjCMethodKind WantKind,
4654                                    IdentifierInfo **SelIdents,
4655                                    unsigned NumSelIdents,
4656                                    bool AllowSameLength = true) {
4657   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
4658                                   NumSelIdents, AllowSameLength);
4659 }
4660 
4661 namespace {
4662   /// \brief A set of selectors, which is used to avoid introducing multiple
4663   /// completions with the same selector into the result set.
4664   typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
4665 }
4666 
4667 /// \brief Add all of the Objective-C methods in the given Objective-C
4668 /// container to the set of results.
4669 ///
4670 /// The container will be a class, protocol, category, or implementation of
4671 /// any of the above. This mether will recurse to include methods from
4672 /// the superclasses of classes along with their categories, protocols, and
4673 /// implementations.
4674 ///
4675 /// \param Container the container in which we'll look to find methods.
4676 ///
4677 /// \param WantInstance whether to add instance methods (only); if false, this
4678 /// routine will add factory methods (only).
4679 ///
4680 /// \param CurContext the context in which we're performing the lookup that
4681 /// finds methods.
4682 ///
4683 /// \param AllowSameLength Whether we allow a method to be added to the list
4684 /// when it has the same number of parameters as we have selector identifiers.
4685 ///
4686 /// \param Results the structure into which we'll add results.
4687 static void AddObjCMethods(ObjCContainerDecl *Container,
4688                            bool WantInstanceMethods,
4689                            ObjCMethodKind WantKind,
4690                            IdentifierInfo **SelIdents,
4691                            unsigned NumSelIdents,
4692                            DeclContext *CurContext,
4693                            VisitedSelectorSet &Selectors,
4694                            bool AllowSameLength,
4695                            ResultBuilder &Results,
4696                            bool InOriginalClass = true) {
4697   typedef CodeCompletionResult Result;
4698   for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
4699                                        MEnd = Container->meth_end();
4700        M != MEnd; ++M) {
4701     if (M->isInstanceMethod() == WantInstanceMethods) {
4702       // Check whether the selector identifiers we've been given are a
4703       // subset of the identifiers for this particular method.
4704       if (!isAcceptableObjCMethod(&*M, WantKind, SelIdents, NumSelIdents,
4705                                   AllowSameLength))
4706         continue;
4707 
4708       if (!Selectors.insert(M->getSelector()))
4709         continue;
4710 
4711       Result R = Result(&*M, 0);
4712       R.StartParameter = NumSelIdents;
4713       R.AllParametersAreInformative = (WantKind != MK_Any);
4714       if (!InOriginalClass)
4715         R.Priority += CCD_InBaseClass;
4716       Results.MaybeAddResult(R, CurContext);
4717     }
4718   }
4719 
4720   // Visit the protocols of protocols.
4721   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
4722     if (Protocol->hasDefinition()) {
4723       const ObjCList<ObjCProtocolDecl> &Protocols
4724         = Protocol->getReferencedProtocols();
4725       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4726                                                 E = Protocols.end();
4727            I != E; ++I)
4728         AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,
4729                        NumSelIdents, CurContext, Selectors, AllowSameLength,
4730                        Results, false);
4731     }
4732   }
4733 
4734   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
4735   if (!IFace || !IFace->hasDefinition())
4736     return;
4737 
4738   // Add methods in protocols.
4739   for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(),
4740                                             E = IFace->protocol_end();
4741        I != E; ++I)
4742     AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents,
4743                    CurContext, Selectors, AllowSameLength, Results, false);
4744 
4745   // Add methods in categories.
4746   for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl;
4747        CatDecl = CatDecl->getNextClassCategory()) {
4748     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
4749                    NumSelIdents, CurContext, Selectors, AllowSameLength,
4750                    Results, InOriginalClass);
4751 
4752     // Add a categories protocol methods.
4753     const ObjCList<ObjCProtocolDecl> &Protocols
4754       = CatDecl->getReferencedProtocols();
4755     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4756                                               E = Protocols.end();
4757          I != E; ++I)
4758       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,
4759                      NumSelIdents, CurContext, Selectors, AllowSameLength,
4760                      Results, false);
4761 
4762     // Add methods in category implementations.
4763     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
4764       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4765                      NumSelIdents, CurContext, Selectors, AllowSameLength,
4766                      Results, InOriginalClass);
4767   }
4768 
4769   // Add methods in superclass.
4770   if (IFace->getSuperClass())
4771     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
4772                    SelIdents, NumSelIdents, CurContext, Selectors,
4773                    AllowSameLength, Results, false);
4774 
4775   // Add methods in our implementation, if any.
4776   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
4777     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4778                    NumSelIdents, CurContext, Selectors, AllowSameLength,
4779                    Results, InOriginalClass);
4780 }
4781 
4782 
4783 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) {
4784   typedef CodeCompletionResult Result;
4785 
4786   // Try to find the interface where getters might live.
4787   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
4788   if (!Class) {
4789     if (ObjCCategoryDecl *Category
4790           = dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
4791       Class = Category->getClassInterface();
4792 
4793     if (!Class)
4794       return;
4795   }
4796 
4797   // Find all of the potential getters.
4798   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4799                         CodeCompleter->getCodeCompletionTUInfo(),
4800                         CodeCompletionContext::CCC_Other);
4801   Results.EnterNewScope();
4802 
4803   VisitedSelectorSet Selectors;
4804   AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors,
4805                  /*AllowSameLength=*/true, Results);
4806   Results.ExitScope();
4807   HandleCodeCompleteResults(this, CodeCompleter,
4808                             CodeCompletionContext::CCC_Other,
4809                             Results.data(),Results.size());
4810 }
4811 
4812 void Sema::CodeCompleteObjCPropertySetter(Scope *S) {
4813   typedef CodeCompletionResult Result;
4814 
4815   // Try to find the interface where setters might live.
4816   ObjCInterfaceDecl *Class
4817     = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
4818   if (!Class) {
4819     if (ObjCCategoryDecl *Category
4820           = dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
4821       Class = Category->getClassInterface();
4822 
4823     if (!Class)
4824       return;
4825   }
4826 
4827   // Find all of the potential getters.
4828   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4829                         CodeCompleter->getCodeCompletionTUInfo(),
4830                         CodeCompletionContext::CCC_Other);
4831   Results.EnterNewScope();
4832 
4833   VisitedSelectorSet Selectors;
4834   AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext,
4835                  Selectors, /*AllowSameLength=*/true, Results);
4836 
4837   Results.ExitScope();
4838   HandleCodeCompleteResults(this, CodeCompleter,
4839                             CodeCompletionContext::CCC_Other,
4840                             Results.data(),Results.size());
4841 }
4842 
4843 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
4844                                        bool IsParameter) {
4845   typedef CodeCompletionResult Result;
4846   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4847                         CodeCompleter->getCodeCompletionTUInfo(),
4848                         CodeCompletionContext::CCC_Type);
4849   Results.EnterNewScope();
4850 
4851   // Add context-sensitive, Objective-C parameter-passing keywords.
4852   bool AddedInOut = false;
4853   if ((DS.getObjCDeclQualifier() &
4854        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
4855     Results.AddResult("in");
4856     Results.AddResult("inout");
4857     AddedInOut = true;
4858   }
4859   if ((DS.getObjCDeclQualifier() &
4860        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
4861     Results.AddResult("out");
4862     if (!AddedInOut)
4863       Results.AddResult("inout");
4864   }
4865   if ((DS.getObjCDeclQualifier() &
4866        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
4867         ObjCDeclSpec::DQ_Oneway)) == 0) {
4868      Results.AddResult("bycopy");
4869      Results.AddResult("byref");
4870      Results.AddResult("oneway");
4871   }
4872 
4873   // If we're completing the return type of an Objective-C method and the
4874   // identifier IBAction refers to a macro, provide a completion item for
4875   // an action, e.g.,
4876   //   IBAction)<#selector#>:(id)sender
4877   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
4878       Context.Idents.get("IBAction").hasMacroDefinition()) {
4879     CodeCompletionBuilder Builder(Results.getAllocator(),
4880                                   Results.getCodeCompletionTUInfo(),
4881                                   CCP_CodePattern, CXAvailability_Available);
4882     Builder.AddTypedTextChunk("IBAction");
4883     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4884     Builder.AddPlaceholderChunk("selector");
4885     Builder.AddChunk(CodeCompletionString::CK_Colon);
4886     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4887     Builder.AddTextChunk("id");
4888     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4889     Builder.AddTextChunk("sender");
4890     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
4891   }
4892 
4893   // Add various builtin type names and specifiers.
4894   AddOrdinaryNameResults(PCC_Type, S, *this, Results);
4895   Results.ExitScope();
4896 
4897   // Add the various type names
4898   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
4899   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4900   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4901                      CodeCompleter->includeGlobals());
4902 
4903   if (CodeCompleter->includeMacros())
4904     AddMacroResults(PP, Results);
4905 
4906   HandleCodeCompleteResults(this, CodeCompleter,
4907                             CodeCompletionContext::CCC_Type,
4908                             Results.data(), Results.size());
4909 }
4910 
4911 /// \brief When we have an expression with type "id", we may assume
4912 /// that it has some more-specific class type based on knowledge of
4913 /// common uses of Objective-C. This routine returns that class type,
4914 /// or NULL if no better result could be determined.
4915 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
4916   ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
4917   if (!Msg)
4918     return 0;
4919 
4920   Selector Sel = Msg->getSelector();
4921   if (Sel.isNull())
4922     return 0;
4923 
4924   IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
4925   if (!Id)
4926     return 0;
4927 
4928   ObjCMethodDecl *Method = Msg->getMethodDecl();
4929   if (!Method)
4930     return 0;
4931 
4932   // Determine the class that we're sending the message to.
4933   ObjCInterfaceDecl *IFace = 0;
4934   switch (Msg->getReceiverKind()) {
4935   case ObjCMessageExpr::Class:
4936     if (const ObjCObjectType *ObjType
4937                            = Msg->getClassReceiver()->getAs<ObjCObjectType>())
4938       IFace = ObjType->getInterface();
4939     break;
4940 
4941   case ObjCMessageExpr::Instance: {
4942     QualType T = Msg->getInstanceReceiver()->getType();
4943     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
4944       IFace = Ptr->getInterfaceDecl();
4945     break;
4946   }
4947 
4948   case ObjCMessageExpr::SuperInstance:
4949   case ObjCMessageExpr::SuperClass:
4950     break;
4951   }
4952 
4953   if (!IFace)
4954     return 0;
4955 
4956   ObjCInterfaceDecl *Super = IFace->getSuperClass();
4957   if (Method->isInstanceMethod())
4958     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
4959       .Case("retain", IFace)
4960       .Case("strong", IFace)
4961       .Case("autorelease", IFace)
4962       .Case("copy", IFace)
4963       .Case("copyWithZone", IFace)
4964       .Case("mutableCopy", IFace)
4965       .Case("mutableCopyWithZone", IFace)
4966       .Case("awakeFromCoder", IFace)
4967       .Case("replacementObjectFromCoder", IFace)
4968       .Case("class", IFace)
4969       .Case("classForCoder", IFace)
4970       .Case("superclass", Super)
4971       .Default(0);
4972 
4973   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
4974     .Case("new", IFace)
4975     .Case("alloc", IFace)
4976     .Case("allocWithZone", IFace)
4977     .Case("class", IFace)
4978     .Case("superclass", Super)
4979     .Default(0);
4980 }
4981 
4982 // Add a special completion for a message send to "super", which fills in the
4983 // most likely case of forwarding all of our arguments to the superclass
4984 // function.
4985 ///
4986 /// \param S The semantic analysis object.
4987 ///
4988 /// \param S NeedSuperKeyword Whether we need to prefix this completion with
4989 /// the "super" keyword. Otherwise, we just need to provide the arguments.
4990 ///
4991 /// \param SelIdents The identifiers in the selector that have already been
4992 /// provided as arguments for a send to "super".
4993 ///
4994 /// \param NumSelIdents The number of identifiers in \p SelIdents.
4995 ///
4996 /// \param Results The set of results to augment.
4997 ///
4998 /// \returns the Objective-C method declaration that would be invoked by
4999 /// this "super" completion. If NULL, no completion was added.
5000 static ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,
5001                                               IdentifierInfo **SelIdents,
5002                                               unsigned NumSelIdents,
5003                                               ResultBuilder &Results) {
5004   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
5005   if (!CurMethod)
5006     return 0;
5007 
5008   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
5009   if (!Class)
5010     return 0;
5011 
5012   // Try to find a superclass method with the same selector.
5013   ObjCMethodDecl *SuperMethod = 0;
5014   while ((Class = Class->getSuperClass()) && !SuperMethod) {
5015     // Check in the class
5016     SuperMethod = Class->getMethod(CurMethod->getSelector(),
5017                                    CurMethod->isInstanceMethod());
5018 
5019     // Check in categories or class extensions.
5020     if (!SuperMethod) {
5021       for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
5022            Category = Category->getNextClassCategory())
5023         if ((SuperMethod = Category->getMethod(CurMethod->getSelector(),
5024                                                CurMethod->isInstanceMethod())))
5025           break;
5026     }
5027   }
5028 
5029   if (!SuperMethod)
5030     return 0;
5031 
5032   // Check whether the superclass method has the same signature.
5033   if (CurMethod->param_size() != SuperMethod->param_size() ||
5034       CurMethod->isVariadic() != SuperMethod->isVariadic())
5035     return 0;
5036 
5037   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
5038                                    CurPEnd = CurMethod->param_end(),
5039                                     SuperP = SuperMethod->param_begin();
5040        CurP != CurPEnd; ++CurP, ++SuperP) {
5041     // Make sure the parameter types are compatible.
5042     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
5043                                           (*SuperP)->getType()))
5044       return 0;
5045 
5046     // Make sure we have a parameter name to forward!
5047     if (!(*CurP)->getIdentifier())
5048       return 0;
5049   }
5050 
5051   // We have a superclass method. Now, form the send-to-super completion.
5052   CodeCompletionBuilder Builder(Results.getAllocator(),
5053                                 Results.getCodeCompletionTUInfo());
5054 
5055   // Give this completion a return type.
5056   AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod,
5057                      Builder);
5058 
5059   // If we need the "super" keyword, add it (plus some spacing).
5060   if (NeedSuperKeyword) {
5061     Builder.AddTypedTextChunk("super");
5062     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5063   }
5064 
5065   Selector Sel = CurMethod->getSelector();
5066   if (Sel.isUnarySelector()) {
5067     if (NeedSuperKeyword)
5068       Builder.AddTextChunk(Builder.getAllocator().CopyString(
5069                                   Sel.getNameForSlot(0)));
5070     else
5071       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
5072                                    Sel.getNameForSlot(0)));
5073   } else {
5074     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
5075     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
5076       if (I > NumSelIdents)
5077         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5078 
5079       if (I < NumSelIdents)
5080         Builder.AddInformativeChunk(
5081                    Builder.getAllocator().CopyString(
5082                                                  Sel.getNameForSlot(I) + ":"));
5083       else if (NeedSuperKeyword || I > NumSelIdents) {
5084         Builder.AddTextChunk(
5085                  Builder.getAllocator().CopyString(
5086                                                   Sel.getNameForSlot(I) + ":"));
5087         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
5088                                          (*CurP)->getIdentifier()->getName()));
5089       } else {
5090         Builder.AddTypedTextChunk(
5091                   Builder.getAllocator().CopyString(
5092                                                   Sel.getNameForSlot(I) + ":"));
5093         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
5094                                          (*CurP)->getIdentifier()->getName()));
5095       }
5096     }
5097   }
5098 
5099   Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod,
5100                                          CCP_SuperCompletion));
5101   return SuperMethod;
5102 }
5103 
5104 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {
5105   typedef CodeCompletionResult Result;
5106   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5107                         CodeCompleter->getCodeCompletionTUInfo(),
5108                         CodeCompletionContext::CCC_ObjCMessageReceiver,
5109                         getLangOpts().CPlusPlus0x
5110                           ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
5111                           : &ResultBuilder::IsObjCMessageReceiver);
5112 
5113   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5114   Results.EnterNewScope();
5115   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5116                      CodeCompleter->includeGlobals());
5117 
5118   // If we are in an Objective-C method inside a class that has a superclass,
5119   // add "super" as an option.
5120   if (ObjCMethodDecl *Method = getCurMethodDecl())
5121     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
5122       if (Iface->getSuperClass()) {
5123         Results.AddResult(Result("super"));
5124 
5125         AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, 0, 0, Results);
5126       }
5127 
5128   if (getLangOpts().CPlusPlus0x)
5129     addThisCompletion(*this, Results);
5130 
5131   Results.ExitScope();
5132 
5133   if (CodeCompleter->includeMacros())
5134     AddMacroResults(PP, Results);
5135   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5136                             Results.data(), Results.size());
5137 
5138 }
5139 
5140 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
5141                                         IdentifierInfo **SelIdents,
5142                                         unsigned NumSelIdents,
5143                                         bool AtArgumentExpression) {
5144   ObjCInterfaceDecl *CDecl = 0;
5145   if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
5146     // Figure out which interface we're in.
5147     CDecl = CurMethod->getClassInterface();
5148     if (!CDecl)
5149       return;
5150 
5151     // Find the superclass of this class.
5152     CDecl = CDecl->getSuperClass();
5153     if (!CDecl)
5154       return;
5155 
5156     if (CurMethod->isInstanceMethod()) {
5157       // We are inside an instance method, which means that the message
5158       // send [super ...] is actually calling an instance method on the
5159       // current object.
5160       return CodeCompleteObjCInstanceMessage(S, 0,
5161                                              SelIdents, NumSelIdents,
5162                                              AtArgumentExpression,
5163                                              CDecl);
5164     }
5165 
5166     // Fall through to send to the superclass in CDecl.
5167   } else {
5168     // "super" may be the name of a type or variable. Figure out which
5169     // it is.
5170     IdentifierInfo *Super = &Context.Idents.get("super");
5171     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc,
5172                                      LookupOrdinaryName);
5173     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
5174       // "super" names an interface. Use it.
5175     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
5176       if (const ObjCObjectType *Iface
5177             = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>())
5178         CDecl = Iface->getInterface();
5179     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
5180       // "super" names an unresolved type; we can't be more specific.
5181     } else {
5182       // Assume that "super" names some kind of value and parse that way.
5183       CXXScopeSpec SS;
5184       SourceLocation TemplateKWLoc;
5185       UnqualifiedId id;
5186       id.setIdentifier(Super, SuperLoc);
5187       ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id,
5188                                                false, false);
5189       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
5190                                              SelIdents, NumSelIdents,
5191                                              AtArgumentExpression);
5192     }
5193 
5194     // Fall through
5195   }
5196 
5197   ParsedType Receiver;
5198   if (CDecl)
5199     Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));
5200   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
5201                                       NumSelIdents, AtArgumentExpression,
5202                                       /*IsSuper=*/true);
5203 }
5204 
5205 /// \brief Given a set of code-completion results for the argument of a message
5206 /// send, determine the preferred type (if any) for that argument expression.
5207 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
5208                                                        unsigned NumSelIdents) {
5209   typedef CodeCompletionResult Result;
5210   ASTContext &Context = Results.getSema().Context;
5211 
5212   QualType PreferredType;
5213   unsigned BestPriority = CCP_Unlikely * 2;
5214   Result *ResultsData = Results.data();
5215   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
5216     Result &R = ResultsData[I];
5217     if (R.Kind == Result::RK_Declaration &&
5218         isa<ObjCMethodDecl>(R.Declaration)) {
5219       if (R.Priority <= BestPriority) {
5220         ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
5221         if (NumSelIdents <= Method->param_size()) {
5222           QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1]
5223                                        ->getType();
5224           if (R.Priority < BestPriority || PreferredType.isNull()) {
5225             BestPriority = R.Priority;
5226             PreferredType = MyPreferredType;
5227           } else if (!Context.hasSameUnqualifiedType(PreferredType,
5228                                                      MyPreferredType)) {
5229             PreferredType = QualType();
5230           }
5231         }
5232       }
5233     }
5234   }
5235 
5236   return PreferredType;
5237 }
5238 
5239 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
5240                                        ParsedType Receiver,
5241                                        IdentifierInfo **SelIdents,
5242                                        unsigned NumSelIdents,
5243                                        bool AtArgumentExpression,
5244                                        bool IsSuper,
5245                                        ResultBuilder &Results) {
5246   typedef CodeCompletionResult Result;
5247   ObjCInterfaceDecl *CDecl = 0;
5248 
5249   // If the given name refers to an interface type, retrieve the
5250   // corresponding declaration.
5251   if (Receiver) {
5252     QualType T = SemaRef.GetTypeFromParser(Receiver, 0);
5253     if (!T.isNull())
5254       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
5255         CDecl = Interface->getInterface();
5256   }
5257 
5258   // Add all of the factory methods in this Objective-C class, its protocols,
5259   // superclasses, categories, implementation, etc.
5260   Results.EnterNewScope();
5261 
5262   // If this is a send-to-super, try to add the special "super" send
5263   // completion.
5264   if (IsSuper) {
5265     if (ObjCMethodDecl *SuperMethod
5266         = AddSuperSendCompletion(SemaRef, false, SelIdents, NumSelIdents,
5267                                  Results))
5268       Results.Ignore(SuperMethod);
5269   }
5270 
5271   // If we're inside an Objective-C method definition, prefer its selector to
5272   // others.
5273   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
5274     Results.setPreferredSelector(CurMethod->getSelector());
5275 
5276   VisitedSelectorSet Selectors;
5277   if (CDecl)
5278     AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents,
5279                    SemaRef.CurContext, Selectors, AtArgumentExpression,
5280                    Results);
5281   else {
5282     // We're messaging "id" as a type; provide all class/factory methods.
5283 
5284     // If we have an external source, load the entire class method
5285     // pool from the AST file.
5286     if (SemaRef.ExternalSource) {
5287       for (uint32_t I = 0,
5288                     N = SemaRef.ExternalSource->GetNumExternalSelectors();
5289            I != N; ++I) {
5290         Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I);
5291         if (Sel.isNull() || SemaRef.MethodPool.count(Sel))
5292           continue;
5293 
5294         SemaRef.ReadMethodPool(Sel);
5295       }
5296     }
5297 
5298     for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(),
5299                                        MEnd = SemaRef.MethodPool.end();
5300          M != MEnd; ++M) {
5301       for (ObjCMethodList *MethList = &M->second.second;
5302            MethList && MethList->Method;
5303            MethList = MethList->Next) {
5304         if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
5305                                     NumSelIdents))
5306           continue;
5307 
5308         Result R(MethList->Method, 0);
5309         R.StartParameter = NumSelIdents;
5310         R.AllParametersAreInformative = false;
5311         Results.MaybeAddResult(R, SemaRef.CurContext);
5312       }
5313     }
5314   }
5315 
5316   Results.ExitScope();
5317 }
5318 
5319 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
5320                                         IdentifierInfo **SelIdents,
5321                                         unsigned NumSelIdents,
5322                                         bool AtArgumentExpression,
5323                                         bool IsSuper) {
5324 
5325   QualType T = this->GetTypeFromParser(Receiver);
5326 
5327   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5328                         CodeCompleter->getCodeCompletionTUInfo(),
5329               CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage,
5330                                     T, SelIdents, NumSelIdents));
5331 
5332   AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents,
5333                              AtArgumentExpression, IsSuper, Results);
5334 
5335   // If we're actually at the argument expression (rather than prior to the
5336   // selector), we're actually performing code completion for an expression.
5337   // Determine whether we have a single, best method. If so, we can
5338   // code-complete the expression using the corresponding parameter type as
5339   // our preferred type, improving completion results.
5340   if (AtArgumentExpression) {
5341     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
5342                                                                   NumSelIdents);
5343     if (PreferredType.isNull())
5344       CodeCompleteOrdinaryName(S, PCC_Expression);
5345     else
5346       CodeCompleteExpression(S, PreferredType);
5347     return;
5348   }
5349 
5350   HandleCodeCompleteResults(this, CodeCompleter,
5351                             Results.getCompletionContext(),
5352                             Results.data(), Results.size());
5353 }
5354 
5355 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,
5356                                            IdentifierInfo **SelIdents,
5357                                            unsigned NumSelIdents,
5358                                            bool AtArgumentExpression,
5359                                            ObjCInterfaceDecl *Super) {
5360   typedef CodeCompletionResult Result;
5361 
5362   Expr *RecExpr = static_cast<Expr *>(Receiver);
5363 
5364   // If necessary, apply function/array conversion to the receiver.
5365   // C99 6.7.5.3p[7,8].
5366   if (RecExpr) {
5367     ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr);
5368     if (Conv.isInvalid()) // conversion failed. bail.
5369       return;
5370     RecExpr = Conv.take();
5371   }
5372   QualType ReceiverType = RecExpr? RecExpr->getType()
5373                           : Super? Context.getObjCObjectPointerType(
5374                                             Context.getObjCInterfaceType(Super))
5375                                  : Context.getObjCIdType();
5376 
5377   // If we're messaging an expression with type "id" or "Class", check
5378   // whether we know something special about the receiver that allows
5379   // us to assume a more-specific receiver type.
5380   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType())
5381     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
5382       if (ReceiverType->isObjCClassType())
5383         return CodeCompleteObjCClassMessage(S,
5384                        ParsedType::make(Context.getObjCInterfaceType(IFace)),
5385                                             SelIdents, NumSelIdents,
5386                                             AtArgumentExpression, Super);
5387 
5388       ReceiverType = Context.getObjCObjectPointerType(
5389                                           Context.getObjCInterfaceType(IFace));
5390     }
5391 
5392   // Build the set of methods we can see.
5393   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5394                         CodeCompleter->getCodeCompletionTUInfo(),
5395            CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
5396                                  ReceiverType, SelIdents, NumSelIdents));
5397 
5398   Results.EnterNewScope();
5399 
5400   // If this is a send-to-super, try to add the special "super" send
5401   // completion.
5402   if (Super) {
5403     if (ObjCMethodDecl *SuperMethod
5404           = AddSuperSendCompletion(*this, false, SelIdents, NumSelIdents,
5405                                    Results))
5406       Results.Ignore(SuperMethod);
5407   }
5408 
5409   // If we're inside an Objective-C method definition, prefer its selector to
5410   // others.
5411   if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
5412     Results.setPreferredSelector(CurMethod->getSelector());
5413 
5414   // Keep track of the selectors we've already added.
5415   VisitedSelectorSet Selectors;
5416 
5417   // Handle messages to Class. This really isn't a message to an instance
5418   // method, so we treat it the same way we would treat a message send to a
5419   // class method.
5420   if (ReceiverType->isObjCClassType() ||
5421       ReceiverType->isObjCQualifiedClassType()) {
5422     if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
5423       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
5424         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents,
5425                        CurContext, Selectors, AtArgumentExpression, Results);
5426     }
5427   }
5428   // Handle messages to a qualified ID ("id<foo>").
5429   else if (const ObjCObjectPointerType *QualID
5430              = ReceiverType->getAsObjCQualifiedIdType()) {
5431     // Search protocols for instance methods.
5432     for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(),
5433                                               E = QualID->qual_end();
5434          I != E; ++I)
5435       AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext,
5436                      Selectors, AtArgumentExpression, Results);
5437   }
5438   // Handle messages to a pointer to interface type.
5439   else if (const ObjCObjectPointerType *IFacePtr
5440                               = ReceiverType->getAsObjCInterfacePointerType()) {
5441     // Search the class, its superclasses, etc., for instance methods.
5442     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
5443                    NumSelIdents, CurContext, Selectors, AtArgumentExpression,
5444                    Results);
5445 
5446     // Search protocols for instance methods.
5447     for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(),
5448          E = IFacePtr->qual_end();
5449          I != E; ++I)
5450       AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext,
5451                      Selectors, AtArgumentExpression, Results);
5452   }
5453   // Handle messages to "id".
5454   else if (ReceiverType->isObjCIdType()) {
5455     // We're messaging "id", so provide all instance methods we know
5456     // about as code-completion results.
5457 
5458     // If we have an external source, load the entire class method
5459     // pool from the AST file.
5460     if (ExternalSource) {
5461       for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
5462            I != N; ++I) {
5463         Selector Sel = ExternalSource->GetExternalSelector(I);
5464         if (Sel.isNull() || MethodPool.count(Sel))
5465           continue;
5466 
5467         ReadMethodPool(Sel);
5468       }
5469     }
5470 
5471     for (GlobalMethodPool::iterator M = MethodPool.begin(),
5472                                     MEnd = MethodPool.end();
5473          M != MEnd; ++M) {
5474       for (ObjCMethodList *MethList = &M->second.first;
5475            MethList && MethList->Method;
5476            MethList = MethList->Next) {
5477         if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
5478                                     NumSelIdents))
5479           continue;
5480 
5481         if (!Selectors.insert(MethList->Method->getSelector()))
5482           continue;
5483 
5484         Result R(MethList->Method, 0);
5485         R.StartParameter = NumSelIdents;
5486         R.AllParametersAreInformative = false;
5487         Results.MaybeAddResult(R, CurContext);
5488       }
5489     }
5490   }
5491   Results.ExitScope();
5492 
5493 
5494   // If we're actually at the argument expression (rather than prior to the
5495   // selector), we're actually performing code completion for an expression.
5496   // Determine whether we have a single, best method. If so, we can
5497   // code-complete the expression using the corresponding parameter type as
5498   // our preferred type, improving completion results.
5499   if (AtArgumentExpression) {
5500     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
5501                                                                   NumSelIdents);
5502     if (PreferredType.isNull())
5503       CodeCompleteOrdinaryName(S, PCC_Expression);
5504     else
5505       CodeCompleteExpression(S, PreferredType);
5506     return;
5507   }
5508 
5509   HandleCodeCompleteResults(this, CodeCompleter,
5510                             Results.getCompletionContext(),
5511                             Results.data(),Results.size());
5512 }
5513 
5514 void Sema::CodeCompleteObjCForCollection(Scope *S,
5515                                          DeclGroupPtrTy IterationVar) {
5516   CodeCompleteExpressionData Data;
5517   Data.ObjCCollection = true;
5518 
5519   if (IterationVar.getAsOpaquePtr()) {
5520     DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>();
5521     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
5522       if (*I)
5523         Data.IgnoreDecls.push_back(*I);
5524     }
5525   }
5526 
5527   CodeCompleteExpression(S, Data);
5528 }
5529 
5530 void Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents,
5531                                     unsigned NumSelIdents) {
5532   // If we have an external source, load the entire class method
5533   // pool from the AST file.
5534   if (ExternalSource) {
5535     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
5536          I != N; ++I) {
5537       Selector Sel = ExternalSource->GetExternalSelector(I);
5538       if (Sel.isNull() || MethodPool.count(Sel))
5539         continue;
5540 
5541       ReadMethodPool(Sel);
5542     }
5543   }
5544 
5545   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5546                         CodeCompleter->getCodeCompletionTUInfo(),
5547                         CodeCompletionContext::CCC_SelectorName);
5548   Results.EnterNewScope();
5549   for (GlobalMethodPool::iterator M = MethodPool.begin(),
5550                                MEnd = MethodPool.end();
5551        M != MEnd; ++M) {
5552 
5553     Selector Sel = M->first;
5554     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents, NumSelIdents))
5555       continue;
5556 
5557     CodeCompletionBuilder Builder(Results.getAllocator(),
5558                                   Results.getCodeCompletionTUInfo());
5559     if (Sel.isUnarySelector()) {
5560       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
5561                                                        Sel.getNameForSlot(0)));
5562       Results.AddResult(Builder.TakeString());
5563       continue;
5564     }
5565 
5566     std::string Accumulator;
5567     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
5568       if (I == NumSelIdents) {
5569         if (!Accumulator.empty()) {
5570           Builder.AddInformativeChunk(Builder.getAllocator().CopyString(
5571                                                  Accumulator));
5572           Accumulator.clear();
5573         }
5574       }
5575 
5576       Accumulator += Sel.getNameForSlot(I);
5577       Accumulator += ':';
5578     }
5579     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator));
5580     Results.AddResult(Builder.TakeString());
5581   }
5582   Results.ExitScope();
5583 
5584   HandleCodeCompleteResults(this, CodeCompleter,
5585                             CodeCompletionContext::CCC_SelectorName,
5586                             Results.data(), Results.size());
5587 }
5588 
5589 /// \brief Add all of the protocol declarations that we find in the given
5590 /// (translation unit) context.
5591 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
5592                                bool OnlyForwardDeclarations,
5593                                ResultBuilder &Results) {
5594   typedef CodeCompletionResult Result;
5595 
5596   for (DeclContext::decl_iterator D = Ctx->decls_begin(),
5597                                DEnd = Ctx->decls_end();
5598        D != DEnd; ++D) {
5599     // Record any protocols we find.
5600     if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D))
5601       if (!OnlyForwardDeclarations || !Proto->hasDefinition())
5602         Results.AddResult(Result(Proto, 0), CurContext, 0, false);
5603   }
5604 }
5605 
5606 void Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols,
5607                                               unsigned NumProtocols) {
5608   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5609                         CodeCompleter->getCodeCompletionTUInfo(),
5610                         CodeCompletionContext::CCC_ObjCProtocolName);
5611 
5612   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5613     Results.EnterNewScope();
5614 
5615     // Tell the result set to ignore all of the protocols we have
5616     // already seen.
5617     // FIXME: This doesn't work when caching code-completion results.
5618     for (unsigned I = 0; I != NumProtocols; ++I)
5619       if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first,
5620                                                       Protocols[I].second))
5621         Results.Ignore(Protocol);
5622 
5623     // Add all protocols.
5624     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false,
5625                        Results);
5626 
5627     Results.ExitScope();
5628   }
5629 
5630   HandleCodeCompleteResults(this, CodeCompleter,
5631                             CodeCompletionContext::CCC_ObjCProtocolName,
5632                             Results.data(),Results.size());
5633 }
5634 
5635 void Sema::CodeCompleteObjCProtocolDecl(Scope *) {
5636   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5637                         CodeCompleter->getCodeCompletionTUInfo(),
5638                         CodeCompletionContext::CCC_ObjCProtocolName);
5639 
5640   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5641     Results.EnterNewScope();
5642 
5643     // Add all protocols.
5644     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true,
5645                        Results);
5646 
5647     Results.ExitScope();
5648   }
5649 
5650   HandleCodeCompleteResults(this, CodeCompleter,
5651                             CodeCompletionContext::CCC_ObjCProtocolName,
5652                             Results.data(),Results.size());
5653 }
5654 
5655 /// \brief Add all of the Objective-C interface declarations that we find in
5656 /// the given (translation unit) context.
5657 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
5658                                 bool OnlyForwardDeclarations,
5659                                 bool OnlyUnimplemented,
5660                                 ResultBuilder &Results) {
5661   typedef CodeCompletionResult Result;
5662 
5663   for (DeclContext::decl_iterator D = Ctx->decls_begin(),
5664                                DEnd = Ctx->decls_end();
5665        D != DEnd; ++D) {
5666     // Record any interfaces we find.
5667     if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D))
5668       if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
5669           (!OnlyUnimplemented || !Class->getImplementation()))
5670         Results.AddResult(Result(Class, 0), CurContext, 0, false);
5671   }
5672 }
5673 
5674 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
5675   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5676                         CodeCompleter->getCodeCompletionTUInfo(),
5677                         CodeCompletionContext::CCC_Other);
5678   Results.EnterNewScope();
5679 
5680   if (CodeCompleter->includeGlobals()) {
5681     // Add all classes.
5682     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5683                         false, Results);
5684   }
5685 
5686   Results.ExitScope();
5687 
5688   HandleCodeCompleteResults(this, CodeCompleter,
5689                             CodeCompletionContext::CCC_ObjCInterfaceName,
5690                             Results.data(),Results.size());
5691 }
5692 
5693 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
5694                                       SourceLocation ClassNameLoc) {
5695   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5696                         CodeCompleter->getCodeCompletionTUInfo(),
5697                         CodeCompletionContext::CCC_ObjCInterfaceName);
5698   Results.EnterNewScope();
5699 
5700   // Make sure that we ignore the class we're currently defining.
5701   NamedDecl *CurClass
5702     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5703   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
5704     Results.Ignore(CurClass);
5705 
5706   if (CodeCompleter->includeGlobals()) {
5707     // Add all classes.
5708     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5709                         false, Results);
5710   }
5711 
5712   Results.ExitScope();
5713 
5714   HandleCodeCompleteResults(this, CodeCompleter,
5715                             CodeCompletionContext::CCC_ObjCInterfaceName,
5716                             Results.data(),Results.size());
5717 }
5718 
5719 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
5720   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5721                         CodeCompleter->getCodeCompletionTUInfo(),
5722                         CodeCompletionContext::CCC_Other);
5723   Results.EnterNewScope();
5724 
5725   if (CodeCompleter->includeGlobals()) {
5726     // Add all unimplemented classes.
5727     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5728                         true, Results);
5729   }
5730 
5731   Results.ExitScope();
5732 
5733   HandleCodeCompleteResults(this, CodeCompleter,
5734                             CodeCompletionContext::CCC_ObjCInterfaceName,
5735                             Results.data(),Results.size());
5736 }
5737 
5738 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
5739                                              IdentifierInfo *ClassName,
5740                                              SourceLocation ClassNameLoc) {
5741   typedef CodeCompletionResult Result;
5742 
5743   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5744                         CodeCompleter->getCodeCompletionTUInfo(),
5745                         CodeCompletionContext::CCC_ObjCCategoryName);
5746 
5747   // Ignore any categories we find that have already been implemented by this
5748   // interface.
5749   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5750   NamedDecl *CurClass
5751     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5752   if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass))
5753     for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
5754          Category = Category->getNextClassCategory())
5755       CategoryNames.insert(Category->getIdentifier());
5756 
5757   // Add all of the categories we know about.
5758   Results.EnterNewScope();
5759   TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
5760   for (DeclContext::decl_iterator D = TU->decls_begin(),
5761                                DEnd = TU->decls_end();
5762        D != DEnd; ++D)
5763     if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D))
5764       if (CategoryNames.insert(Category->getIdentifier()))
5765         Results.AddResult(Result(Category, 0), CurContext, 0, false);
5766   Results.ExitScope();
5767 
5768   HandleCodeCompleteResults(this, CodeCompleter,
5769                             CodeCompletionContext::CCC_ObjCCategoryName,
5770                             Results.data(),Results.size());
5771 }
5772 
5773 void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
5774                                                   IdentifierInfo *ClassName,
5775                                                   SourceLocation ClassNameLoc) {
5776   typedef CodeCompletionResult Result;
5777 
5778   // Find the corresponding interface. If we couldn't find the interface, the
5779   // program itself is ill-formed. However, we'll try to be helpful still by
5780   // providing the list of all of the categories we know about.
5781   NamedDecl *CurClass
5782     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5783   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
5784   if (!Class)
5785     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
5786 
5787   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5788                         CodeCompleter->getCodeCompletionTUInfo(),
5789                         CodeCompletionContext::CCC_ObjCCategoryName);
5790 
5791   // Add all of the categories that have have corresponding interface
5792   // declarations in this class and any of its superclasses, except for
5793   // already-implemented categories in the class itself.
5794   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5795   Results.EnterNewScope();
5796   bool IgnoreImplemented = true;
5797   while (Class) {
5798     for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
5799          Category = Category->getNextClassCategory())
5800       if ((!IgnoreImplemented || !Category->getImplementation()) &&
5801           CategoryNames.insert(Category->getIdentifier()))
5802         Results.AddResult(Result(Category, 0), CurContext, 0, false);
5803 
5804     Class = Class->getSuperClass();
5805     IgnoreImplemented = false;
5806   }
5807   Results.ExitScope();
5808 
5809   HandleCodeCompleteResults(this, CodeCompleter,
5810                             CodeCompletionContext::CCC_ObjCCategoryName,
5811                             Results.data(),Results.size());
5812 }
5813 
5814 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) {
5815   typedef CodeCompletionResult Result;
5816   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5817                         CodeCompleter->getCodeCompletionTUInfo(),
5818                         CodeCompletionContext::CCC_Other);
5819 
5820   // Figure out where this @synthesize lives.
5821   ObjCContainerDecl *Container
5822     = dyn_cast_or_null<ObjCContainerDecl>(CurContext);
5823   if (!Container ||
5824       (!isa<ObjCImplementationDecl>(Container) &&
5825        !isa<ObjCCategoryImplDecl>(Container)))
5826     return;
5827 
5828   // Ignore any properties that have already been implemented.
5829   for (DeclContext::decl_iterator D = Container->decls_begin(),
5830                                DEnd = Container->decls_end();
5831        D != DEnd; ++D)
5832     if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D))
5833       Results.Ignore(PropertyImpl->getPropertyDecl());
5834 
5835   // Add any properties that we find.
5836   AddedPropertiesSet AddedProperties;
5837   Results.EnterNewScope();
5838   if (ObjCImplementationDecl *ClassImpl
5839         = dyn_cast<ObjCImplementationDecl>(Container))
5840     AddObjCProperties(ClassImpl->getClassInterface(), false,
5841                       /*AllowNullaryMethods=*/false, CurContext,
5842                       AddedProperties, Results);
5843   else
5844     AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
5845                       false, /*AllowNullaryMethods=*/false, CurContext,
5846                       AddedProperties, Results);
5847   Results.ExitScope();
5848 
5849   HandleCodeCompleteResults(this, CodeCompleter,
5850                             CodeCompletionContext::CCC_Other,
5851                             Results.data(),Results.size());
5852 }
5853 
5854 void Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S,
5855                                                   IdentifierInfo *PropertyName) {
5856   typedef CodeCompletionResult Result;
5857   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5858                         CodeCompleter->getCodeCompletionTUInfo(),
5859                         CodeCompletionContext::CCC_Other);
5860 
5861   // Figure out where this @synthesize lives.
5862   ObjCContainerDecl *Container
5863     = dyn_cast_or_null<ObjCContainerDecl>(CurContext);
5864   if (!Container ||
5865       (!isa<ObjCImplementationDecl>(Container) &&
5866        !isa<ObjCCategoryImplDecl>(Container)))
5867     return;
5868 
5869   // Figure out which interface we're looking into.
5870   ObjCInterfaceDecl *Class = 0;
5871   if (ObjCImplementationDecl *ClassImpl
5872                                  = dyn_cast<ObjCImplementationDecl>(Container))
5873     Class = ClassImpl->getClassInterface();
5874   else
5875     Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl()
5876                                                           ->getClassInterface();
5877 
5878   // Determine the type of the property we're synthesizing.
5879   QualType PropertyType = Context.getObjCIdType();
5880   if (Class) {
5881     if (ObjCPropertyDecl *Property
5882                               = Class->FindPropertyDeclaration(PropertyName)) {
5883       PropertyType
5884         = Property->getType().getNonReferenceType().getUnqualifiedType();
5885 
5886       // Give preference to ivars
5887       Results.setPreferredType(PropertyType);
5888     }
5889   }
5890 
5891   // Add all of the instance variables in this class and its superclasses.
5892   Results.EnterNewScope();
5893   bool SawSimilarlyNamedIvar = false;
5894   std::string NameWithPrefix;
5895   NameWithPrefix += '_';
5896   NameWithPrefix += PropertyName->getName();
5897   std::string NameWithSuffix = PropertyName->getName().str();
5898   NameWithSuffix += '_';
5899   for(; Class; Class = Class->getSuperClass()) {
5900     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
5901          Ivar = Ivar->getNextIvar()) {
5902       Results.AddResult(Result(Ivar, 0), CurContext, 0, false);
5903 
5904       // Determine whether we've seen an ivar with a name similar to the
5905       // property.
5906       if ((PropertyName == Ivar->getIdentifier() ||
5907            NameWithPrefix == Ivar->getName() ||
5908            NameWithSuffix == Ivar->getName())) {
5909         SawSimilarlyNamedIvar = true;
5910 
5911         // Reduce the priority of this result by one, to give it a slight
5912         // advantage over other results whose names don't match so closely.
5913         if (Results.size() &&
5914             Results.data()[Results.size() - 1].Kind
5915                                       == CodeCompletionResult::RK_Declaration &&
5916             Results.data()[Results.size() - 1].Declaration == Ivar)
5917           Results.data()[Results.size() - 1].Priority--;
5918       }
5919     }
5920   }
5921 
5922   if (!SawSimilarlyNamedIvar) {
5923     // Create ivar result _propName, that the user can use to synthesize
5924     // an ivar of the appropriate type.
5925     unsigned Priority = CCP_MemberDeclaration + 1;
5926     typedef CodeCompletionResult Result;
5927     CodeCompletionAllocator &Allocator = Results.getAllocator();
5928     CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(),
5929                                   Priority,CXAvailability_Available);
5930 
5931     PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
5932     Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context,
5933                                                        Policy, Allocator));
5934     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
5935     Results.AddResult(Result(Builder.TakeString(), Priority,
5936                              CXCursor_ObjCIvarDecl));
5937   }
5938 
5939   Results.ExitScope();
5940 
5941   HandleCodeCompleteResults(this, CodeCompleter,
5942                             CodeCompletionContext::CCC_Other,
5943                             Results.data(),Results.size());
5944 }
5945 
5946 // Mapping from selectors to the methods that implement that selector, along
5947 // with the "in original class" flag.
5948 typedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> >
5949   KnownMethodsMap;
5950 
5951 /// \brief Find all of the methods that reside in the given container
5952 /// (and its superclasses, protocols, etc.) that meet the given
5953 /// criteria. Insert those methods into the map of known methods,
5954 /// indexed by selector so they can be easily found.
5955 static void FindImplementableMethods(ASTContext &Context,
5956                                      ObjCContainerDecl *Container,
5957                                      bool WantInstanceMethods,
5958                                      QualType ReturnType,
5959                                      KnownMethodsMap &KnownMethods,
5960                                      bool InOriginalClass = true) {
5961   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
5962     // Recurse into protocols.
5963     if (!IFace->hasDefinition())
5964       return;
5965 
5966     const ObjCList<ObjCProtocolDecl> &Protocols
5967       = IFace->getReferencedProtocols();
5968     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5969                                               E = Protocols.end();
5970          I != E; ++I)
5971       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
5972                                KnownMethods, InOriginalClass);
5973 
5974     // Add methods from any class extensions and categories.
5975     for (const ObjCCategoryDecl *Cat = IFace->getCategoryList(); Cat;
5976          Cat = Cat->getNextClassCategory())
5977       FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat),
5978                                WantInstanceMethods, ReturnType,
5979                                KnownMethods, false);
5980 
5981     // Visit the superclass.
5982     if (IFace->getSuperClass())
5983       FindImplementableMethods(Context, IFace->getSuperClass(),
5984                                WantInstanceMethods, ReturnType,
5985                                KnownMethods, false);
5986   }
5987 
5988   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
5989     // Recurse into protocols.
5990     const ObjCList<ObjCProtocolDecl> &Protocols
5991       = Category->getReferencedProtocols();
5992     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5993                                               E = Protocols.end();
5994          I != E; ++I)
5995       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
5996                                KnownMethods, InOriginalClass);
5997 
5998     // If this category is the original class, jump to the interface.
5999     if (InOriginalClass && Category->getClassInterface())
6000       FindImplementableMethods(Context, Category->getClassInterface(),
6001                                WantInstanceMethods, ReturnType, KnownMethods,
6002                                false);
6003   }
6004 
6005   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
6006     if (Protocol->hasDefinition()) {
6007       // Recurse into protocols.
6008       const ObjCList<ObjCProtocolDecl> &Protocols
6009         = Protocol->getReferencedProtocols();
6010       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
6011              E = Protocols.end();
6012            I != E; ++I)
6013         FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
6014                                  KnownMethods, false);
6015     }
6016   }
6017 
6018   // Add methods in this container. This operation occurs last because
6019   // we want the methods from this container to override any methods
6020   // we've previously seen with the same selector.
6021   for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
6022                                        MEnd = Container->meth_end();
6023        M != MEnd; ++M) {
6024     if (M->isInstanceMethod() == WantInstanceMethods) {
6025       if (!ReturnType.isNull() &&
6026           !Context.hasSameUnqualifiedType(ReturnType, M->getResultType()))
6027         continue;
6028 
6029       KnownMethods[M->getSelector()] = std::make_pair(&*M, InOriginalClass);
6030     }
6031   }
6032 }
6033 
6034 /// \brief Add the parenthesized return or parameter type chunk to a code
6035 /// completion string.
6036 static void AddObjCPassingTypeChunk(QualType Type,
6037                                     unsigned ObjCDeclQuals,
6038                                     ASTContext &Context,
6039                                     const PrintingPolicy &Policy,
6040                                     CodeCompletionBuilder &Builder) {
6041   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6042   std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals);
6043   if (!Quals.empty())
6044     Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
6045   Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy,
6046                                                Builder.getAllocator()));
6047   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6048 }
6049 
6050 /// \brief Determine whether the given class is or inherits from a class by
6051 /// the given name.
6052 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class,
6053                                    StringRef Name) {
6054   if (!Class)
6055     return false;
6056 
6057   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
6058     return true;
6059 
6060   return InheritsFromClassNamed(Class->getSuperClass(), Name);
6061 }
6062 
6063 /// \brief Add code completions for Objective-C Key-Value Coding (KVC) and
6064 /// Key-Value Observing (KVO).
6065 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
6066                                        bool IsInstanceMethod,
6067                                        QualType ReturnType,
6068                                        ASTContext &Context,
6069                                        VisitedSelectorSet &KnownSelectors,
6070                                        ResultBuilder &Results) {
6071   IdentifierInfo *PropName = Property->getIdentifier();
6072   if (!PropName || PropName->getLength() == 0)
6073     return;
6074 
6075   PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
6076 
6077   // Builder that will create each code completion.
6078   typedef CodeCompletionResult Result;
6079   CodeCompletionAllocator &Allocator = Results.getAllocator();
6080   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
6081 
6082   // The selector table.
6083   SelectorTable &Selectors = Context.Selectors;
6084 
6085   // The property name, copied into the code completion allocation region
6086   // on demand.
6087   struct KeyHolder {
6088     CodeCompletionAllocator &Allocator;
6089     StringRef Key;
6090     const char *CopiedKey;
6091 
6092     KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key)
6093     : Allocator(Allocator), Key(Key), CopiedKey(0) { }
6094 
6095     operator const char *() {
6096       if (CopiedKey)
6097         return CopiedKey;
6098 
6099       return CopiedKey = Allocator.CopyString(Key);
6100     }
6101   } Key(Allocator, PropName->getName());
6102 
6103   // The uppercased name of the property name.
6104   std::string UpperKey = PropName->getName();
6105   if (!UpperKey.empty())
6106     UpperKey[0] = toupper(UpperKey[0]);
6107 
6108   bool ReturnTypeMatchesProperty = ReturnType.isNull() ||
6109     Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
6110                                    Property->getType());
6111   bool ReturnTypeMatchesVoid
6112     = ReturnType.isNull() || ReturnType->isVoidType();
6113 
6114   // Add the normal accessor -(type)key.
6115   if (IsInstanceMethod &&
6116       KnownSelectors.insert(Selectors.getNullarySelector(PropName)) &&
6117       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
6118     if (ReturnType.isNull())
6119       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0,
6120                               Context, Policy, Builder);
6121 
6122     Builder.AddTypedTextChunk(Key);
6123     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6124                              CXCursor_ObjCInstanceMethodDecl));
6125   }
6126 
6127   // If we have an integral or boolean property (or the user has provided
6128   // an integral or boolean return type), add the accessor -(type)isKey.
6129   if (IsInstanceMethod &&
6130       ((!ReturnType.isNull() &&
6131         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
6132        (ReturnType.isNull() &&
6133         (Property->getType()->isIntegerType() ||
6134          Property->getType()->isBooleanType())))) {
6135     std::string SelectorName = (Twine("is") + UpperKey).str();
6136     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6137     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6138       if (ReturnType.isNull()) {
6139         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6140         Builder.AddTextChunk("BOOL");
6141         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6142       }
6143 
6144       Builder.AddTypedTextChunk(
6145                                 Allocator.CopyString(SelectorId->getName()));
6146       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6147                                CXCursor_ObjCInstanceMethodDecl));
6148     }
6149   }
6150 
6151   // Add the normal mutator.
6152   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
6153       !Property->getSetterMethodDecl()) {
6154     std::string SelectorName = (Twine("set") + UpperKey).str();
6155     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6156     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6157       if (ReturnType.isNull()) {
6158         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6159         Builder.AddTextChunk("void");
6160         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6161       }
6162 
6163       Builder.AddTypedTextChunk(
6164                                 Allocator.CopyString(SelectorId->getName()));
6165       Builder.AddTypedTextChunk(":");
6166       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0,
6167                               Context, Policy, Builder);
6168       Builder.AddTextChunk(Key);
6169       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6170                                CXCursor_ObjCInstanceMethodDecl));
6171     }
6172   }
6173 
6174   // Indexed and unordered accessors
6175   unsigned IndexedGetterPriority = CCP_CodePattern;
6176   unsigned IndexedSetterPriority = CCP_CodePattern;
6177   unsigned UnorderedGetterPriority = CCP_CodePattern;
6178   unsigned UnorderedSetterPriority = CCP_CodePattern;
6179   if (const ObjCObjectPointerType *ObjCPointer
6180                     = Property->getType()->getAs<ObjCObjectPointerType>()) {
6181     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
6182       // If this interface type is not provably derived from a known
6183       // collection, penalize the corresponding completions.
6184       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
6185         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
6186         if (!InheritsFromClassNamed(IFace, "NSArray"))
6187           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
6188       }
6189 
6190       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
6191         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
6192         if (!InheritsFromClassNamed(IFace, "NSSet"))
6193           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
6194       }
6195     }
6196   } else {
6197     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
6198     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
6199     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
6200     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
6201   }
6202 
6203   // Add -(NSUInteger)countOf<key>
6204   if (IsInstanceMethod &&
6205       (ReturnType.isNull() || ReturnType->isIntegerType())) {
6206     std::string SelectorName = (Twine("countOf") + UpperKey).str();
6207     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6208     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6209       if (ReturnType.isNull()) {
6210         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6211         Builder.AddTextChunk("NSUInteger");
6212         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6213       }
6214 
6215       Builder.AddTypedTextChunk(
6216                                 Allocator.CopyString(SelectorId->getName()));
6217       Results.AddResult(Result(Builder.TakeString(),
6218                                std::min(IndexedGetterPriority,
6219                                         UnorderedGetterPriority),
6220                                CXCursor_ObjCInstanceMethodDecl));
6221     }
6222   }
6223 
6224   // Indexed getters
6225   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
6226   if (IsInstanceMethod &&
6227       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
6228     std::string SelectorName
6229       = (Twine("objectIn") + UpperKey + "AtIndex").str();
6230     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6231     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6232       if (ReturnType.isNull()) {
6233         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6234         Builder.AddTextChunk("id");
6235         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6236       }
6237 
6238       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6239       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6240       Builder.AddTextChunk("NSUInteger");
6241       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6242       Builder.AddTextChunk("index");
6243       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6244                                CXCursor_ObjCInstanceMethodDecl));
6245     }
6246   }
6247 
6248   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
6249   if (IsInstanceMethod &&
6250       (ReturnType.isNull() ||
6251        (ReturnType->isObjCObjectPointerType() &&
6252         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6253         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6254                                                 ->getName() == "NSArray"))) {
6255     std::string SelectorName
6256       = (Twine(Property->getName()) + "AtIndexes").str();
6257     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6258     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6259       if (ReturnType.isNull()) {
6260         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6261         Builder.AddTextChunk("NSArray *");
6262         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6263       }
6264 
6265       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6266       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6267       Builder.AddTextChunk("NSIndexSet *");
6268       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6269       Builder.AddTextChunk("indexes");
6270       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6271                                CXCursor_ObjCInstanceMethodDecl));
6272     }
6273   }
6274 
6275   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
6276   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6277     std::string SelectorName = (Twine("get") + UpperKey).str();
6278     IdentifierInfo *SelectorIds[2] = {
6279       &Context.Idents.get(SelectorName),
6280       &Context.Idents.get("range")
6281     };
6282 
6283     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6284       if (ReturnType.isNull()) {
6285         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6286         Builder.AddTextChunk("void");
6287         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6288       }
6289 
6290       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6291       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6292       Builder.AddPlaceholderChunk("object-type");
6293       Builder.AddTextChunk(" **");
6294       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6295       Builder.AddTextChunk("buffer");
6296       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6297       Builder.AddTypedTextChunk("range:");
6298       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6299       Builder.AddTextChunk("NSRange");
6300       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6301       Builder.AddTextChunk("inRange");
6302       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6303                                CXCursor_ObjCInstanceMethodDecl));
6304     }
6305   }
6306 
6307   // Mutable indexed accessors
6308 
6309   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
6310   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6311     std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str();
6312     IdentifierInfo *SelectorIds[2] = {
6313       &Context.Idents.get("insertObject"),
6314       &Context.Idents.get(SelectorName)
6315     };
6316 
6317     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6318       if (ReturnType.isNull()) {
6319         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6320         Builder.AddTextChunk("void");
6321         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6322       }
6323 
6324       Builder.AddTypedTextChunk("insertObject:");
6325       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6326       Builder.AddPlaceholderChunk("object-type");
6327       Builder.AddTextChunk(" *");
6328       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6329       Builder.AddTextChunk("object");
6330       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6331       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6332       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6333       Builder.AddPlaceholderChunk("NSUInteger");
6334       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6335       Builder.AddTextChunk("index");
6336       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6337                                CXCursor_ObjCInstanceMethodDecl));
6338     }
6339   }
6340 
6341   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
6342   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6343     std::string SelectorName = (Twine("insert") + UpperKey).str();
6344     IdentifierInfo *SelectorIds[2] = {
6345       &Context.Idents.get(SelectorName),
6346       &Context.Idents.get("atIndexes")
6347     };
6348 
6349     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6350       if (ReturnType.isNull()) {
6351         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6352         Builder.AddTextChunk("void");
6353         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6354       }
6355 
6356       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6357       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6358       Builder.AddTextChunk("NSArray *");
6359       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6360       Builder.AddTextChunk("array");
6361       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6362       Builder.AddTypedTextChunk("atIndexes:");
6363       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6364       Builder.AddPlaceholderChunk("NSIndexSet *");
6365       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6366       Builder.AddTextChunk("indexes");
6367       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6368                                CXCursor_ObjCInstanceMethodDecl));
6369     }
6370   }
6371 
6372   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
6373   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6374     std::string SelectorName
6375       = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
6376     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6377     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6378       if (ReturnType.isNull()) {
6379         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6380         Builder.AddTextChunk("void");
6381         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6382       }
6383 
6384       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6385       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6386       Builder.AddTextChunk("NSUInteger");
6387       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6388       Builder.AddTextChunk("index");
6389       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6390                                CXCursor_ObjCInstanceMethodDecl));
6391     }
6392   }
6393 
6394   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
6395   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6396     std::string SelectorName
6397       = (Twine("remove") + UpperKey + "AtIndexes").str();
6398     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6399     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6400       if (ReturnType.isNull()) {
6401         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6402         Builder.AddTextChunk("void");
6403         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6404       }
6405 
6406       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6407       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6408       Builder.AddTextChunk("NSIndexSet *");
6409       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6410       Builder.AddTextChunk("indexes");
6411       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6412                                CXCursor_ObjCInstanceMethodDecl));
6413     }
6414   }
6415 
6416   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
6417   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6418     std::string SelectorName
6419       = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
6420     IdentifierInfo *SelectorIds[2] = {
6421       &Context.Idents.get(SelectorName),
6422       &Context.Idents.get("withObject")
6423     };
6424 
6425     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
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.AddPlaceholderChunk("NSUInteger");
6435       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6436       Builder.AddTextChunk("index");
6437       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6438       Builder.AddTypedTextChunk("withObject:");
6439       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6440       Builder.AddTextChunk("id");
6441       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6442       Builder.AddTextChunk("object");
6443       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6444                                CXCursor_ObjCInstanceMethodDecl));
6445     }
6446   }
6447 
6448   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
6449   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6450     std::string SelectorName1
6451       = (Twine("replace") + UpperKey + "AtIndexes").str();
6452     std::string SelectorName2 = (Twine("with") + UpperKey).str();
6453     IdentifierInfo *SelectorIds[2] = {
6454       &Context.Idents.get(SelectorName1),
6455       &Context.Idents.get(SelectorName2)
6456     };
6457 
6458     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6459       if (ReturnType.isNull()) {
6460         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6461         Builder.AddTextChunk("void");
6462         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6463       }
6464 
6465       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
6466       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6467       Builder.AddPlaceholderChunk("NSIndexSet *");
6468       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6469       Builder.AddTextChunk("indexes");
6470       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6471       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
6472       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6473       Builder.AddTextChunk("NSArray *");
6474       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6475       Builder.AddTextChunk("array");
6476       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6477                                CXCursor_ObjCInstanceMethodDecl));
6478     }
6479   }
6480 
6481   // Unordered getters
6482   // - (NSEnumerator *)enumeratorOfKey
6483   if (IsInstanceMethod &&
6484       (ReturnType.isNull() ||
6485        (ReturnType->isObjCObjectPointerType() &&
6486         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6487         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6488           ->getName() == "NSEnumerator"))) {
6489     std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str();
6490     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6491     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6492       if (ReturnType.isNull()) {
6493         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6494         Builder.AddTextChunk("NSEnumerator *");
6495         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6496       }
6497 
6498       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6499       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
6500                               CXCursor_ObjCInstanceMethodDecl));
6501     }
6502   }
6503 
6504   // - (type *)memberOfKey:(type *)object
6505   if (IsInstanceMethod &&
6506       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
6507     std::string SelectorName = (Twine("memberOf") + UpperKey).str();
6508     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6509     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6510       if (ReturnType.isNull()) {
6511         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6512         Builder.AddPlaceholderChunk("object-type");
6513         Builder.AddTextChunk(" *");
6514         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6515       }
6516 
6517       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6518       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6519       if (ReturnType.isNull()) {
6520         Builder.AddPlaceholderChunk("object-type");
6521         Builder.AddTextChunk(" *");
6522       } else {
6523         Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context,
6524                                                      Policy,
6525                                                      Builder.getAllocator()));
6526       }
6527       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6528       Builder.AddTextChunk("object");
6529       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
6530                                CXCursor_ObjCInstanceMethodDecl));
6531     }
6532   }
6533 
6534   // Mutable unordered accessors
6535   // - (void)addKeyObject:(type *)object
6536   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6537     std::string SelectorName
6538       = (Twine("add") + UpperKey + Twine("Object")).str();
6539     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6540     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6541       if (ReturnType.isNull()) {
6542         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6543         Builder.AddTextChunk("void");
6544         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6545       }
6546 
6547       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6548       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6549       Builder.AddPlaceholderChunk("object-type");
6550       Builder.AddTextChunk(" *");
6551       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6552       Builder.AddTextChunk("object");
6553       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6554                                CXCursor_ObjCInstanceMethodDecl));
6555     }
6556   }
6557 
6558   // - (void)addKey:(NSSet *)objects
6559   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6560     std::string SelectorName = (Twine("add") + UpperKey).str();
6561     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6562     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6563       if (ReturnType.isNull()) {
6564         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6565         Builder.AddTextChunk("void");
6566         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6567       }
6568 
6569       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6570       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6571       Builder.AddTextChunk("NSSet *");
6572       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6573       Builder.AddTextChunk("objects");
6574       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6575                                CXCursor_ObjCInstanceMethodDecl));
6576     }
6577   }
6578 
6579   // - (void)removeKeyObject:(type *)object
6580   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6581     std::string SelectorName
6582       = (Twine("remove") + UpperKey + Twine("Object")).str();
6583     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6584     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6585       if (ReturnType.isNull()) {
6586         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6587         Builder.AddTextChunk("void");
6588         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6589       }
6590 
6591       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6592       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6593       Builder.AddPlaceholderChunk("object-type");
6594       Builder.AddTextChunk(" *");
6595       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6596       Builder.AddTextChunk("object");
6597       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6598                                CXCursor_ObjCInstanceMethodDecl));
6599     }
6600   }
6601 
6602   // - (void)removeKey:(NSSet *)objects
6603   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6604     std::string SelectorName = (Twine("remove") + UpperKey).str();
6605     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6606     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6607       if (ReturnType.isNull()) {
6608         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6609         Builder.AddTextChunk("void");
6610         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6611       }
6612 
6613       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6614       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6615       Builder.AddTextChunk("NSSet *");
6616       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6617       Builder.AddTextChunk("objects");
6618       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6619                                CXCursor_ObjCInstanceMethodDecl));
6620     }
6621   }
6622 
6623   // - (void)intersectKey:(NSSet *)objects
6624   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6625     std::string SelectorName = (Twine("intersect") + UpperKey).str();
6626     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6627     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6628       if (ReturnType.isNull()) {
6629         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6630         Builder.AddTextChunk("void");
6631         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6632       }
6633 
6634       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6635       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6636       Builder.AddTextChunk("NSSet *");
6637       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6638       Builder.AddTextChunk("objects");
6639       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6640                                CXCursor_ObjCInstanceMethodDecl));
6641     }
6642   }
6643 
6644   // Key-Value Observing
6645   // + (NSSet *)keyPathsForValuesAffectingKey
6646   if (!IsInstanceMethod &&
6647       (ReturnType.isNull() ||
6648        (ReturnType->isObjCObjectPointerType() &&
6649         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6650         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6651                                                     ->getName() == "NSSet"))) {
6652     std::string SelectorName
6653       = (Twine("keyPathsForValuesAffecting") + UpperKey).str();
6654     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6655     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6656       if (ReturnType.isNull()) {
6657         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6658         Builder.AddTextChunk("NSSet *");
6659         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6660       }
6661 
6662       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6663       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6664                               CXCursor_ObjCClassMethodDecl));
6665     }
6666   }
6667 
6668   // + (BOOL)automaticallyNotifiesObserversForKey
6669   if (!IsInstanceMethod &&
6670       (ReturnType.isNull() ||
6671        ReturnType->isIntegerType() ||
6672        ReturnType->isBooleanType())) {
6673     std::string SelectorName
6674       = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str();
6675     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6676     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6677       if (ReturnType.isNull()) {
6678         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6679         Builder.AddTextChunk("BOOL");
6680         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6681       }
6682 
6683       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6684       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6685                               CXCursor_ObjCClassMethodDecl));
6686     }
6687   }
6688 }
6689 
6690 void Sema::CodeCompleteObjCMethodDecl(Scope *S,
6691                                       bool IsInstanceMethod,
6692                                       ParsedType ReturnTy) {
6693   // Determine the return type of the method we're declaring, if
6694   // provided.
6695   QualType ReturnType = GetTypeFromParser(ReturnTy);
6696   Decl *IDecl = 0;
6697   if (CurContext->isObjCContainer()) {
6698       ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext);
6699       IDecl = cast<Decl>(OCD);
6700   }
6701   // Determine where we should start searching for methods.
6702   ObjCContainerDecl *SearchDecl = 0;
6703   bool IsInImplementation = false;
6704   if (Decl *D = IDecl) {
6705     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
6706       SearchDecl = Impl->getClassInterface();
6707       IsInImplementation = true;
6708     } else if (ObjCCategoryImplDecl *CatImpl
6709                                          = dyn_cast<ObjCCategoryImplDecl>(D)) {
6710       SearchDecl = CatImpl->getCategoryDecl();
6711       IsInImplementation = true;
6712     } else
6713       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
6714   }
6715 
6716   if (!SearchDecl && S) {
6717     if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity()))
6718       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
6719   }
6720 
6721   if (!SearchDecl) {
6722     HandleCodeCompleteResults(this, CodeCompleter,
6723                               CodeCompletionContext::CCC_Other,
6724                               0, 0);
6725     return;
6726   }
6727 
6728   // Find all of the methods that we could declare/implement here.
6729   KnownMethodsMap KnownMethods;
6730   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod,
6731                            ReturnType, KnownMethods);
6732 
6733   // Add declarations or definitions for each of the known methods.
6734   typedef CodeCompletionResult Result;
6735   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6736                         CodeCompleter->getCodeCompletionTUInfo(),
6737                         CodeCompletionContext::CCC_Other);
6738   Results.EnterNewScope();
6739   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
6740   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
6741                               MEnd = KnownMethods.end();
6742        M != MEnd; ++M) {
6743     ObjCMethodDecl *Method = M->second.first;
6744     CodeCompletionBuilder Builder(Results.getAllocator(),
6745                                   Results.getCodeCompletionTUInfo());
6746 
6747     // If the result type was not already provided, add it to the
6748     // pattern as (type).
6749     if (ReturnType.isNull())
6750       AddObjCPassingTypeChunk(Method->getResultType(),
6751                               Method->getObjCDeclQualifier(),
6752                               Context, Policy,
6753                               Builder);
6754 
6755     Selector Sel = Method->getSelector();
6756 
6757     // Add the first part of the selector to the pattern.
6758     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6759                                                        Sel.getNameForSlot(0)));
6760 
6761     // Add parameters to the pattern.
6762     unsigned I = 0;
6763     for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
6764                                      PEnd = Method->param_end();
6765          P != PEnd; (void)++P, ++I) {
6766       // Add the part of the selector name.
6767       if (I == 0)
6768         Builder.AddTypedTextChunk(":");
6769       else if (I < Sel.getNumArgs()) {
6770         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6771         Builder.AddTypedTextChunk(
6772                 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6773       } else
6774         break;
6775 
6776       // Add the parameter type.
6777       AddObjCPassingTypeChunk((*P)->getOriginalType(),
6778                               (*P)->getObjCDeclQualifier(),
6779                               Context, Policy,
6780                               Builder);
6781 
6782       if (IdentifierInfo *Id = (*P)->getIdentifier())
6783         Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName()));
6784     }
6785 
6786     if (Method->isVariadic()) {
6787       if (Method->param_size() > 0)
6788         Builder.AddChunk(CodeCompletionString::CK_Comma);
6789       Builder.AddTextChunk("...");
6790     }
6791 
6792     if (IsInImplementation && Results.includeCodePatterns()) {
6793       // We will be defining the method here, so add a compound statement.
6794       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6795       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6796       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6797       if (!Method->getResultType()->isVoidType()) {
6798         // If the result type is not void, add a return clause.
6799         Builder.AddTextChunk("return");
6800         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6801         Builder.AddPlaceholderChunk("expression");
6802         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
6803       } else
6804         Builder.AddPlaceholderChunk("statements");
6805 
6806       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6807       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6808     }
6809 
6810     unsigned Priority = CCP_CodePattern;
6811     if (!M->second.second)
6812       Priority += CCD_InBaseClass;
6813 
6814     Results.AddResult(Result(Builder.TakeString(), Method, Priority));
6815   }
6816 
6817   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
6818   // the properties in this class and its categories.
6819   if (Context.getLangOpts().ObjC2) {
6820     SmallVector<ObjCContainerDecl *, 4> Containers;
6821     Containers.push_back(SearchDecl);
6822 
6823     VisitedSelectorSet KnownSelectors;
6824     for (KnownMethodsMap::iterator M = KnownMethods.begin(),
6825                                 MEnd = KnownMethods.end();
6826          M != MEnd; ++M)
6827       KnownSelectors.insert(M->first);
6828 
6829 
6830     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
6831     if (!IFace)
6832       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
6833         IFace = Category->getClassInterface();
6834 
6835     if (IFace) {
6836       for (ObjCCategoryDecl *Category = IFace->getCategoryList(); Category;
6837            Category = Category->getNextClassCategory())
6838         Containers.push_back(Category);
6839     }
6840 
6841     for (unsigned I = 0, N = Containers.size(); I != N; ++I) {
6842       for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(),
6843                                          PEnd = Containers[I]->prop_end();
6844            P != PEnd; ++P) {
6845         AddObjCKeyValueCompletions(&*P, IsInstanceMethod, ReturnType, Context,
6846                                    KnownSelectors, Results);
6847       }
6848     }
6849   }
6850 
6851   Results.ExitScope();
6852 
6853   HandleCodeCompleteResults(this, CodeCompleter,
6854                             CodeCompletionContext::CCC_Other,
6855                             Results.data(),Results.size());
6856 }
6857 
6858 void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S,
6859                                               bool IsInstanceMethod,
6860                                               bool AtParameterName,
6861                                               ParsedType ReturnTy,
6862                                               IdentifierInfo **SelIdents,
6863                                               unsigned NumSelIdents) {
6864   // If we have an external source, load the entire class method
6865   // pool from the AST file.
6866   if (ExternalSource) {
6867     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
6868          I != N; ++I) {
6869       Selector Sel = ExternalSource->GetExternalSelector(I);
6870       if (Sel.isNull() || MethodPool.count(Sel))
6871         continue;
6872 
6873       ReadMethodPool(Sel);
6874     }
6875   }
6876 
6877   // Build the set of methods we can see.
6878   typedef CodeCompletionResult Result;
6879   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6880                         CodeCompleter->getCodeCompletionTUInfo(),
6881                         CodeCompletionContext::CCC_Other);
6882 
6883   if (ReturnTy)
6884     Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType());
6885 
6886   Results.EnterNewScope();
6887   for (GlobalMethodPool::iterator M = MethodPool.begin(),
6888                                   MEnd = MethodPool.end();
6889        M != MEnd; ++M) {
6890     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first :
6891                                                        &M->second.second;
6892          MethList && MethList->Method;
6893          MethList = MethList->Next) {
6894       if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
6895                                   NumSelIdents))
6896         continue;
6897 
6898       if (AtParameterName) {
6899         // Suggest parameter names we've seen before.
6900         if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) {
6901           ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1];
6902           if (Param->getIdentifier()) {
6903             CodeCompletionBuilder Builder(Results.getAllocator(),
6904                                           Results.getCodeCompletionTUInfo());
6905             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6906                                            Param->getIdentifier()->getName()));
6907             Results.AddResult(Builder.TakeString());
6908           }
6909         }
6910 
6911         continue;
6912       }
6913 
6914       Result R(MethList->Method, 0);
6915       R.StartParameter = NumSelIdents;
6916       R.AllParametersAreInformative = false;
6917       R.DeclaringEntity = true;
6918       Results.MaybeAddResult(R, CurContext);
6919     }
6920   }
6921 
6922   Results.ExitScope();
6923   HandleCodeCompleteResults(this, CodeCompleter,
6924                             CodeCompletionContext::CCC_Other,
6925                             Results.data(),Results.size());
6926 }
6927 
6928 void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
6929   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6930                         CodeCompleter->getCodeCompletionTUInfo(),
6931                         CodeCompletionContext::CCC_PreprocessorDirective);
6932   Results.EnterNewScope();
6933 
6934   // #if <condition>
6935   CodeCompletionBuilder Builder(Results.getAllocator(),
6936                                 Results.getCodeCompletionTUInfo());
6937   Builder.AddTypedTextChunk("if");
6938   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6939   Builder.AddPlaceholderChunk("condition");
6940   Results.AddResult(Builder.TakeString());
6941 
6942   // #ifdef <macro>
6943   Builder.AddTypedTextChunk("ifdef");
6944   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6945   Builder.AddPlaceholderChunk("macro");
6946   Results.AddResult(Builder.TakeString());
6947 
6948   // #ifndef <macro>
6949   Builder.AddTypedTextChunk("ifndef");
6950   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6951   Builder.AddPlaceholderChunk("macro");
6952   Results.AddResult(Builder.TakeString());
6953 
6954   if (InConditional) {
6955     // #elif <condition>
6956     Builder.AddTypedTextChunk("elif");
6957     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6958     Builder.AddPlaceholderChunk("condition");
6959     Results.AddResult(Builder.TakeString());
6960 
6961     // #else
6962     Builder.AddTypedTextChunk("else");
6963     Results.AddResult(Builder.TakeString());
6964 
6965     // #endif
6966     Builder.AddTypedTextChunk("endif");
6967     Results.AddResult(Builder.TakeString());
6968   }
6969 
6970   // #include "header"
6971   Builder.AddTypedTextChunk("include");
6972   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6973   Builder.AddTextChunk("\"");
6974   Builder.AddPlaceholderChunk("header");
6975   Builder.AddTextChunk("\"");
6976   Results.AddResult(Builder.TakeString());
6977 
6978   // #include <header>
6979   Builder.AddTypedTextChunk("include");
6980   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6981   Builder.AddTextChunk("<");
6982   Builder.AddPlaceholderChunk("header");
6983   Builder.AddTextChunk(">");
6984   Results.AddResult(Builder.TakeString());
6985 
6986   // #define <macro>
6987   Builder.AddTypedTextChunk("define");
6988   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6989   Builder.AddPlaceholderChunk("macro");
6990   Results.AddResult(Builder.TakeString());
6991 
6992   // #define <macro>(<args>)
6993   Builder.AddTypedTextChunk("define");
6994   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6995   Builder.AddPlaceholderChunk("macro");
6996   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6997   Builder.AddPlaceholderChunk("args");
6998   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6999   Results.AddResult(Builder.TakeString());
7000 
7001   // #undef <macro>
7002   Builder.AddTypedTextChunk("undef");
7003   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7004   Builder.AddPlaceholderChunk("macro");
7005   Results.AddResult(Builder.TakeString());
7006 
7007   // #line <number>
7008   Builder.AddTypedTextChunk("line");
7009   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7010   Builder.AddPlaceholderChunk("number");
7011   Results.AddResult(Builder.TakeString());
7012 
7013   // #line <number> "filename"
7014   Builder.AddTypedTextChunk("line");
7015   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7016   Builder.AddPlaceholderChunk("number");
7017   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7018   Builder.AddTextChunk("\"");
7019   Builder.AddPlaceholderChunk("filename");
7020   Builder.AddTextChunk("\"");
7021   Results.AddResult(Builder.TakeString());
7022 
7023   // #error <message>
7024   Builder.AddTypedTextChunk("error");
7025   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7026   Builder.AddPlaceholderChunk("message");
7027   Results.AddResult(Builder.TakeString());
7028 
7029   // #pragma <arguments>
7030   Builder.AddTypedTextChunk("pragma");
7031   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7032   Builder.AddPlaceholderChunk("arguments");
7033   Results.AddResult(Builder.TakeString());
7034 
7035   if (getLangOpts().ObjC1) {
7036     // #import "header"
7037     Builder.AddTypedTextChunk("import");
7038     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7039     Builder.AddTextChunk("\"");
7040     Builder.AddPlaceholderChunk("header");
7041     Builder.AddTextChunk("\"");
7042     Results.AddResult(Builder.TakeString());
7043 
7044     // #import <header>
7045     Builder.AddTypedTextChunk("import");
7046     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7047     Builder.AddTextChunk("<");
7048     Builder.AddPlaceholderChunk("header");
7049     Builder.AddTextChunk(">");
7050     Results.AddResult(Builder.TakeString());
7051   }
7052 
7053   // #include_next "header"
7054   Builder.AddTypedTextChunk("include_next");
7055   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7056   Builder.AddTextChunk("\"");
7057   Builder.AddPlaceholderChunk("header");
7058   Builder.AddTextChunk("\"");
7059   Results.AddResult(Builder.TakeString());
7060 
7061   // #include_next <header>
7062   Builder.AddTypedTextChunk("include_next");
7063   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7064   Builder.AddTextChunk("<");
7065   Builder.AddPlaceholderChunk("header");
7066   Builder.AddTextChunk(">");
7067   Results.AddResult(Builder.TakeString());
7068 
7069   // #warning <message>
7070   Builder.AddTypedTextChunk("warning");
7071   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7072   Builder.AddPlaceholderChunk("message");
7073   Results.AddResult(Builder.TakeString());
7074 
7075   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
7076   // completions for them. And __include_macros is a Clang-internal extension
7077   // that we don't want to encourage anyone to use.
7078 
7079   // FIXME: we don't support #assert or #unassert, so don't suggest them.
7080   Results.ExitScope();
7081 
7082   HandleCodeCompleteResults(this, CodeCompleter,
7083                             CodeCompletionContext::CCC_PreprocessorDirective,
7084                             Results.data(), Results.size());
7085 }
7086 
7087 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
7088   CodeCompleteOrdinaryName(S,
7089                            S->getFnParent()? Sema::PCC_RecoveryInFunction
7090                                            : Sema::PCC_Namespace);
7091 }
7092 
7093 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
7094   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7095                         CodeCompleter->getCodeCompletionTUInfo(),
7096                         IsDefinition? CodeCompletionContext::CCC_MacroName
7097                                     : CodeCompletionContext::CCC_MacroNameUse);
7098   if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
7099     // Add just the names of macros, not their arguments.
7100     CodeCompletionBuilder Builder(Results.getAllocator(),
7101                                   Results.getCodeCompletionTUInfo());
7102     Results.EnterNewScope();
7103     for (Preprocessor::macro_iterator M = PP.macro_begin(),
7104                                    MEnd = PP.macro_end();
7105          M != MEnd; ++M) {
7106       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
7107                                            M->first->getName()));
7108       Results.AddResult(Builder.TakeString());
7109     }
7110     Results.ExitScope();
7111   } else if (IsDefinition) {
7112     // FIXME: Can we detect when the user just wrote an include guard above?
7113   }
7114 
7115   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7116                             Results.data(), Results.size());
7117 }
7118 
7119 void Sema::CodeCompletePreprocessorExpression() {
7120   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7121                         CodeCompleter->getCodeCompletionTUInfo(),
7122                         CodeCompletionContext::CCC_PreprocessorExpression);
7123 
7124   if (!CodeCompleter || CodeCompleter->includeMacros())
7125     AddMacroResults(PP, Results);
7126 
7127     // defined (<macro>)
7128   Results.EnterNewScope();
7129   CodeCompletionBuilder Builder(Results.getAllocator(),
7130                                 Results.getCodeCompletionTUInfo());
7131   Builder.AddTypedTextChunk("defined");
7132   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7133   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7134   Builder.AddPlaceholderChunk("macro");
7135   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7136   Results.AddResult(Builder.TakeString());
7137   Results.ExitScope();
7138 
7139   HandleCodeCompleteResults(this, CodeCompleter,
7140                             CodeCompletionContext::CCC_PreprocessorExpression,
7141                             Results.data(), Results.size());
7142 }
7143 
7144 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
7145                                                  IdentifierInfo *Macro,
7146                                                  MacroInfo *MacroInfo,
7147                                                  unsigned Argument) {
7148   // FIXME: In the future, we could provide "overload" results, much like we
7149   // do for function calls.
7150 
7151   // Now just ignore this. There will be another code-completion callback
7152   // for the expanded tokens.
7153 }
7154 
7155 void Sema::CodeCompleteNaturalLanguage() {
7156   HandleCodeCompleteResults(this, CodeCompleter,
7157                             CodeCompletionContext::CCC_NaturalLanguage,
7158                             0, 0);
7159 }
7160 
7161 void Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator,
7162                                        CodeCompletionTUInfo &CCTUInfo,
7163                  SmallVectorImpl<CodeCompletionResult> &Results) {
7164   ResultBuilder Builder(*this, Allocator, CCTUInfo,
7165                         CodeCompletionContext::CCC_Recovery);
7166   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
7167     CodeCompletionDeclConsumer Consumer(Builder,
7168                                         Context.getTranslationUnitDecl());
7169     LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName,
7170                        Consumer);
7171   }
7172 
7173   if (!CodeCompleter || CodeCompleter->includeMacros())
7174     AddMacroResults(PP, Builder);
7175 
7176   Results.clear();
7177   Results.insert(Results.end(),
7178                  Builder.data(), Builder.data() + Builder.size());
7179 }
7180