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