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