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