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