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