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