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   // @[ objects, ... ]
4397   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,[));
4398   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4399   Builder.AddPlaceholderChunk("objects, ...");
4400   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4401   Builder.AddChunk(CodeCompletionString::CK_RightBracket);
4402   Results.AddResult(Result(Builder.TakeString()));
4403 
4404   // @{ key : object, ... }
4405   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,{));
4406   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4407   Builder.AddPlaceholderChunk("key");
4408   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4409   Builder.AddChunk(CodeCompletionString::CK_Colon);
4410   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4411   Builder.AddPlaceholderChunk("object, ...");
4412   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4413   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4414   Results.AddResult(Result(Builder.TakeString()));
4415 }
4416 
4417 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
4418   typedef CodeCompletionResult Result;
4419   CodeCompletionBuilder Builder(Results.getAllocator());
4420 
4421   if (Results.includeCodePatterns()) {
4422     // @try { statements } @catch ( declaration ) { statements } @finally
4423     //   { statements }
4424     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try));
4425     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4426     Builder.AddPlaceholderChunk("statements");
4427     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4428     Builder.AddTextChunk("@catch");
4429     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4430     Builder.AddPlaceholderChunk("parameter");
4431     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4432     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4433     Builder.AddPlaceholderChunk("statements");
4434     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4435     Builder.AddTextChunk("@finally");
4436     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4437     Builder.AddPlaceholderChunk("statements");
4438     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4439     Results.AddResult(Result(Builder.TakeString()));
4440   }
4441 
4442   // @throw
4443   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw));
4444   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4445   Builder.AddPlaceholderChunk("expression");
4446   Results.AddResult(Result(Builder.TakeString()));
4447 
4448   if (Results.includeCodePatterns()) {
4449     // @synchronized ( expression ) { statements }
4450     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized));
4451     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4452     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4453     Builder.AddPlaceholderChunk("expression");
4454     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4455     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
4456     Builder.AddPlaceholderChunk("statements");
4457     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
4458     Results.AddResult(Result(Builder.TakeString()));
4459   }
4460 }
4461 
4462 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
4463                                      ResultBuilder &Results,
4464                                      bool NeedAt) {
4465   typedef CodeCompletionResult Result;
4466   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private)));
4467   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected)));
4468   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public)));
4469   if (LangOpts.ObjC2)
4470     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package)));
4471 }
4472 
4473 void Sema::CodeCompleteObjCAtVisibility(Scope *S) {
4474   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4475                         CodeCompletionContext::CCC_Other);
4476   Results.EnterNewScope();
4477   AddObjCVisibilityResults(getLangOptions(), Results, false);
4478   Results.ExitScope();
4479   HandleCodeCompleteResults(this, CodeCompleter,
4480                             CodeCompletionContext::CCC_Other,
4481                             Results.data(),Results.size());
4482 }
4483 
4484 void Sema::CodeCompleteObjCAtStatement(Scope *S) {
4485   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4486                         CodeCompletionContext::CCC_Other);
4487   Results.EnterNewScope();
4488   AddObjCStatementResults(Results, false);
4489   AddObjCExpressionResults(Results, false);
4490   Results.ExitScope();
4491   HandleCodeCompleteResults(this, CodeCompleter,
4492                             CodeCompletionContext::CCC_Other,
4493                             Results.data(),Results.size());
4494 }
4495 
4496 void Sema::CodeCompleteObjCAtExpression(Scope *S) {
4497   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4498                         CodeCompletionContext::CCC_Other);
4499   Results.EnterNewScope();
4500   AddObjCExpressionResults(Results, false);
4501   Results.ExitScope();
4502   HandleCodeCompleteResults(this, CodeCompleter,
4503                             CodeCompletionContext::CCC_Other,
4504                             Results.data(),Results.size());
4505 }
4506 
4507 /// \brief Determine whether the addition of the given flag to an Objective-C
4508 /// property's attributes will cause a conflict.
4509 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
4510   // Check if we've already added this flag.
4511   if (Attributes & NewFlag)
4512     return true;
4513 
4514   Attributes |= NewFlag;
4515 
4516   // Check for collisions with "readonly".
4517   if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
4518       (Attributes & (ObjCDeclSpec::DQ_PR_readwrite |
4519                      ObjCDeclSpec::DQ_PR_assign |
4520                      ObjCDeclSpec::DQ_PR_unsafe_unretained |
4521                      ObjCDeclSpec::DQ_PR_copy |
4522                      ObjCDeclSpec::DQ_PR_retain |
4523                      ObjCDeclSpec::DQ_PR_strong)))
4524     return true;
4525 
4526   // Check for more than one of { assign, copy, retain, strong }.
4527   unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign |
4528                                          ObjCDeclSpec::DQ_PR_unsafe_unretained |
4529                                              ObjCDeclSpec::DQ_PR_copy |
4530                                              ObjCDeclSpec::DQ_PR_retain|
4531                                              ObjCDeclSpec::DQ_PR_strong);
4532   if (AssignCopyRetMask &&
4533       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign &&
4534       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained &&
4535       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy &&
4536       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain &&
4537       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong)
4538     return true;
4539 
4540   return false;
4541 }
4542 
4543 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
4544   if (!CodeCompleter)
4545     return;
4546 
4547   unsigned Attributes = ODS.getPropertyAttributes();
4548 
4549   typedef CodeCompletionResult Result;
4550   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4551                         CodeCompletionContext::CCC_Other);
4552   Results.EnterNewScope();
4553   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly))
4554     Results.AddResult(CodeCompletionResult("readonly"));
4555   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign))
4556     Results.AddResult(CodeCompletionResult("assign"));
4557   if (!ObjCPropertyFlagConflicts(Attributes,
4558                                  ObjCDeclSpec::DQ_PR_unsafe_unretained))
4559     Results.AddResult(CodeCompletionResult("unsafe_unretained"));
4560   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite))
4561     Results.AddResult(CodeCompletionResult("readwrite"));
4562   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain))
4563     Results.AddResult(CodeCompletionResult("retain"));
4564   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong))
4565     Results.AddResult(CodeCompletionResult("strong"));
4566   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy))
4567     Results.AddResult(CodeCompletionResult("copy"));
4568   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic))
4569     Results.AddResult(CodeCompletionResult("nonatomic"));
4570   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic))
4571     Results.AddResult(CodeCompletionResult("atomic"));
4572   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) {
4573     CodeCompletionBuilder Setter(Results.getAllocator());
4574     Setter.AddTypedTextChunk("setter");
4575     Setter.AddTextChunk(" = ");
4576     Setter.AddPlaceholderChunk("method");
4577     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
4578   }
4579   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) {
4580     CodeCompletionBuilder Getter(Results.getAllocator());
4581     Getter.AddTypedTextChunk("getter");
4582     Getter.AddTextChunk(" = ");
4583     Getter.AddPlaceholderChunk("method");
4584     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
4585   }
4586   Results.ExitScope();
4587   HandleCodeCompleteResults(this, CodeCompleter,
4588                             CodeCompletionContext::CCC_Other,
4589                             Results.data(),Results.size());
4590 }
4591 
4592 /// \brief Descripts the kind of Objective-C method that we want to find
4593 /// via code completion.
4594 enum ObjCMethodKind {
4595   MK_Any, //< Any kind of method, provided it means other specified criteria.
4596   MK_ZeroArgSelector, //< Zero-argument (unary) selector.
4597   MK_OneArgSelector //< One-argument selector.
4598 };
4599 
4600 static bool isAcceptableObjCSelector(Selector Sel,
4601                                      ObjCMethodKind WantKind,
4602                                      IdentifierInfo **SelIdents,
4603                                      unsigned NumSelIdents,
4604                                      bool AllowSameLength = true) {
4605   if (NumSelIdents > Sel.getNumArgs())
4606     return false;
4607 
4608   switch (WantKind) {
4609     case MK_Any:             break;
4610     case MK_ZeroArgSelector: return Sel.isUnarySelector();
4611     case MK_OneArgSelector:  return Sel.getNumArgs() == 1;
4612   }
4613 
4614   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
4615     return false;
4616 
4617   for (unsigned I = 0; I != NumSelIdents; ++I)
4618     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
4619       return false;
4620 
4621   return true;
4622 }
4623 
4624 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
4625                                    ObjCMethodKind WantKind,
4626                                    IdentifierInfo **SelIdents,
4627                                    unsigned NumSelIdents,
4628                                    bool AllowSameLength = true) {
4629   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
4630                                   NumSelIdents, AllowSameLength);
4631 }
4632 
4633 namespace {
4634   /// \brief A set of selectors, which is used to avoid introducing multiple
4635   /// completions with the same selector into the result set.
4636   typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
4637 }
4638 
4639 /// \brief Add all of the Objective-C methods in the given Objective-C
4640 /// container to the set of results.
4641 ///
4642 /// The container will be a class, protocol, category, or implementation of
4643 /// any of the above. This mether will recurse to include methods from
4644 /// the superclasses of classes along with their categories, protocols, and
4645 /// implementations.
4646 ///
4647 /// \param Container the container in which we'll look to find methods.
4648 ///
4649 /// \param WantInstance whether to add instance methods (only); if false, this
4650 /// routine will add factory methods (only).
4651 ///
4652 /// \param CurContext the context in which we're performing the lookup that
4653 /// finds methods.
4654 ///
4655 /// \param AllowSameLength Whether we allow a method to be added to the list
4656 /// when it has the same number of parameters as we have selector identifiers.
4657 ///
4658 /// \param Results the structure into which we'll add results.
4659 static void AddObjCMethods(ObjCContainerDecl *Container,
4660                            bool WantInstanceMethods,
4661                            ObjCMethodKind WantKind,
4662                            IdentifierInfo **SelIdents,
4663                            unsigned NumSelIdents,
4664                            DeclContext *CurContext,
4665                            VisitedSelectorSet &Selectors,
4666                            bool AllowSameLength,
4667                            ResultBuilder &Results,
4668                            bool InOriginalClass = true) {
4669   typedef CodeCompletionResult Result;
4670   for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
4671                                        MEnd = Container->meth_end();
4672        M != MEnd; ++M) {
4673     if ((*M)->isInstanceMethod() == WantInstanceMethods) {
4674       // Check whether the selector identifiers we've been given are a
4675       // subset of the identifiers for this particular method.
4676       if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents,
4677                                   AllowSameLength))
4678         continue;
4679 
4680       if (!Selectors.insert((*M)->getSelector()))
4681         continue;
4682 
4683       Result R = Result(*M, 0);
4684       R.StartParameter = NumSelIdents;
4685       R.AllParametersAreInformative = (WantKind != MK_Any);
4686       if (!InOriginalClass)
4687         R.Priority += CCD_InBaseClass;
4688       Results.MaybeAddResult(R, CurContext);
4689     }
4690   }
4691 
4692   // Visit the protocols of protocols.
4693   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
4694     if (Protocol->hasDefinition()) {
4695       const ObjCList<ObjCProtocolDecl> &Protocols
4696         = Protocol->getReferencedProtocols();
4697       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4698                                                 E = Protocols.end();
4699            I != E; ++I)
4700         AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,
4701                        NumSelIdents, CurContext, Selectors, AllowSameLength,
4702                        Results, false);
4703     }
4704   }
4705 
4706   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
4707   if (!IFace || !IFace->hasDefinition())
4708     return;
4709 
4710   // Add methods in protocols.
4711   const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols();
4712   for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4713                                             E = Protocols.end();
4714        I != E; ++I)
4715     AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents,
4716                    CurContext, Selectors, AllowSameLength, Results, false);
4717 
4718   // Add methods in categories.
4719   for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl;
4720        CatDecl = CatDecl->getNextClassCategory()) {
4721     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
4722                    NumSelIdents, CurContext, Selectors, AllowSameLength,
4723                    Results, InOriginalClass);
4724 
4725     // Add a categories protocol methods.
4726     const ObjCList<ObjCProtocolDecl> &Protocols
4727       = CatDecl->getReferencedProtocols();
4728     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
4729                                               E = Protocols.end();
4730          I != E; ++I)
4731       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,
4732                      NumSelIdents, CurContext, Selectors, AllowSameLength,
4733                      Results, false);
4734 
4735     // Add methods in category implementations.
4736     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
4737       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4738                      NumSelIdents, CurContext, Selectors, AllowSameLength,
4739                      Results, InOriginalClass);
4740   }
4741 
4742   // Add methods in superclass.
4743   if (IFace->getSuperClass())
4744     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
4745                    SelIdents, NumSelIdents, CurContext, Selectors,
4746                    AllowSameLength, Results, false);
4747 
4748   // Add methods in our implementation, if any.
4749   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
4750     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,
4751                    NumSelIdents, CurContext, Selectors, AllowSameLength,
4752                    Results, InOriginalClass);
4753 }
4754 
4755 
4756 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) {
4757   typedef CodeCompletionResult Result;
4758 
4759   // Try to find the interface where getters might live.
4760   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
4761   if (!Class) {
4762     if (ObjCCategoryDecl *Category
4763           = dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
4764       Class = Category->getClassInterface();
4765 
4766     if (!Class)
4767       return;
4768   }
4769 
4770   // Find all of the potential getters.
4771   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4772                         CodeCompletionContext::CCC_Other);
4773   Results.EnterNewScope();
4774 
4775   VisitedSelectorSet Selectors;
4776   AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors,
4777                  /*AllowSameLength=*/true, Results);
4778   Results.ExitScope();
4779   HandleCodeCompleteResults(this, CodeCompleter,
4780                             CodeCompletionContext::CCC_Other,
4781                             Results.data(),Results.size());
4782 }
4783 
4784 void Sema::CodeCompleteObjCPropertySetter(Scope *S) {
4785   typedef CodeCompletionResult Result;
4786 
4787   // Try to find the interface where setters might live.
4788   ObjCInterfaceDecl *Class
4789     = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
4790   if (!Class) {
4791     if (ObjCCategoryDecl *Category
4792           = dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
4793       Class = Category->getClassInterface();
4794 
4795     if (!Class)
4796       return;
4797   }
4798 
4799   // Find all of the potential getters.
4800   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4801                         CodeCompletionContext::CCC_Other);
4802   Results.EnterNewScope();
4803 
4804   VisitedSelectorSet Selectors;
4805   AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext,
4806                  Selectors, /*AllowSameLength=*/true, Results);
4807 
4808   Results.ExitScope();
4809   HandleCodeCompleteResults(this, CodeCompleter,
4810                             CodeCompletionContext::CCC_Other,
4811                             Results.data(),Results.size());
4812 }
4813 
4814 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
4815                                        bool IsParameter) {
4816   typedef CodeCompletionResult Result;
4817   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4818                         CodeCompletionContext::CCC_Type);
4819   Results.EnterNewScope();
4820 
4821   // Add context-sensitive, Objective-C parameter-passing keywords.
4822   bool AddedInOut = false;
4823   if ((DS.getObjCDeclQualifier() &
4824        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
4825     Results.AddResult("in");
4826     Results.AddResult("inout");
4827     AddedInOut = true;
4828   }
4829   if ((DS.getObjCDeclQualifier() &
4830        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
4831     Results.AddResult("out");
4832     if (!AddedInOut)
4833       Results.AddResult("inout");
4834   }
4835   if ((DS.getObjCDeclQualifier() &
4836        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
4837         ObjCDeclSpec::DQ_Oneway)) == 0) {
4838      Results.AddResult("bycopy");
4839      Results.AddResult("byref");
4840      Results.AddResult("oneway");
4841   }
4842 
4843   // If we're completing the return type of an Objective-C method and the
4844   // identifier IBAction refers to a macro, provide a completion item for
4845   // an action, e.g.,
4846   //   IBAction)<#selector#>:(id)sender
4847   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
4848       Context.Idents.get("IBAction").hasMacroDefinition()) {
4849     typedef CodeCompletionString::Chunk Chunk;
4850     CodeCompletionBuilder Builder(Results.getAllocator(), CCP_CodePattern,
4851                                   CXAvailability_Available);
4852     Builder.AddTypedTextChunk("IBAction");
4853     Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen));
4854     Builder.AddPlaceholderChunk("selector");
4855     Builder.AddChunk(Chunk(CodeCompletionString::CK_Colon));
4856     Builder.AddChunk(Chunk(CodeCompletionString::CK_LeftParen));
4857     Builder.AddTextChunk("id");
4858     Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen));
4859     Builder.AddTextChunk("sender");
4860     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
4861   }
4862 
4863   // Add various builtin type names and specifiers.
4864   AddOrdinaryNameResults(PCC_Type, S, *this, Results);
4865   Results.ExitScope();
4866 
4867   // Add the various type names
4868   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
4869   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4870   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4871                      CodeCompleter->includeGlobals());
4872 
4873   if (CodeCompleter->includeMacros())
4874     AddMacroResults(PP, Results);
4875 
4876   HandleCodeCompleteResults(this, CodeCompleter,
4877                             CodeCompletionContext::CCC_Type,
4878                             Results.data(), Results.size());
4879 }
4880 
4881 /// \brief When we have an expression with type "id", we may assume
4882 /// that it has some more-specific class type based on knowledge of
4883 /// common uses of Objective-C. This routine returns that class type,
4884 /// or NULL if no better result could be determined.
4885 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
4886   ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
4887   if (!Msg)
4888     return 0;
4889 
4890   Selector Sel = Msg->getSelector();
4891   if (Sel.isNull())
4892     return 0;
4893 
4894   IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
4895   if (!Id)
4896     return 0;
4897 
4898   ObjCMethodDecl *Method = Msg->getMethodDecl();
4899   if (!Method)
4900     return 0;
4901 
4902   // Determine the class that we're sending the message to.
4903   ObjCInterfaceDecl *IFace = 0;
4904   switch (Msg->getReceiverKind()) {
4905   case ObjCMessageExpr::Class:
4906     if (const ObjCObjectType *ObjType
4907                            = Msg->getClassReceiver()->getAs<ObjCObjectType>())
4908       IFace = ObjType->getInterface();
4909     break;
4910 
4911   case ObjCMessageExpr::Instance: {
4912     QualType T = Msg->getInstanceReceiver()->getType();
4913     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
4914       IFace = Ptr->getInterfaceDecl();
4915     break;
4916   }
4917 
4918   case ObjCMessageExpr::SuperInstance:
4919   case ObjCMessageExpr::SuperClass:
4920     break;
4921   }
4922 
4923   if (!IFace)
4924     return 0;
4925 
4926   ObjCInterfaceDecl *Super = IFace->getSuperClass();
4927   if (Method->isInstanceMethod())
4928     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
4929       .Case("retain", IFace)
4930       .Case("strong", IFace)
4931       .Case("autorelease", IFace)
4932       .Case("copy", IFace)
4933       .Case("copyWithZone", IFace)
4934       .Case("mutableCopy", IFace)
4935       .Case("mutableCopyWithZone", IFace)
4936       .Case("awakeFromCoder", IFace)
4937       .Case("replacementObjectFromCoder", IFace)
4938       .Case("class", IFace)
4939       .Case("classForCoder", IFace)
4940       .Case("superclass", Super)
4941       .Default(0);
4942 
4943   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
4944     .Case("new", IFace)
4945     .Case("alloc", IFace)
4946     .Case("allocWithZone", IFace)
4947     .Case("class", IFace)
4948     .Case("superclass", Super)
4949     .Default(0);
4950 }
4951 
4952 // Add a special completion for a message send to "super", which fills in the
4953 // most likely case of forwarding all of our arguments to the superclass
4954 // function.
4955 ///
4956 /// \param S The semantic analysis object.
4957 ///
4958 /// \param S NeedSuperKeyword Whether we need to prefix this completion with
4959 /// the "super" keyword. Otherwise, we just need to provide the arguments.
4960 ///
4961 /// \param SelIdents The identifiers in the selector that have already been
4962 /// provided as arguments for a send to "super".
4963 ///
4964 /// \param NumSelIdents The number of identifiers in \p SelIdents.
4965 ///
4966 /// \param Results The set of results to augment.
4967 ///
4968 /// \returns the Objective-C method declaration that would be invoked by
4969 /// this "super" completion. If NULL, no completion was added.
4970 static ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,
4971                                               IdentifierInfo **SelIdents,
4972                                               unsigned NumSelIdents,
4973                                               ResultBuilder &Results) {
4974   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
4975   if (!CurMethod)
4976     return 0;
4977 
4978   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
4979   if (!Class)
4980     return 0;
4981 
4982   // Try to find a superclass method with the same selector.
4983   ObjCMethodDecl *SuperMethod = 0;
4984   while ((Class = Class->getSuperClass()) && !SuperMethod) {
4985     // Check in the class
4986     SuperMethod = Class->getMethod(CurMethod->getSelector(),
4987                                    CurMethod->isInstanceMethod());
4988 
4989     // Check in categories or class extensions.
4990     if (!SuperMethod) {
4991       for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
4992            Category = Category->getNextClassCategory())
4993         if ((SuperMethod = Category->getMethod(CurMethod->getSelector(),
4994                                                CurMethod->isInstanceMethod())))
4995           break;
4996     }
4997   }
4998 
4999   if (!SuperMethod)
5000     return 0;
5001 
5002   // Check whether the superclass method has the same signature.
5003   if (CurMethod->param_size() != SuperMethod->param_size() ||
5004       CurMethod->isVariadic() != SuperMethod->isVariadic())
5005     return 0;
5006 
5007   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
5008                                    CurPEnd = CurMethod->param_end(),
5009                                     SuperP = SuperMethod->param_begin();
5010        CurP != CurPEnd; ++CurP, ++SuperP) {
5011     // Make sure the parameter types are compatible.
5012     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
5013                                           (*SuperP)->getType()))
5014       return 0;
5015 
5016     // Make sure we have a parameter name to forward!
5017     if (!(*CurP)->getIdentifier())
5018       return 0;
5019   }
5020 
5021   // We have a superclass method. Now, form the send-to-super completion.
5022   CodeCompletionBuilder Builder(Results.getAllocator());
5023 
5024   // Give this completion a return type.
5025   AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod,
5026                      Builder);
5027 
5028   // If we need the "super" keyword, add it (plus some spacing).
5029   if (NeedSuperKeyword) {
5030     Builder.AddTypedTextChunk("super");
5031     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5032   }
5033 
5034   Selector Sel = CurMethod->getSelector();
5035   if (Sel.isUnarySelector()) {
5036     if (NeedSuperKeyword)
5037       Builder.AddTextChunk(Builder.getAllocator().CopyString(
5038                                   Sel.getNameForSlot(0)));
5039     else
5040       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
5041                                    Sel.getNameForSlot(0)));
5042   } else {
5043     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
5044     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
5045       if (I > NumSelIdents)
5046         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5047 
5048       if (I < NumSelIdents)
5049         Builder.AddInformativeChunk(
5050                    Builder.getAllocator().CopyString(
5051                                                  Sel.getNameForSlot(I) + ":"));
5052       else if (NeedSuperKeyword || I > NumSelIdents) {
5053         Builder.AddTextChunk(
5054                  Builder.getAllocator().CopyString(
5055                                                   Sel.getNameForSlot(I) + ":"));
5056         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
5057                                          (*CurP)->getIdentifier()->getName()));
5058       } else {
5059         Builder.AddTypedTextChunk(
5060                   Builder.getAllocator().CopyString(
5061                                                   Sel.getNameForSlot(I) + ":"));
5062         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
5063                                          (*CurP)->getIdentifier()->getName()));
5064       }
5065     }
5066   }
5067 
5068   Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_SuperCompletion,
5069                                          SuperMethod->isInstanceMethod()
5070                                            ? CXCursor_ObjCInstanceMethodDecl
5071                                            : CXCursor_ObjCClassMethodDecl));
5072   return SuperMethod;
5073 }
5074 
5075 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {
5076   typedef CodeCompletionResult Result;
5077   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5078                         CodeCompletionContext::CCC_ObjCMessageReceiver,
5079                         getLangOptions().CPlusPlus0x
5080                           ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
5081                           : &ResultBuilder::IsObjCMessageReceiver);
5082 
5083   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5084   Results.EnterNewScope();
5085   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5086                      CodeCompleter->includeGlobals());
5087 
5088   // If we are in an Objective-C method inside a class that has a superclass,
5089   // add "super" as an option.
5090   if (ObjCMethodDecl *Method = getCurMethodDecl())
5091     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
5092       if (Iface->getSuperClass()) {
5093         Results.AddResult(Result("super"));
5094 
5095         AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, 0, 0, Results);
5096       }
5097 
5098   if (getLangOptions().CPlusPlus0x)
5099     addThisCompletion(*this, Results);
5100 
5101   Results.ExitScope();
5102 
5103   if (CodeCompleter->includeMacros())
5104     AddMacroResults(PP, Results);
5105   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5106                             Results.data(), Results.size());
5107 
5108 }
5109 
5110 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
5111                                         IdentifierInfo **SelIdents,
5112                                         unsigned NumSelIdents,
5113                                         bool AtArgumentExpression) {
5114   ObjCInterfaceDecl *CDecl = 0;
5115   if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
5116     // Figure out which interface we're in.
5117     CDecl = CurMethod->getClassInterface();
5118     if (!CDecl)
5119       return;
5120 
5121     // Find the superclass of this class.
5122     CDecl = CDecl->getSuperClass();
5123     if (!CDecl)
5124       return;
5125 
5126     if (CurMethod->isInstanceMethod()) {
5127       // We are inside an instance method, which means that the message
5128       // send [super ...] is actually calling an instance method on the
5129       // current object.
5130       return CodeCompleteObjCInstanceMessage(S, 0,
5131                                              SelIdents, NumSelIdents,
5132                                              AtArgumentExpression,
5133                                              CDecl);
5134     }
5135 
5136     // Fall through to send to the superclass in CDecl.
5137   } else {
5138     // "super" may be the name of a type or variable. Figure out which
5139     // it is.
5140     IdentifierInfo *Super = &Context.Idents.get("super");
5141     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc,
5142                                      LookupOrdinaryName);
5143     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
5144       // "super" names an interface. Use it.
5145     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
5146       if (const ObjCObjectType *Iface
5147             = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>())
5148         CDecl = Iface->getInterface();
5149     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
5150       // "super" names an unresolved type; we can't be more specific.
5151     } else {
5152       // Assume that "super" names some kind of value and parse that way.
5153       CXXScopeSpec SS;
5154       SourceLocation TemplateKWLoc;
5155       UnqualifiedId id;
5156       id.setIdentifier(Super, SuperLoc);
5157       ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id,
5158                                                false, false);
5159       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
5160                                              SelIdents, NumSelIdents,
5161                                              AtArgumentExpression);
5162     }
5163 
5164     // Fall through
5165   }
5166 
5167   ParsedType Receiver;
5168   if (CDecl)
5169     Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));
5170   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
5171                                       NumSelIdents, AtArgumentExpression,
5172                                       /*IsSuper=*/true);
5173 }
5174 
5175 /// \brief Given a set of code-completion results for the argument of a message
5176 /// send, determine the preferred type (if any) for that argument expression.
5177 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
5178                                                        unsigned NumSelIdents) {
5179   typedef CodeCompletionResult Result;
5180   ASTContext &Context = Results.getSema().Context;
5181 
5182   QualType PreferredType;
5183   unsigned BestPriority = CCP_Unlikely * 2;
5184   Result *ResultsData = Results.data();
5185   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
5186     Result &R = ResultsData[I];
5187     if (R.Kind == Result::RK_Declaration &&
5188         isa<ObjCMethodDecl>(R.Declaration)) {
5189       if (R.Priority <= BestPriority) {
5190         ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
5191         if (NumSelIdents <= Method->param_size()) {
5192           QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1]
5193                                        ->getType();
5194           if (R.Priority < BestPriority || PreferredType.isNull()) {
5195             BestPriority = R.Priority;
5196             PreferredType = MyPreferredType;
5197           } else if (!Context.hasSameUnqualifiedType(PreferredType,
5198                                                      MyPreferredType)) {
5199             PreferredType = QualType();
5200           }
5201         }
5202       }
5203     }
5204   }
5205 
5206   return PreferredType;
5207 }
5208 
5209 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
5210                                        ParsedType Receiver,
5211                                        IdentifierInfo **SelIdents,
5212                                        unsigned NumSelIdents,
5213                                        bool AtArgumentExpression,
5214                                        bool IsSuper,
5215                                        ResultBuilder &Results) {
5216   typedef CodeCompletionResult Result;
5217   ObjCInterfaceDecl *CDecl = 0;
5218 
5219   // If the given name refers to an interface type, retrieve the
5220   // corresponding declaration.
5221   if (Receiver) {
5222     QualType T = SemaRef.GetTypeFromParser(Receiver, 0);
5223     if (!T.isNull())
5224       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
5225         CDecl = Interface->getInterface();
5226   }
5227 
5228   // Add all of the factory methods in this Objective-C class, its protocols,
5229   // superclasses, categories, implementation, etc.
5230   Results.EnterNewScope();
5231 
5232   // If this is a send-to-super, try to add the special "super" send
5233   // completion.
5234   if (IsSuper) {
5235     if (ObjCMethodDecl *SuperMethod
5236         = AddSuperSendCompletion(SemaRef, false, SelIdents, NumSelIdents,
5237                                  Results))
5238       Results.Ignore(SuperMethod);
5239   }
5240 
5241   // If we're inside an Objective-C method definition, prefer its selector to
5242   // others.
5243   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
5244     Results.setPreferredSelector(CurMethod->getSelector());
5245 
5246   VisitedSelectorSet Selectors;
5247   if (CDecl)
5248     AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents,
5249                    SemaRef.CurContext, Selectors, AtArgumentExpression,
5250                    Results);
5251   else {
5252     // We're messaging "id" as a type; provide all class/factory methods.
5253 
5254     // If we have an external source, load the entire class method
5255     // pool from the AST file.
5256     if (SemaRef.ExternalSource) {
5257       for (uint32_t I = 0,
5258                     N = SemaRef.ExternalSource->GetNumExternalSelectors();
5259            I != N; ++I) {
5260         Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I);
5261         if (Sel.isNull() || SemaRef.MethodPool.count(Sel))
5262           continue;
5263 
5264         SemaRef.ReadMethodPool(Sel);
5265       }
5266     }
5267 
5268     for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(),
5269                                        MEnd = SemaRef.MethodPool.end();
5270          M != MEnd; ++M) {
5271       for (ObjCMethodList *MethList = &M->second.second;
5272            MethList && MethList->Method;
5273            MethList = MethList->Next) {
5274         if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
5275                                     NumSelIdents))
5276           continue;
5277 
5278         Result R(MethList->Method, 0);
5279         R.StartParameter = NumSelIdents;
5280         R.AllParametersAreInformative = false;
5281         Results.MaybeAddResult(R, SemaRef.CurContext);
5282       }
5283     }
5284   }
5285 
5286   Results.ExitScope();
5287 }
5288 
5289 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
5290                                         IdentifierInfo **SelIdents,
5291                                         unsigned NumSelIdents,
5292                                         bool AtArgumentExpression,
5293                                         bool IsSuper) {
5294 
5295   QualType T = this->GetTypeFromParser(Receiver);
5296 
5297   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5298               CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage,
5299                                     T, SelIdents, NumSelIdents));
5300 
5301   AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents,
5302                              AtArgumentExpression, IsSuper, Results);
5303 
5304   // If we're actually at the argument expression (rather than prior to the
5305   // selector), we're actually performing code completion for an expression.
5306   // Determine whether we have a single, best method. If so, we can
5307   // code-complete the expression using the corresponding parameter type as
5308   // our preferred type, improving completion results.
5309   if (AtArgumentExpression) {
5310     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
5311                                                                   NumSelIdents);
5312     if (PreferredType.isNull())
5313       CodeCompleteOrdinaryName(S, PCC_Expression);
5314     else
5315       CodeCompleteExpression(S, PreferredType);
5316     return;
5317   }
5318 
5319   HandleCodeCompleteResults(this, CodeCompleter,
5320                             Results.getCompletionContext(),
5321                             Results.data(), Results.size());
5322 }
5323 
5324 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,
5325                                            IdentifierInfo **SelIdents,
5326                                            unsigned NumSelIdents,
5327                                            bool AtArgumentExpression,
5328                                            ObjCInterfaceDecl *Super) {
5329   typedef CodeCompletionResult Result;
5330 
5331   Expr *RecExpr = static_cast<Expr *>(Receiver);
5332 
5333   // If necessary, apply function/array conversion to the receiver.
5334   // C99 6.7.5.3p[7,8].
5335   if (RecExpr) {
5336     ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr);
5337     if (Conv.isInvalid()) // conversion failed. bail.
5338       return;
5339     RecExpr = Conv.take();
5340   }
5341   QualType ReceiverType = RecExpr? RecExpr->getType()
5342                           : Super? Context.getObjCObjectPointerType(
5343                                             Context.getObjCInterfaceType(Super))
5344                                  : Context.getObjCIdType();
5345 
5346   // If we're messaging an expression with type "id" or "Class", check
5347   // whether we know something special about the receiver that allows
5348   // us to assume a more-specific receiver type.
5349   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType())
5350     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
5351       if (ReceiverType->isObjCClassType())
5352         return CodeCompleteObjCClassMessage(S,
5353                        ParsedType::make(Context.getObjCInterfaceType(IFace)),
5354                                             SelIdents, NumSelIdents,
5355                                             AtArgumentExpression, Super);
5356 
5357       ReceiverType = Context.getObjCObjectPointerType(
5358                                           Context.getObjCInterfaceType(IFace));
5359     }
5360 
5361   // Build the set of methods we can see.
5362   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5363            CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
5364                                  ReceiverType, SelIdents, NumSelIdents));
5365 
5366   Results.EnterNewScope();
5367 
5368   // If this is a send-to-super, try to add the special "super" send
5369   // completion.
5370   if (Super) {
5371     if (ObjCMethodDecl *SuperMethod
5372           = AddSuperSendCompletion(*this, false, SelIdents, NumSelIdents,
5373                                    Results))
5374       Results.Ignore(SuperMethod);
5375   }
5376 
5377   // If we're inside an Objective-C method definition, prefer its selector to
5378   // others.
5379   if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
5380     Results.setPreferredSelector(CurMethod->getSelector());
5381 
5382   // Keep track of the selectors we've already added.
5383   VisitedSelectorSet Selectors;
5384 
5385   // Handle messages to Class. This really isn't a message to an instance
5386   // method, so we treat it the same way we would treat a message send to a
5387   // class method.
5388   if (ReceiverType->isObjCClassType() ||
5389       ReceiverType->isObjCQualifiedClassType()) {
5390     if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
5391       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
5392         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents,
5393                        CurContext, Selectors, AtArgumentExpression, Results);
5394     }
5395   }
5396   // Handle messages to a qualified ID ("id<foo>").
5397   else if (const ObjCObjectPointerType *QualID
5398              = ReceiverType->getAsObjCQualifiedIdType()) {
5399     // Search protocols for instance methods.
5400     for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(),
5401                                               E = QualID->qual_end();
5402          I != E; ++I)
5403       AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext,
5404                      Selectors, AtArgumentExpression, Results);
5405   }
5406   // Handle messages to a pointer to interface type.
5407   else if (const ObjCObjectPointerType *IFacePtr
5408                               = ReceiverType->getAsObjCInterfacePointerType()) {
5409     // Search the class, its superclasses, etc., for instance methods.
5410     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
5411                    NumSelIdents, CurContext, Selectors, AtArgumentExpression,
5412                    Results);
5413 
5414     // Search protocols for instance methods.
5415     for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(),
5416          E = IFacePtr->qual_end();
5417          I != E; ++I)
5418       AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext,
5419                      Selectors, AtArgumentExpression, Results);
5420   }
5421   // Handle messages to "id".
5422   else if (ReceiverType->isObjCIdType()) {
5423     // We're messaging "id", so provide all instance methods we know
5424     // about as code-completion results.
5425 
5426     // If we have an external source, load the entire class method
5427     // pool from the AST file.
5428     if (ExternalSource) {
5429       for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
5430            I != N; ++I) {
5431         Selector Sel = ExternalSource->GetExternalSelector(I);
5432         if (Sel.isNull() || MethodPool.count(Sel))
5433           continue;
5434 
5435         ReadMethodPool(Sel);
5436       }
5437     }
5438 
5439     for (GlobalMethodPool::iterator M = MethodPool.begin(),
5440                                     MEnd = MethodPool.end();
5441          M != MEnd; ++M) {
5442       for (ObjCMethodList *MethList = &M->second.first;
5443            MethList && MethList->Method;
5444            MethList = MethList->Next) {
5445         if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
5446                                     NumSelIdents))
5447           continue;
5448 
5449         if (!Selectors.insert(MethList->Method->getSelector()))
5450           continue;
5451 
5452         Result R(MethList->Method, 0);
5453         R.StartParameter = NumSelIdents;
5454         R.AllParametersAreInformative = false;
5455         Results.MaybeAddResult(R, CurContext);
5456       }
5457     }
5458   }
5459   Results.ExitScope();
5460 
5461 
5462   // If we're actually at the argument expression (rather than prior to the
5463   // selector), we're actually performing code completion for an expression.
5464   // Determine whether we have a single, best method. If so, we can
5465   // code-complete the expression using the corresponding parameter type as
5466   // our preferred type, improving completion results.
5467   if (AtArgumentExpression) {
5468     QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,
5469                                                                   NumSelIdents);
5470     if (PreferredType.isNull())
5471       CodeCompleteOrdinaryName(S, PCC_Expression);
5472     else
5473       CodeCompleteExpression(S, PreferredType);
5474     return;
5475   }
5476 
5477   HandleCodeCompleteResults(this, CodeCompleter,
5478                             Results.getCompletionContext(),
5479                             Results.data(),Results.size());
5480 }
5481 
5482 void Sema::CodeCompleteObjCForCollection(Scope *S,
5483                                          DeclGroupPtrTy IterationVar) {
5484   CodeCompleteExpressionData Data;
5485   Data.ObjCCollection = true;
5486 
5487   if (IterationVar.getAsOpaquePtr()) {
5488     DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>();
5489     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
5490       if (*I)
5491         Data.IgnoreDecls.push_back(*I);
5492     }
5493   }
5494 
5495   CodeCompleteExpression(S, Data);
5496 }
5497 
5498 void Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents,
5499                                     unsigned NumSelIdents) {
5500   // If we have an external source, load the entire class method
5501   // pool from the AST file.
5502   if (ExternalSource) {
5503     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
5504          I != N; ++I) {
5505       Selector Sel = ExternalSource->GetExternalSelector(I);
5506       if (Sel.isNull() || MethodPool.count(Sel))
5507         continue;
5508 
5509       ReadMethodPool(Sel);
5510     }
5511   }
5512 
5513   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5514                         CodeCompletionContext::CCC_SelectorName);
5515   Results.EnterNewScope();
5516   for (GlobalMethodPool::iterator M = MethodPool.begin(),
5517                                MEnd = MethodPool.end();
5518        M != MEnd; ++M) {
5519 
5520     Selector Sel = M->first;
5521     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents, NumSelIdents))
5522       continue;
5523 
5524     CodeCompletionBuilder Builder(Results.getAllocator());
5525     if (Sel.isUnarySelector()) {
5526       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
5527                                                        Sel.getNameForSlot(0)));
5528       Results.AddResult(Builder.TakeString());
5529       continue;
5530     }
5531 
5532     std::string Accumulator;
5533     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
5534       if (I == NumSelIdents) {
5535         if (!Accumulator.empty()) {
5536           Builder.AddInformativeChunk(Builder.getAllocator().CopyString(
5537                                                  Accumulator));
5538           Accumulator.clear();
5539         }
5540       }
5541 
5542       Accumulator += Sel.getNameForSlot(I);
5543       Accumulator += ':';
5544     }
5545     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator));
5546     Results.AddResult(Builder.TakeString());
5547   }
5548   Results.ExitScope();
5549 
5550   HandleCodeCompleteResults(this, CodeCompleter,
5551                             CodeCompletionContext::CCC_SelectorName,
5552                             Results.data(), Results.size());
5553 }
5554 
5555 /// \brief Add all of the protocol declarations that we find in the given
5556 /// (translation unit) context.
5557 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
5558                                bool OnlyForwardDeclarations,
5559                                ResultBuilder &Results) {
5560   typedef CodeCompletionResult Result;
5561 
5562   for (DeclContext::decl_iterator D = Ctx->decls_begin(),
5563                                DEnd = Ctx->decls_end();
5564        D != DEnd; ++D) {
5565     // Record any protocols we find.
5566     if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D))
5567       if (!OnlyForwardDeclarations || !Proto->hasDefinition())
5568         Results.AddResult(Result(Proto, 0), CurContext, 0, false);
5569   }
5570 }
5571 
5572 void Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols,
5573                                               unsigned NumProtocols) {
5574   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5575                         CodeCompletionContext::CCC_ObjCProtocolName);
5576 
5577   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5578     Results.EnterNewScope();
5579 
5580     // Tell the result set to ignore all of the protocols we have
5581     // already seen.
5582     // FIXME: This doesn't work when caching code-completion results.
5583     for (unsigned I = 0; I != NumProtocols; ++I)
5584       if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first,
5585                                                       Protocols[I].second))
5586         Results.Ignore(Protocol);
5587 
5588     // Add all protocols.
5589     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false,
5590                        Results);
5591 
5592     Results.ExitScope();
5593   }
5594 
5595   HandleCodeCompleteResults(this, CodeCompleter,
5596                             CodeCompletionContext::CCC_ObjCProtocolName,
5597                             Results.data(),Results.size());
5598 }
5599 
5600 void Sema::CodeCompleteObjCProtocolDecl(Scope *) {
5601   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5602                         CodeCompletionContext::CCC_ObjCProtocolName);
5603 
5604   if (CodeCompleter && CodeCompleter->includeGlobals()) {
5605     Results.EnterNewScope();
5606 
5607     // Add all protocols.
5608     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true,
5609                        Results);
5610 
5611     Results.ExitScope();
5612   }
5613 
5614   HandleCodeCompleteResults(this, CodeCompleter,
5615                             CodeCompletionContext::CCC_ObjCProtocolName,
5616                             Results.data(),Results.size());
5617 }
5618 
5619 /// \brief Add all of the Objective-C interface declarations that we find in
5620 /// the given (translation unit) context.
5621 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
5622                                 bool OnlyForwardDeclarations,
5623                                 bool OnlyUnimplemented,
5624                                 ResultBuilder &Results) {
5625   typedef CodeCompletionResult Result;
5626 
5627   for (DeclContext::decl_iterator D = Ctx->decls_begin(),
5628                                DEnd = Ctx->decls_end();
5629        D != DEnd; ++D) {
5630     // Record any interfaces we find.
5631     if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D))
5632       if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
5633           (!OnlyUnimplemented || !Class->getImplementation()))
5634         Results.AddResult(Result(Class, 0), CurContext, 0, false);
5635   }
5636 }
5637 
5638 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
5639   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5640                         CodeCompletionContext::CCC_Other);
5641   Results.EnterNewScope();
5642 
5643   if (CodeCompleter->includeGlobals()) {
5644     // Add all classes.
5645     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5646                         false, Results);
5647   }
5648 
5649   Results.ExitScope();
5650 
5651   HandleCodeCompleteResults(this, CodeCompleter,
5652                             CodeCompletionContext::CCC_ObjCInterfaceName,
5653                             Results.data(),Results.size());
5654 }
5655 
5656 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
5657                                       SourceLocation ClassNameLoc) {
5658   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5659                         CodeCompletionContext::CCC_ObjCInterfaceName);
5660   Results.EnterNewScope();
5661 
5662   // Make sure that we ignore the class we're currently defining.
5663   NamedDecl *CurClass
5664     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5665   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
5666     Results.Ignore(CurClass);
5667 
5668   if (CodeCompleter->includeGlobals()) {
5669     // Add all classes.
5670     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5671                         false, Results);
5672   }
5673 
5674   Results.ExitScope();
5675 
5676   HandleCodeCompleteResults(this, CodeCompleter,
5677                             CodeCompletionContext::CCC_ObjCInterfaceName,
5678                             Results.data(),Results.size());
5679 }
5680 
5681 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
5682   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5683                         CodeCompletionContext::CCC_Other);
5684   Results.EnterNewScope();
5685 
5686   if (CodeCompleter->includeGlobals()) {
5687     // Add all unimplemented classes.
5688     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
5689                         true, Results);
5690   }
5691 
5692   Results.ExitScope();
5693 
5694   HandleCodeCompleteResults(this, CodeCompleter,
5695                             CodeCompletionContext::CCC_ObjCInterfaceName,
5696                             Results.data(),Results.size());
5697 }
5698 
5699 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
5700                                              IdentifierInfo *ClassName,
5701                                              SourceLocation ClassNameLoc) {
5702   typedef CodeCompletionResult Result;
5703 
5704   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5705                         CodeCompletionContext::CCC_ObjCCategoryName);
5706 
5707   // Ignore any categories we find that have already been implemented by this
5708   // interface.
5709   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5710   NamedDecl *CurClass
5711     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5712   if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass))
5713     for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
5714          Category = Category->getNextClassCategory())
5715       CategoryNames.insert(Category->getIdentifier());
5716 
5717   // Add all of the categories we know about.
5718   Results.EnterNewScope();
5719   TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
5720   for (DeclContext::decl_iterator D = TU->decls_begin(),
5721                                DEnd = TU->decls_end();
5722        D != DEnd; ++D)
5723     if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D))
5724       if (CategoryNames.insert(Category->getIdentifier()))
5725         Results.AddResult(Result(Category, 0), CurContext, 0, false);
5726   Results.ExitScope();
5727 
5728   HandleCodeCompleteResults(this, CodeCompleter,
5729                             CodeCompletionContext::CCC_ObjCCategoryName,
5730                             Results.data(),Results.size());
5731 }
5732 
5733 void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
5734                                                   IdentifierInfo *ClassName,
5735                                                   SourceLocation ClassNameLoc) {
5736   typedef CodeCompletionResult Result;
5737 
5738   // Find the corresponding interface. If we couldn't find the interface, the
5739   // program itself is ill-formed. However, we'll try to be helpful still by
5740   // providing the list of all of the categories we know about.
5741   NamedDecl *CurClass
5742     = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
5743   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
5744   if (!Class)
5745     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
5746 
5747   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5748                         CodeCompletionContext::CCC_ObjCCategoryName);
5749 
5750   // Add all of the categories that have have corresponding interface
5751   // declarations in this class and any of its superclasses, except for
5752   // already-implemented categories in the class itself.
5753   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
5754   Results.EnterNewScope();
5755   bool IgnoreImplemented = true;
5756   while (Class) {
5757     for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category;
5758          Category = Category->getNextClassCategory())
5759       if ((!IgnoreImplemented || !Category->getImplementation()) &&
5760           CategoryNames.insert(Category->getIdentifier()))
5761         Results.AddResult(Result(Category, 0), CurContext, 0, false);
5762 
5763     Class = Class->getSuperClass();
5764     IgnoreImplemented = false;
5765   }
5766   Results.ExitScope();
5767 
5768   HandleCodeCompleteResults(this, CodeCompleter,
5769                             CodeCompletionContext::CCC_ObjCCategoryName,
5770                             Results.data(),Results.size());
5771 }
5772 
5773 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) {
5774   typedef CodeCompletionResult Result;
5775   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5776                         CodeCompletionContext::CCC_Other);
5777 
5778   // Figure out where this @synthesize lives.
5779   ObjCContainerDecl *Container
5780     = dyn_cast_or_null<ObjCContainerDecl>(CurContext);
5781   if (!Container ||
5782       (!isa<ObjCImplementationDecl>(Container) &&
5783        !isa<ObjCCategoryImplDecl>(Container)))
5784     return;
5785 
5786   // Ignore any properties that have already been implemented.
5787   for (DeclContext::decl_iterator D = Container->decls_begin(),
5788                                DEnd = Container->decls_end();
5789        D != DEnd; ++D)
5790     if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D))
5791       Results.Ignore(PropertyImpl->getPropertyDecl());
5792 
5793   // Add any properties that we find.
5794   AddedPropertiesSet AddedProperties;
5795   Results.EnterNewScope();
5796   if (ObjCImplementationDecl *ClassImpl
5797         = dyn_cast<ObjCImplementationDecl>(Container))
5798     AddObjCProperties(ClassImpl->getClassInterface(), false,
5799                       /*AllowNullaryMethods=*/false, CurContext,
5800                       AddedProperties, Results);
5801   else
5802     AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
5803                       false, /*AllowNullaryMethods=*/false, CurContext,
5804                       AddedProperties, Results);
5805   Results.ExitScope();
5806 
5807   HandleCodeCompleteResults(this, CodeCompleter,
5808                             CodeCompletionContext::CCC_Other,
5809                             Results.data(),Results.size());
5810 }
5811 
5812 void Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S,
5813                                                   IdentifierInfo *PropertyName) {
5814   typedef CodeCompletionResult Result;
5815   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5816                         CodeCompletionContext::CCC_Other);
5817 
5818   // Figure out where this @synthesize lives.
5819   ObjCContainerDecl *Container
5820     = dyn_cast_or_null<ObjCContainerDecl>(CurContext);
5821   if (!Container ||
5822       (!isa<ObjCImplementationDecl>(Container) &&
5823        !isa<ObjCCategoryImplDecl>(Container)))
5824     return;
5825 
5826   // Figure out which interface we're looking into.
5827   ObjCInterfaceDecl *Class = 0;
5828   if (ObjCImplementationDecl *ClassImpl
5829                                  = dyn_cast<ObjCImplementationDecl>(Container))
5830     Class = ClassImpl->getClassInterface();
5831   else
5832     Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl()
5833                                                           ->getClassInterface();
5834 
5835   // Determine the type of the property we're synthesizing.
5836   QualType PropertyType = Context.getObjCIdType();
5837   if (Class) {
5838     if (ObjCPropertyDecl *Property
5839                               = Class->FindPropertyDeclaration(PropertyName)) {
5840       PropertyType
5841         = Property->getType().getNonReferenceType().getUnqualifiedType();
5842 
5843       // Give preference to ivars
5844       Results.setPreferredType(PropertyType);
5845     }
5846   }
5847 
5848   // Add all of the instance variables in this class and its superclasses.
5849   Results.EnterNewScope();
5850   bool SawSimilarlyNamedIvar = false;
5851   std::string NameWithPrefix;
5852   NameWithPrefix += '_';
5853   NameWithPrefix += PropertyName->getName();
5854   std::string NameWithSuffix = PropertyName->getName().str();
5855   NameWithSuffix += '_';
5856   for(; Class; Class = Class->getSuperClass()) {
5857     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
5858          Ivar = Ivar->getNextIvar()) {
5859       Results.AddResult(Result(Ivar, 0), CurContext, 0, false);
5860 
5861       // Determine whether we've seen an ivar with a name similar to the
5862       // property.
5863       if ((PropertyName == Ivar->getIdentifier() ||
5864            NameWithPrefix == Ivar->getName() ||
5865            NameWithSuffix == Ivar->getName())) {
5866         SawSimilarlyNamedIvar = true;
5867 
5868         // Reduce the priority of this result by one, to give it a slight
5869         // advantage over other results whose names don't match so closely.
5870         if (Results.size() &&
5871             Results.data()[Results.size() - 1].Kind
5872                                       == CodeCompletionResult::RK_Declaration &&
5873             Results.data()[Results.size() - 1].Declaration == Ivar)
5874           Results.data()[Results.size() - 1].Priority--;
5875       }
5876     }
5877   }
5878 
5879   if (!SawSimilarlyNamedIvar) {
5880     // Create ivar result _propName, that the user can use to synthesize
5881     // an ivar of the appropriate type.
5882     unsigned Priority = CCP_MemberDeclaration + 1;
5883     typedef CodeCompletionResult Result;
5884     CodeCompletionAllocator &Allocator = Results.getAllocator();
5885     CodeCompletionBuilder Builder(Allocator, Priority,CXAvailability_Available);
5886 
5887     PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
5888     Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context,
5889                                                        Policy, Allocator));
5890     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
5891     Results.AddResult(Result(Builder.TakeString(), Priority,
5892                              CXCursor_ObjCIvarDecl));
5893   }
5894 
5895   Results.ExitScope();
5896 
5897   HandleCodeCompleteResults(this, CodeCompleter,
5898                             CodeCompletionContext::CCC_Other,
5899                             Results.data(),Results.size());
5900 }
5901 
5902 // Mapping from selectors to the methods that implement that selector, along
5903 // with the "in original class" flag.
5904 typedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> >
5905   KnownMethodsMap;
5906 
5907 /// \brief Find all of the methods that reside in the given container
5908 /// (and its superclasses, protocols, etc.) that meet the given
5909 /// criteria. Insert those methods into the map of known methods,
5910 /// indexed by selector so they can be easily found.
5911 static void FindImplementableMethods(ASTContext &Context,
5912                                      ObjCContainerDecl *Container,
5913                                      bool WantInstanceMethods,
5914                                      QualType ReturnType,
5915                                      KnownMethodsMap &KnownMethods,
5916                                      bool InOriginalClass = true) {
5917   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
5918     // Recurse into protocols.
5919     if (!IFace->hasDefinition())
5920       return;
5921 
5922     const ObjCList<ObjCProtocolDecl> &Protocols
5923       = IFace->getReferencedProtocols();
5924     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5925                                               E = Protocols.end();
5926          I != E; ++I)
5927       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
5928                                KnownMethods, InOriginalClass);
5929 
5930     // Add methods from any class extensions and categories.
5931     for (const ObjCCategoryDecl *Cat = IFace->getCategoryList(); Cat;
5932          Cat = Cat->getNextClassCategory())
5933       FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat),
5934                                WantInstanceMethods, ReturnType,
5935                                KnownMethods, false);
5936 
5937     // Visit the superclass.
5938     if (IFace->getSuperClass())
5939       FindImplementableMethods(Context, IFace->getSuperClass(),
5940                                WantInstanceMethods, ReturnType,
5941                                KnownMethods, false);
5942   }
5943 
5944   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
5945     // Recurse into protocols.
5946     const ObjCList<ObjCProtocolDecl> &Protocols
5947       = Category->getReferencedProtocols();
5948     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5949                                               E = Protocols.end();
5950          I != E; ++I)
5951       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
5952                                KnownMethods, InOriginalClass);
5953 
5954     // If this category is the original class, jump to the interface.
5955     if (InOriginalClass && Category->getClassInterface())
5956       FindImplementableMethods(Context, Category->getClassInterface(),
5957                                WantInstanceMethods, ReturnType, KnownMethods,
5958                                false);
5959   }
5960 
5961   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
5962     if (Protocol->hasDefinition()) {
5963       // Recurse into protocols.
5964       const ObjCList<ObjCProtocolDecl> &Protocols
5965         = Protocol->getReferencedProtocols();
5966       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5967              E = Protocols.end();
5968            I != E; ++I)
5969         FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
5970                                  KnownMethods, false);
5971     }
5972   }
5973 
5974   // Add methods in this container. This operation occurs last because
5975   // we want the methods from this container to override any methods
5976   // we've previously seen with the same selector.
5977   for (ObjCContainerDecl::method_iterator M = Container->meth_begin(),
5978                                        MEnd = Container->meth_end();
5979        M != MEnd; ++M) {
5980     if ((*M)->isInstanceMethod() == WantInstanceMethods) {
5981       if (!ReturnType.isNull() &&
5982           !Context.hasSameUnqualifiedType(ReturnType, (*M)->getResultType()))
5983         continue;
5984 
5985       KnownMethods[(*M)->getSelector()] = std::make_pair(*M, InOriginalClass);
5986     }
5987   }
5988 }
5989 
5990 /// \brief Add the parenthesized return or parameter type chunk to a code
5991 /// completion string.
5992 static void AddObjCPassingTypeChunk(QualType Type,
5993                                     ASTContext &Context,
5994                                     const PrintingPolicy &Policy,
5995                                     CodeCompletionBuilder &Builder) {
5996   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5997   Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy,
5998                                                Builder.getAllocator()));
5999   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6000 }
6001 
6002 /// \brief Determine whether the given class is or inherits from a class by
6003 /// the given name.
6004 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class,
6005                                    StringRef Name) {
6006   if (!Class)
6007     return false;
6008 
6009   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
6010     return true;
6011 
6012   return InheritsFromClassNamed(Class->getSuperClass(), Name);
6013 }
6014 
6015 /// \brief Add code completions for Objective-C Key-Value Coding (KVC) and
6016 /// Key-Value Observing (KVO).
6017 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
6018                                        bool IsInstanceMethod,
6019                                        QualType ReturnType,
6020                                        ASTContext &Context,
6021                                        VisitedSelectorSet &KnownSelectors,
6022                                        ResultBuilder &Results) {
6023   IdentifierInfo *PropName = Property->getIdentifier();
6024   if (!PropName || PropName->getLength() == 0)
6025     return;
6026 
6027   PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
6028 
6029   // Builder that will create each code completion.
6030   typedef CodeCompletionResult Result;
6031   CodeCompletionAllocator &Allocator = Results.getAllocator();
6032   CodeCompletionBuilder Builder(Allocator);
6033 
6034   // The selector table.
6035   SelectorTable &Selectors = Context.Selectors;
6036 
6037   // The property name, copied into the code completion allocation region
6038   // on demand.
6039   struct KeyHolder {
6040     CodeCompletionAllocator &Allocator;
6041     StringRef Key;
6042     const char *CopiedKey;
6043 
6044     KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key)
6045     : Allocator(Allocator), Key(Key), CopiedKey(0) { }
6046 
6047     operator const char *() {
6048       if (CopiedKey)
6049         return CopiedKey;
6050 
6051       return CopiedKey = Allocator.CopyString(Key);
6052     }
6053   } Key(Allocator, PropName->getName());
6054 
6055   // The uppercased name of the property name.
6056   std::string UpperKey = PropName->getName();
6057   if (!UpperKey.empty())
6058     UpperKey[0] = toupper(UpperKey[0]);
6059 
6060   bool ReturnTypeMatchesProperty = ReturnType.isNull() ||
6061     Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
6062                                    Property->getType());
6063   bool ReturnTypeMatchesVoid
6064     = ReturnType.isNull() || ReturnType->isVoidType();
6065 
6066   // Add the normal accessor -(type)key.
6067   if (IsInstanceMethod &&
6068       KnownSelectors.insert(Selectors.getNullarySelector(PropName)) &&
6069       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
6070     if (ReturnType.isNull())
6071       AddObjCPassingTypeChunk(Property->getType(), Context, Policy, Builder);
6072 
6073     Builder.AddTypedTextChunk(Key);
6074     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6075                              CXCursor_ObjCInstanceMethodDecl));
6076   }
6077 
6078   // If we have an integral or boolean property (or the user has provided
6079   // an integral or boolean return type), add the accessor -(type)isKey.
6080   if (IsInstanceMethod &&
6081       ((!ReturnType.isNull() &&
6082         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
6083        (ReturnType.isNull() &&
6084         (Property->getType()->isIntegerType() ||
6085          Property->getType()->isBooleanType())))) {
6086     std::string SelectorName = (Twine("is") + UpperKey).str();
6087     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6088     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6089       if (ReturnType.isNull()) {
6090         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6091         Builder.AddTextChunk("BOOL");
6092         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6093       }
6094 
6095       Builder.AddTypedTextChunk(
6096                                 Allocator.CopyString(SelectorId->getName()));
6097       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6098                                CXCursor_ObjCInstanceMethodDecl));
6099     }
6100   }
6101 
6102   // Add the normal mutator.
6103   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
6104       !Property->getSetterMethodDecl()) {
6105     std::string SelectorName = (Twine("set") + UpperKey).str();
6106     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6107     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6108       if (ReturnType.isNull()) {
6109         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6110         Builder.AddTextChunk("void");
6111         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6112       }
6113 
6114       Builder.AddTypedTextChunk(
6115                                 Allocator.CopyString(SelectorId->getName()));
6116       Builder.AddTypedTextChunk(":");
6117       AddObjCPassingTypeChunk(Property->getType(), Context, Policy, Builder);
6118       Builder.AddTextChunk(Key);
6119       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6120                                CXCursor_ObjCInstanceMethodDecl));
6121     }
6122   }
6123 
6124   // Indexed and unordered accessors
6125   unsigned IndexedGetterPriority = CCP_CodePattern;
6126   unsigned IndexedSetterPriority = CCP_CodePattern;
6127   unsigned UnorderedGetterPriority = CCP_CodePattern;
6128   unsigned UnorderedSetterPriority = CCP_CodePattern;
6129   if (const ObjCObjectPointerType *ObjCPointer
6130                     = Property->getType()->getAs<ObjCObjectPointerType>()) {
6131     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
6132       // If this interface type is not provably derived from a known
6133       // collection, penalize the corresponding completions.
6134       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
6135         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
6136         if (!InheritsFromClassNamed(IFace, "NSArray"))
6137           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
6138       }
6139 
6140       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
6141         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
6142         if (!InheritsFromClassNamed(IFace, "NSSet"))
6143           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
6144       }
6145     }
6146   } else {
6147     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
6148     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
6149     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
6150     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
6151   }
6152 
6153   // Add -(NSUInteger)countOf<key>
6154   if (IsInstanceMethod &&
6155       (ReturnType.isNull() || ReturnType->isIntegerType())) {
6156     std::string SelectorName = (Twine("countOf") + UpperKey).str();
6157     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6158     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6159       if (ReturnType.isNull()) {
6160         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6161         Builder.AddTextChunk("NSUInteger");
6162         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6163       }
6164 
6165       Builder.AddTypedTextChunk(
6166                                 Allocator.CopyString(SelectorId->getName()));
6167       Results.AddResult(Result(Builder.TakeString(),
6168                                std::min(IndexedGetterPriority,
6169                                         UnorderedGetterPriority),
6170                                CXCursor_ObjCInstanceMethodDecl));
6171     }
6172   }
6173 
6174   // Indexed getters
6175   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
6176   if (IsInstanceMethod &&
6177       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
6178     std::string SelectorName
6179       = (Twine("objectIn") + UpperKey + "AtIndex").str();
6180     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6181     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6182       if (ReturnType.isNull()) {
6183         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6184         Builder.AddTextChunk("id");
6185         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6186       }
6187 
6188       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6189       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6190       Builder.AddTextChunk("NSUInteger");
6191       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6192       Builder.AddTextChunk("index");
6193       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6194                                CXCursor_ObjCInstanceMethodDecl));
6195     }
6196   }
6197 
6198   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
6199   if (IsInstanceMethod &&
6200       (ReturnType.isNull() ||
6201        (ReturnType->isObjCObjectPointerType() &&
6202         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6203         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6204                                                 ->getName() == "NSArray"))) {
6205     std::string SelectorName
6206       = (Twine(Property->getName()) + "AtIndexes").str();
6207     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6208     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6209       if (ReturnType.isNull()) {
6210         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6211         Builder.AddTextChunk("NSArray *");
6212         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6213       }
6214 
6215       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6216       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6217       Builder.AddTextChunk("NSIndexSet *");
6218       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6219       Builder.AddTextChunk("indexes");
6220       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6221                                CXCursor_ObjCInstanceMethodDecl));
6222     }
6223   }
6224 
6225   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
6226   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6227     std::string SelectorName = (Twine("get") + UpperKey).str();
6228     IdentifierInfo *SelectorIds[2] = {
6229       &Context.Idents.get(SelectorName),
6230       &Context.Idents.get("range")
6231     };
6232 
6233     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6234       if (ReturnType.isNull()) {
6235         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6236         Builder.AddTextChunk("void");
6237         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6238       }
6239 
6240       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6241       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6242       Builder.AddPlaceholderChunk("object-type");
6243       Builder.AddTextChunk(" **");
6244       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6245       Builder.AddTextChunk("buffer");
6246       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6247       Builder.AddTypedTextChunk("range:");
6248       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6249       Builder.AddTextChunk("NSRange");
6250       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6251       Builder.AddTextChunk("inRange");
6252       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
6253                                CXCursor_ObjCInstanceMethodDecl));
6254     }
6255   }
6256 
6257   // Mutable indexed accessors
6258 
6259   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
6260   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6261     std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str();
6262     IdentifierInfo *SelectorIds[2] = {
6263       &Context.Idents.get("insertObject"),
6264       &Context.Idents.get(SelectorName)
6265     };
6266 
6267     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6268       if (ReturnType.isNull()) {
6269         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6270         Builder.AddTextChunk("void");
6271         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6272       }
6273 
6274       Builder.AddTypedTextChunk("insertObject:");
6275       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6276       Builder.AddPlaceholderChunk("object-type");
6277       Builder.AddTextChunk(" *");
6278       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6279       Builder.AddTextChunk("object");
6280       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6281       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6282       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6283       Builder.AddPlaceholderChunk("NSUInteger");
6284       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6285       Builder.AddTextChunk("index");
6286       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6287                                CXCursor_ObjCInstanceMethodDecl));
6288     }
6289   }
6290 
6291   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
6292   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6293     std::string SelectorName = (Twine("insert") + UpperKey).str();
6294     IdentifierInfo *SelectorIds[2] = {
6295       &Context.Idents.get(SelectorName),
6296       &Context.Idents.get("atIndexes")
6297     };
6298 
6299     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6300       if (ReturnType.isNull()) {
6301         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6302         Builder.AddTextChunk("void");
6303         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6304       }
6305 
6306       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6307       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6308       Builder.AddTextChunk("NSArray *");
6309       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6310       Builder.AddTextChunk("array");
6311       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6312       Builder.AddTypedTextChunk("atIndexes:");
6313       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6314       Builder.AddPlaceholderChunk("NSIndexSet *");
6315       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6316       Builder.AddTextChunk("indexes");
6317       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6318                                CXCursor_ObjCInstanceMethodDecl));
6319     }
6320   }
6321 
6322   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
6323   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6324     std::string SelectorName
6325       = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
6326     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6327     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6328       if (ReturnType.isNull()) {
6329         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6330         Builder.AddTextChunk("void");
6331         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6332       }
6333 
6334       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6335       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6336       Builder.AddTextChunk("NSUInteger");
6337       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6338       Builder.AddTextChunk("index");
6339       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6340                                CXCursor_ObjCInstanceMethodDecl));
6341     }
6342   }
6343 
6344   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
6345   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6346     std::string SelectorName
6347       = (Twine("remove") + UpperKey + "AtIndexes").str();
6348     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6349     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6350       if (ReturnType.isNull()) {
6351         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6352         Builder.AddTextChunk("void");
6353         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6354       }
6355 
6356       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6357       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6358       Builder.AddTextChunk("NSIndexSet *");
6359       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6360       Builder.AddTextChunk("indexes");
6361       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6362                                CXCursor_ObjCInstanceMethodDecl));
6363     }
6364   }
6365 
6366   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
6367   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6368     std::string SelectorName
6369       = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
6370     IdentifierInfo *SelectorIds[2] = {
6371       &Context.Idents.get(SelectorName),
6372       &Context.Idents.get("withObject")
6373     };
6374 
6375     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6376       if (ReturnType.isNull()) {
6377         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6378         Builder.AddTextChunk("void");
6379         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6380       }
6381 
6382       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6383       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6384       Builder.AddPlaceholderChunk("NSUInteger");
6385       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6386       Builder.AddTextChunk("index");
6387       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6388       Builder.AddTypedTextChunk("withObject:");
6389       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6390       Builder.AddTextChunk("id");
6391       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6392       Builder.AddTextChunk("object");
6393       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6394                                CXCursor_ObjCInstanceMethodDecl));
6395     }
6396   }
6397 
6398   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
6399   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6400     std::string SelectorName1
6401       = (Twine("replace") + UpperKey + "AtIndexes").str();
6402     std::string SelectorName2 = (Twine("with") + UpperKey).str();
6403     IdentifierInfo *SelectorIds[2] = {
6404       &Context.Idents.get(SelectorName1),
6405       &Context.Idents.get(SelectorName2)
6406     };
6407 
6408     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) {
6409       if (ReturnType.isNull()) {
6410         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6411         Builder.AddTextChunk("void");
6412         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6413       }
6414 
6415       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
6416       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6417       Builder.AddPlaceholderChunk("NSIndexSet *");
6418       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6419       Builder.AddTextChunk("indexes");
6420       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6421       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
6422       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6423       Builder.AddTextChunk("NSArray *");
6424       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6425       Builder.AddTextChunk("array");
6426       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
6427                                CXCursor_ObjCInstanceMethodDecl));
6428     }
6429   }
6430 
6431   // Unordered getters
6432   // - (NSEnumerator *)enumeratorOfKey
6433   if (IsInstanceMethod &&
6434       (ReturnType.isNull() ||
6435        (ReturnType->isObjCObjectPointerType() &&
6436         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6437         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6438           ->getName() == "NSEnumerator"))) {
6439     std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str();
6440     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6441     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6442       if (ReturnType.isNull()) {
6443         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6444         Builder.AddTextChunk("NSEnumerator *");
6445         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6446       }
6447 
6448       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6449       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
6450                               CXCursor_ObjCInstanceMethodDecl));
6451     }
6452   }
6453 
6454   // - (type *)memberOfKey:(type *)object
6455   if (IsInstanceMethod &&
6456       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
6457     std::string SelectorName = (Twine("memberOf") + UpperKey).str();
6458     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6459     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6460       if (ReturnType.isNull()) {
6461         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6462         Builder.AddPlaceholderChunk("object-type");
6463         Builder.AddTextChunk(" *");
6464         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6465       }
6466 
6467       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6468       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6469       if (ReturnType.isNull()) {
6470         Builder.AddPlaceholderChunk("object-type");
6471         Builder.AddTextChunk(" *");
6472       } else {
6473         Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context,
6474                                                      Policy,
6475                                                      Builder.getAllocator()));
6476       }
6477       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6478       Builder.AddTextChunk("object");
6479       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
6480                                CXCursor_ObjCInstanceMethodDecl));
6481     }
6482   }
6483 
6484   // Mutable unordered accessors
6485   // - (void)addKeyObject:(type *)object
6486   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6487     std::string SelectorName
6488       = (Twine("add") + UpperKey + Twine("Object")).str();
6489     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6490     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6491       if (ReturnType.isNull()) {
6492         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6493         Builder.AddTextChunk("void");
6494         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6495       }
6496 
6497       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6498       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6499       Builder.AddPlaceholderChunk("object-type");
6500       Builder.AddTextChunk(" *");
6501       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6502       Builder.AddTextChunk("object");
6503       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6504                                CXCursor_ObjCInstanceMethodDecl));
6505     }
6506   }
6507 
6508   // - (void)addKey:(NSSet *)objects
6509   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6510     std::string SelectorName = (Twine("add") + UpperKey).str();
6511     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6512     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6513       if (ReturnType.isNull()) {
6514         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6515         Builder.AddTextChunk("void");
6516         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6517       }
6518 
6519       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6520       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6521       Builder.AddTextChunk("NSSet *");
6522       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6523       Builder.AddTextChunk("objects");
6524       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6525                                CXCursor_ObjCInstanceMethodDecl));
6526     }
6527   }
6528 
6529   // - (void)removeKeyObject:(type *)object
6530   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6531     std::string SelectorName
6532       = (Twine("remove") + UpperKey + Twine("Object")).str();
6533     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6534     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6535       if (ReturnType.isNull()) {
6536         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6537         Builder.AddTextChunk("void");
6538         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6539       }
6540 
6541       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6542       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6543       Builder.AddPlaceholderChunk("object-type");
6544       Builder.AddTextChunk(" *");
6545       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6546       Builder.AddTextChunk("object");
6547       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6548                                CXCursor_ObjCInstanceMethodDecl));
6549     }
6550   }
6551 
6552   // - (void)removeKey:(NSSet *)objects
6553   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6554     std::string SelectorName = (Twine("remove") + UpperKey).str();
6555     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6556     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6557       if (ReturnType.isNull()) {
6558         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6559         Builder.AddTextChunk("void");
6560         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6561       }
6562 
6563       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6564       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6565       Builder.AddTextChunk("NSSet *");
6566       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6567       Builder.AddTextChunk("objects");
6568       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6569                                CXCursor_ObjCInstanceMethodDecl));
6570     }
6571   }
6572 
6573   // - (void)intersectKey:(NSSet *)objects
6574   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
6575     std::string SelectorName = (Twine("intersect") + UpperKey).str();
6576     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6577     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) {
6578       if (ReturnType.isNull()) {
6579         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6580         Builder.AddTextChunk("void");
6581         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6582       }
6583 
6584       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
6585       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6586       Builder.AddTextChunk("NSSet *");
6587       Builder.AddChunk(CodeCompletionString::CK_RightParen);
6588       Builder.AddTextChunk("objects");
6589       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
6590                                CXCursor_ObjCInstanceMethodDecl));
6591     }
6592   }
6593 
6594   // Key-Value Observing
6595   // + (NSSet *)keyPathsForValuesAffectingKey
6596   if (!IsInstanceMethod &&
6597       (ReturnType.isNull() ||
6598        (ReturnType->isObjCObjectPointerType() &&
6599         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
6600         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()
6601                                                     ->getName() == "NSSet"))) {
6602     std::string SelectorName
6603       = (Twine("keyPathsForValuesAffecting") + UpperKey).str();
6604     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6605     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6606       if (ReturnType.isNull()) {
6607         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6608         Builder.AddTextChunk("NSSet *");
6609         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6610       }
6611 
6612       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6613       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6614                               CXCursor_ObjCClassMethodDecl));
6615     }
6616   }
6617 
6618   // + (BOOL)automaticallyNotifiesObserversForKey
6619   if (!IsInstanceMethod &&
6620       (ReturnType.isNull() ||
6621        ReturnType->isIntegerType() ||
6622        ReturnType->isBooleanType())) {
6623     std::string SelectorName
6624       = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str();
6625     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
6626     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) {
6627       if (ReturnType.isNull()) {
6628         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6629         Builder.AddTextChunk("BOOL");
6630         Builder.AddChunk(CodeCompletionString::CK_RightParen);
6631       }
6632 
6633       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
6634       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
6635                               CXCursor_ObjCClassMethodDecl));
6636     }
6637   }
6638 }
6639 
6640 void Sema::CodeCompleteObjCMethodDecl(Scope *S,
6641                                       bool IsInstanceMethod,
6642                                       ParsedType ReturnTy) {
6643   // Determine the return type of the method we're declaring, if
6644   // provided.
6645   QualType ReturnType = GetTypeFromParser(ReturnTy);
6646   Decl *IDecl = 0;
6647   if (CurContext->isObjCContainer()) {
6648       ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext);
6649       IDecl = cast<Decl>(OCD);
6650   }
6651   // Determine where we should start searching for methods.
6652   ObjCContainerDecl *SearchDecl = 0;
6653   bool IsInImplementation = false;
6654   if (Decl *D = IDecl) {
6655     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
6656       SearchDecl = Impl->getClassInterface();
6657       IsInImplementation = true;
6658     } else if (ObjCCategoryImplDecl *CatImpl
6659                                          = dyn_cast<ObjCCategoryImplDecl>(D)) {
6660       SearchDecl = CatImpl->getCategoryDecl();
6661       IsInImplementation = true;
6662     } else
6663       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
6664   }
6665 
6666   if (!SearchDecl && S) {
6667     if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity()))
6668       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
6669   }
6670 
6671   if (!SearchDecl) {
6672     HandleCodeCompleteResults(this, CodeCompleter,
6673                               CodeCompletionContext::CCC_Other,
6674                               0, 0);
6675     return;
6676   }
6677 
6678   // Find all of the methods that we could declare/implement here.
6679   KnownMethodsMap KnownMethods;
6680   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod,
6681                            ReturnType, KnownMethods);
6682 
6683   // Add declarations or definitions for each of the known methods.
6684   typedef CodeCompletionResult Result;
6685   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6686                         CodeCompletionContext::CCC_Other);
6687   Results.EnterNewScope();
6688   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
6689   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
6690                               MEnd = KnownMethods.end();
6691        M != MEnd; ++M) {
6692     ObjCMethodDecl *Method = M->second.first;
6693     CodeCompletionBuilder Builder(Results.getAllocator());
6694 
6695     // If the result type was not already provided, add it to the
6696     // pattern as (type).
6697     if (ReturnType.isNull())
6698       AddObjCPassingTypeChunk(Method->getResultType(), Context, Policy,
6699                               Builder);
6700 
6701     Selector Sel = Method->getSelector();
6702 
6703     // Add the first part of the selector to the pattern.
6704     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6705                                                        Sel.getNameForSlot(0)));
6706 
6707     // Add parameters to the pattern.
6708     unsigned I = 0;
6709     for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
6710                                      PEnd = Method->param_end();
6711          P != PEnd; (void)++P, ++I) {
6712       // Add the part of the selector name.
6713       if (I == 0)
6714         Builder.AddTypedTextChunk(":");
6715       else if (I < Sel.getNumArgs()) {
6716         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6717         Builder.AddTypedTextChunk(
6718                 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6719       } else
6720         break;
6721 
6722       // Add the parameter type.
6723       AddObjCPassingTypeChunk((*P)->getOriginalType(), Context, Policy,
6724                               Builder);
6725 
6726       if (IdentifierInfo *Id = (*P)->getIdentifier())
6727         Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName()));
6728     }
6729 
6730     if (Method->isVariadic()) {
6731       if (Method->param_size() > 0)
6732         Builder.AddChunk(CodeCompletionString::CK_Comma);
6733       Builder.AddTextChunk("...");
6734     }
6735 
6736     if (IsInImplementation && Results.includeCodePatterns()) {
6737       // We will be defining the method here, so add a compound statement.
6738       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6739       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6740       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6741       if (!Method->getResultType()->isVoidType()) {
6742         // If the result type is not void, add a return clause.
6743         Builder.AddTextChunk("return");
6744         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6745         Builder.AddPlaceholderChunk("expression");
6746         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
6747       } else
6748         Builder.AddPlaceholderChunk("statements");
6749 
6750       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6751       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6752     }
6753 
6754     unsigned Priority = CCP_CodePattern;
6755     if (!M->second.second)
6756       Priority += CCD_InBaseClass;
6757 
6758     Results.AddResult(Result(Builder.TakeString(), Priority,
6759                              Method->isInstanceMethod()
6760                                ? CXCursor_ObjCInstanceMethodDecl
6761                                : CXCursor_ObjCClassMethodDecl));
6762   }
6763 
6764   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
6765   // the properties in this class and its categories.
6766   if (Context.getLangOptions().ObjC2) {
6767     SmallVector<ObjCContainerDecl *, 4> Containers;
6768     Containers.push_back(SearchDecl);
6769 
6770     VisitedSelectorSet KnownSelectors;
6771     for (KnownMethodsMap::iterator M = KnownMethods.begin(),
6772                                 MEnd = KnownMethods.end();
6773          M != MEnd; ++M)
6774       KnownSelectors.insert(M->first);
6775 
6776 
6777     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
6778     if (!IFace)
6779       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
6780         IFace = Category->getClassInterface();
6781 
6782     if (IFace) {
6783       for (ObjCCategoryDecl *Category = IFace->getCategoryList(); Category;
6784            Category = Category->getNextClassCategory())
6785         Containers.push_back(Category);
6786     }
6787 
6788     for (unsigned I = 0, N = Containers.size(); I != N; ++I) {
6789       for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(),
6790                                          PEnd = Containers[I]->prop_end();
6791            P != PEnd; ++P) {
6792         AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context,
6793                                    KnownSelectors, Results);
6794       }
6795     }
6796   }
6797 
6798   Results.ExitScope();
6799 
6800   HandleCodeCompleteResults(this, CodeCompleter,
6801                             CodeCompletionContext::CCC_Other,
6802                             Results.data(),Results.size());
6803 }
6804 
6805 void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S,
6806                                               bool IsInstanceMethod,
6807                                               bool AtParameterName,
6808                                               ParsedType ReturnTy,
6809                                               IdentifierInfo **SelIdents,
6810                                               unsigned NumSelIdents) {
6811   // If we have an external source, load the entire class method
6812   // pool from the AST file.
6813   if (ExternalSource) {
6814     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
6815          I != N; ++I) {
6816       Selector Sel = ExternalSource->GetExternalSelector(I);
6817       if (Sel.isNull() || MethodPool.count(Sel))
6818         continue;
6819 
6820       ReadMethodPool(Sel);
6821     }
6822   }
6823 
6824   // Build the set of methods we can see.
6825   typedef CodeCompletionResult Result;
6826   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6827                         CodeCompletionContext::CCC_Other);
6828 
6829   if (ReturnTy)
6830     Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType());
6831 
6832   Results.EnterNewScope();
6833   for (GlobalMethodPool::iterator M = MethodPool.begin(),
6834                                   MEnd = MethodPool.end();
6835        M != MEnd; ++M) {
6836     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first :
6837                                                        &M->second.second;
6838          MethList && MethList->Method;
6839          MethList = MethList->Next) {
6840       if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,
6841                                   NumSelIdents))
6842         continue;
6843 
6844       if (AtParameterName) {
6845         // Suggest parameter names we've seen before.
6846         if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) {
6847           ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1];
6848           if (Param->getIdentifier()) {
6849             CodeCompletionBuilder Builder(Results.getAllocator());
6850             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
6851                                            Param->getIdentifier()->getName()));
6852             Results.AddResult(Builder.TakeString());
6853           }
6854         }
6855 
6856         continue;
6857       }
6858 
6859       Result R(MethList->Method, 0);
6860       R.StartParameter = NumSelIdents;
6861       R.AllParametersAreInformative = false;
6862       R.DeclaringEntity = true;
6863       Results.MaybeAddResult(R, CurContext);
6864     }
6865   }
6866 
6867   Results.ExitScope();
6868   HandleCodeCompleteResults(this, CodeCompleter,
6869                             CodeCompletionContext::CCC_Other,
6870                             Results.data(),Results.size());
6871 }
6872 
6873 void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
6874   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6875                         CodeCompletionContext::CCC_PreprocessorDirective);
6876   Results.EnterNewScope();
6877 
6878   // #if <condition>
6879   CodeCompletionBuilder Builder(Results.getAllocator());
6880   Builder.AddTypedTextChunk("if");
6881   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6882   Builder.AddPlaceholderChunk("condition");
6883   Results.AddResult(Builder.TakeString());
6884 
6885   // #ifdef <macro>
6886   Builder.AddTypedTextChunk("ifdef");
6887   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6888   Builder.AddPlaceholderChunk("macro");
6889   Results.AddResult(Builder.TakeString());
6890 
6891   // #ifndef <macro>
6892   Builder.AddTypedTextChunk("ifndef");
6893   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6894   Builder.AddPlaceholderChunk("macro");
6895   Results.AddResult(Builder.TakeString());
6896 
6897   if (InConditional) {
6898     // #elif <condition>
6899     Builder.AddTypedTextChunk("elif");
6900     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6901     Builder.AddPlaceholderChunk("condition");
6902     Results.AddResult(Builder.TakeString());
6903 
6904     // #else
6905     Builder.AddTypedTextChunk("else");
6906     Results.AddResult(Builder.TakeString());
6907 
6908     // #endif
6909     Builder.AddTypedTextChunk("endif");
6910     Results.AddResult(Builder.TakeString());
6911   }
6912 
6913   // #include "header"
6914   Builder.AddTypedTextChunk("include");
6915   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6916   Builder.AddTextChunk("\"");
6917   Builder.AddPlaceholderChunk("header");
6918   Builder.AddTextChunk("\"");
6919   Results.AddResult(Builder.TakeString());
6920 
6921   // #include <header>
6922   Builder.AddTypedTextChunk("include");
6923   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6924   Builder.AddTextChunk("<");
6925   Builder.AddPlaceholderChunk("header");
6926   Builder.AddTextChunk(">");
6927   Results.AddResult(Builder.TakeString());
6928 
6929   // #define <macro>
6930   Builder.AddTypedTextChunk("define");
6931   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6932   Builder.AddPlaceholderChunk("macro");
6933   Results.AddResult(Builder.TakeString());
6934 
6935   // #define <macro>(<args>)
6936   Builder.AddTypedTextChunk("define");
6937   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6938   Builder.AddPlaceholderChunk("macro");
6939   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6940   Builder.AddPlaceholderChunk("args");
6941   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6942   Results.AddResult(Builder.TakeString());
6943 
6944   // #undef <macro>
6945   Builder.AddTypedTextChunk("undef");
6946   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6947   Builder.AddPlaceholderChunk("macro");
6948   Results.AddResult(Builder.TakeString());
6949 
6950   // #line <number>
6951   Builder.AddTypedTextChunk("line");
6952   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6953   Builder.AddPlaceholderChunk("number");
6954   Results.AddResult(Builder.TakeString());
6955 
6956   // #line <number> "filename"
6957   Builder.AddTypedTextChunk("line");
6958   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6959   Builder.AddPlaceholderChunk("number");
6960   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6961   Builder.AddTextChunk("\"");
6962   Builder.AddPlaceholderChunk("filename");
6963   Builder.AddTextChunk("\"");
6964   Results.AddResult(Builder.TakeString());
6965 
6966   // #error <message>
6967   Builder.AddTypedTextChunk("error");
6968   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6969   Builder.AddPlaceholderChunk("message");
6970   Results.AddResult(Builder.TakeString());
6971 
6972   // #pragma <arguments>
6973   Builder.AddTypedTextChunk("pragma");
6974   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6975   Builder.AddPlaceholderChunk("arguments");
6976   Results.AddResult(Builder.TakeString());
6977 
6978   if (getLangOptions().ObjC1) {
6979     // #import "header"
6980     Builder.AddTypedTextChunk("import");
6981     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6982     Builder.AddTextChunk("\"");
6983     Builder.AddPlaceholderChunk("header");
6984     Builder.AddTextChunk("\"");
6985     Results.AddResult(Builder.TakeString());
6986 
6987     // #import <header>
6988     Builder.AddTypedTextChunk("import");
6989     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6990     Builder.AddTextChunk("<");
6991     Builder.AddPlaceholderChunk("header");
6992     Builder.AddTextChunk(">");
6993     Results.AddResult(Builder.TakeString());
6994   }
6995 
6996   // #include_next "header"
6997   Builder.AddTypedTextChunk("include_next");
6998   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6999   Builder.AddTextChunk("\"");
7000   Builder.AddPlaceholderChunk("header");
7001   Builder.AddTextChunk("\"");
7002   Results.AddResult(Builder.TakeString());
7003 
7004   // #include_next <header>
7005   Builder.AddTypedTextChunk("include_next");
7006   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7007   Builder.AddTextChunk("<");
7008   Builder.AddPlaceholderChunk("header");
7009   Builder.AddTextChunk(">");
7010   Results.AddResult(Builder.TakeString());
7011 
7012   // #warning <message>
7013   Builder.AddTypedTextChunk("warning");
7014   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7015   Builder.AddPlaceholderChunk("message");
7016   Results.AddResult(Builder.TakeString());
7017 
7018   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
7019   // completions for them. And __include_macros is a Clang-internal extension
7020   // that we don't want to encourage anyone to use.
7021 
7022   // FIXME: we don't support #assert or #unassert, so don't suggest them.
7023   Results.ExitScope();
7024 
7025   HandleCodeCompleteResults(this, CodeCompleter,
7026                             CodeCompletionContext::CCC_PreprocessorDirective,
7027                             Results.data(), Results.size());
7028 }
7029 
7030 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
7031   CodeCompleteOrdinaryName(S,
7032                            S->getFnParent()? Sema::PCC_RecoveryInFunction
7033                                            : Sema::PCC_Namespace);
7034 }
7035 
7036 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
7037   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7038                         IsDefinition? CodeCompletionContext::CCC_MacroName
7039                                     : CodeCompletionContext::CCC_MacroNameUse);
7040   if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
7041     // Add just the names of macros, not their arguments.
7042     CodeCompletionBuilder Builder(Results.getAllocator());
7043     Results.EnterNewScope();
7044     for (Preprocessor::macro_iterator M = PP.macro_begin(),
7045                                    MEnd = PP.macro_end();
7046          M != MEnd; ++M) {
7047       Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
7048                                            M->first->getName()));
7049       Results.AddResult(Builder.TakeString());
7050     }
7051     Results.ExitScope();
7052   } else if (IsDefinition) {
7053     // FIXME: Can we detect when the user just wrote an include guard above?
7054   }
7055 
7056   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7057                             Results.data(), Results.size());
7058 }
7059 
7060 void Sema::CodeCompletePreprocessorExpression() {
7061   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7062                         CodeCompletionContext::CCC_PreprocessorExpression);
7063 
7064   if (!CodeCompleter || CodeCompleter->includeMacros())
7065     AddMacroResults(PP, Results);
7066 
7067     // defined (<macro>)
7068   Results.EnterNewScope();
7069   CodeCompletionBuilder Builder(Results.getAllocator());
7070   Builder.AddTypedTextChunk("defined");
7071   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7072   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7073   Builder.AddPlaceholderChunk("macro");
7074   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7075   Results.AddResult(Builder.TakeString());
7076   Results.ExitScope();
7077 
7078   HandleCodeCompleteResults(this, CodeCompleter,
7079                             CodeCompletionContext::CCC_PreprocessorExpression,
7080                             Results.data(), Results.size());
7081 }
7082 
7083 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
7084                                                  IdentifierInfo *Macro,
7085                                                  MacroInfo *MacroInfo,
7086                                                  unsigned Argument) {
7087   // FIXME: In the future, we could provide "overload" results, much like we
7088   // do for function calls.
7089 
7090   // Now just ignore this. There will be another code-completion callback
7091   // for the expanded tokens.
7092 }
7093 
7094 void Sema::CodeCompleteNaturalLanguage() {
7095   HandleCodeCompleteResults(this, CodeCompleter,
7096                             CodeCompletionContext::CCC_NaturalLanguage,
7097                             0, 0);
7098 }
7099 
7100 void Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator,
7101                  SmallVectorImpl<CodeCompletionResult> &Results) {
7102   ResultBuilder Builder(*this, Allocator, CodeCompletionContext::CCC_Recovery);
7103   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
7104     CodeCompletionDeclConsumer Consumer(Builder,
7105                                         Context.getTranslationUnitDecl());
7106     LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName,
7107                        Consumer);
7108   }
7109 
7110   if (!CodeCompleter || CodeCompleter->includeMacros())
7111     AddMacroResults(PP, Builder);
7112 
7113   Results.clear();
7114   Results.insert(Results.end(),
7115                  Builder.data(), Builder.data() + Builder.size());
7116 }
7117