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