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