Home | History | Annotate | Line # | Download | only in Sema
      1 //===---------------- SemaCodeComplete.cpp - Code Completion ----*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 //  This file defines the code-completion semantic actions.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 #include "clang/AST/ASTConcept.h"
     13 #include "clang/AST/Decl.h"
     14 #include "clang/AST/DeclBase.h"
     15 #include "clang/AST/DeclCXX.h"
     16 #include "clang/AST/DeclObjC.h"
     17 #include "clang/AST/DeclTemplate.h"
     18 #include "clang/AST/Expr.h"
     19 #include "clang/AST/ExprCXX.h"
     20 #include "clang/AST/ExprConcepts.h"
     21 #include "clang/AST/ExprObjC.h"
     22 #include "clang/AST/NestedNameSpecifier.h"
     23 #include "clang/AST/QualTypeNames.h"
     24 #include "clang/AST/RecursiveASTVisitor.h"
     25 #include "clang/AST/Type.h"
     26 #include "clang/Basic/CharInfo.h"
     27 #include "clang/Basic/OperatorKinds.h"
     28 #include "clang/Basic/Specifiers.h"
     29 #include "clang/Lex/HeaderSearch.h"
     30 #include "clang/Lex/MacroInfo.h"
     31 #include "clang/Lex/Preprocessor.h"
     32 #include "clang/Sema/CodeCompleteConsumer.h"
     33 #include "clang/Sema/DeclSpec.h"
     34 #include "clang/Sema/Designator.h"
     35 #include "clang/Sema/Lookup.h"
     36 #include "clang/Sema/Overload.h"
     37 #include "clang/Sema/Scope.h"
     38 #include "clang/Sema/ScopeInfo.h"
     39 #include "clang/Sema/Sema.h"
     40 #include "clang/Sema/SemaInternal.h"
     41 #include "llvm/ADT/ArrayRef.h"
     42 #include "llvm/ADT/DenseSet.h"
     43 #include "llvm/ADT/SmallBitVector.h"
     44 #include "llvm/ADT/SmallPtrSet.h"
     45 #include "llvm/ADT/SmallString.h"
     46 #include "llvm/ADT/StringExtras.h"
     47 #include "llvm/ADT/StringSwitch.h"
     48 #include "llvm/ADT/Twine.h"
     49 #include "llvm/ADT/iterator_range.h"
     50 #include "llvm/Support/Casting.h"
     51 #include "llvm/Support/Path.h"
     52 #include "llvm/Support/raw_ostream.h"
     53 #include <list>
     54 #include <map>
     55 #include <string>
     56 #include <vector>
     57 
     58 using namespace clang;
     59 using namespace sema;
     60 
     61 namespace {
     62 /// A container of code-completion results.
     63 class ResultBuilder {
     64 public:
     65   /// The type of a name-lookup filter, which can be provided to the
     66   /// name-lookup routines to specify which declarations should be included in
     67   /// the result set (when it returns true) and which declarations should be
     68   /// filtered out (returns false).
     69   typedef bool (ResultBuilder::*LookupFilter)(const NamedDecl *) const;
     70 
     71   typedef CodeCompletionResult Result;
     72 
     73 private:
     74   /// The actual results we have found.
     75   std::vector<Result> Results;
     76 
     77   /// A record of all of the declarations we have found and placed
     78   /// into the result set, used to ensure that no declaration ever gets into
     79   /// the result set twice.
     80   llvm::SmallPtrSet<const Decl *, 16> AllDeclsFound;
     81 
     82   typedef std::pair<const NamedDecl *, unsigned> DeclIndexPair;
     83 
     84   /// An entry in the shadow map, which is optimized to store
     85   /// a single (declaration, index) mapping (the common case) but
     86   /// can also store a list of (declaration, index) mappings.
     87   class ShadowMapEntry {
     88     typedef SmallVector<DeclIndexPair, 4> DeclIndexPairVector;
     89 
     90     /// Contains either the solitary NamedDecl * or a vector
     91     /// of (declaration, index) pairs.
     92     llvm::PointerUnion<const NamedDecl *, DeclIndexPairVector *> DeclOrVector;
     93 
     94     /// When the entry contains a single declaration, this is
     95     /// the index associated with that entry.
     96     unsigned SingleDeclIndex;
     97 
     98   public:
     99     ShadowMapEntry() : DeclOrVector(), SingleDeclIndex(0) {}
    100     ShadowMapEntry(const ShadowMapEntry &) = delete;
    101     ShadowMapEntry(ShadowMapEntry &&Move) { *this = std::move(Move); }
    102     ShadowMapEntry &operator=(const ShadowMapEntry &) = delete;
    103     ShadowMapEntry &operator=(ShadowMapEntry &&Move) {
    104       SingleDeclIndex = Move.SingleDeclIndex;
    105       DeclOrVector = Move.DeclOrVector;
    106       Move.DeclOrVector = nullptr;
    107       return *this;
    108     }
    109 
    110     void Add(const NamedDecl *ND, unsigned Index) {
    111       if (DeclOrVector.isNull()) {
    112         // 0 - > 1 elements: just set the single element information.
    113         DeclOrVector = ND;
    114         SingleDeclIndex = Index;
    115         return;
    116       }
    117 
    118       if (const NamedDecl *PrevND =
    119               DeclOrVector.dyn_cast<const NamedDecl *>()) {
    120         // 1 -> 2 elements: create the vector of results and push in the
    121         // existing declaration.
    122         DeclIndexPairVector *Vec = new DeclIndexPairVector;
    123         Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex));
    124         DeclOrVector = Vec;
    125       }
    126 
    127       // Add the new element to the end of the vector.
    128       DeclOrVector.get<DeclIndexPairVector *>()->push_back(
    129           DeclIndexPair(ND, Index));
    130     }
    131 
    132     ~ShadowMapEntry() {
    133       if (DeclIndexPairVector *Vec =
    134               DeclOrVector.dyn_cast<DeclIndexPairVector *>()) {
    135         delete Vec;
    136         DeclOrVector = ((NamedDecl *)nullptr);
    137       }
    138     }
    139 
    140     // Iteration.
    141     class iterator;
    142     iterator begin() const;
    143     iterator end() const;
    144   };
    145 
    146   /// A mapping from declaration names to the declarations that have
    147   /// this name within a particular scope and their index within the list of
    148   /// results.
    149   typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap;
    150 
    151   /// The semantic analysis object for which results are being
    152   /// produced.
    153   Sema &SemaRef;
    154 
    155   /// The allocator used to allocate new code-completion strings.
    156   CodeCompletionAllocator &Allocator;
    157 
    158   CodeCompletionTUInfo &CCTUInfo;
    159 
    160   /// If non-NULL, a filter function used to remove any code-completion
    161   /// results that are not desirable.
    162   LookupFilter Filter;
    163 
    164   /// Whether we should allow declarations as
    165   /// nested-name-specifiers that would otherwise be filtered out.
    166   bool AllowNestedNameSpecifiers;
    167 
    168   /// If set, the type that we would prefer our resulting value
    169   /// declarations to have.
    170   ///
    171   /// Closely matching the preferred type gives a boost to a result's
    172   /// priority.
    173   CanQualType PreferredType;
    174 
    175   /// A list of shadow maps, which is used to model name hiding at
    176   /// different levels of, e.g., the inheritance hierarchy.
    177   std::list<ShadowMap> ShadowMaps;
    178 
    179   /// Overloaded C++ member functions found by SemaLookup.
    180   /// Used to determine when one overload is dominated by another.
    181   llvm::DenseMap<std::pair<DeclContext *, /*Name*/uintptr_t>, ShadowMapEntry>
    182       OverloadMap;
    183 
    184   /// If we're potentially referring to a C++ member function, the set
    185   /// of qualifiers applied to the object type.
    186   Qualifiers ObjectTypeQualifiers;
    187   /// The kind of the object expression, for rvalue/lvalue overloads.
    188   ExprValueKind ObjectKind;
    189 
    190   /// Whether the \p ObjectTypeQualifiers field is active.
    191   bool HasObjectTypeQualifiers;
    192 
    193   /// The selector that we prefer.
    194   Selector PreferredSelector;
    195 
    196   /// The completion context in which we are gathering results.
    197   CodeCompletionContext CompletionContext;
    198 
    199   /// If we are in an instance method definition, the \@implementation
    200   /// object.
    201   ObjCImplementationDecl *ObjCImplementation;
    202 
    203   void AdjustResultPriorityForDecl(Result &R);
    204 
    205   void MaybeAddConstructorResults(Result R);
    206 
    207 public:
    208   explicit ResultBuilder(Sema &SemaRef, CodeCompletionAllocator &Allocator,
    209                          CodeCompletionTUInfo &CCTUInfo,
    210                          const CodeCompletionContext &CompletionContext,
    211                          LookupFilter Filter = nullptr)
    212       : SemaRef(SemaRef), Allocator(Allocator), CCTUInfo(CCTUInfo),
    213         Filter(Filter), AllowNestedNameSpecifiers(false),
    214         HasObjectTypeQualifiers(false), CompletionContext(CompletionContext),
    215         ObjCImplementation(nullptr) {
    216     // If this is an Objective-C instance method definition, dig out the
    217     // corresponding implementation.
    218     switch (CompletionContext.getKind()) {
    219     case CodeCompletionContext::CCC_Expression:
    220     case CodeCompletionContext::CCC_ObjCMessageReceiver:
    221     case CodeCompletionContext::CCC_ParenthesizedExpression:
    222     case CodeCompletionContext::CCC_Statement:
    223     case CodeCompletionContext::CCC_Recovery:
    224       if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl())
    225         if (Method->isInstanceMethod())
    226           if (ObjCInterfaceDecl *Interface = Method->getClassInterface())
    227             ObjCImplementation = Interface->getImplementation();
    228       break;
    229 
    230     default:
    231       break;
    232     }
    233   }
    234 
    235   /// Determine the priority for a reference to the given declaration.
    236   unsigned getBasePriority(const NamedDecl *D);
    237 
    238   /// Whether we should include code patterns in the completion
    239   /// results.
    240   bool includeCodePatterns() const {
    241     return SemaRef.CodeCompleter &&
    242            SemaRef.CodeCompleter->includeCodePatterns();
    243   }
    244 
    245   /// Set the filter used for code-completion results.
    246   void setFilter(LookupFilter Filter) { this->Filter = Filter; }
    247 
    248   Result *data() { return Results.empty() ? nullptr : &Results.front(); }
    249   unsigned size() const { return Results.size(); }
    250   bool empty() const { return Results.empty(); }
    251 
    252   /// Specify the preferred type.
    253   void setPreferredType(QualType T) {
    254     PreferredType = SemaRef.Context.getCanonicalType(T);
    255   }
    256 
    257   /// Set the cv-qualifiers on the object type, for us in filtering
    258   /// calls to member functions.
    259   ///
    260   /// When there are qualifiers in this set, they will be used to filter
    261   /// out member functions that aren't available (because there will be a
    262   /// cv-qualifier mismatch) or prefer functions with an exact qualifier
    263   /// match.
    264   void setObjectTypeQualifiers(Qualifiers Quals, ExprValueKind Kind) {
    265     ObjectTypeQualifiers = Quals;
    266     ObjectKind = Kind;
    267     HasObjectTypeQualifiers = true;
    268   }
    269 
    270   /// Set the preferred selector.
    271   ///
    272   /// When an Objective-C method declaration result is added, and that
    273   /// method's selector matches this preferred selector, we give that method
    274   /// a slight priority boost.
    275   void setPreferredSelector(Selector Sel) { PreferredSelector = Sel; }
    276 
    277   /// Retrieve the code-completion context for which results are
    278   /// being collected.
    279   const CodeCompletionContext &getCompletionContext() const {
    280     return CompletionContext;
    281   }
    282 
    283   /// Specify whether nested-name-specifiers are allowed.
    284   void allowNestedNameSpecifiers(bool Allow = true) {
    285     AllowNestedNameSpecifiers = Allow;
    286   }
    287 
    288   /// Return the semantic analysis object for which we are collecting
    289   /// code completion results.
    290   Sema &getSema() const { return SemaRef; }
    291 
    292   /// Retrieve the allocator used to allocate code completion strings.
    293   CodeCompletionAllocator &getAllocator() const { return Allocator; }
    294 
    295   CodeCompletionTUInfo &getCodeCompletionTUInfo() const { return CCTUInfo; }
    296 
    297   /// Determine whether the given declaration is at all interesting
    298   /// as a code-completion result.
    299   ///
    300   /// \param ND the declaration that we are inspecting.
    301   ///
    302   /// \param AsNestedNameSpecifier will be set true if this declaration is
    303   /// only interesting when it is a nested-name-specifier.
    304   bool isInterestingDecl(const NamedDecl *ND,
    305                          bool &AsNestedNameSpecifier) const;
    306 
    307   /// Check whether the result is hidden by the Hiding declaration.
    308   ///
    309   /// \returns true if the result is hidden and cannot be found, false if
    310   /// the hidden result could still be found. When false, \p R may be
    311   /// modified to describe how the result can be found (e.g., via extra
    312   /// qualification).
    313   bool CheckHiddenResult(Result &R, DeclContext *CurContext,
    314                          const NamedDecl *Hiding);
    315 
    316   /// Add a new result to this result set (if it isn't already in one
    317   /// of the shadow maps), or replace an existing result (for, e.g., a
    318   /// redeclaration).
    319   ///
    320   /// \param R the result to add (if it is unique).
    321   ///
    322   /// \param CurContext the context in which this result will be named.
    323   void MaybeAddResult(Result R, DeclContext *CurContext = nullptr);
    324 
    325   /// Add a new result to this result set, where we already know
    326   /// the hiding declaration (if any).
    327   ///
    328   /// \param R the result to add (if it is unique).
    329   ///
    330   /// \param CurContext the context in which this result will be named.
    331   ///
    332   /// \param Hiding the declaration that hides the result.
    333   ///
    334   /// \param InBaseClass whether the result was found in a base
    335   /// class of the searched context.
    336   void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding,
    337                  bool InBaseClass);
    338 
    339   /// Add a new non-declaration result to this result set.
    340   void AddResult(Result R);
    341 
    342   /// Enter into a new scope.
    343   void EnterNewScope();
    344 
    345   /// Exit from the current scope.
    346   void ExitScope();
    347 
    348   /// Ignore this declaration, if it is seen again.
    349   void Ignore(const Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); }
    350 
    351   /// Add a visited context.
    352   void addVisitedContext(DeclContext *Ctx) {
    353     CompletionContext.addVisitedContext(Ctx);
    354   }
    355 
    356   /// \name Name lookup predicates
    357   ///
    358   /// These predicates can be passed to the name lookup functions to filter the
    359   /// results of name lookup. All of the predicates have the same type, so that
    360   ///
    361   //@{
    362   bool IsOrdinaryName(const NamedDecl *ND) const;
    363   bool IsOrdinaryNonTypeName(const NamedDecl *ND) const;
    364   bool IsIntegralConstantValue(const NamedDecl *ND) const;
    365   bool IsOrdinaryNonValueName(const NamedDecl *ND) const;
    366   bool IsNestedNameSpecifier(const NamedDecl *ND) const;
    367   bool IsEnum(const NamedDecl *ND) const;
    368   bool IsClassOrStruct(const NamedDecl *ND) const;
    369   bool IsUnion(const NamedDecl *ND) const;
    370   bool IsNamespace(const NamedDecl *ND) const;
    371   bool IsNamespaceOrAlias(const NamedDecl *ND) const;
    372   bool IsType(const NamedDecl *ND) const;
    373   bool IsMember(const NamedDecl *ND) const;
    374   bool IsObjCIvar(const NamedDecl *ND) const;
    375   bool IsObjCMessageReceiver(const NamedDecl *ND) const;
    376   bool IsObjCMessageReceiverOrLambdaCapture(const NamedDecl *ND) const;
    377   bool IsObjCCollection(const NamedDecl *ND) const;
    378   bool IsImpossibleToSatisfy(const NamedDecl *ND) const;
    379   //@}
    380 };
    381 } // namespace
    382 
    383 void PreferredTypeBuilder::enterReturn(Sema &S, SourceLocation Tok) {
    384   if (!Enabled)
    385     return;
    386   if (isa<BlockDecl>(S.CurContext)) {
    387     if (sema::BlockScopeInfo *BSI = S.getCurBlock()) {
    388       ComputeType = nullptr;
    389       Type = BSI->ReturnType;
    390       ExpectedLoc = Tok;
    391     }
    392   } else if (const auto *Function = dyn_cast<FunctionDecl>(S.CurContext)) {
    393     ComputeType = nullptr;
    394     Type = Function->getReturnType();
    395     ExpectedLoc = Tok;
    396   } else if (const auto *Method = dyn_cast<ObjCMethodDecl>(S.CurContext)) {
    397     ComputeType = nullptr;
    398     Type = Method->getReturnType();
    399     ExpectedLoc = Tok;
    400   }
    401 }
    402 
    403 void PreferredTypeBuilder::enterVariableInit(SourceLocation Tok, Decl *D) {
    404   if (!Enabled)
    405     return;
    406   auto *VD = llvm::dyn_cast_or_null<ValueDecl>(D);
    407   ComputeType = nullptr;
    408   Type = VD ? VD->getType() : QualType();
    409   ExpectedLoc = Tok;
    410 }
    411 
    412 static QualType getDesignatedType(QualType BaseType, const Designation &Desig);
    413 
    414 void PreferredTypeBuilder::enterDesignatedInitializer(SourceLocation Tok,
    415                                                       QualType BaseType,
    416                                                       const Designation &D) {
    417   if (!Enabled)
    418     return;
    419   ComputeType = nullptr;
    420   Type = getDesignatedType(BaseType, D);
    421   ExpectedLoc = Tok;
    422 }
    423 
    424 void PreferredTypeBuilder::enterFunctionArgument(
    425     SourceLocation Tok, llvm::function_ref<QualType()> ComputeType) {
    426   if (!Enabled)
    427     return;
    428   this->ComputeType = ComputeType;
    429   Type = QualType();
    430   ExpectedLoc = Tok;
    431 }
    432 
    433 void PreferredTypeBuilder::enterParenExpr(SourceLocation Tok,
    434                                           SourceLocation LParLoc) {
    435   if (!Enabled)
    436     return;
    437   // expected type for parenthesized expression does not change.
    438   if (ExpectedLoc == LParLoc)
    439     ExpectedLoc = Tok;
    440 }
    441 
    442 static QualType getPreferredTypeOfBinaryRHS(Sema &S, Expr *LHS,
    443                                             tok::TokenKind Op) {
    444   if (!LHS)
    445     return QualType();
    446 
    447   QualType LHSType = LHS->getType();
    448   if (LHSType->isPointerType()) {
    449     if (Op == tok::plus || Op == tok::plusequal || Op == tok::minusequal)
    450       return S.getASTContext().getPointerDiffType();
    451     // Pointer difference is more common than subtracting an int from a pointer.
    452     if (Op == tok::minus)
    453       return LHSType;
    454   }
    455 
    456   switch (Op) {
    457   // No way to infer the type of RHS from LHS.
    458   case tok::comma:
    459     return QualType();
    460   // Prefer the type of the left operand for all of these.
    461   // Arithmetic operations.
    462   case tok::plus:
    463   case tok::plusequal:
    464   case tok::minus:
    465   case tok::minusequal:
    466   case tok::percent:
    467   case tok::percentequal:
    468   case tok::slash:
    469   case tok::slashequal:
    470   case tok::star:
    471   case tok::starequal:
    472   // Assignment.
    473   case tok::equal:
    474   // Comparison operators.
    475   case tok::equalequal:
    476   case tok::exclaimequal:
    477   case tok::less:
    478   case tok::lessequal:
    479   case tok::greater:
    480   case tok::greaterequal:
    481   case tok::spaceship:
    482     return LHS->getType();
    483   // Binary shifts are often overloaded, so don't try to guess those.
    484   case tok::greatergreater:
    485   case tok::greatergreaterequal:
    486   case tok::lessless:
    487   case tok::lesslessequal:
    488     if (LHSType->isIntegralOrEnumerationType())
    489       return S.getASTContext().IntTy;
    490     return QualType();
    491   // Logical operators, assume we want bool.
    492   case tok::ampamp:
    493   case tok::pipepipe:
    494   case tok::caretcaret:
    495     return S.getASTContext().BoolTy;
    496   // Operators often used for bit manipulation are typically used with the type
    497   // of the left argument.
    498   case tok::pipe:
    499   case tok::pipeequal:
    500   case tok::caret:
    501   case tok::caretequal:
    502   case tok::amp:
    503   case tok::ampequal:
    504     if (LHSType->isIntegralOrEnumerationType())
    505       return LHSType;
    506     return QualType();
    507   // RHS should be a pointer to a member of the 'LHS' type, but we can't give
    508   // any particular type here.
    509   case tok::periodstar:
    510   case tok::arrowstar:
    511     return QualType();
    512   default:
    513     // FIXME(ibiryukov): handle the missing op, re-add the assertion.
    514     // assert(false && "unhandled binary op");
    515     return QualType();
    516   }
    517 }
    518 
    519 /// Get preferred type for an argument of an unary expression. \p ContextType is
    520 /// preferred type of the whole unary expression.
    521 static QualType getPreferredTypeOfUnaryArg(Sema &S, QualType ContextType,
    522                                            tok::TokenKind Op) {
    523   switch (Op) {
    524   case tok::exclaim:
    525     return S.getASTContext().BoolTy;
    526   case tok::amp:
    527     if (!ContextType.isNull() && ContextType->isPointerType())
    528       return ContextType->getPointeeType();
    529     return QualType();
    530   case tok::star:
    531     if (ContextType.isNull())
    532       return QualType();
    533     return S.getASTContext().getPointerType(ContextType.getNonReferenceType());
    534   case tok::plus:
    535   case tok::minus:
    536   case tok::tilde:
    537   case tok::minusminus:
    538   case tok::plusplus:
    539     if (ContextType.isNull())
    540       return S.getASTContext().IntTy;
    541     // leave as is, these operators typically return the same type.
    542     return ContextType;
    543   case tok::kw___real:
    544   case tok::kw___imag:
    545     return QualType();
    546   default:
    547     assert(false && "unhandled unary op");
    548     return QualType();
    549   }
    550 }
    551 
    552 void PreferredTypeBuilder::enterBinary(Sema &S, SourceLocation Tok, Expr *LHS,
    553                                        tok::TokenKind Op) {
    554   if (!Enabled)
    555     return;
    556   ComputeType = nullptr;
    557   Type = getPreferredTypeOfBinaryRHS(S, LHS, Op);
    558   ExpectedLoc = Tok;
    559 }
    560 
    561 void PreferredTypeBuilder::enterMemAccess(Sema &S, SourceLocation Tok,
    562                                           Expr *Base) {
    563   if (!Enabled || !Base)
    564     return;
    565   // Do we have expected type for Base?
    566   if (ExpectedLoc != Base->getBeginLoc())
    567     return;
    568   // Keep the expected type, only update the location.
    569   ExpectedLoc = Tok;
    570   return;
    571 }
    572 
    573 void PreferredTypeBuilder::enterUnary(Sema &S, SourceLocation Tok,
    574                                       tok::TokenKind OpKind,
    575                                       SourceLocation OpLoc) {
    576   if (!Enabled)
    577     return;
    578   ComputeType = nullptr;
    579   Type = getPreferredTypeOfUnaryArg(S, this->get(OpLoc), OpKind);
    580   ExpectedLoc = Tok;
    581 }
    582 
    583 void PreferredTypeBuilder::enterSubscript(Sema &S, SourceLocation Tok,
    584                                           Expr *LHS) {
    585   if (!Enabled)
    586     return;
    587   ComputeType = nullptr;
    588   Type = S.getASTContext().IntTy;
    589   ExpectedLoc = Tok;
    590 }
    591 
    592 void PreferredTypeBuilder::enterTypeCast(SourceLocation Tok,
    593                                          QualType CastType) {
    594   if (!Enabled)
    595     return;
    596   ComputeType = nullptr;
    597   Type = !CastType.isNull() ? CastType.getCanonicalType() : QualType();
    598   ExpectedLoc = Tok;
    599 }
    600 
    601 void PreferredTypeBuilder::enterCondition(Sema &S, SourceLocation Tok) {
    602   if (!Enabled)
    603     return;
    604   ComputeType = nullptr;
    605   Type = S.getASTContext().BoolTy;
    606   ExpectedLoc = Tok;
    607 }
    608 
    609 class ResultBuilder::ShadowMapEntry::iterator {
    610   llvm::PointerUnion<const NamedDecl *, const DeclIndexPair *> DeclOrIterator;
    611   unsigned SingleDeclIndex;
    612 
    613 public:
    614   typedef DeclIndexPair value_type;
    615   typedef value_type reference;
    616   typedef std::ptrdiff_t difference_type;
    617   typedef std::input_iterator_tag iterator_category;
    618 
    619   class pointer {
    620     DeclIndexPair Value;
    621 
    622   public:
    623     pointer(const DeclIndexPair &Value) : Value(Value) {}
    624 
    625     const DeclIndexPair *operator->() const { return &Value; }
    626   };
    627 
    628   iterator() : DeclOrIterator((NamedDecl *)nullptr), SingleDeclIndex(0) {}
    629 
    630   iterator(const NamedDecl *SingleDecl, unsigned Index)
    631       : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) {}
    632 
    633   iterator(const DeclIndexPair *Iterator)
    634       : DeclOrIterator(Iterator), SingleDeclIndex(0) {}
    635 
    636   iterator &operator++() {
    637     if (DeclOrIterator.is<const NamedDecl *>()) {
    638       DeclOrIterator = (NamedDecl *)nullptr;
    639       SingleDeclIndex = 0;
    640       return *this;
    641     }
    642 
    643     const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair *>();
    644     ++I;
    645     DeclOrIterator = I;
    646     return *this;
    647   }
    648 
    649   /*iterator operator++(int) {
    650     iterator tmp(*this);
    651     ++(*this);
    652     return tmp;
    653   }*/
    654 
    655   reference operator*() const {
    656     if (const NamedDecl *ND = DeclOrIterator.dyn_cast<const NamedDecl *>())
    657       return reference(ND, SingleDeclIndex);
    658 
    659     return *DeclOrIterator.get<const DeclIndexPair *>();
    660   }
    661 
    662   pointer operator->() const { return pointer(**this); }
    663 
    664   friend bool operator==(const iterator &X, const iterator &Y) {
    665     return X.DeclOrIterator.getOpaqueValue() ==
    666                Y.DeclOrIterator.getOpaqueValue() &&
    667            X.SingleDeclIndex == Y.SingleDeclIndex;
    668   }
    669 
    670   friend bool operator!=(const iterator &X, const iterator &Y) {
    671     return !(X == Y);
    672   }
    673 };
    674 
    675 ResultBuilder::ShadowMapEntry::iterator
    676 ResultBuilder::ShadowMapEntry::begin() const {
    677   if (DeclOrVector.isNull())
    678     return iterator();
    679 
    680   if (const NamedDecl *ND = DeclOrVector.dyn_cast<const NamedDecl *>())
    681     return iterator(ND, SingleDeclIndex);
    682 
    683   return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin());
    684 }
    685 
    686 ResultBuilder::ShadowMapEntry::iterator
    687 ResultBuilder::ShadowMapEntry::end() const {
    688   if (DeclOrVector.is<const NamedDecl *>() || DeclOrVector.isNull())
    689     return iterator();
    690 
    691   return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end());
    692 }
    693 
    694 /// Compute the qualification required to get from the current context
    695 /// (\p CurContext) to the target context (\p TargetContext).
    696 ///
    697 /// \param Context the AST context in which the qualification will be used.
    698 ///
    699 /// \param CurContext the context where an entity is being named, which is
    700 /// typically based on the current scope.
    701 ///
    702 /// \param TargetContext the context in which the named entity actually
    703 /// resides.
    704 ///
    705 /// \returns a nested name specifier that refers into the target context, or
    706 /// NULL if no qualification is needed.
    707 static NestedNameSpecifier *
    708 getRequiredQualification(ASTContext &Context, const DeclContext *CurContext,
    709                          const DeclContext *TargetContext) {
    710   SmallVector<const DeclContext *, 4> TargetParents;
    711 
    712   for (const DeclContext *CommonAncestor = TargetContext;
    713        CommonAncestor && !CommonAncestor->Encloses(CurContext);
    714        CommonAncestor = CommonAncestor->getLookupParent()) {
    715     if (CommonAncestor->isTransparentContext() ||
    716         CommonAncestor->isFunctionOrMethod())
    717       continue;
    718 
    719     TargetParents.push_back(CommonAncestor);
    720   }
    721 
    722   NestedNameSpecifier *Result = nullptr;
    723   while (!TargetParents.empty()) {
    724     const DeclContext *Parent = TargetParents.pop_back_val();
    725 
    726     if (const auto *Namespace = dyn_cast<NamespaceDecl>(Parent)) {
    727       if (!Namespace->getIdentifier())
    728         continue;
    729 
    730       Result = NestedNameSpecifier::Create(Context, Result, Namespace);
    731     } else if (const auto *TD = dyn_cast<TagDecl>(Parent))
    732       Result = NestedNameSpecifier::Create(
    733           Context, Result, false, Context.getTypeDeclType(TD).getTypePtr());
    734   }
    735   return Result;
    736 }
    737 
    738 // Some declarations have reserved names that we don't want to ever show.
    739 // Filter out names reserved for the implementation if they come from a
    740 // system header.
    741 static bool shouldIgnoreDueToReservedName(const NamedDecl *ND, Sema &SemaRef) {
    742   ReservedIdentifierStatus Status = ND->isReserved(SemaRef.getLangOpts());
    743   // Ignore reserved names for compiler provided decls.
    744   if ((Status != ReservedIdentifierStatus::NotReserved) &&
    745       (Status != ReservedIdentifierStatus::StartsWithUnderscoreAtGlobalScope) &&
    746       ND->getLocation().isInvalid())
    747     return true;
    748 
    749   // For system headers ignore only double-underscore names.
    750   // This allows for system headers providing private symbols with a single
    751   // underscore.
    752   if (Status == ReservedIdentifierStatus::StartsWithDoubleUnderscore &&
    753       SemaRef.SourceMgr.isInSystemHeader(
    754           SemaRef.SourceMgr.getSpellingLoc(ND->getLocation())))
    755     return true;
    756 
    757   return false;
    758 }
    759 
    760 bool ResultBuilder::isInterestingDecl(const NamedDecl *ND,
    761                                       bool &AsNestedNameSpecifier) const {
    762   AsNestedNameSpecifier = false;
    763 
    764   auto *Named = ND;
    765   ND = ND->getUnderlyingDecl();
    766 
    767   // Skip unnamed entities.
    768   if (!ND->getDeclName())
    769     return false;
    770 
    771   // Friend declarations and declarations introduced due to friends are never
    772   // added as results.
    773   if (ND->getFriendObjectKind() == Decl::FOK_Undeclared)
    774     return false;
    775 
    776   // Class template (partial) specializations are never added as results.
    777   if (isa<ClassTemplateSpecializationDecl>(ND) ||
    778       isa<ClassTemplatePartialSpecializationDecl>(ND))
    779     return false;
    780 
    781   // Using declarations themselves are never added as results.
    782   if (isa<UsingDecl>(ND))
    783     return false;
    784 
    785   if (shouldIgnoreDueToReservedName(ND, SemaRef))
    786     return false;
    787 
    788   if (Filter == &ResultBuilder::IsNestedNameSpecifier ||
    789       (isa<NamespaceDecl>(ND) && Filter != &ResultBuilder::IsNamespace &&
    790        Filter != &ResultBuilder::IsNamespaceOrAlias && Filter != nullptr))
    791     AsNestedNameSpecifier = true;
    792 
    793   // Filter out any unwanted results.
    794   if (Filter && !(this->*Filter)(Named)) {
    795     // Check whether it is interesting as a nested-name-specifier.
    796     if (AllowNestedNameSpecifiers && SemaRef.getLangOpts().CPlusPlus &&
    797         IsNestedNameSpecifier(ND) &&
    798         (Filter != &ResultBuilder::IsMember ||
    799          (isa<CXXRecordDecl>(ND) &&
    800           cast<CXXRecordDecl>(ND)->isInjectedClassName()))) {
    801       AsNestedNameSpecifier = true;
    802       return true;
    803     }
    804 
    805     return false;
    806   }
    807   // ... then it must be interesting!
    808   return true;
    809 }
    810 
    811 bool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext,
    812                                       const NamedDecl *Hiding) {
    813   // In C, there is no way to refer to a hidden name.
    814   // FIXME: This isn't true; we can find a tag name hidden by an ordinary
    815   // name if we introduce the tag type.
    816   if (!SemaRef.getLangOpts().CPlusPlus)
    817     return true;
    818 
    819   const DeclContext *HiddenCtx =
    820       R.Declaration->getDeclContext()->getRedeclContext();
    821 
    822   // There is no way to qualify a name declared in a function or method.
    823   if (HiddenCtx->isFunctionOrMethod())
    824     return true;
    825 
    826   if (HiddenCtx == Hiding->getDeclContext()->getRedeclContext())
    827     return true;
    828 
    829   // We can refer to the result with the appropriate qualification. Do it.
    830   R.Hidden = true;
    831   R.QualifierIsInformative = false;
    832 
    833   if (!R.Qualifier)
    834     R.Qualifier = getRequiredQualification(SemaRef.Context, CurContext,
    835                                            R.Declaration->getDeclContext());
    836   return false;
    837 }
    838 
    839 /// A simplified classification of types used to determine whether two
    840 /// types are "similar enough" when adjusting priorities.
    841 SimplifiedTypeClass clang::getSimplifiedTypeClass(CanQualType T) {
    842   switch (T->getTypeClass()) {
    843   case Type::Builtin:
    844     switch (cast<BuiltinType>(T)->getKind()) {
    845     case BuiltinType::Void:
    846       return STC_Void;
    847 
    848     case BuiltinType::NullPtr:
    849       return STC_Pointer;
    850 
    851     case BuiltinType::Overload:
    852     case BuiltinType::Dependent:
    853       return STC_Other;
    854 
    855     case BuiltinType::ObjCId:
    856     case BuiltinType::ObjCClass:
    857     case BuiltinType::ObjCSel:
    858       return STC_ObjectiveC;
    859 
    860     default:
    861       return STC_Arithmetic;
    862     }
    863 
    864   case Type::Complex:
    865     return STC_Arithmetic;
    866 
    867   case Type::Pointer:
    868     return STC_Pointer;
    869 
    870   case Type::BlockPointer:
    871     return STC_Block;
    872 
    873   case Type::LValueReference:
    874   case Type::RValueReference:
    875     return getSimplifiedTypeClass(T->getAs<ReferenceType>()->getPointeeType());
    876 
    877   case Type::ConstantArray:
    878   case Type::IncompleteArray:
    879   case Type::VariableArray:
    880   case Type::DependentSizedArray:
    881     return STC_Array;
    882 
    883   case Type::DependentSizedExtVector:
    884   case Type::Vector:
    885   case Type::ExtVector:
    886     return STC_Arithmetic;
    887 
    888   case Type::FunctionProto:
    889   case Type::FunctionNoProto:
    890     return STC_Function;
    891 
    892   case Type::Record:
    893     return STC_Record;
    894 
    895   case Type::Enum:
    896     return STC_Arithmetic;
    897 
    898   case Type::ObjCObject:
    899   case Type::ObjCInterface:
    900   case Type::ObjCObjectPointer:
    901     return STC_ObjectiveC;
    902 
    903   default:
    904     return STC_Other;
    905   }
    906 }
    907 
    908 /// Get the type that a given expression will have if this declaration
    909 /// is used as an expression in its "typical" code-completion form.
    910 QualType clang::getDeclUsageType(ASTContext &C, const NamedDecl *ND) {
    911   ND = ND->getUnderlyingDecl();
    912 
    913   if (const auto *Type = dyn_cast<TypeDecl>(ND))
    914     return C.getTypeDeclType(Type);
    915   if (const auto *Iface = dyn_cast<ObjCInterfaceDecl>(ND))
    916     return C.getObjCInterfaceType(Iface);
    917 
    918   QualType T;
    919   if (const FunctionDecl *Function = ND->getAsFunction())
    920     T = Function->getCallResultType();
    921   else if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND))
    922     T = Method->getSendResultType();
    923   else if (const auto *Enumerator = dyn_cast<EnumConstantDecl>(ND))
    924     T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext()));
    925   else if (const auto *Property = dyn_cast<ObjCPropertyDecl>(ND))
    926     T = Property->getType();
    927   else if (const auto *Value = dyn_cast<ValueDecl>(ND))
    928     T = Value->getType();
    929 
    930   if (T.isNull())
    931     return QualType();
    932 
    933   // Dig through references, function pointers, and block pointers to
    934   // get down to the likely type of an expression when the entity is
    935   // used.
    936   do {
    937     if (const auto *Ref = T->getAs<ReferenceType>()) {
    938       T = Ref->getPointeeType();
    939       continue;
    940     }
    941 
    942     if (const auto *Pointer = T->getAs<PointerType>()) {
    943       if (Pointer->getPointeeType()->isFunctionType()) {
    944         T = Pointer->getPointeeType();
    945         continue;
    946       }
    947 
    948       break;
    949     }
    950 
    951     if (const auto *Block = T->getAs<BlockPointerType>()) {
    952       T = Block->getPointeeType();
    953       continue;
    954     }
    955 
    956     if (const auto *Function = T->getAs<FunctionType>()) {
    957       T = Function->getReturnType();
    958       continue;
    959     }
    960 
    961     break;
    962   } while (true);
    963 
    964   return T;
    965 }
    966 
    967 unsigned ResultBuilder::getBasePriority(const NamedDecl *ND) {
    968   if (!ND)
    969     return CCP_Unlikely;
    970 
    971   // Context-based decisions.
    972   const DeclContext *LexicalDC = ND->getLexicalDeclContext();
    973   if (LexicalDC->isFunctionOrMethod()) {
    974     // _cmd is relatively rare
    975     if (const auto *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
    976       if (ImplicitParam->getIdentifier() &&
    977           ImplicitParam->getIdentifier()->isStr("_cmd"))
    978         return CCP_ObjC_cmd;
    979 
    980     return CCP_LocalDeclaration;
    981   }
    982 
    983   const DeclContext *DC = ND->getDeclContext()->getRedeclContext();
    984   if (DC->isRecord() || isa<ObjCContainerDecl>(DC)) {
    985     // Explicit destructor calls are very rare.
    986     if (isa<CXXDestructorDecl>(ND))
    987       return CCP_Unlikely;
    988     // Explicit operator and conversion function calls are also very rare.
    989     auto DeclNameKind = ND->getDeclName().getNameKind();
    990     if (DeclNameKind == DeclarationName::CXXOperatorName ||
    991         DeclNameKind == DeclarationName::CXXLiteralOperatorName ||
    992         DeclNameKind == DeclarationName::CXXConversionFunctionName)
    993       return CCP_Unlikely;
    994     return CCP_MemberDeclaration;
    995   }
    996 
    997   // Content-based decisions.
    998   if (isa<EnumConstantDecl>(ND))
    999     return CCP_Constant;
   1000 
   1001   // Use CCP_Type for type declarations unless we're in a statement, Objective-C
   1002   // message receiver, or parenthesized expression context. There, it's as
   1003   // likely that the user will want to write a type as other declarations.
   1004   if ((isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) &&
   1005       !(CompletionContext.getKind() == CodeCompletionContext::CCC_Statement ||
   1006         CompletionContext.getKind() ==
   1007             CodeCompletionContext::CCC_ObjCMessageReceiver ||
   1008         CompletionContext.getKind() ==
   1009             CodeCompletionContext::CCC_ParenthesizedExpression))
   1010     return CCP_Type;
   1011 
   1012   return CCP_Declaration;
   1013 }
   1014 
   1015 void ResultBuilder::AdjustResultPriorityForDecl(Result &R) {
   1016   // If this is an Objective-C method declaration whose selector matches our
   1017   // preferred selector, give it a priority boost.
   1018   if (!PreferredSelector.isNull())
   1019     if (const auto *Method = dyn_cast<ObjCMethodDecl>(R.Declaration))
   1020       if (PreferredSelector == Method->getSelector())
   1021         R.Priority += CCD_SelectorMatch;
   1022 
   1023   // If we have a preferred type, adjust the priority for results with exactly-
   1024   // matching or nearly-matching types.
   1025   if (!PreferredType.isNull()) {
   1026     QualType T = getDeclUsageType(SemaRef.Context, R.Declaration);
   1027     if (!T.isNull()) {
   1028       CanQualType TC = SemaRef.Context.getCanonicalType(T);
   1029       // Check for exactly-matching types (modulo qualifiers).
   1030       if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC))
   1031         R.Priority /= CCF_ExactTypeMatch;
   1032       // Check for nearly-matching types, based on classification of each.
   1033       else if ((getSimplifiedTypeClass(PreferredType) ==
   1034                 getSimplifiedTypeClass(TC)) &&
   1035                !(PreferredType->isEnumeralType() && TC->isEnumeralType()))
   1036         R.Priority /= CCF_SimilarTypeMatch;
   1037     }
   1038   }
   1039 }
   1040 
   1041 static DeclContext::lookup_result getConstructors(ASTContext &Context,
   1042                                                   const CXXRecordDecl *Record) {
   1043   QualType RecordTy = Context.getTypeDeclType(Record);
   1044   DeclarationName ConstructorName =
   1045       Context.DeclarationNames.getCXXConstructorName(
   1046           Context.getCanonicalType(RecordTy));
   1047   return Record->lookup(ConstructorName);
   1048 }
   1049 
   1050 void ResultBuilder::MaybeAddConstructorResults(Result R) {
   1051   if (!SemaRef.getLangOpts().CPlusPlus || !R.Declaration ||
   1052       !CompletionContext.wantConstructorResults())
   1053     return;
   1054 
   1055   const NamedDecl *D = R.Declaration;
   1056   const CXXRecordDecl *Record = nullptr;
   1057   if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D))
   1058     Record = ClassTemplate->getTemplatedDecl();
   1059   else if ((Record = dyn_cast<CXXRecordDecl>(D))) {
   1060     // Skip specializations and partial specializations.
   1061     if (isa<ClassTemplateSpecializationDecl>(Record))
   1062       return;
   1063   } else {
   1064     // There are no constructors here.
   1065     return;
   1066   }
   1067 
   1068   Record = Record->getDefinition();
   1069   if (!Record)
   1070     return;
   1071 
   1072   for (NamedDecl *Ctor : getConstructors(SemaRef.Context, Record)) {
   1073     R.Declaration = Ctor;
   1074     R.CursorKind = getCursorKindForDecl(R.Declaration);
   1075     Results.push_back(R);
   1076   }
   1077 }
   1078 
   1079 static bool isConstructor(const Decl *ND) {
   1080   if (const auto *Tmpl = dyn_cast<FunctionTemplateDecl>(ND))
   1081     ND = Tmpl->getTemplatedDecl();
   1082   return isa<CXXConstructorDecl>(ND);
   1083 }
   1084 
   1085 void ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) {
   1086   assert(!ShadowMaps.empty() && "Must enter into a results scope");
   1087 
   1088   if (R.Kind != Result::RK_Declaration) {
   1089     // For non-declaration results, just add the result.
   1090     Results.push_back(R);
   1091     return;
   1092   }
   1093 
   1094   // Look through using declarations.
   1095   if (const UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) {
   1096     CodeCompletionResult Result(Using->getTargetDecl(),
   1097                                 getBasePriority(Using->getTargetDecl()),
   1098                                 R.Qualifier);
   1099     Result.ShadowDecl = Using;
   1100     MaybeAddResult(Result, CurContext);
   1101     return;
   1102   }
   1103 
   1104   const Decl *CanonDecl = R.Declaration->getCanonicalDecl();
   1105   unsigned IDNS = CanonDecl->getIdentifierNamespace();
   1106 
   1107   bool AsNestedNameSpecifier = false;
   1108   if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
   1109     return;
   1110 
   1111   // C++ constructors are never found by name lookup.
   1112   if (isConstructor(R.Declaration))
   1113     return;
   1114 
   1115   ShadowMap &SMap = ShadowMaps.back();
   1116   ShadowMapEntry::iterator I, IEnd;
   1117   ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName());
   1118   if (NamePos != SMap.end()) {
   1119     I = NamePos->second.begin();
   1120     IEnd = NamePos->second.end();
   1121   }
   1122 
   1123   for (; I != IEnd; ++I) {
   1124     const NamedDecl *ND = I->first;
   1125     unsigned Index = I->second;
   1126     if (ND->getCanonicalDecl() == CanonDecl) {
   1127       // This is a redeclaration. Always pick the newer declaration.
   1128       Results[Index].Declaration = R.Declaration;
   1129 
   1130       // We're done.
   1131       return;
   1132     }
   1133   }
   1134 
   1135   // This is a new declaration in this scope. However, check whether this
   1136   // declaration name is hidden by a similarly-named declaration in an outer
   1137   // scope.
   1138   std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end();
   1139   --SMEnd;
   1140   for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) {
   1141     ShadowMapEntry::iterator I, IEnd;
   1142     ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName());
   1143     if (NamePos != SM->end()) {
   1144       I = NamePos->second.begin();
   1145       IEnd = NamePos->second.end();
   1146     }
   1147     for (; I != IEnd; ++I) {
   1148       // A tag declaration does not hide a non-tag declaration.
   1149       if (I->first->hasTagIdentifierNamespace() &&
   1150           (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary |
   1151                    Decl::IDNS_LocalExtern | Decl::IDNS_ObjCProtocol)))
   1152         continue;
   1153 
   1154       // Protocols are in distinct namespaces from everything else.
   1155       if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) ||
   1156            (IDNS & Decl::IDNS_ObjCProtocol)) &&
   1157           I->first->getIdentifierNamespace() != IDNS)
   1158         continue;
   1159 
   1160       // The newly-added result is hidden by an entry in the shadow map.
   1161       if (CheckHiddenResult(R, CurContext, I->first))
   1162         return;
   1163 
   1164       break;
   1165     }
   1166   }
   1167 
   1168   // Make sure that any given declaration only shows up in the result set once.
   1169   if (!AllDeclsFound.insert(CanonDecl).second)
   1170     return;
   1171 
   1172   // If the filter is for nested-name-specifiers, then this result starts a
   1173   // nested-name-specifier.
   1174   if (AsNestedNameSpecifier) {
   1175     R.StartsNestedNameSpecifier = true;
   1176     R.Priority = CCP_NestedNameSpecifier;
   1177   } else
   1178     AdjustResultPriorityForDecl(R);
   1179 
   1180   // If this result is supposed to have an informative qualifier, add one.
   1181   if (R.QualifierIsInformative && !R.Qualifier &&
   1182       !R.StartsNestedNameSpecifier) {
   1183     const DeclContext *Ctx = R.Declaration->getDeclContext();
   1184     if (const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx))
   1185       R.Qualifier =
   1186           NestedNameSpecifier::Create(SemaRef.Context, nullptr, Namespace);
   1187     else if (const TagDecl *Tag = dyn_cast<TagDecl>(Ctx))
   1188       R.Qualifier = NestedNameSpecifier::Create(
   1189           SemaRef.Context, nullptr, false,
   1190           SemaRef.Context.getTypeDeclType(Tag).getTypePtr());
   1191     else
   1192       R.QualifierIsInformative = false;
   1193   }
   1194 
   1195   // Insert this result into the set of results and into the current shadow
   1196   // map.
   1197   SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size());
   1198   Results.push_back(R);
   1199 
   1200   if (!AsNestedNameSpecifier)
   1201     MaybeAddConstructorResults(R);
   1202 }
   1203 
   1204 static void setInBaseClass(ResultBuilder::Result &R) {
   1205   R.Priority += CCD_InBaseClass;
   1206   R.InBaseClass = true;
   1207 }
   1208 
   1209 enum class OverloadCompare { BothViable, Dominates, Dominated };
   1210 // Will Candidate ever be called on the object, when overloaded with Incumbent?
   1211 // Returns Dominates if Candidate is always called, Dominated if Incumbent is
   1212 // always called, BothViable if either may be called dependending on arguments.
   1213 // Precondition: must actually be overloads!
   1214 static OverloadCompare compareOverloads(const CXXMethodDecl &Candidate,
   1215                                         const CXXMethodDecl &Incumbent,
   1216                                         const Qualifiers &ObjectQuals,
   1217                                         ExprValueKind ObjectKind) {
   1218   // Base/derived shadowing is handled elsewhere.
   1219   if (Candidate.getDeclContext() != Incumbent.getDeclContext())
   1220     return OverloadCompare::BothViable;
   1221   if (Candidate.isVariadic() != Incumbent.isVariadic() ||
   1222       Candidate.getNumParams() != Incumbent.getNumParams() ||
   1223       Candidate.getMinRequiredArguments() !=
   1224           Incumbent.getMinRequiredArguments())
   1225     return OverloadCompare::BothViable;
   1226   for (unsigned I = 0, E = Candidate.getNumParams(); I != E; ++I)
   1227     if (Candidate.parameters()[I]->getType().getCanonicalType() !=
   1228         Incumbent.parameters()[I]->getType().getCanonicalType())
   1229       return OverloadCompare::BothViable;
   1230   if (!llvm::empty(Candidate.specific_attrs<EnableIfAttr>()) ||
   1231       !llvm::empty(Incumbent.specific_attrs<EnableIfAttr>()))
   1232     return OverloadCompare::BothViable;
   1233   // At this point, we know calls can't pick one or the other based on
   1234   // arguments, so one of the two must win. (Or both fail, handled elsewhere).
   1235   RefQualifierKind CandidateRef = Candidate.getRefQualifier();
   1236   RefQualifierKind IncumbentRef = Incumbent.getRefQualifier();
   1237   if (CandidateRef != IncumbentRef) {
   1238     // If the object kind is LValue/RValue, there's one acceptable ref-qualifier
   1239     // and it can't be mixed with ref-unqualified overloads (in valid code).
   1240 
   1241     // For xvalue objects, we prefer the rvalue overload even if we have to
   1242     // add qualifiers (which is rare, because const&& is rare).
   1243     if (ObjectKind == clang::VK_XValue)
   1244       return CandidateRef == RQ_RValue ? OverloadCompare::Dominates
   1245                                        : OverloadCompare::Dominated;
   1246   }
   1247   // Now the ref qualifiers are the same (or we're in some invalid state).
   1248   // So make some decision based on the qualifiers.
   1249   Qualifiers CandidateQual = Candidate.getMethodQualifiers();
   1250   Qualifiers IncumbentQual = Incumbent.getMethodQualifiers();
   1251   bool CandidateSuperset = CandidateQual.compatiblyIncludes(IncumbentQual);
   1252   bool IncumbentSuperset = IncumbentQual.compatiblyIncludes(CandidateQual);
   1253   if (CandidateSuperset == IncumbentSuperset)
   1254     return OverloadCompare::BothViable;
   1255   return IncumbentSuperset ? OverloadCompare::Dominates
   1256                            : OverloadCompare::Dominated;
   1257 }
   1258 
   1259 void ResultBuilder::AddResult(Result R, DeclContext *CurContext,
   1260                               NamedDecl *Hiding, bool InBaseClass = false) {
   1261   if (R.Kind != Result::RK_Declaration) {
   1262     // For non-declaration results, just add the result.
   1263     Results.push_back(R);
   1264     return;
   1265   }
   1266 
   1267   // Look through using declarations.
   1268   if (const auto *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) {
   1269     CodeCompletionResult Result(Using->getTargetDecl(),
   1270                                 getBasePriority(Using->getTargetDecl()),
   1271                                 R.Qualifier);
   1272     Result.ShadowDecl = Using;
   1273     AddResult(Result, CurContext, Hiding);
   1274     return;
   1275   }
   1276 
   1277   bool AsNestedNameSpecifier = false;
   1278   if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
   1279     return;
   1280 
   1281   // C++ constructors are never found by name lookup.
   1282   if (isConstructor(R.Declaration))
   1283     return;
   1284 
   1285   if (Hiding && CheckHiddenResult(R, CurContext, Hiding))
   1286     return;
   1287 
   1288   // Make sure that any given declaration only shows up in the result set once.
   1289   if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl()).second)
   1290     return;
   1291 
   1292   // If the filter is for nested-name-specifiers, then this result starts a
   1293   // nested-name-specifier.
   1294   if (AsNestedNameSpecifier) {
   1295     R.StartsNestedNameSpecifier = true;
   1296     R.Priority = CCP_NestedNameSpecifier;
   1297   } else if (Filter == &ResultBuilder::IsMember && !R.Qualifier &&
   1298              InBaseClass &&
   1299              isa<CXXRecordDecl>(
   1300                  R.Declaration->getDeclContext()->getRedeclContext()))
   1301     R.QualifierIsInformative = true;
   1302 
   1303   // If this result is supposed to have an informative qualifier, add one.
   1304   if (R.QualifierIsInformative && !R.Qualifier &&
   1305       !R.StartsNestedNameSpecifier) {
   1306     const DeclContext *Ctx = R.Declaration->getDeclContext();
   1307     if (const auto *Namespace = dyn_cast<NamespaceDecl>(Ctx))
   1308       R.Qualifier =
   1309           NestedNameSpecifier::Create(SemaRef.Context, nullptr, Namespace);
   1310     else if (const auto *Tag = dyn_cast<TagDecl>(Ctx))
   1311       R.Qualifier = NestedNameSpecifier::Create(
   1312           SemaRef.Context, nullptr, false,
   1313           SemaRef.Context.getTypeDeclType(Tag).getTypePtr());
   1314     else
   1315       R.QualifierIsInformative = false;
   1316   }
   1317 
   1318   // Adjust the priority if this result comes from a base class.
   1319   if (InBaseClass)
   1320     setInBaseClass(R);
   1321 
   1322   AdjustResultPriorityForDecl(R);
   1323 
   1324   if (HasObjectTypeQualifiers)
   1325     if (const auto *Method = dyn_cast<CXXMethodDecl>(R.Declaration))
   1326       if (Method->isInstance()) {
   1327         Qualifiers MethodQuals = Method->getMethodQualifiers();
   1328         if (ObjectTypeQualifiers == MethodQuals)
   1329           R.Priority += CCD_ObjectQualifierMatch;
   1330         else if (ObjectTypeQualifiers - MethodQuals) {
   1331           // The method cannot be invoked, because doing so would drop
   1332           // qualifiers.
   1333           return;
   1334         }
   1335         // Detect cases where a ref-qualified method cannot be invoked.
   1336         switch (Method->getRefQualifier()) {
   1337           case RQ_LValue:
   1338             if (ObjectKind != VK_LValue && !MethodQuals.hasConst())
   1339               return;
   1340             break;
   1341           case RQ_RValue:
   1342             if (ObjectKind == VK_LValue)
   1343               return;
   1344             break;
   1345           case RQ_None:
   1346             break;
   1347         }
   1348 
   1349         /// Check whether this dominates another overloaded method, which should
   1350         /// be suppressed (or vice versa).
   1351         /// Motivating case is const_iterator begin() const vs iterator begin().
   1352         auto &OverloadSet = OverloadMap[std::make_pair(
   1353             CurContext, Method->getDeclName().getAsOpaqueInteger())];
   1354         for (const DeclIndexPair Entry : OverloadSet) {
   1355           Result &Incumbent = Results[Entry.second];
   1356           switch (compareOverloads(*Method,
   1357                                    *cast<CXXMethodDecl>(Incumbent.Declaration),
   1358                                    ObjectTypeQualifiers, ObjectKind)) {
   1359           case OverloadCompare::Dominates:
   1360             // Replace the dominated overload with this one.
   1361             // FIXME: if the overload dominates multiple incumbents then we
   1362             // should remove all. But two overloads is by far the common case.
   1363             Incumbent = std::move(R);
   1364             return;
   1365           case OverloadCompare::Dominated:
   1366             // This overload can't be called, drop it.
   1367             return;
   1368           case OverloadCompare::BothViable:
   1369             break;
   1370           }
   1371         }
   1372         OverloadSet.Add(Method, Results.size());
   1373       }
   1374 
   1375   // Insert this result into the set of results.
   1376   Results.push_back(R);
   1377 
   1378   if (!AsNestedNameSpecifier)
   1379     MaybeAddConstructorResults(R);
   1380 }
   1381 
   1382 void ResultBuilder::AddResult(Result R) {
   1383   assert(R.Kind != Result::RK_Declaration &&
   1384          "Declaration results need more context");
   1385   Results.push_back(R);
   1386 }
   1387 
   1388 /// Enter into a new scope.
   1389 void ResultBuilder::EnterNewScope() { ShadowMaps.emplace_back(); }
   1390 
   1391 /// Exit from the current scope.
   1392 void ResultBuilder::ExitScope() {
   1393   ShadowMaps.pop_back();
   1394 }
   1395 
   1396 /// Determines whether this given declaration will be found by
   1397 /// ordinary name lookup.
   1398 bool ResultBuilder::IsOrdinaryName(const NamedDecl *ND) const {
   1399   ND = ND->getUnderlyingDecl();
   1400 
   1401   // If name lookup finds a local extern declaration, then we are in a
   1402   // context where it behaves like an ordinary name.
   1403   unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_LocalExtern;
   1404   if (SemaRef.getLangOpts().CPlusPlus)
   1405     IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member;
   1406   else if (SemaRef.getLangOpts().ObjC) {
   1407     if (isa<ObjCIvarDecl>(ND))
   1408       return true;
   1409   }
   1410 
   1411   return ND->getIdentifierNamespace() & IDNS;
   1412 }
   1413 
   1414 /// Determines whether this given declaration will be found by
   1415 /// ordinary name lookup but is not a type name.
   1416 bool ResultBuilder::IsOrdinaryNonTypeName(const NamedDecl *ND) const {
   1417   ND = ND->getUnderlyingDecl();
   1418   if (isa<TypeDecl>(ND))
   1419     return false;
   1420   // Objective-C interfaces names are not filtered by this method because they
   1421   // can be used in a class property expression. We can still filter out
   1422   // @class declarations though.
   1423   if (const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND)) {
   1424     if (!ID->getDefinition())
   1425       return false;
   1426   }
   1427 
   1428   unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_LocalExtern;
   1429   if (SemaRef.getLangOpts().CPlusPlus)
   1430     IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member;
   1431   else if (SemaRef.getLangOpts().ObjC) {
   1432     if (isa<ObjCIvarDecl>(ND))
   1433       return true;
   1434   }
   1435 
   1436   return ND->getIdentifierNamespace() & IDNS;
   1437 }
   1438 
   1439 bool ResultBuilder::IsIntegralConstantValue(const NamedDecl *ND) const {
   1440   if (!IsOrdinaryNonTypeName(ND))
   1441     return 0;
   1442 
   1443   if (const auto *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl()))
   1444     if (VD->getType()->isIntegralOrEnumerationType())
   1445       return true;
   1446 
   1447   return false;
   1448 }
   1449 
   1450 /// Determines whether this given declaration will be found by
   1451 /// ordinary name lookup.
   1452 bool ResultBuilder::IsOrdinaryNonValueName(const NamedDecl *ND) const {
   1453   ND = ND->getUnderlyingDecl();
   1454 
   1455   unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_LocalExtern;
   1456   if (SemaRef.getLangOpts().CPlusPlus)
   1457     IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace;
   1458 
   1459   return (ND->getIdentifierNamespace() & IDNS) && !isa<ValueDecl>(ND) &&
   1460          !isa<FunctionTemplateDecl>(ND) && !isa<ObjCPropertyDecl>(ND);
   1461 }
   1462 
   1463 /// Determines whether the given declaration is suitable as the
   1464 /// start of a C++ nested-name-specifier, e.g., a class or namespace.
   1465 bool ResultBuilder::IsNestedNameSpecifier(const NamedDecl *ND) const {
   1466   // Allow us to find class templates, too.
   1467   if (const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
   1468     ND = ClassTemplate->getTemplatedDecl();
   1469 
   1470   return SemaRef.isAcceptableNestedNameSpecifier(ND);
   1471 }
   1472 
   1473 /// Determines whether the given declaration is an enumeration.
   1474 bool ResultBuilder::IsEnum(const NamedDecl *ND) const {
   1475   return isa<EnumDecl>(ND);
   1476 }
   1477 
   1478 /// Determines whether the given declaration is a class or struct.
   1479 bool ResultBuilder::IsClassOrStruct(const NamedDecl *ND) const {
   1480   // Allow us to find class templates, too.
   1481   if (const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
   1482     ND = ClassTemplate->getTemplatedDecl();
   1483 
   1484   // For purposes of this check, interfaces match too.
   1485   if (const auto *RD = dyn_cast<RecordDecl>(ND))
   1486     return RD->getTagKind() == TTK_Class || RD->getTagKind() == TTK_Struct ||
   1487            RD->getTagKind() == TTK_Interface;
   1488 
   1489   return false;
   1490 }
   1491 
   1492 /// Determines whether the given declaration is a union.
   1493 bool ResultBuilder::IsUnion(const NamedDecl *ND) const {
   1494   // Allow us to find class templates, too.
   1495   if (const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
   1496     ND = ClassTemplate->getTemplatedDecl();
   1497 
   1498   if (const auto *RD = dyn_cast<RecordDecl>(ND))
   1499     return RD->getTagKind() == TTK_Union;
   1500 
   1501   return false;
   1502 }
   1503 
   1504 /// Determines whether the given declaration is a namespace.
   1505 bool ResultBuilder::IsNamespace(const NamedDecl *ND) const {
   1506   return isa<NamespaceDecl>(ND);
   1507 }
   1508 
   1509 /// Determines whether the given declaration is a namespace or
   1510 /// namespace alias.
   1511 bool ResultBuilder::IsNamespaceOrAlias(const NamedDecl *ND) const {
   1512   return isa<NamespaceDecl>(ND->getUnderlyingDecl());
   1513 }
   1514 
   1515 /// Determines whether the given declaration is a type.
   1516 bool ResultBuilder::IsType(const NamedDecl *ND) const {
   1517   ND = ND->getUnderlyingDecl();
   1518   return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND);
   1519 }
   1520 
   1521 /// Determines which members of a class should be visible via
   1522 /// "." or "->".  Only value declarations, nested name specifiers, and
   1523 /// using declarations thereof should show up.
   1524 bool ResultBuilder::IsMember(const NamedDecl *ND) const {
   1525   ND = ND->getUnderlyingDecl();
   1526   return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) ||
   1527          isa<ObjCPropertyDecl>(ND);
   1528 }
   1529 
   1530 static bool isObjCReceiverType(ASTContext &C, QualType T) {
   1531   T = C.getCanonicalType(T);
   1532   switch (T->getTypeClass()) {
   1533   case Type::ObjCObject:
   1534   case Type::ObjCInterface:
   1535   case Type::ObjCObjectPointer:
   1536     return true;
   1537 
   1538   case Type::Builtin:
   1539     switch (cast<BuiltinType>(T)->getKind()) {
   1540     case BuiltinType::ObjCId:
   1541     case BuiltinType::ObjCClass:
   1542     case BuiltinType::ObjCSel:
   1543       return true;
   1544 
   1545     default:
   1546       break;
   1547     }
   1548     return false;
   1549 
   1550   default:
   1551     break;
   1552   }
   1553 
   1554   if (!C.getLangOpts().CPlusPlus)
   1555     return false;
   1556 
   1557   // FIXME: We could perform more analysis here to determine whether a
   1558   // particular class type has any conversions to Objective-C types. For now,
   1559   // just accept all class types.
   1560   return T->isDependentType() || T->isRecordType();
   1561 }
   1562 
   1563 bool ResultBuilder::IsObjCMessageReceiver(const NamedDecl *ND) const {
   1564   QualType T = getDeclUsageType(SemaRef.Context, ND);
   1565   if (T.isNull())
   1566     return false;
   1567 
   1568   T = SemaRef.Context.getBaseElementType(T);
   1569   return isObjCReceiverType(SemaRef.Context, T);
   1570 }
   1571 
   1572 bool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(
   1573     const NamedDecl *ND) const {
   1574   if (IsObjCMessageReceiver(ND))
   1575     return true;
   1576 
   1577   const auto *Var = dyn_cast<VarDecl>(ND);
   1578   if (!Var)
   1579     return false;
   1580 
   1581   return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>();
   1582 }
   1583 
   1584 bool ResultBuilder::IsObjCCollection(const NamedDecl *ND) const {
   1585   if ((SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryName(ND)) ||
   1586       (!SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryNonTypeName(ND)))
   1587     return false;
   1588 
   1589   QualType T = getDeclUsageType(SemaRef.Context, ND);
   1590   if (T.isNull())
   1591     return false;
   1592 
   1593   T = SemaRef.Context.getBaseElementType(T);
   1594   return T->isObjCObjectType() || T->isObjCObjectPointerType() ||
   1595          T->isObjCIdType() ||
   1596          (SemaRef.getLangOpts().CPlusPlus && T->isRecordType());
   1597 }
   1598 
   1599 bool ResultBuilder::IsImpossibleToSatisfy(const NamedDecl *ND) const {
   1600   return false;
   1601 }
   1602 
   1603 /// Determines whether the given declaration is an Objective-C
   1604 /// instance variable.
   1605 bool ResultBuilder::IsObjCIvar(const NamedDecl *ND) const {
   1606   return isa<ObjCIvarDecl>(ND);
   1607 }
   1608 
   1609 namespace {
   1610 
   1611 /// Visible declaration consumer that adds a code-completion result
   1612 /// for each visible declaration.
   1613 class CodeCompletionDeclConsumer : public VisibleDeclConsumer {
   1614   ResultBuilder &Results;
   1615   DeclContext *InitialLookupCtx;
   1616   // NamingClass and BaseType are used for access-checking. See
   1617   // Sema::IsSimplyAccessible for details.
   1618   CXXRecordDecl *NamingClass;
   1619   QualType BaseType;
   1620   std::vector<FixItHint> FixIts;
   1621 
   1622 public:
   1623   CodeCompletionDeclConsumer(
   1624       ResultBuilder &Results, DeclContext *InitialLookupCtx,
   1625       QualType BaseType = QualType(),
   1626       std::vector<FixItHint> FixIts = std::vector<FixItHint>())
   1627       : Results(Results), InitialLookupCtx(InitialLookupCtx),
   1628         FixIts(std::move(FixIts)) {
   1629     NamingClass = llvm::dyn_cast<CXXRecordDecl>(InitialLookupCtx);
   1630     // If BaseType was not provided explicitly, emulate implicit 'this->'.
   1631     if (BaseType.isNull()) {
   1632       auto ThisType = Results.getSema().getCurrentThisType();
   1633       if (!ThisType.isNull()) {
   1634         assert(ThisType->isPointerType());
   1635         BaseType = ThisType->getPointeeType();
   1636         if (!NamingClass)
   1637           NamingClass = BaseType->getAsCXXRecordDecl();
   1638       }
   1639     }
   1640     this->BaseType = BaseType;
   1641   }
   1642 
   1643   void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx,
   1644                  bool InBaseClass) override {
   1645     ResultBuilder::Result Result(ND, Results.getBasePriority(ND), nullptr,
   1646                                  false, IsAccessible(ND, Ctx), FixIts);
   1647     Results.AddResult(Result, InitialLookupCtx, Hiding, InBaseClass);
   1648   }
   1649 
   1650   void EnteredContext(DeclContext *Ctx) override {
   1651     Results.addVisitedContext(Ctx);
   1652   }
   1653 
   1654 private:
   1655   bool IsAccessible(NamedDecl *ND, DeclContext *Ctx) {
   1656     // Naming class to use for access check. In most cases it was provided
   1657     // explicitly (e.g. member access (lhs.foo) or qualified lookup (X::)),
   1658     // for unqualified lookup we fallback to the \p Ctx in which we found the
   1659     // member.
   1660     auto *NamingClass = this->NamingClass;
   1661     QualType BaseType = this->BaseType;
   1662     if (auto *Cls = llvm::dyn_cast_or_null<CXXRecordDecl>(Ctx)) {
   1663       if (!NamingClass)
   1664         NamingClass = Cls;
   1665       // When we emulate implicit 'this->' in an unqualified lookup, we might
   1666       // end up with an invalid naming class. In that case, we avoid emulating
   1667       // 'this->' qualifier to satisfy preconditions of the access checking.
   1668       if (NamingClass->getCanonicalDecl() != Cls->getCanonicalDecl() &&
   1669           !NamingClass->isDerivedFrom(Cls)) {
   1670         NamingClass = Cls;
   1671         BaseType = QualType();
   1672       }
   1673     } else {
   1674       // The decl was found outside the C++ class, so only ObjC access checks
   1675       // apply. Those do not rely on NamingClass and BaseType, so we clear them
   1676       // out.
   1677       NamingClass = nullptr;
   1678       BaseType = QualType();
   1679     }
   1680     return Results.getSema().IsSimplyAccessible(ND, NamingClass, BaseType);
   1681   }
   1682 };
   1683 } // namespace
   1684 
   1685 /// Add type specifiers for the current language as keyword results.
   1686 static void AddTypeSpecifierResults(const LangOptions &LangOpts,
   1687                                     ResultBuilder &Results) {
   1688   typedef CodeCompletionResult Result;
   1689   Results.AddResult(Result("short", CCP_Type));
   1690   Results.AddResult(Result("long", CCP_Type));
   1691   Results.AddResult(Result("signed", CCP_Type));
   1692   Results.AddResult(Result("unsigned", CCP_Type));
   1693   Results.AddResult(Result("void", CCP_Type));
   1694   Results.AddResult(Result("char", CCP_Type));
   1695   Results.AddResult(Result("int", CCP_Type));
   1696   Results.AddResult(Result("float", CCP_Type));
   1697   Results.AddResult(Result("double", CCP_Type));
   1698   Results.AddResult(Result("enum", CCP_Type));
   1699   Results.AddResult(Result("struct", CCP_Type));
   1700   Results.AddResult(Result("union", CCP_Type));
   1701   Results.AddResult(Result("const", CCP_Type));
   1702   Results.AddResult(Result("volatile", CCP_Type));
   1703 
   1704   if (LangOpts.C99) {
   1705     // C99-specific
   1706     Results.AddResult(Result("_Complex", CCP_Type));
   1707     Results.AddResult(Result("_Imaginary", CCP_Type));
   1708     Results.AddResult(Result("_Bool", CCP_Type));
   1709     Results.AddResult(Result("restrict", CCP_Type));
   1710   }
   1711 
   1712   CodeCompletionBuilder Builder(Results.getAllocator(),
   1713                                 Results.getCodeCompletionTUInfo());
   1714   if (LangOpts.CPlusPlus) {
   1715     // C++-specific
   1716     Results.AddResult(
   1717         Result("bool", CCP_Type + (LangOpts.ObjC ? CCD_bool_in_ObjC : 0)));
   1718     Results.AddResult(Result("class", CCP_Type));
   1719     Results.AddResult(Result("wchar_t", CCP_Type));
   1720 
   1721     // typename name
   1722     Builder.AddTypedTextChunk("typename");
   1723     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   1724     Builder.AddPlaceholderChunk("name");
   1725     Results.AddResult(Result(Builder.TakeString()));
   1726 
   1727     if (LangOpts.CPlusPlus11) {
   1728       Results.AddResult(Result("auto", CCP_Type));
   1729       Results.AddResult(Result("char16_t", CCP_Type));
   1730       Results.AddResult(Result("char32_t", CCP_Type));
   1731 
   1732       Builder.AddTypedTextChunk("decltype");
   1733       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   1734       Builder.AddPlaceholderChunk("expression");
   1735       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   1736       Results.AddResult(Result(Builder.TakeString()));
   1737     }
   1738   } else
   1739     Results.AddResult(Result("__auto_type", CCP_Type));
   1740 
   1741   // GNU keywords
   1742   if (LangOpts.GNUKeywords) {
   1743     // FIXME: Enable when we actually support decimal floating point.
   1744     //    Results.AddResult(Result("_Decimal32"));
   1745     //    Results.AddResult(Result("_Decimal64"));
   1746     //    Results.AddResult(Result("_Decimal128"));
   1747 
   1748     Builder.AddTypedTextChunk("typeof");
   1749     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   1750     Builder.AddPlaceholderChunk("expression");
   1751     Results.AddResult(Result(Builder.TakeString()));
   1752 
   1753     Builder.AddTypedTextChunk("typeof");
   1754     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   1755     Builder.AddPlaceholderChunk("type");
   1756     Builder.AddChunk(CodeCompletionString::CK_RightParen);
   1757     Results.AddResult(Result(Builder.TakeString()));
   1758   }
   1759 
   1760   // Nullability
   1761   Results.AddResult(Result("_Nonnull", CCP_Type));
   1762   Results.AddResult(Result("_Null_unspecified", CCP_Type));
   1763   Results.AddResult(Result("_Nullable", CCP_Type));
   1764 }
   1765 
   1766 static void AddStorageSpecifiers(Sema::ParserCompletionContext CCC,
   1767                                  const LangOptions &LangOpts,
   1768                                  ResultBuilder &Results) {
   1769   typedef CodeCompletionResult Result;
   1770   // Note: we don't suggest either "auto" or "register", because both
   1771   // are pointless as storage specifiers. Elsewhere, we suggest "auto"
   1772   // in C++0x as a type specifier.
   1773   Results.AddResult(Result("extern"));
   1774   Results.AddResult(Result("static"));
   1775 
   1776   if (LangOpts.CPlusPlus11) {
   1777     CodeCompletionAllocator &Allocator = Results.getAllocator();
   1778     CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
   1779 
   1780     // alignas
   1781     Builder.AddTypedTextChunk("alignas");
   1782     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   1783     Builder.AddPlaceholderChunk("expression");
   1784     Builder.AddChunk(CodeCompletionString::CK_RightParen);
   1785     Results.AddResult(Result(Builder.TakeString()));
   1786 
   1787     Results.AddResult(Result("constexpr"));
   1788     Results.AddResult(Result("thread_local"));
   1789   }
   1790 }
   1791 
   1792 static void AddFunctionSpecifiers(Sema::ParserCompletionContext CCC,
   1793                                   const LangOptions &LangOpts,
   1794                                   ResultBuilder &Results) {
   1795   typedef CodeCompletionResult Result;
   1796   switch (CCC) {
   1797   case Sema::PCC_Class:
   1798   case Sema::PCC_MemberTemplate:
   1799     if (LangOpts.CPlusPlus) {
   1800       Results.AddResult(Result("explicit"));
   1801       Results.AddResult(Result("friend"));
   1802       Results.AddResult(Result("mutable"));
   1803       Results.AddResult(Result("virtual"));
   1804     }
   1805     LLVM_FALLTHROUGH;
   1806 
   1807   case Sema::PCC_ObjCInterface:
   1808   case Sema::PCC_ObjCImplementation:
   1809   case Sema::PCC_Namespace:
   1810   case Sema::PCC_Template:
   1811     if (LangOpts.CPlusPlus || LangOpts.C99)
   1812       Results.AddResult(Result("inline"));
   1813     break;
   1814 
   1815   case Sema::PCC_ObjCInstanceVariableList:
   1816   case Sema::PCC_Expression:
   1817   case Sema::PCC_Statement:
   1818   case Sema::PCC_ForInit:
   1819   case Sema::PCC_Condition:
   1820   case Sema::PCC_RecoveryInFunction:
   1821   case Sema::PCC_Type:
   1822   case Sema::PCC_ParenthesizedExpression:
   1823   case Sema::PCC_LocalDeclarationSpecifiers:
   1824     break;
   1825   }
   1826 }
   1827 
   1828 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt);
   1829 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt);
   1830 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
   1831                                      ResultBuilder &Results, bool NeedAt);
   1832 static void AddObjCImplementationResults(const LangOptions &LangOpts,
   1833                                          ResultBuilder &Results, bool NeedAt);
   1834 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
   1835                                     ResultBuilder &Results, bool NeedAt);
   1836 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt);
   1837 
   1838 static void AddTypedefResult(ResultBuilder &Results) {
   1839   CodeCompletionBuilder Builder(Results.getAllocator(),
   1840                                 Results.getCodeCompletionTUInfo());
   1841   Builder.AddTypedTextChunk("typedef");
   1842   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   1843   Builder.AddPlaceholderChunk("type");
   1844   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   1845   Builder.AddPlaceholderChunk("name");
   1846   Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   1847   Results.AddResult(CodeCompletionResult(Builder.TakeString()));
   1848 }
   1849 
   1850 // using name = type
   1851 static void AddUsingAliasResult(CodeCompletionBuilder &Builder,
   1852                                 ResultBuilder &Results) {
   1853   Builder.AddTypedTextChunk("using");
   1854   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   1855   Builder.AddPlaceholderChunk("name");
   1856   Builder.AddChunk(CodeCompletionString::CK_Equal);
   1857   Builder.AddPlaceholderChunk("type");
   1858   Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   1859   Results.AddResult(CodeCompletionResult(Builder.TakeString()));
   1860 }
   1861 
   1862 static bool WantTypesInContext(Sema::ParserCompletionContext CCC,
   1863                                const LangOptions &LangOpts) {
   1864   switch (CCC) {
   1865   case Sema::PCC_Namespace:
   1866   case Sema::PCC_Class:
   1867   case Sema::PCC_ObjCInstanceVariableList:
   1868   case Sema::PCC_Template:
   1869   case Sema::PCC_MemberTemplate:
   1870   case Sema::PCC_Statement:
   1871   case Sema::PCC_RecoveryInFunction:
   1872   case Sema::PCC_Type:
   1873   case Sema::PCC_ParenthesizedExpression:
   1874   case Sema::PCC_LocalDeclarationSpecifiers:
   1875     return true;
   1876 
   1877   case Sema::PCC_Expression:
   1878   case Sema::PCC_Condition:
   1879     return LangOpts.CPlusPlus;
   1880 
   1881   case Sema::PCC_ObjCInterface:
   1882   case Sema::PCC_ObjCImplementation:
   1883     return false;
   1884 
   1885   case Sema::PCC_ForInit:
   1886     return LangOpts.CPlusPlus || LangOpts.ObjC || LangOpts.C99;
   1887   }
   1888 
   1889   llvm_unreachable("Invalid ParserCompletionContext!");
   1890 }
   1891 
   1892 static PrintingPolicy getCompletionPrintingPolicy(const ASTContext &Context,
   1893                                                   const Preprocessor &PP) {
   1894   PrintingPolicy Policy = Sema::getPrintingPolicy(Context, PP);
   1895   Policy.AnonymousTagLocations = false;
   1896   Policy.SuppressStrongLifetime = true;
   1897   Policy.SuppressUnwrittenScope = true;
   1898   Policy.SuppressScope = true;
   1899   return Policy;
   1900 }
   1901 
   1902 /// Retrieve a printing policy suitable for code completion.
   1903 static PrintingPolicy getCompletionPrintingPolicy(Sema &S) {
   1904   return getCompletionPrintingPolicy(S.Context, S.PP);
   1905 }
   1906 
   1907 /// Retrieve the string representation of the given type as a string
   1908 /// that has the appropriate lifetime for code completion.
   1909 ///
   1910 /// This routine provides a fast path where we provide constant strings for
   1911 /// common type names.
   1912 static const char *GetCompletionTypeString(QualType T, ASTContext &Context,
   1913                                            const PrintingPolicy &Policy,
   1914                                            CodeCompletionAllocator &Allocator) {
   1915   if (!T.getLocalQualifiers()) {
   1916     // Built-in type names are constant strings.
   1917     if (const BuiltinType *BT = dyn_cast<BuiltinType>(T))
   1918       return BT->getNameAsCString(Policy);
   1919 
   1920     // Anonymous tag types are constant strings.
   1921     if (const TagType *TagT = dyn_cast<TagType>(T))
   1922       if (TagDecl *Tag = TagT->getDecl())
   1923         if (!Tag->hasNameForLinkage()) {
   1924           switch (Tag->getTagKind()) {
   1925           case TTK_Struct:
   1926             return "struct <anonymous>";
   1927           case TTK_Interface:
   1928             return "__interface <anonymous>";
   1929           case TTK_Class:
   1930             return "class <anonymous>";
   1931           case TTK_Union:
   1932             return "union <anonymous>";
   1933           case TTK_Enum:
   1934             return "enum <anonymous>";
   1935           }
   1936         }
   1937   }
   1938 
   1939   // Slow path: format the type as a string.
   1940   std::string Result;
   1941   T.getAsStringInternal(Result, Policy);
   1942   return Allocator.CopyString(Result);
   1943 }
   1944 
   1945 /// Add a completion for "this", if we're in a member function.
   1946 static void addThisCompletion(Sema &S, ResultBuilder &Results) {
   1947   QualType ThisTy = S.getCurrentThisType();
   1948   if (ThisTy.isNull())
   1949     return;
   1950 
   1951   CodeCompletionAllocator &Allocator = Results.getAllocator();
   1952   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
   1953   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
   1954   Builder.AddResultTypeChunk(
   1955       GetCompletionTypeString(ThisTy, S.Context, Policy, Allocator));
   1956   Builder.AddTypedTextChunk("this");
   1957   Results.AddResult(CodeCompletionResult(Builder.TakeString()));
   1958 }
   1959 
   1960 static void AddStaticAssertResult(CodeCompletionBuilder &Builder,
   1961                                   ResultBuilder &Results,
   1962                                   const LangOptions &LangOpts) {
   1963   if (!LangOpts.CPlusPlus11)
   1964     return;
   1965 
   1966   Builder.AddTypedTextChunk("static_assert");
   1967   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   1968   Builder.AddPlaceholderChunk("expression");
   1969   Builder.AddChunk(CodeCompletionString::CK_Comma);
   1970   Builder.AddPlaceholderChunk("message");
   1971   Builder.AddChunk(CodeCompletionString::CK_RightParen);
   1972   Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   1973   Results.AddResult(CodeCompletionResult(Builder.TakeString()));
   1974 }
   1975 
   1976 static void AddOverrideResults(ResultBuilder &Results,
   1977                                const CodeCompletionContext &CCContext,
   1978                                CodeCompletionBuilder &Builder) {
   1979   Sema &S = Results.getSema();
   1980   const auto *CR = llvm::dyn_cast<CXXRecordDecl>(S.CurContext);
   1981   // If not inside a class/struct/union return empty.
   1982   if (!CR)
   1983     return;
   1984   // First store overrides within current class.
   1985   // These are stored by name to make querying fast in the later step.
   1986   llvm::StringMap<std::vector<FunctionDecl *>> Overrides;
   1987   for (auto *Method : CR->methods()) {
   1988     if (!Method->isVirtual() || !Method->getIdentifier())
   1989       continue;
   1990     Overrides[Method->getName()].push_back(Method);
   1991   }
   1992 
   1993   for (const auto &Base : CR->bases()) {
   1994     const auto *BR = Base.getType().getTypePtr()->getAsCXXRecordDecl();
   1995     if (!BR)
   1996       continue;
   1997     for (auto *Method : BR->methods()) {
   1998       if (!Method->isVirtual() || !Method->getIdentifier())
   1999         continue;
   2000       const auto it = Overrides.find(Method->getName());
   2001       bool IsOverriden = false;
   2002       if (it != Overrides.end()) {
   2003         for (auto *MD : it->second) {
   2004           // If the method in current body is not an overload of this virtual
   2005           // function, then it overrides this one.
   2006           if (!S.IsOverload(MD, Method, false)) {
   2007             IsOverriden = true;
   2008             break;
   2009           }
   2010         }
   2011       }
   2012       if (!IsOverriden) {
   2013         // Generates a new CodeCompletionResult by taking this function and
   2014         // converting it into an override declaration with only one chunk in the
   2015         // final CodeCompletionString as a TypedTextChunk.
   2016         std::string OverrideSignature;
   2017         llvm::raw_string_ostream OS(OverrideSignature);
   2018         CodeCompletionResult CCR(Method, 0);
   2019         PrintingPolicy Policy =
   2020             getCompletionPrintingPolicy(S.getASTContext(), S.getPreprocessor());
   2021         auto *CCS = CCR.createCodeCompletionStringForOverride(
   2022             S.getPreprocessor(), S.getASTContext(), Builder,
   2023             /*IncludeBriefComments=*/false, CCContext, Policy);
   2024         Results.AddResult(CodeCompletionResult(CCS, Method, CCP_CodePattern));
   2025       }
   2026     }
   2027   }
   2028 }
   2029 
   2030 /// Add language constructs that show up for "ordinary" names.
   2031 static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC, Scope *S,
   2032                                    Sema &SemaRef, ResultBuilder &Results) {
   2033   CodeCompletionAllocator &Allocator = Results.getAllocator();
   2034   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
   2035 
   2036   typedef CodeCompletionResult Result;
   2037   switch (CCC) {
   2038   case Sema::PCC_Namespace:
   2039     if (SemaRef.getLangOpts().CPlusPlus) {
   2040       if (Results.includeCodePatterns()) {
   2041         // namespace <identifier> { declarations }
   2042         Builder.AddTypedTextChunk("namespace");
   2043         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2044         Builder.AddPlaceholderChunk("identifier");
   2045         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2046         Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   2047         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2048         Builder.AddPlaceholderChunk("declarations");
   2049         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2050         Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   2051         Results.AddResult(Result(Builder.TakeString()));
   2052       }
   2053 
   2054       // namespace identifier = identifier ;
   2055       Builder.AddTypedTextChunk("namespace");
   2056       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2057       Builder.AddPlaceholderChunk("name");
   2058       Builder.AddChunk(CodeCompletionString::CK_Equal);
   2059       Builder.AddPlaceholderChunk("namespace");
   2060       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2061       Results.AddResult(Result(Builder.TakeString()));
   2062 
   2063       // Using directives
   2064       Builder.AddTypedTextChunk("using namespace");
   2065       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2066       Builder.AddPlaceholderChunk("identifier");
   2067       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2068       Results.AddResult(Result(Builder.TakeString()));
   2069 
   2070       // asm(string-literal)
   2071       Builder.AddTypedTextChunk("asm");
   2072       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2073       Builder.AddPlaceholderChunk("string-literal");
   2074       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2075       Results.AddResult(Result(Builder.TakeString()));
   2076 
   2077       if (Results.includeCodePatterns()) {
   2078         // Explicit template instantiation
   2079         Builder.AddTypedTextChunk("template");
   2080         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2081         Builder.AddPlaceholderChunk("declaration");
   2082         Results.AddResult(Result(Builder.TakeString()));
   2083       } else {
   2084         Results.AddResult(Result("template", CodeCompletionResult::RK_Keyword));
   2085       }
   2086     }
   2087 
   2088     if (SemaRef.getLangOpts().ObjC)
   2089       AddObjCTopLevelResults(Results, true);
   2090 
   2091     AddTypedefResult(Results);
   2092     LLVM_FALLTHROUGH;
   2093 
   2094   case Sema::PCC_Class:
   2095     if (SemaRef.getLangOpts().CPlusPlus) {
   2096       // Using declaration
   2097       Builder.AddTypedTextChunk("using");
   2098       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2099       Builder.AddPlaceholderChunk("qualifier");
   2100       Builder.AddTextChunk("::");
   2101       Builder.AddPlaceholderChunk("name");
   2102       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2103       Results.AddResult(Result(Builder.TakeString()));
   2104 
   2105       if (SemaRef.getLangOpts().CPlusPlus11)
   2106         AddUsingAliasResult(Builder, Results);
   2107 
   2108       // using typename qualifier::name (only in a dependent context)
   2109       if (SemaRef.CurContext->isDependentContext()) {
   2110         Builder.AddTypedTextChunk("using typename");
   2111         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2112         Builder.AddPlaceholderChunk("qualifier");
   2113         Builder.AddTextChunk("::");
   2114         Builder.AddPlaceholderChunk("name");
   2115         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2116         Results.AddResult(Result(Builder.TakeString()));
   2117       }
   2118 
   2119       AddStaticAssertResult(Builder, Results, SemaRef.getLangOpts());
   2120 
   2121       if (CCC == Sema::PCC_Class) {
   2122         AddTypedefResult(Results);
   2123 
   2124         bool IsNotInheritanceScope =
   2125             !(S->getFlags() & Scope::ClassInheritanceScope);
   2126         // public:
   2127         Builder.AddTypedTextChunk("public");
   2128         if (IsNotInheritanceScope && Results.includeCodePatterns())
   2129           Builder.AddChunk(CodeCompletionString::CK_Colon);
   2130         Results.AddResult(Result(Builder.TakeString()));
   2131 
   2132         // protected:
   2133         Builder.AddTypedTextChunk("protected");
   2134         if (IsNotInheritanceScope && Results.includeCodePatterns())
   2135           Builder.AddChunk(CodeCompletionString::CK_Colon);
   2136         Results.AddResult(Result(Builder.TakeString()));
   2137 
   2138         // private:
   2139         Builder.AddTypedTextChunk("private");
   2140         if (IsNotInheritanceScope && Results.includeCodePatterns())
   2141           Builder.AddChunk(CodeCompletionString::CK_Colon);
   2142         Results.AddResult(Result(Builder.TakeString()));
   2143 
   2144         // FIXME: This adds override results only if we are at the first word of
   2145         // the declaration/definition. Also call this from other sides to have
   2146         // more use-cases.
   2147         AddOverrideResults(Results, CodeCompletionContext::CCC_ClassStructUnion,
   2148                            Builder);
   2149       }
   2150     }
   2151     LLVM_FALLTHROUGH;
   2152 
   2153   case Sema::PCC_Template:
   2154   case Sema::PCC_MemberTemplate:
   2155     if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns()) {
   2156       // template < parameters >
   2157       Builder.AddTypedTextChunk("template");
   2158       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
   2159       Builder.AddPlaceholderChunk("parameters");
   2160       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
   2161       Results.AddResult(Result(Builder.TakeString()));
   2162     } else {
   2163       Results.AddResult(Result("template", CodeCompletionResult::RK_Keyword));
   2164     }
   2165 
   2166     AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
   2167     AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results);
   2168     break;
   2169 
   2170   case Sema::PCC_ObjCInterface:
   2171     AddObjCInterfaceResults(SemaRef.getLangOpts(), Results, true);
   2172     AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
   2173     AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results);
   2174     break;
   2175 
   2176   case Sema::PCC_ObjCImplementation:
   2177     AddObjCImplementationResults(SemaRef.getLangOpts(), Results, true);
   2178     AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
   2179     AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results);
   2180     break;
   2181 
   2182   case Sema::PCC_ObjCInstanceVariableList:
   2183     AddObjCVisibilityResults(SemaRef.getLangOpts(), Results, true);
   2184     break;
   2185 
   2186   case Sema::PCC_RecoveryInFunction:
   2187   case Sema::PCC_Statement: {
   2188     if (SemaRef.getLangOpts().CPlusPlus11)
   2189       AddUsingAliasResult(Builder, Results);
   2190 
   2191     AddTypedefResult(Results);
   2192 
   2193     if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns() &&
   2194         SemaRef.getLangOpts().CXXExceptions) {
   2195       Builder.AddTypedTextChunk("try");
   2196       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2197       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   2198       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2199       Builder.AddPlaceholderChunk("statements");
   2200       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2201       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   2202       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2203       Builder.AddTextChunk("catch");
   2204       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2205       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2206       Builder.AddPlaceholderChunk("declaration");
   2207       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2208       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2209       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   2210       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2211       Builder.AddPlaceholderChunk("statements");
   2212       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2213       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   2214       Results.AddResult(Result(Builder.TakeString()));
   2215     }
   2216     if (SemaRef.getLangOpts().ObjC)
   2217       AddObjCStatementResults(Results, true);
   2218 
   2219     if (Results.includeCodePatterns()) {
   2220       // if (condition) { statements }
   2221       Builder.AddTypedTextChunk("if");
   2222       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2223       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2224       if (SemaRef.getLangOpts().CPlusPlus)
   2225         Builder.AddPlaceholderChunk("condition");
   2226       else
   2227         Builder.AddPlaceholderChunk("expression");
   2228       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2229       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2230       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   2231       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2232       Builder.AddPlaceholderChunk("statements");
   2233       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2234       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   2235       Results.AddResult(Result(Builder.TakeString()));
   2236 
   2237       // switch (condition) { }
   2238       Builder.AddTypedTextChunk("switch");
   2239       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2240       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2241       if (SemaRef.getLangOpts().CPlusPlus)
   2242         Builder.AddPlaceholderChunk("condition");
   2243       else
   2244         Builder.AddPlaceholderChunk("expression");
   2245       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2246       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2247       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   2248       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2249       Builder.AddPlaceholderChunk("cases");
   2250       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2251       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   2252       Results.AddResult(Result(Builder.TakeString()));
   2253     }
   2254 
   2255     // Switch-specific statements.
   2256     if (SemaRef.getCurFunction() &&
   2257         !SemaRef.getCurFunction()->SwitchStack.empty()) {
   2258       // case expression:
   2259       Builder.AddTypedTextChunk("case");
   2260       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2261       Builder.AddPlaceholderChunk("expression");
   2262       Builder.AddChunk(CodeCompletionString::CK_Colon);
   2263       Results.AddResult(Result(Builder.TakeString()));
   2264 
   2265       // default:
   2266       Builder.AddTypedTextChunk("default");
   2267       Builder.AddChunk(CodeCompletionString::CK_Colon);
   2268       Results.AddResult(Result(Builder.TakeString()));
   2269     }
   2270 
   2271     if (Results.includeCodePatterns()) {
   2272       /// while (condition) { statements }
   2273       Builder.AddTypedTextChunk("while");
   2274       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2275       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2276       if (SemaRef.getLangOpts().CPlusPlus)
   2277         Builder.AddPlaceholderChunk("condition");
   2278       else
   2279         Builder.AddPlaceholderChunk("expression");
   2280       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2281       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2282       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   2283       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2284       Builder.AddPlaceholderChunk("statements");
   2285       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2286       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   2287       Results.AddResult(Result(Builder.TakeString()));
   2288 
   2289       // do { statements } while ( expression );
   2290       Builder.AddTypedTextChunk("do");
   2291       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2292       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   2293       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2294       Builder.AddPlaceholderChunk("statements");
   2295       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2296       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   2297       Builder.AddTextChunk("while");
   2298       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2299       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2300       Builder.AddPlaceholderChunk("expression");
   2301       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2302       Results.AddResult(Result(Builder.TakeString()));
   2303 
   2304       // for ( for-init-statement ; condition ; expression ) { statements }
   2305       Builder.AddTypedTextChunk("for");
   2306       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2307       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2308       if (SemaRef.getLangOpts().CPlusPlus || SemaRef.getLangOpts().C99)
   2309         Builder.AddPlaceholderChunk("init-statement");
   2310       else
   2311         Builder.AddPlaceholderChunk("init-expression");
   2312       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2313       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2314       Builder.AddPlaceholderChunk("condition");
   2315       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2316       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2317       Builder.AddPlaceholderChunk("inc-expression");
   2318       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2319       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2320       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   2321       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2322       Builder.AddPlaceholderChunk("statements");
   2323       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2324       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   2325       Results.AddResult(Result(Builder.TakeString()));
   2326 
   2327       if (SemaRef.getLangOpts().CPlusPlus11 || SemaRef.getLangOpts().ObjC) {
   2328         // for ( range_declaration (:|in) range_expression ) { statements }
   2329         Builder.AddTypedTextChunk("for");
   2330         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2331         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2332         Builder.AddPlaceholderChunk("range-declaration");
   2333         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2334         if (SemaRef.getLangOpts().ObjC)
   2335           Builder.AddTextChunk("in");
   2336         else
   2337           Builder.AddChunk(CodeCompletionString::CK_Colon);
   2338         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2339         Builder.AddPlaceholderChunk("range-expression");
   2340         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2341         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2342         Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   2343         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2344         Builder.AddPlaceholderChunk("statements");
   2345         Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   2346         Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   2347         Results.AddResult(Result(Builder.TakeString()));
   2348       }
   2349     }
   2350 
   2351     if (S->getContinueParent()) {
   2352       // continue ;
   2353       Builder.AddTypedTextChunk("continue");
   2354       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2355       Results.AddResult(Result(Builder.TakeString()));
   2356     }
   2357 
   2358     if (S->getBreakParent()) {
   2359       // break ;
   2360       Builder.AddTypedTextChunk("break");
   2361       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2362       Results.AddResult(Result(Builder.TakeString()));
   2363     }
   2364 
   2365     // "return expression ;" or "return ;", depending on the return type.
   2366     QualType ReturnType;
   2367     if (const auto *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext))
   2368       ReturnType = Function->getReturnType();
   2369     else if (const auto *Method = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext))
   2370       ReturnType = Method->getReturnType();
   2371     else if (SemaRef.getCurBlock() &&
   2372              !SemaRef.getCurBlock()->ReturnType.isNull())
   2373       ReturnType = SemaRef.getCurBlock()->ReturnType;;
   2374     if (ReturnType.isNull() || ReturnType->isVoidType()) {
   2375       Builder.AddTypedTextChunk("return");
   2376       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2377       Results.AddResult(Result(Builder.TakeString()));
   2378     } else {
   2379       assert(!ReturnType.isNull());
   2380       // "return expression ;"
   2381       Builder.AddTypedTextChunk("return");
   2382       Builder.AddChunk(clang::CodeCompletionString::CK_HorizontalSpace);
   2383       Builder.AddPlaceholderChunk("expression");
   2384       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2385       Results.AddResult(Result(Builder.TakeString()));
   2386       // When boolean, also add 'return true;' and 'return false;'.
   2387       if (ReturnType->isBooleanType()) {
   2388         Builder.AddTypedTextChunk("return true");
   2389         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2390         Results.AddResult(Result(Builder.TakeString()));
   2391 
   2392         Builder.AddTypedTextChunk("return false");
   2393         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2394         Results.AddResult(Result(Builder.TakeString()));
   2395       }
   2396       // For pointers, suggest 'return nullptr' in C++.
   2397       if (SemaRef.getLangOpts().CPlusPlus11 &&
   2398           (ReturnType->isPointerType() || ReturnType->isMemberPointerType())) {
   2399         Builder.AddTypedTextChunk("return nullptr");
   2400         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2401         Results.AddResult(Result(Builder.TakeString()));
   2402       }
   2403     }
   2404 
   2405     // goto identifier ;
   2406     Builder.AddTypedTextChunk("goto");
   2407     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2408     Builder.AddPlaceholderChunk("label");
   2409     Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2410     Results.AddResult(Result(Builder.TakeString()));
   2411 
   2412     // Using directives
   2413     Builder.AddTypedTextChunk("using namespace");
   2414     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2415     Builder.AddPlaceholderChunk("identifier");
   2416     Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   2417     Results.AddResult(Result(Builder.TakeString()));
   2418 
   2419     AddStaticAssertResult(Builder, Results, SemaRef.getLangOpts());
   2420   }
   2421     LLVM_FALLTHROUGH;
   2422 
   2423   // Fall through (for statement expressions).
   2424   case Sema::PCC_ForInit:
   2425   case Sema::PCC_Condition:
   2426     AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
   2427     // Fall through: conditions and statements can have expressions.
   2428     LLVM_FALLTHROUGH;
   2429 
   2430   case Sema::PCC_ParenthesizedExpression:
   2431     if (SemaRef.getLangOpts().ObjCAutoRefCount &&
   2432         CCC == Sema::PCC_ParenthesizedExpression) {
   2433       // (__bridge <type>)<expression>
   2434       Builder.AddTypedTextChunk("__bridge");
   2435       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2436       Builder.AddPlaceholderChunk("type");
   2437       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2438       Builder.AddPlaceholderChunk("expression");
   2439       Results.AddResult(Result(Builder.TakeString()));
   2440 
   2441       // (__bridge_transfer <Objective-C type>)<expression>
   2442       Builder.AddTypedTextChunk("__bridge_transfer");
   2443       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2444       Builder.AddPlaceholderChunk("Objective-C type");
   2445       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2446       Builder.AddPlaceholderChunk("expression");
   2447       Results.AddResult(Result(Builder.TakeString()));
   2448 
   2449       // (__bridge_retained <CF type>)<expression>
   2450       Builder.AddTypedTextChunk("__bridge_retained");
   2451       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2452       Builder.AddPlaceholderChunk("CF type");
   2453       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2454       Builder.AddPlaceholderChunk("expression");
   2455       Results.AddResult(Result(Builder.TakeString()));
   2456     }
   2457     // Fall through
   2458     LLVM_FALLTHROUGH;
   2459 
   2460   case Sema::PCC_Expression: {
   2461     if (SemaRef.getLangOpts().CPlusPlus) {
   2462       // 'this', if we're in a non-static member function.
   2463       addThisCompletion(SemaRef, Results);
   2464 
   2465       // true
   2466       Builder.AddResultTypeChunk("bool");
   2467       Builder.AddTypedTextChunk("true");
   2468       Results.AddResult(Result(Builder.TakeString()));
   2469 
   2470       // false
   2471       Builder.AddResultTypeChunk("bool");
   2472       Builder.AddTypedTextChunk("false");
   2473       Results.AddResult(Result(Builder.TakeString()));
   2474 
   2475       if (SemaRef.getLangOpts().RTTI) {
   2476         // dynamic_cast < type-id > ( expression )
   2477         Builder.AddTypedTextChunk("dynamic_cast");
   2478         Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
   2479         Builder.AddPlaceholderChunk("type");
   2480         Builder.AddChunk(CodeCompletionString::CK_RightAngle);
   2481         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2482         Builder.AddPlaceholderChunk("expression");
   2483         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2484         Results.AddResult(Result(Builder.TakeString()));
   2485       }
   2486 
   2487       // static_cast < type-id > ( expression )
   2488       Builder.AddTypedTextChunk("static_cast");
   2489       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
   2490       Builder.AddPlaceholderChunk("type");
   2491       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
   2492       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2493       Builder.AddPlaceholderChunk("expression");
   2494       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2495       Results.AddResult(Result(Builder.TakeString()));
   2496 
   2497       // reinterpret_cast < type-id > ( expression )
   2498       Builder.AddTypedTextChunk("reinterpret_cast");
   2499       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
   2500       Builder.AddPlaceholderChunk("type");
   2501       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
   2502       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2503       Builder.AddPlaceholderChunk("expression");
   2504       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2505       Results.AddResult(Result(Builder.TakeString()));
   2506 
   2507       // const_cast < type-id > ( expression )
   2508       Builder.AddTypedTextChunk("const_cast");
   2509       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
   2510       Builder.AddPlaceholderChunk("type");
   2511       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
   2512       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2513       Builder.AddPlaceholderChunk("expression");
   2514       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2515       Results.AddResult(Result(Builder.TakeString()));
   2516 
   2517       if (SemaRef.getLangOpts().RTTI) {
   2518         // typeid ( expression-or-type )
   2519         Builder.AddResultTypeChunk("std::type_info");
   2520         Builder.AddTypedTextChunk("typeid");
   2521         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2522         Builder.AddPlaceholderChunk("expression-or-type");
   2523         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2524         Results.AddResult(Result(Builder.TakeString()));
   2525       }
   2526 
   2527       // new T ( ... )
   2528       Builder.AddTypedTextChunk("new");
   2529       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2530       Builder.AddPlaceholderChunk("type");
   2531       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2532       Builder.AddPlaceholderChunk("expressions");
   2533       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2534       Results.AddResult(Result(Builder.TakeString()));
   2535 
   2536       // new T [ ] ( ... )
   2537       Builder.AddTypedTextChunk("new");
   2538       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2539       Builder.AddPlaceholderChunk("type");
   2540       Builder.AddChunk(CodeCompletionString::CK_LeftBracket);
   2541       Builder.AddPlaceholderChunk("size");
   2542       Builder.AddChunk(CodeCompletionString::CK_RightBracket);
   2543       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2544       Builder.AddPlaceholderChunk("expressions");
   2545       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2546       Results.AddResult(Result(Builder.TakeString()));
   2547 
   2548       // delete expression
   2549       Builder.AddResultTypeChunk("void");
   2550       Builder.AddTypedTextChunk("delete");
   2551       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2552       Builder.AddPlaceholderChunk("expression");
   2553       Results.AddResult(Result(Builder.TakeString()));
   2554 
   2555       // delete [] expression
   2556       Builder.AddResultTypeChunk("void");
   2557       Builder.AddTypedTextChunk("delete");
   2558       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2559       Builder.AddChunk(CodeCompletionString::CK_LeftBracket);
   2560       Builder.AddChunk(CodeCompletionString::CK_RightBracket);
   2561       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2562       Builder.AddPlaceholderChunk("expression");
   2563       Results.AddResult(Result(Builder.TakeString()));
   2564 
   2565       if (SemaRef.getLangOpts().CXXExceptions) {
   2566         // throw expression
   2567         Builder.AddResultTypeChunk("void");
   2568         Builder.AddTypedTextChunk("throw");
   2569         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   2570         Builder.AddPlaceholderChunk("expression");
   2571         Results.AddResult(Result(Builder.TakeString()));
   2572       }
   2573 
   2574       // FIXME: Rethrow?
   2575 
   2576       if (SemaRef.getLangOpts().CPlusPlus11) {
   2577         // nullptr
   2578         Builder.AddResultTypeChunk("std::nullptr_t");
   2579         Builder.AddTypedTextChunk("nullptr");
   2580         Results.AddResult(Result(Builder.TakeString()));
   2581 
   2582         // alignof
   2583         Builder.AddResultTypeChunk("size_t");
   2584         Builder.AddTypedTextChunk("alignof");
   2585         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2586         Builder.AddPlaceholderChunk("type");
   2587         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2588         Results.AddResult(Result(Builder.TakeString()));
   2589 
   2590         // noexcept
   2591         Builder.AddResultTypeChunk("bool");
   2592         Builder.AddTypedTextChunk("noexcept");
   2593         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2594         Builder.AddPlaceholderChunk("expression");
   2595         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2596         Results.AddResult(Result(Builder.TakeString()));
   2597 
   2598         // sizeof... expression
   2599         Builder.AddResultTypeChunk("size_t");
   2600         Builder.AddTypedTextChunk("sizeof...");
   2601         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2602         Builder.AddPlaceholderChunk("parameter-pack");
   2603         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2604         Results.AddResult(Result(Builder.TakeString()));
   2605       }
   2606     }
   2607 
   2608     if (SemaRef.getLangOpts().ObjC) {
   2609       // Add "super", if we're in an Objective-C class with a superclass.
   2610       if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) {
   2611         // The interface can be NULL.
   2612         if (ObjCInterfaceDecl *ID = Method->getClassInterface())
   2613           if (ID->getSuperClass()) {
   2614             std::string SuperType;
   2615             SuperType = ID->getSuperClass()->getNameAsString();
   2616             if (Method->isInstanceMethod())
   2617               SuperType += " *";
   2618 
   2619             Builder.AddResultTypeChunk(Allocator.CopyString(SuperType));
   2620             Builder.AddTypedTextChunk("super");
   2621             Results.AddResult(Result(Builder.TakeString()));
   2622           }
   2623       }
   2624 
   2625       AddObjCExpressionResults(Results, true);
   2626     }
   2627 
   2628     if (SemaRef.getLangOpts().C11) {
   2629       // _Alignof
   2630       Builder.AddResultTypeChunk("size_t");
   2631       if (SemaRef.PP.isMacroDefined("alignof"))
   2632         Builder.AddTypedTextChunk("alignof");
   2633       else
   2634         Builder.AddTypedTextChunk("_Alignof");
   2635       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2636       Builder.AddPlaceholderChunk("type");
   2637       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2638       Results.AddResult(Result(Builder.TakeString()));
   2639     }
   2640 
   2641     // sizeof expression
   2642     Builder.AddResultTypeChunk("size_t");
   2643     Builder.AddTypedTextChunk("sizeof");
   2644     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   2645     Builder.AddPlaceholderChunk("expression-or-type");
   2646     Builder.AddChunk(CodeCompletionString::CK_RightParen);
   2647     Results.AddResult(Result(Builder.TakeString()));
   2648     break;
   2649   }
   2650 
   2651   case Sema::PCC_Type:
   2652   case Sema::PCC_LocalDeclarationSpecifiers:
   2653     break;
   2654   }
   2655 
   2656   if (WantTypesInContext(CCC, SemaRef.getLangOpts()))
   2657     AddTypeSpecifierResults(SemaRef.getLangOpts(), Results);
   2658 
   2659   if (SemaRef.getLangOpts().CPlusPlus && CCC != Sema::PCC_Type)
   2660     Results.AddResult(Result("operator"));
   2661 }
   2662 
   2663 /// If the given declaration has an associated type, add it as a result
   2664 /// type chunk.
   2665 static void AddResultTypeChunk(ASTContext &Context,
   2666                                const PrintingPolicy &Policy,
   2667                                const NamedDecl *ND, QualType BaseType,
   2668                                CodeCompletionBuilder &Result) {
   2669   if (!ND)
   2670     return;
   2671 
   2672   // Skip constructors and conversion functions, which have their return types
   2673   // built into their names.
   2674   if (isConstructor(ND) || isa<CXXConversionDecl>(ND))
   2675     return;
   2676 
   2677   // Determine the type of the declaration (if it has a type).
   2678   QualType T;
   2679   if (const FunctionDecl *Function = ND->getAsFunction())
   2680     T = Function->getReturnType();
   2681   else if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) {
   2682     if (!BaseType.isNull())
   2683       T = Method->getSendResultType(BaseType);
   2684     else
   2685       T = Method->getReturnType();
   2686   } else if (const auto *Enumerator = dyn_cast<EnumConstantDecl>(ND)) {
   2687     T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext()));
   2688     T = clang::TypeName::getFullyQualifiedType(T, Context);
   2689   } else if (isa<UnresolvedUsingValueDecl>(ND)) {
   2690     /* Do nothing: ignore unresolved using declarations*/
   2691   } else if (const auto *Ivar = dyn_cast<ObjCIvarDecl>(ND)) {
   2692     if (!BaseType.isNull())
   2693       T = Ivar->getUsageType(BaseType);
   2694     else
   2695       T = Ivar->getType();
   2696   } else if (const auto *Value = dyn_cast<ValueDecl>(ND)) {
   2697     T = Value->getType();
   2698   } else if (const auto *Property = dyn_cast<ObjCPropertyDecl>(ND)) {
   2699     if (!BaseType.isNull())
   2700       T = Property->getUsageType(BaseType);
   2701     else
   2702       T = Property->getType();
   2703   }
   2704 
   2705   if (T.isNull() || Context.hasSameType(T, Context.DependentTy))
   2706     return;
   2707 
   2708   Result.AddResultTypeChunk(
   2709       GetCompletionTypeString(T, Context, Policy, Result.getAllocator()));
   2710 }
   2711 
   2712 static void MaybeAddSentinel(Preprocessor &PP,
   2713                              const NamedDecl *FunctionOrMethod,
   2714                              CodeCompletionBuilder &Result) {
   2715   if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>())
   2716     if (Sentinel->getSentinel() == 0) {
   2717       if (PP.getLangOpts().ObjC && PP.isMacroDefined("nil"))
   2718         Result.AddTextChunk(", nil");
   2719       else if (PP.isMacroDefined("NULL"))
   2720         Result.AddTextChunk(", NULL");
   2721       else
   2722         Result.AddTextChunk(", (void*)0");
   2723     }
   2724 }
   2725 
   2726 static std::string formatObjCParamQualifiers(unsigned ObjCQuals,
   2727                                              QualType &Type) {
   2728   std::string Result;
   2729   if (ObjCQuals & Decl::OBJC_TQ_In)
   2730     Result += "in ";
   2731   else if (ObjCQuals & Decl::OBJC_TQ_Inout)
   2732     Result += "inout ";
   2733   else if (ObjCQuals & Decl::OBJC_TQ_Out)
   2734     Result += "out ";
   2735   if (ObjCQuals & Decl::OBJC_TQ_Bycopy)
   2736     Result += "bycopy ";
   2737   else if (ObjCQuals & Decl::OBJC_TQ_Byref)
   2738     Result += "byref ";
   2739   if (ObjCQuals & Decl::OBJC_TQ_Oneway)
   2740     Result += "oneway ";
   2741   if (ObjCQuals & Decl::OBJC_TQ_CSNullability) {
   2742     if (auto nullability = AttributedType::stripOuterNullability(Type)) {
   2743       switch (*nullability) {
   2744       case NullabilityKind::NonNull:
   2745         Result += "nonnull ";
   2746         break;
   2747 
   2748       case NullabilityKind::Nullable:
   2749         Result += "nullable ";
   2750         break;
   2751 
   2752       case NullabilityKind::Unspecified:
   2753         Result += "null_unspecified ";
   2754         break;
   2755 
   2756       case NullabilityKind::NullableResult:
   2757         llvm_unreachable("Not supported as a context-sensitive keyword!");
   2758         break;
   2759       }
   2760     }
   2761   }
   2762   return Result;
   2763 }
   2764 
   2765 /// Tries to find the most appropriate type location for an Objective-C
   2766 /// block placeholder.
   2767 ///
   2768 /// This function ignores things like typedefs and qualifiers in order to
   2769 /// present the most relevant and accurate block placeholders in code completion
   2770 /// results.
   2771 static void findTypeLocationForBlockDecl(const TypeSourceInfo *TSInfo,
   2772                                          FunctionTypeLoc &Block,
   2773                                          FunctionProtoTypeLoc &BlockProto,
   2774                                          bool SuppressBlock = false) {
   2775   if (!TSInfo)
   2776     return;
   2777   TypeLoc TL = TSInfo->getTypeLoc().getUnqualifiedLoc();
   2778   while (true) {
   2779     // Look through typedefs.
   2780     if (!SuppressBlock) {
   2781       if (TypedefTypeLoc TypedefTL = TL.getAs<TypedefTypeLoc>()) {
   2782         if (TypeSourceInfo *InnerTSInfo =
   2783                 TypedefTL.getTypedefNameDecl()->getTypeSourceInfo()) {
   2784           TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc();
   2785           continue;
   2786         }
   2787       }
   2788 
   2789       // Look through qualified types
   2790       if (QualifiedTypeLoc QualifiedTL = TL.getAs<QualifiedTypeLoc>()) {
   2791         TL = QualifiedTL.getUnqualifiedLoc();
   2792         continue;
   2793       }
   2794 
   2795       if (AttributedTypeLoc AttrTL = TL.getAs<AttributedTypeLoc>()) {
   2796         TL = AttrTL.getModifiedLoc();
   2797         continue;
   2798       }
   2799     }
   2800 
   2801     // Try to get the function prototype behind the block pointer type,
   2802     // then we're done.
   2803     if (BlockPointerTypeLoc BlockPtr = TL.getAs<BlockPointerTypeLoc>()) {
   2804       TL = BlockPtr.getPointeeLoc().IgnoreParens();
   2805       Block = TL.getAs<FunctionTypeLoc>();
   2806       BlockProto = TL.getAs<FunctionProtoTypeLoc>();
   2807     }
   2808     break;
   2809   }
   2810 }
   2811 
   2812 static std::string
   2813 formatBlockPlaceholder(const PrintingPolicy &Policy, const NamedDecl *BlockDecl,
   2814                        FunctionTypeLoc &Block, FunctionProtoTypeLoc &BlockProto,
   2815                        bool SuppressBlockName = false,
   2816                        bool SuppressBlock = false,
   2817                        Optional<ArrayRef<QualType>> ObjCSubsts = None);
   2818 
   2819 static std::string
   2820 FormatFunctionParameter(const PrintingPolicy &Policy, const ParmVarDecl *Param,
   2821                         bool SuppressName = false, bool SuppressBlock = false,
   2822                         Optional<ArrayRef<QualType>> ObjCSubsts = None) {
   2823   // Params are unavailable in FunctionTypeLoc if the FunctionType is invalid.
   2824   // It would be better to pass in the param Type, which is usually avaliable.
   2825   // But this case is rare, so just pretend we fell back to int as elsewhere.
   2826   if (!Param)
   2827     return "int";
   2828   bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext());
   2829   if (Param->getType()->isDependentType() ||
   2830       !Param->getType()->isBlockPointerType()) {
   2831     // The argument for a dependent or non-block parameter is a placeholder
   2832     // containing that parameter's type.
   2833     std::string Result;
   2834 
   2835     if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName)
   2836       Result = std::string(Param->getIdentifier()->getName());
   2837 
   2838     QualType Type = Param->getType();
   2839     if (ObjCSubsts)
   2840       Type = Type.substObjCTypeArgs(Param->getASTContext(), *ObjCSubsts,
   2841                                     ObjCSubstitutionContext::Parameter);
   2842     if (ObjCMethodParam) {
   2843       Result =
   2844           "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier(), Type);
   2845       Result += Type.getAsString(Policy) + ")";
   2846       if (Param->getIdentifier() && !SuppressName)
   2847         Result += Param->getIdentifier()->getName();
   2848     } else {
   2849       Type.getAsStringInternal(Result, Policy);
   2850     }
   2851     return Result;
   2852   }
   2853 
   2854   // The argument for a block pointer parameter is a block literal with
   2855   // the appropriate type.
   2856   FunctionTypeLoc Block;
   2857   FunctionProtoTypeLoc BlockProto;
   2858   findTypeLocationForBlockDecl(Param->getTypeSourceInfo(), Block, BlockProto,
   2859                                SuppressBlock);
   2860   // Try to retrieve the block type information from the property if this is a
   2861   // parameter in a setter.
   2862   if (!Block && ObjCMethodParam &&
   2863       cast<ObjCMethodDecl>(Param->getDeclContext())->isPropertyAccessor()) {
   2864     if (const auto *PD = cast<ObjCMethodDecl>(Param->getDeclContext())
   2865                              ->findPropertyDecl(/*CheckOverrides=*/false))
   2866       findTypeLocationForBlockDecl(PD->getTypeSourceInfo(), Block, BlockProto,
   2867                                    SuppressBlock);
   2868   }
   2869 
   2870   if (!Block) {
   2871     // We were unable to find a FunctionProtoTypeLoc with parameter names
   2872     // for the block; just use the parameter type as a placeholder.
   2873     std::string Result;
   2874     if (!ObjCMethodParam && Param->getIdentifier())
   2875       Result = std::string(Param->getIdentifier()->getName());
   2876 
   2877     QualType Type = Param->getType().getUnqualifiedType();
   2878 
   2879     if (ObjCMethodParam) {
   2880       Result = Type.getAsString(Policy);
   2881       std::string Quals =
   2882           formatObjCParamQualifiers(Param->getObjCDeclQualifier(), Type);
   2883       if (!Quals.empty())
   2884         Result = "(" + Quals + " " + Result + ")";
   2885       if (Result.back() != ')')
   2886         Result += " ";
   2887       if (Param->getIdentifier())
   2888         Result += Param->getIdentifier()->getName();
   2889     } else {
   2890       Type.getAsStringInternal(Result, Policy);
   2891     }
   2892 
   2893     return Result;
   2894   }
   2895 
   2896   // We have the function prototype behind the block pointer type, as it was
   2897   // written in the source.
   2898   return formatBlockPlaceholder(Policy, Param, Block, BlockProto,
   2899                                 /*SuppressBlockName=*/false, SuppressBlock,
   2900                                 ObjCSubsts);
   2901 }
   2902 
   2903 /// Returns a placeholder string that corresponds to an Objective-C block
   2904 /// declaration.
   2905 ///
   2906 /// \param BlockDecl A declaration with an Objective-C block type.
   2907 ///
   2908 /// \param Block The most relevant type location for that block type.
   2909 ///
   2910 /// \param SuppressBlockName Determines whether or not the name of the block
   2911 /// declaration is included in the resulting string.
   2912 static std::string
   2913 formatBlockPlaceholder(const PrintingPolicy &Policy, const NamedDecl *BlockDecl,
   2914                        FunctionTypeLoc &Block, FunctionProtoTypeLoc &BlockProto,
   2915                        bool SuppressBlockName, bool SuppressBlock,
   2916                        Optional<ArrayRef<QualType>> ObjCSubsts) {
   2917   std::string Result;
   2918   QualType ResultType = Block.getTypePtr()->getReturnType();
   2919   if (ObjCSubsts)
   2920     ResultType =
   2921         ResultType.substObjCTypeArgs(BlockDecl->getASTContext(), *ObjCSubsts,
   2922                                      ObjCSubstitutionContext::Result);
   2923   if (!ResultType->isVoidType() || SuppressBlock)
   2924     ResultType.getAsStringInternal(Result, Policy);
   2925 
   2926   // Format the parameter list.
   2927   std::string Params;
   2928   if (!BlockProto || Block.getNumParams() == 0) {
   2929     if (BlockProto && BlockProto.getTypePtr()->isVariadic())
   2930       Params = "(...)";
   2931     else
   2932       Params = "(void)";
   2933   } else {
   2934     Params += "(";
   2935     for (unsigned I = 0, N = Block.getNumParams(); I != N; ++I) {
   2936       if (I)
   2937         Params += ", ";
   2938       Params += FormatFunctionParameter(Policy, Block.getParam(I),
   2939                                         /*SuppressName=*/false,
   2940                                         /*SuppressBlock=*/true, ObjCSubsts);
   2941 
   2942       if (I == N - 1 && BlockProto.getTypePtr()->isVariadic())
   2943         Params += ", ...";
   2944     }
   2945     Params += ")";
   2946   }
   2947 
   2948   if (SuppressBlock) {
   2949     // Format as a parameter.
   2950     Result = Result + " (^";
   2951     if (!SuppressBlockName && BlockDecl->getIdentifier())
   2952       Result += BlockDecl->getIdentifier()->getName();
   2953     Result += ")";
   2954     Result += Params;
   2955   } else {
   2956     // Format as a block literal argument.
   2957     Result = '^' + Result;
   2958     Result += Params;
   2959 
   2960     if (!SuppressBlockName && BlockDecl->getIdentifier())
   2961       Result += BlockDecl->getIdentifier()->getName();
   2962   }
   2963 
   2964   return Result;
   2965 }
   2966 
   2967 static std::string GetDefaultValueString(const ParmVarDecl *Param,
   2968                                          const SourceManager &SM,
   2969                                          const LangOptions &LangOpts) {
   2970   const SourceRange SrcRange = Param->getDefaultArgRange();
   2971   CharSourceRange CharSrcRange = CharSourceRange::getTokenRange(SrcRange);
   2972   bool Invalid = CharSrcRange.isInvalid();
   2973   if (Invalid)
   2974     return "";
   2975   StringRef srcText =
   2976       Lexer::getSourceText(CharSrcRange, SM, LangOpts, &Invalid);
   2977   if (Invalid)
   2978     return "";
   2979 
   2980   if (srcText.empty() || srcText == "=") {
   2981     // Lexer can't determine the value.
   2982     // This happens if the code is incorrect (for example class is forward
   2983     // declared).
   2984     return "";
   2985   }
   2986   std::string DefValue(srcText.str());
   2987   // FIXME: remove this check if the Lexer::getSourceText value is fixed and
   2988   // this value always has (or always does not have) '=' in front of it
   2989   if (DefValue.at(0) != '=') {
   2990     // If we don't have '=' in front of value.
   2991     // Lexer returns built-in types values without '=' and user-defined types
   2992     // values with it.
   2993     return " = " + DefValue;
   2994   }
   2995   return " " + DefValue;
   2996 }
   2997 
   2998 /// Add function parameter chunks to the given code completion string.
   2999 static void AddFunctionParameterChunks(Preprocessor &PP,
   3000                                        const PrintingPolicy &Policy,
   3001                                        const FunctionDecl *Function,
   3002                                        CodeCompletionBuilder &Result,
   3003                                        unsigned Start = 0,
   3004                                        bool InOptional = false) {
   3005   bool FirstParameter = true;
   3006 
   3007   for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) {
   3008     const ParmVarDecl *Param = Function->getParamDecl(P);
   3009 
   3010     if (Param->hasDefaultArg() && !InOptional) {
   3011       // When we see an optional default argument, put that argument and
   3012       // the remaining default arguments into a new, optional string.
   3013       CodeCompletionBuilder Opt(Result.getAllocator(),
   3014                                 Result.getCodeCompletionTUInfo());
   3015       if (!FirstParameter)
   3016         Opt.AddChunk(CodeCompletionString::CK_Comma);
   3017       AddFunctionParameterChunks(PP, Policy, Function, Opt, P, true);
   3018       Result.AddOptionalChunk(Opt.TakeString());
   3019       break;
   3020     }
   3021 
   3022     if (FirstParameter)
   3023       FirstParameter = false;
   3024     else
   3025       Result.AddChunk(CodeCompletionString::CK_Comma);
   3026 
   3027     InOptional = false;
   3028 
   3029     // Format the placeholder string.
   3030     std::string PlaceholderStr = FormatFunctionParameter(Policy, Param);
   3031     if (Param->hasDefaultArg())
   3032       PlaceholderStr +=
   3033           GetDefaultValueString(Param, PP.getSourceManager(), PP.getLangOpts());
   3034 
   3035     if (Function->isVariadic() && P == N - 1)
   3036       PlaceholderStr += ", ...";
   3037 
   3038     // Add the placeholder string.
   3039     Result.AddPlaceholderChunk(
   3040         Result.getAllocator().CopyString(PlaceholderStr));
   3041   }
   3042 
   3043   if (const auto *Proto = Function->getType()->getAs<FunctionProtoType>())
   3044     if (Proto->isVariadic()) {
   3045       if (Proto->getNumParams() == 0)
   3046         Result.AddPlaceholderChunk("...");
   3047 
   3048       MaybeAddSentinel(PP, Function, Result);
   3049     }
   3050 }
   3051 
   3052 /// Add template parameter chunks to the given code completion string.
   3053 static void AddTemplateParameterChunks(
   3054     ASTContext &Context, const PrintingPolicy &Policy,
   3055     const TemplateDecl *Template, CodeCompletionBuilder &Result,
   3056     unsigned MaxParameters = 0, unsigned Start = 0, bool InDefaultArg = false) {
   3057   bool FirstParameter = true;
   3058 
   3059   // Prefer to take the template parameter names from the first declaration of
   3060   // the template.
   3061   Template = cast<TemplateDecl>(Template->getCanonicalDecl());
   3062 
   3063   TemplateParameterList *Params = Template->getTemplateParameters();
   3064   TemplateParameterList::iterator PEnd = Params->end();
   3065   if (MaxParameters)
   3066     PEnd = Params->begin() + MaxParameters;
   3067   for (TemplateParameterList::iterator P = Params->begin() + Start; P != PEnd;
   3068        ++P) {
   3069     bool HasDefaultArg = false;
   3070     std::string PlaceholderStr;
   3071     if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
   3072       if (TTP->wasDeclaredWithTypename())
   3073         PlaceholderStr = "typename";
   3074       else if (const auto *TC = TTP->getTypeConstraint()) {
   3075         llvm::raw_string_ostream OS(PlaceholderStr);
   3076         TC->print(OS, Policy);
   3077         OS.flush();
   3078       } else
   3079         PlaceholderStr = "class";
   3080 
   3081       if (TTP->getIdentifier()) {
   3082         PlaceholderStr += ' ';
   3083         PlaceholderStr += TTP->getIdentifier()->getName();
   3084       }
   3085 
   3086       HasDefaultArg = TTP->hasDefaultArgument();
   3087     } else if (NonTypeTemplateParmDecl *NTTP =
   3088                    dyn_cast<NonTypeTemplateParmDecl>(*P)) {
   3089       if (NTTP->getIdentifier())
   3090         PlaceholderStr = std::string(NTTP->getIdentifier()->getName());
   3091       NTTP->getType().getAsStringInternal(PlaceholderStr, Policy);
   3092       HasDefaultArg = NTTP->hasDefaultArgument();
   3093     } else {
   3094       assert(isa<TemplateTemplateParmDecl>(*P));
   3095       TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P);
   3096 
   3097       // Since putting the template argument list into the placeholder would
   3098       // be very, very long, we just use an abbreviation.
   3099       PlaceholderStr = "template<...> class";
   3100       if (TTP->getIdentifier()) {
   3101         PlaceholderStr += ' ';
   3102         PlaceholderStr += TTP->getIdentifier()->getName();
   3103       }
   3104 
   3105       HasDefaultArg = TTP->hasDefaultArgument();
   3106     }
   3107 
   3108     if (HasDefaultArg && !InDefaultArg) {
   3109       // When we see an optional default argument, put that argument and
   3110       // the remaining default arguments into a new, optional string.
   3111       CodeCompletionBuilder Opt(Result.getAllocator(),
   3112                                 Result.getCodeCompletionTUInfo());
   3113       if (!FirstParameter)
   3114         Opt.AddChunk(CodeCompletionString::CK_Comma);
   3115       AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters,
   3116                                  P - Params->begin(), true);
   3117       Result.AddOptionalChunk(Opt.TakeString());
   3118       break;
   3119     }
   3120 
   3121     InDefaultArg = false;
   3122 
   3123     if (FirstParameter)
   3124       FirstParameter = false;
   3125     else
   3126       Result.AddChunk(CodeCompletionString::CK_Comma);
   3127 
   3128     // Add the placeholder string.
   3129     Result.AddPlaceholderChunk(
   3130         Result.getAllocator().CopyString(PlaceholderStr));
   3131   }
   3132 }
   3133 
   3134 /// Add a qualifier to the given code-completion string, if the
   3135 /// provided nested-name-specifier is non-NULL.
   3136 static void AddQualifierToCompletionString(CodeCompletionBuilder &Result,
   3137                                            NestedNameSpecifier *Qualifier,
   3138                                            bool QualifierIsInformative,
   3139                                            ASTContext &Context,
   3140                                            const PrintingPolicy &Policy) {
   3141   if (!Qualifier)
   3142     return;
   3143 
   3144   std::string PrintedNNS;
   3145   {
   3146     llvm::raw_string_ostream OS(PrintedNNS);
   3147     Qualifier->print(OS, Policy);
   3148   }
   3149   if (QualifierIsInformative)
   3150     Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS));
   3151   else
   3152     Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS));
   3153 }
   3154 
   3155 static void
   3156 AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result,
   3157                                        const FunctionDecl *Function) {
   3158   const auto *Proto = Function->getType()->getAs<FunctionProtoType>();
   3159   if (!Proto || !Proto->getMethodQuals())
   3160     return;
   3161 
   3162   // FIXME: Add ref-qualifier!
   3163 
   3164   // Handle single qualifiers without copying
   3165   if (Proto->getMethodQuals().hasOnlyConst()) {
   3166     Result.AddInformativeChunk(" const");
   3167     return;
   3168   }
   3169 
   3170   if (Proto->getMethodQuals().hasOnlyVolatile()) {
   3171     Result.AddInformativeChunk(" volatile");
   3172     return;
   3173   }
   3174 
   3175   if (Proto->getMethodQuals().hasOnlyRestrict()) {
   3176     Result.AddInformativeChunk(" restrict");
   3177     return;
   3178   }
   3179 
   3180   // Handle multiple qualifiers.
   3181   std::string QualsStr;
   3182   if (Proto->isConst())
   3183     QualsStr += " const";
   3184   if (Proto->isVolatile())
   3185     QualsStr += " volatile";
   3186   if (Proto->isRestrict())
   3187     QualsStr += " restrict";
   3188   Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr));
   3189 }
   3190 
   3191 /// Add the name of the given declaration
   3192 static void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy,
   3193                               const NamedDecl *ND,
   3194                               CodeCompletionBuilder &Result) {
   3195   DeclarationName Name = ND->getDeclName();
   3196   if (!Name)
   3197     return;
   3198 
   3199   switch (Name.getNameKind()) {
   3200   case DeclarationName::CXXOperatorName: {
   3201     const char *OperatorName = nullptr;
   3202     switch (Name.getCXXOverloadedOperator()) {
   3203     case OO_None:
   3204     case OO_Conditional:
   3205     case NUM_OVERLOADED_OPERATORS:
   3206       OperatorName = "operator";
   3207       break;
   3208 
   3209 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
   3210   case OO_##Name:                                                              \
   3211     OperatorName = "operator" Spelling;                                        \
   3212     break;
   3213 #define OVERLOADED_OPERATOR_MULTI(Name, Spelling, Unary, Binary, MemberOnly)
   3214 #include "clang/Basic/OperatorKinds.def"
   3215 
   3216     case OO_New:
   3217       OperatorName = "operator new";
   3218       break;
   3219     case OO_Delete:
   3220       OperatorName = "operator delete";
   3221       break;
   3222     case OO_Array_New:
   3223       OperatorName = "operator new[]";
   3224       break;
   3225     case OO_Array_Delete:
   3226       OperatorName = "operator delete[]";
   3227       break;
   3228     case OO_Call:
   3229       OperatorName = "operator()";
   3230       break;
   3231     case OO_Subscript:
   3232       OperatorName = "operator[]";
   3233       break;
   3234     }
   3235     Result.AddTypedTextChunk(OperatorName);
   3236     break;
   3237   }
   3238 
   3239   case DeclarationName::Identifier:
   3240   case DeclarationName::CXXConversionFunctionName:
   3241   case DeclarationName::CXXDestructorName:
   3242   case DeclarationName::CXXLiteralOperatorName:
   3243     Result.AddTypedTextChunk(
   3244         Result.getAllocator().CopyString(ND->getNameAsString()));
   3245     break;
   3246 
   3247   case DeclarationName::CXXDeductionGuideName:
   3248   case DeclarationName::CXXUsingDirective:
   3249   case DeclarationName::ObjCZeroArgSelector:
   3250   case DeclarationName::ObjCOneArgSelector:
   3251   case DeclarationName::ObjCMultiArgSelector:
   3252     break;
   3253 
   3254   case DeclarationName::CXXConstructorName: {
   3255     CXXRecordDecl *Record = nullptr;
   3256     QualType Ty = Name.getCXXNameType();
   3257     if (const auto *RecordTy = Ty->getAs<RecordType>())
   3258       Record = cast<CXXRecordDecl>(RecordTy->getDecl());
   3259     else if (const auto *InjectedTy = Ty->getAs<InjectedClassNameType>())
   3260       Record = InjectedTy->getDecl();
   3261     else {
   3262       Result.AddTypedTextChunk(
   3263           Result.getAllocator().CopyString(ND->getNameAsString()));
   3264       break;
   3265     }
   3266 
   3267     Result.AddTypedTextChunk(
   3268         Result.getAllocator().CopyString(Record->getNameAsString()));
   3269     if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) {
   3270       Result.AddChunk(CodeCompletionString::CK_LeftAngle);
   3271       AddTemplateParameterChunks(Context, Policy, Template, Result);
   3272       Result.AddChunk(CodeCompletionString::CK_RightAngle);
   3273     }
   3274     break;
   3275   }
   3276   }
   3277 }
   3278 
   3279 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(
   3280     Sema &S, const CodeCompletionContext &CCContext,
   3281     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
   3282     bool IncludeBriefComments) {
   3283   return CreateCodeCompletionString(S.Context, S.PP, CCContext, Allocator,
   3284                                     CCTUInfo, IncludeBriefComments);
   3285 }
   3286 
   3287 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionStringForMacro(
   3288     Preprocessor &PP, CodeCompletionAllocator &Allocator,
   3289     CodeCompletionTUInfo &CCTUInfo) {
   3290   assert(Kind == RK_Macro);
   3291   CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability);
   3292   const MacroInfo *MI = PP.getMacroInfo(Macro);
   3293   Result.AddTypedTextChunk(Result.getAllocator().CopyString(Macro->getName()));
   3294 
   3295   if (!MI || !MI->isFunctionLike())
   3296     return Result.TakeString();
   3297 
   3298   // Format a function-like macro with placeholders for the arguments.
   3299   Result.AddChunk(CodeCompletionString::CK_LeftParen);
   3300   MacroInfo::param_iterator A = MI->param_begin(), AEnd = MI->param_end();
   3301 
   3302   // C99 variadic macros add __VA_ARGS__ at the end. Skip it.
   3303   if (MI->isC99Varargs()) {
   3304     --AEnd;
   3305 
   3306     if (A == AEnd) {
   3307       Result.AddPlaceholderChunk("...");
   3308     }
   3309   }
   3310 
   3311   for (MacroInfo::param_iterator A = MI->param_begin(); A != AEnd; ++A) {
   3312     if (A != MI->param_begin())
   3313       Result.AddChunk(CodeCompletionString::CK_Comma);
   3314 
   3315     if (MI->isVariadic() && (A + 1) == AEnd) {
   3316       SmallString<32> Arg = (*A)->getName();
   3317       if (MI->isC99Varargs())
   3318         Arg += ", ...";
   3319       else
   3320         Arg += "...";
   3321       Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg));
   3322       break;
   3323     }
   3324 
   3325     // Non-variadic macros are simple.
   3326     Result.AddPlaceholderChunk(
   3327         Result.getAllocator().CopyString((*A)->getName()));
   3328   }
   3329   Result.AddChunk(CodeCompletionString::CK_RightParen);
   3330   return Result.TakeString();
   3331 }
   3332 
   3333 /// If possible, create a new code completion string for the given
   3334 /// result.
   3335 ///
   3336 /// \returns Either a new, heap-allocated code completion string describing
   3337 /// how to use this result, or NULL to indicate that the string or name of the
   3338 /// result is all that is needed.
   3339 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(
   3340     ASTContext &Ctx, Preprocessor &PP, const CodeCompletionContext &CCContext,
   3341     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
   3342     bool IncludeBriefComments) {
   3343   if (Kind == RK_Macro)
   3344     return CreateCodeCompletionStringForMacro(PP, Allocator, CCTUInfo);
   3345 
   3346   CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability);
   3347 
   3348   PrintingPolicy Policy = getCompletionPrintingPolicy(Ctx, PP);
   3349   if (Kind == RK_Pattern) {
   3350     Pattern->Priority = Priority;
   3351     Pattern->Availability = Availability;
   3352 
   3353     if (Declaration) {
   3354       Result.addParentContext(Declaration->getDeclContext());
   3355       Pattern->ParentName = Result.getParentName();
   3356       if (const RawComment *RC =
   3357               getPatternCompletionComment(Ctx, Declaration)) {
   3358         Result.addBriefComment(RC->getBriefText(Ctx));
   3359         Pattern->BriefComment = Result.getBriefComment();
   3360       }
   3361     }
   3362 
   3363     return Pattern;
   3364   }
   3365 
   3366   if (Kind == RK_Keyword) {
   3367     Result.AddTypedTextChunk(Keyword);
   3368     return Result.TakeString();
   3369   }
   3370   assert(Kind == RK_Declaration && "Missed a result kind?");
   3371   return createCodeCompletionStringForDecl(
   3372       PP, Ctx, Result, IncludeBriefComments, CCContext, Policy);
   3373 }
   3374 
   3375 static void printOverrideString(const CodeCompletionString &CCS,
   3376                                 std::string &BeforeName,
   3377                                 std::string &NameAndSignature) {
   3378   bool SeenTypedChunk = false;
   3379   for (auto &Chunk : CCS) {
   3380     if (Chunk.Kind == CodeCompletionString::CK_Optional) {
   3381       assert(SeenTypedChunk && "optional parameter before name");
   3382       // Note that we put all chunks inside into NameAndSignature.
   3383       printOverrideString(*Chunk.Optional, NameAndSignature, NameAndSignature);
   3384       continue;
   3385     }
   3386     SeenTypedChunk |= Chunk.Kind == CodeCompletionString::CK_TypedText;
   3387     if (SeenTypedChunk)
   3388       NameAndSignature += Chunk.Text;
   3389     else
   3390       BeforeName += Chunk.Text;
   3391   }
   3392 }
   3393 
   3394 CodeCompletionString *
   3395 CodeCompletionResult::createCodeCompletionStringForOverride(
   3396     Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result,
   3397     bool IncludeBriefComments, const CodeCompletionContext &CCContext,
   3398     PrintingPolicy &Policy) {
   3399   auto *CCS = createCodeCompletionStringForDecl(PP, Ctx, Result,
   3400                                                 /*IncludeBriefComments=*/false,
   3401                                                 CCContext, Policy);
   3402   std::string BeforeName;
   3403   std::string NameAndSignature;
   3404   // For overrides all chunks go into the result, none are informative.
   3405   printOverrideString(*CCS, BeforeName, NameAndSignature);
   3406   NameAndSignature += " override";
   3407 
   3408   Result.AddTextChunk(Result.getAllocator().CopyString(BeforeName));
   3409   Result.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   3410   Result.AddTypedTextChunk(Result.getAllocator().CopyString(NameAndSignature));
   3411   return Result.TakeString();
   3412 }
   3413 
   3414 // FIXME: Right now this works well with lambdas. Add support for other functor
   3415 // types like std::function.
   3416 static const NamedDecl *extractFunctorCallOperator(const NamedDecl *ND) {
   3417   const auto *VD = dyn_cast<VarDecl>(ND);
   3418   if (!VD)
   3419     return nullptr;
   3420   const auto *RecordDecl = VD->getType()->getAsCXXRecordDecl();
   3421   if (!RecordDecl || !RecordDecl->isLambda())
   3422     return nullptr;
   3423   return RecordDecl->getLambdaCallOperator();
   3424 }
   3425 
   3426 CodeCompletionString *CodeCompletionResult::createCodeCompletionStringForDecl(
   3427     Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result,
   3428     bool IncludeBriefComments, const CodeCompletionContext &CCContext,
   3429     PrintingPolicy &Policy) {
   3430   const NamedDecl *ND = Declaration;
   3431   Result.addParentContext(ND->getDeclContext());
   3432 
   3433   if (IncludeBriefComments) {
   3434     // Add documentation comment, if it exists.
   3435     if (const RawComment *RC = getCompletionComment(Ctx, Declaration)) {
   3436       Result.addBriefComment(RC->getBriefText(Ctx));
   3437     }
   3438   }
   3439 
   3440   if (StartsNestedNameSpecifier) {
   3441     Result.AddTypedTextChunk(
   3442         Result.getAllocator().CopyString(ND->getNameAsString()));
   3443     Result.AddTextChunk("::");
   3444     return Result.TakeString();
   3445   }
   3446 
   3447   for (const auto *I : ND->specific_attrs<AnnotateAttr>())
   3448     Result.AddAnnotation(Result.getAllocator().CopyString(I->getAnnotation()));
   3449 
   3450   auto AddFunctionTypeAndResult = [&](const FunctionDecl *Function) {
   3451     AddResultTypeChunk(Ctx, Policy, Function, CCContext.getBaseType(), Result);
   3452     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
   3453                                    Ctx, Policy);
   3454     AddTypedNameChunk(Ctx, Policy, ND, Result);
   3455     Result.AddChunk(CodeCompletionString::CK_LeftParen);
   3456     AddFunctionParameterChunks(PP, Policy, Function, Result);
   3457     Result.AddChunk(CodeCompletionString::CK_RightParen);
   3458     AddFunctionTypeQualsToCompletionString(Result, Function);
   3459   };
   3460 
   3461   if (const auto *Function = dyn_cast<FunctionDecl>(ND)) {
   3462     AddFunctionTypeAndResult(Function);
   3463     return Result.TakeString();
   3464   }
   3465 
   3466   if (const auto *CallOperator =
   3467           dyn_cast_or_null<FunctionDecl>(extractFunctorCallOperator(ND))) {
   3468     AddFunctionTypeAndResult(CallOperator);
   3469     return Result.TakeString();
   3470   }
   3471 
   3472   AddResultTypeChunk(Ctx, Policy, ND, CCContext.getBaseType(), Result);
   3473 
   3474   if (const FunctionTemplateDecl *FunTmpl =
   3475           dyn_cast<FunctionTemplateDecl>(ND)) {
   3476     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
   3477                                    Ctx, Policy);
   3478     FunctionDecl *Function = FunTmpl->getTemplatedDecl();
   3479     AddTypedNameChunk(Ctx, Policy, Function, Result);
   3480 
   3481     // Figure out which template parameters are deduced (or have default
   3482     // arguments).
   3483     llvm::SmallBitVector Deduced;
   3484     Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced);
   3485     unsigned LastDeducibleArgument;
   3486     for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0;
   3487          --LastDeducibleArgument) {
   3488       if (!Deduced[LastDeducibleArgument - 1]) {
   3489         // C++0x: Figure out if the template argument has a default. If so,
   3490         // the user doesn't need to type this argument.
   3491         // FIXME: We need to abstract template parameters better!
   3492         bool HasDefaultArg = false;
   3493         NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam(
   3494             LastDeducibleArgument - 1);
   3495         if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
   3496           HasDefaultArg = TTP->hasDefaultArgument();
   3497         else if (NonTypeTemplateParmDecl *NTTP =
   3498                      dyn_cast<NonTypeTemplateParmDecl>(Param))
   3499           HasDefaultArg = NTTP->hasDefaultArgument();
   3500         else {
   3501           assert(isa<TemplateTemplateParmDecl>(Param));
   3502           HasDefaultArg =
   3503               cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument();
   3504         }
   3505 
   3506         if (!HasDefaultArg)
   3507           break;
   3508       }
   3509     }
   3510 
   3511     if (LastDeducibleArgument) {
   3512       // Some of the function template arguments cannot be deduced from a
   3513       // function call, so we introduce an explicit template argument list
   3514       // containing all of the arguments up to the first deducible argument.
   3515       Result.AddChunk(CodeCompletionString::CK_LeftAngle);
   3516       AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result,
   3517                                  LastDeducibleArgument);
   3518       Result.AddChunk(CodeCompletionString::CK_RightAngle);
   3519     }
   3520 
   3521     // Add the function parameters
   3522     Result.AddChunk(CodeCompletionString::CK_LeftParen);
   3523     AddFunctionParameterChunks(PP, Policy, Function, Result);
   3524     Result.AddChunk(CodeCompletionString::CK_RightParen);
   3525     AddFunctionTypeQualsToCompletionString(Result, Function);
   3526     return Result.TakeString();
   3527   }
   3528 
   3529   if (const auto *Template = dyn_cast<TemplateDecl>(ND)) {
   3530     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
   3531                                    Ctx, Policy);
   3532     Result.AddTypedTextChunk(
   3533         Result.getAllocator().CopyString(Template->getNameAsString()));
   3534     Result.AddChunk(CodeCompletionString::CK_LeftAngle);
   3535     AddTemplateParameterChunks(Ctx, Policy, Template, Result);
   3536     Result.AddChunk(CodeCompletionString::CK_RightAngle);
   3537     return Result.TakeString();
   3538   }
   3539 
   3540   if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) {
   3541     Selector Sel = Method->getSelector();
   3542     if (Sel.isUnarySelector()) {
   3543       Result.AddTypedTextChunk(
   3544           Result.getAllocator().CopyString(Sel.getNameForSlot(0)));
   3545       return Result.TakeString();
   3546     }
   3547 
   3548     std::string SelName = Sel.getNameForSlot(0).str();
   3549     SelName += ':';
   3550     if (StartParameter == 0)
   3551       Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName));
   3552     else {
   3553       Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName));
   3554 
   3555       // If there is only one parameter, and we're past it, add an empty
   3556       // typed-text chunk since there is nothing to type.
   3557       if (Method->param_size() == 1)
   3558         Result.AddTypedTextChunk("");
   3559     }
   3560     unsigned Idx = 0;
   3561     // The extra Idx < Sel.getNumArgs() check is needed due to legacy C-style
   3562     // method parameters.
   3563     for (ObjCMethodDecl::param_const_iterator P = Method->param_begin(),
   3564                                               PEnd = Method->param_end();
   3565          P != PEnd && Idx < Sel.getNumArgs(); (void)++P, ++Idx) {
   3566       if (Idx > 0) {
   3567         std::string Keyword;
   3568         if (Idx > StartParameter)
   3569           Result.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   3570         if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx))
   3571           Keyword += II->getName();
   3572         Keyword += ":";
   3573         if (Idx < StartParameter || AllParametersAreInformative)
   3574           Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword));
   3575         else
   3576           Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword));
   3577       }
   3578 
   3579       // If we're before the starting parameter, skip the placeholder.
   3580       if (Idx < StartParameter)
   3581         continue;
   3582 
   3583       std::string Arg;
   3584       QualType ParamType = (*P)->getType();
   3585       Optional<ArrayRef<QualType>> ObjCSubsts;
   3586       if (!CCContext.getBaseType().isNull())
   3587         ObjCSubsts = CCContext.getBaseType()->getObjCSubstitutions(Method);
   3588 
   3589       if (ParamType->isBlockPointerType() && !DeclaringEntity)
   3590         Arg = FormatFunctionParameter(Policy, *P, true,
   3591                                       /*SuppressBlock=*/false, ObjCSubsts);
   3592       else {
   3593         if (ObjCSubsts)
   3594           ParamType = ParamType.substObjCTypeArgs(
   3595               Ctx, *ObjCSubsts, ObjCSubstitutionContext::Parameter);
   3596         Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier(),
   3597                                               ParamType);
   3598         Arg += ParamType.getAsString(Policy) + ")";
   3599         if (IdentifierInfo *II = (*P)->getIdentifier())
   3600           if (DeclaringEntity || AllParametersAreInformative)
   3601             Arg += II->getName();
   3602       }
   3603 
   3604       if (Method->isVariadic() && (P + 1) == PEnd)
   3605         Arg += ", ...";
   3606 
   3607       if (DeclaringEntity)
   3608         Result.AddTextChunk(Result.getAllocator().CopyString(Arg));
   3609       else if (AllParametersAreInformative)
   3610         Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg));
   3611       else
   3612         Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg));
   3613     }
   3614 
   3615     if (Method->isVariadic()) {
   3616       if (Method->param_size() == 0) {
   3617         if (DeclaringEntity)
   3618           Result.AddTextChunk(", ...");
   3619         else if (AllParametersAreInformative)
   3620           Result.AddInformativeChunk(", ...");
   3621         else
   3622           Result.AddPlaceholderChunk(", ...");
   3623       }
   3624 
   3625       MaybeAddSentinel(PP, Method, Result);
   3626     }
   3627 
   3628     return Result.TakeString();
   3629   }
   3630 
   3631   if (Qualifier)
   3632     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
   3633                                    Ctx, Policy);
   3634 
   3635   Result.AddTypedTextChunk(
   3636       Result.getAllocator().CopyString(ND->getNameAsString()));
   3637   return Result.TakeString();
   3638 }
   3639 
   3640 const RawComment *clang::getCompletionComment(const ASTContext &Ctx,
   3641                                               const NamedDecl *ND) {
   3642   if (!ND)
   3643     return nullptr;
   3644   if (auto *RC = Ctx.getRawCommentForAnyRedecl(ND))
   3645     return RC;
   3646 
   3647   // Try to find comment from a property for ObjC methods.
   3648   const auto *M = dyn_cast<ObjCMethodDecl>(ND);
   3649   if (!M)
   3650     return nullptr;
   3651   const ObjCPropertyDecl *PDecl = M->findPropertyDecl();
   3652   if (!PDecl)
   3653     return nullptr;
   3654 
   3655   return Ctx.getRawCommentForAnyRedecl(PDecl);
   3656 }
   3657 
   3658 const RawComment *clang::getPatternCompletionComment(const ASTContext &Ctx,
   3659                                                      const NamedDecl *ND) {
   3660   const auto *M = dyn_cast_or_null<ObjCMethodDecl>(ND);
   3661   if (!M || !M->isPropertyAccessor())
   3662     return nullptr;
   3663 
   3664   // Provide code completion comment for self.GetterName where
   3665   // GetterName is the getter method for a property with name
   3666   // different from the property name (declared via a property
   3667   // getter attribute.
   3668   const ObjCPropertyDecl *PDecl = M->findPropertyDecl();
   3669   if (!PDecl)
   3670     return nullptr;
   3671   if (PDecl->getGetterName() == M->getSelector() &&
   3672       PDecl->getIdentifier() != M->getIdentifier()) {
   3673     if (auto *RC = Ctx.getRawCommentForAnyRedecl(M))
   3674       return RC;
   3675     if (auto *RC = Ctx.getRawCommentForAnyRedecl(PDecl))
   3676       return RC;
   3677   }
   3678   return nullptr;
   3679 }
   3680 
   3681 const RawComment *clang::getParameterComment(
   3682     const ASTContext &Ctx,
   3683     const CodeCompleteConsumer::OverloadCandidate &Result, unsigned ArgIndex) {
   3684   auto FDecl = Result.getFunction();
   3685   if (!FDecl)
   3686     return nullptr;
   3687   if (ArgIndex < FDecl->getNumParams())
   3688     return Ctx.getRawCommentForAnyRedecl(FDecl->getParamDecl(ArgIndex));
   3689   return nullptr;
   3690 }
   3691 
   3692 /// Add function overload parameter chunks to the given code completion
   3693 /// string.
   3694 static void AddOverloadParameterChunks(ASTContext &Context,
   3695                                        const PrintingPolicy &Policy,
   3696                                        const FunctionDecl *Function,
   3697                                        const FunctionProtoType *Prototype,
   3698                                        CodeCompletionBuilder &Result,
   3699                                        unsigned CurrentArg, unsigned Start = 0,
   3700                                        bool InOptional = false) {
   3701   bool FirstParameter = true;
   3702   unsigned NumParams =
   3703       Function ? Function->getNumParams() : Prototype->getNumParams();
   3704 
   3705   for (unsigned P = Start; P != NumParams; ++P) {
   3706     if (Function && Function->getParamDecl(P)->hasDefaultArg() && !InOptional) {
   3707       // When we see an optional default argument, put that argument and
   3708       // the remaining default arguments into a new, optional string.
   3709       CodeCompletionBuilder Opt(Result.getAllocator(),
   3710                                 Result.getCodeCompletionTUInfo());
   3711       if (!FirstParameter)
   3712         Opt.AddChunk(CodeCompletionString::CK_Comma);
   3713       // Optional sections are nested.
   3714       AddOverloadParameterChunks(Context, Policy, Function, Prototype, Opt,
   3715                                  CurrentArg, P, /*InOptional=*/true);
   3716       Result.AddOptionalChunk(Opt.TakeString());
   3717       return;
   3718     }
   3719 
   3720     if (FirstParameter)
   3721       FirstParameter = false;
   3722     else
   3723       Result.AddChunk(CodeCompletionString::CK_Comma);
   3724 
   3725     InOptional = false;
   3726 
   3727     // Format the placeholder string.
   3728     std::string Placeholder;
   3729     if (Function) {
   3730       const ParmVarDecl *Param = Function->getParamDecl(P);
   3731       Placeholder = FormatFunctionParameter(Policy, Param);
   3732       if (Param->hasDefaultArg())
   3733         Placeholder += GetDefaultValueString(Param, Context.getSourceManager(),
   3734                                              Context.getLangOpts());
   3735     } else {
   3736       Placeholder = Prototype->getParamType(P).getAsString(Policy);
   3737     }
   3738 
   3739     if (P == CurrentArg)
   3740       Result.AddCurrentParameterChunk(
   3741           Result.getAllocator().CopyString(Placeholder));
   3742     else
   3743       Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Placeholder));
   3744   }
   3745 
   3746   if (Prototype && Prototype->isVariadic()) {
   3747     CodeCompletionBuilder Opt(Result.getAllocator(),
   3748                               Result.getCodeCompletionTUInfo());
   3749     if (!FirstParameter)
   3750       Opt.AddChunk(CodeCompletionString::CK_Comma);
   3751 
   3752     if (CurrentArg < NumParams)
   3753       Opt.AddPlaceholderChunk("...");
   3754     else
   3755       Opt.AddCurrentParameterChunk("...");
   3756 
   3757     Result.AddOptionalChunk(Opt.TakeString());
   3758   }
   3759 }
   3760 
   3761 CodeCompletionString *
   3762 CodeCompleteConsumer::OverloadCandidate::CreateSignatureString(
   3763     unsigned CurrentArg, Sema &S, CodeCompletionAllocator &Allocator,
   3764     CodeCompletionTUInfo &CCTUInfo, bool IncludeBriefComments) const {
   3765   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
   3766   // Show signatures of constructors as they are declared:
   3767   //   vector(int n) rather than vector<string>(int n)
   3768   // This is less noisy without being less clear, and avoids tricky cases.
   3769   Policy.SuppressTemplateArgsInCXXConstructors = true;
   3770 
   3771   // FIXME: Set priority, availability appropriately.
   3772   CodeCompletionBuilder Result(Allocator, CCTUInfo, 1,
   3773                                CXAvailability_Available);
   3774   FunctionDecl *FDecl = getFunction();
   3775   const FunctionProtoType *Proto =
   3776       dyn_cast<FunctionProtoType>(getFunctionType());
   3777   if (!FDecl && !Proto) {
   3778     // Function without a prototype. Just give the return type and a
   3779     // highlighted ellipsis.
   3780     const FunctionType *FT = getFunctionType();
   3781     Result.AddResultTypeChunk(Result.getAllocator().CopyString(
   3782         FT->getReturnType().getAsString(Policy)));
   3783     Result.AddChunk(CodeCompletionString::CK_LeftParen);
   3784     Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "...");
   3785     Result.AddChunk(CodeCompletionString::CK_RightParen);
   3786     return Result.TakeString();
   3787   }
   3788 
   3789   if (FDecl) {
   3790     if (IncludeBriefComments) {
   3791       if (auto RC = getParameterComment(S.getASTContext(), *this, CurrentArg))
   3792         Result.addBriefComment(RC->getBriefText(S.getASTContext()));
   3793     }
   3794     AddResultTypeChunk(S.Context, Policy, FDecl, QualType(), Result);
   3795 
   3796     std::string Name;
   3797     llvm::raw_string_ostream OS(Name);
   3798     FDecl->getDeclName().print(OS, Policy);
   3799     Result.AddTextChunk(Result.getAllocator().CopyString(OS.str()));
   3800   } else {
   3801     Result.AddResultTypeChunk(Result.getAllocator().CopyString(
   3802         Proto->getReturnType().getAsString(Policy)));
   3803   }
   3804 
   3805   Result.AddChunk(CodeCompletionString::CK_LeftParen);
   3806   AddOverloadParameterChunks(S.getASTContext(), Policy, FDecl, Proto, Result,
   3807                              CurrentArg);
   3808   Result.AddChunk(CodeCompletionString::CK_RightParen);
   3809 
   3810   return Result.TakeString();
   3811 }
   3812 
   3813 unsigned clang::getMacroUsagePriority(StringRef MacroName,
   3814                                       const LangOptions &LangOpts,
   3815                                       bool PreferredTypeIsPointer) {
   3816   unsigned Priority = CCP_Macro;
   3817 
   3818   // Treat the "nil", "Nil" and "NULL" macros as null pointer constants.
   3819   if (MacroName.equals("nil") || MacroName.equals("NULL") ||
   3820       MacroName.equals("Nil")) {
   3821     Priority = CCP_Constant;
   3822     if (PreferredTypeIsPointer)
   3823       Priority = Priority / CCF_SimilarTypeMatch;
   3824   }
   3825   // Treat "YES", "NO", "true", and "false" as constants.
   3826   else if (MacroName.equals("YES") || MacroName.equals("NO") ||
   3827            MacroName.equals("true") || MacroName.equals("false"))
   3828     Priority = CCP_Constant;
   3829   // Treat "bool" as a type.
   3830   else if (MacroName.equals("bool"))
   3831     Priority = CCP_Type + (LangOpts.ObjC ? CCD_bool_in_ObjC : 0);
   3832 
   3833   return Priority;
   3834 }
   3835 
   3836 CXCursorKind clang::getCursorKindForDecl(const Decl *D) {
   3837   if (!D)
   3838     return CXCursor_UnexposedDecl;
   3839 
   3840   switch (D->getKind()) {
   3841   case Decl::Enum:
   3842     return CXCursor_EnumDecl;
   3843   case Decl::EnumConstant:
   3844     return CXCursor_EnumConstantDecl;
   3845   case Decl::Field:
   3846     return CXCursor_FieldDecl;
   3847   case Decl::Function:
   3848     return CXCursor_FunctionDecl;
   3849   case Decl::ObjCCategory:
   3850     return CXCursor_ObjCCategoryDecl;
   3851   case Decl::ObjCCategoryImpl:
   3852     return CXCursor_ObjCCategoryImplDecl;
   3853   case Decl::ObjCImplementation:
   3854     return CXCursor_ObjCImplementationDecl;
   3855 
   3856   case Decl::ObjCInterface:
   3857     return CXCursor_ObjCInterfaceDecl;
   3858   case Decl::ObjCIvar:
   3859     return CXCursor_ObjCIvarDecl;
   3860   case Decl::ObjCMethod:
   3861     return cast<ObjCMethodDecl>(D)->isInstanceMethod()
   3862                ? CXCursor_ObjCInstanceMethodDecl
   3863                : CXCursor_ObjCClassMethodDecl;
   3864   case Decl::CXXMethod:
   3865     return CXCursor_CXXMethod;
   3866   case Decl::CXXConstructor:
   3867     return CXCursor_Constructor;
   3868   case Decl::CXXDestructor:
   3869     return CXCursor_Destructor;
   3870   case Decl::CXXConversion:
   3871     return CXCursor_ConversionFunction;
   3872   case Decl::ObjCProperty:
   3873     return CXCursor_ObjCPropertyDecl;
   3874   case Decl::ObjCProtocol:
   3875     return CXCursor_ObjCProtocolDecl;
   3876   case Decl::ParmVar:
   3877     return CXCursor_ParmDecl;
   3878   case Decl::Typedef:
   3879     return CXCursor_TypedefDecl;
   3880   case Decl::TypeAlias:
   3881     return CXCursor_TypeAliasDecl;
   3882   case Decl::TypeAliasTemplate:
   3883     return CXCursor_TypeAliasTemplateDecl;
   3884   case Decl::Var:
   3885     return CXCursor_VarDecl;
   3886   case Decl::Namespace:
   3887     return CXCursor_Namespace;
   3888   case Decl::NamespaceAlias:
   3889     return CXCursor_NamespaceAlias;
   3890   case Decl::TemplateTypeParm:
   3891     return CXCursor_TemplateTypeParameter;
   3892   case Decl::NonTypeTemplateParm:
   3893     return CXCursor_NonTypeTemplateParameter;
   3894   case Decl::TemplateTemplateParm:
   3895     return CXCursor_TemplateTemplateParameter;
   3896   case Decl::FunctionTemplate:
   3897     return CXCursor_FunctionTemplate;
   3898   case Decl::ClassTemplate:
   3899     return CXCursor_ClassTemplate;
   3900   case Decl::AccessSpec:
   3901     return CXCursor_CXXAccessSpecifier;
   3902   case Decl::ClassTemplatePartialSpecialization:
   3903     return CXCursor_ClassTemplatePartialSpecialization;
   3904   case Decl::UsingDirective:
   3905     return CXCursor_UsingDirective;
   3906   case Decl::StaticAssert:
   3907     return CXCursor_StaticAssert;
   3908   case Decl::Friend:
   3909     return CXCursor_FriendDecl;
   3910   case Decl::TranslationUnit:
   3911     return CXCursor_TranslationUnit;
   3912 
   3913   case Decl::Using:
   3914   case Decl::UnresolvedUsingValue:
   3915   case Decl::UnresolvedUsingTypename:
   3916     return CXCursor_UsingDeclaration;
   3917 
   3918   case Decl::ObjCPropertyImpl:
   3919     switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) {
   3920     case ObjCPropertyImplDecl::Dynamic:
   3921       return CXCursor_ObjCDynamicDecl;
   3922 
   3923     case ObjCPropertyImplDecl::Synthesize:
   3924       return CXCursor_ObjCSynthesizeDecl;
   3925     }
   3926     llvm_unreachable("Unexpected Kind!");
   3927 
   3928   case Decl::Import:
   3929     return CXCursor_ModuleImportDecl;
   3930 
   3931   case Decl::ObjCTypeParam:
   3932     return CXCursor_TemplateTypeParameter;
   3933 
   3934   default:
   3935     if (const auto *TD = dyn_cast<TagDecl>(D)) {
   3936       switch (TD->getTagKind()) {
   3937       case TTK_Interface: // fall through
   3938       case TTK_Struct:
   3939         return CXCursor_StructDecl;
   3940       case TTK_Class:
   3941         return CXCursor_ClassDecl;
   3942       case TTK_Union:
   3943         return CXCursor_UnionDecl;
   3944       case TTK_Enum:
   3945         return CXCursor_EnumDecl;
   3946       }
   3947     }
   3948   }
   3949 
   3950   return CXCursor_UnexposedDecl;
   3951 }
   3952 
   3953 static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results,
   3954                             bool LoadExternal, bool IncludeUndefined,
   3955                             bool TargetTypeIsPointer = false) {
   3956   typedef CodeCompletionResult Result;
   3957 
   3958   Results.EnterNewScope();
   3959 
   3960   for (Preprocessor::macro_iterator M = PP.macro_begin(LoadExternal),
   3961                                     MEnd = PP.macro_end(LoadExternal);
   3962        M != MEnd; ++M) {
   3963     auto MD = PP.getMacroDefinition(M->first);
   3964     if (IncludeUndefined || MD) {
   3965       MacroInfo *MI = MD.getMacroInfo();
   3966       if (MI && MI->isUsedForHeaderGuard())
   3967         continue;
   3968 
   3969       Results.AddResult(
   3970           Result(M->first, MI,
   3971                  getMacroUsagePriority(M->first->getName(), PP.getLangOpts(),
   3972                                        TargetTypeIsPointer)));
   3973     }
   3974   }
   3975 
   3976   Results.ExitScope();
   3977 }
   3978 
   3979 static void AddPrettyFunctionResults(const LangOptions &LangOpts,
   3980                                      ResultBuilder &Results) {
   3981   typedef CodeCompletionResult Result;
   3982 
   3983   Results.EnterNewScope();
   3984 
   3985   Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant));
   3986   Results.AddResult(Result("__FUNCTION__", CCP_Constant));
   3987   if (LangOpts.C99 || LangOpts.CPlusPlus11)
   3988     Results.AddResult(Result("__func__", CCP_Constant));
   3989   Results.ExitScope();
   3990 }
   3991 
   3992 static void HandleCodeCompleteResults(Sema *S,
   3993                                       CodeCompleteConsumer *CodeCompleter,
   3994                                       CodeCompletionContext Context,
   3995                                       CodeCompletionResult *Results,
   3996                                       unsigned NumResults) {
   3997   if (CodeCompleter)
   3998     CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults);
   3999 }
   4000 
   4001 static CodeCompletionContext
   4002 mapCodeCompletionContext(Sema &S, Sema::ParserCompletionContext PCC) {
   4003   switch (PCC) {
   4004   case Sema::PCC_Namespace:
   4005     return CodeCompletionContext::CCC_TopLevel;
   4006 
   4007   case Sema::PCC_Class:
   4008     return CodeCompletionContext::CCC_ClassStructUnion;
   4009 
   4010   case Sema::PCC_ObjCInterface:
   4011     return CodeCompletionContext::CCC_ObjCInterface;
   4012 
   4013   case Sema::PCC_ObjCImplementation:
   4014     return CodeCompletionContext::CCC_ObjCImplementation;
   4015 
   4016   case Sema::PCC_ObjCInstanceVariableList:
   4017     return CodeCompletionContext::CCC_ObjCIvarList;
   4018 
   4019   case Sema::PCC_Template:
   4020   case Sema::PCC_MemberTemplate:
   4021     if (S.CurContext->isFileContext())
   4022       return CodeCompletionContext::CCC_TopLevel;
   4023     if (S.CurContext->isRecord())
   4024       return CodeCompletionContext::CCC_ClassStructUnion;
   4025     return CodeCompletionContext::CCC_Other;
   4026 
   4027   case Sema::PCC_RecoveryInFunction:
   4028     return CodeCompletionContext::CCC_Recovery;
   4029 
   4030   case Sema::PCC_ForInit:
   4031     if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 ||
   4032         S.getLangOpts().ObjC)
   4033       return CodeCompletionContext::CCC_ParenthesizedExpression;
   4034     else
   4035       return CodeCompletionContext::CCC_Expression;
   4036 
   4037   case Sema::PCC_Expression:
   4038     return CodeCompletionContext::CCC_Expression;
   4039   case Sema::PCC_Condition:
   4040     return CodeCompletionContext(CodeCompletionContext::CCC_Expression,
   4041                                  S.getASTContext().BoolTy);
   4042 
   4043   case Sema::PCC_Statement:
   4044     return CodeCompletionContext::CCC_Statement;
   4045 
   4046   case Sema::PCC_Type:
   4047     return CodeCompletionContext::CCC_Type;
   4048 
   4049   case Sema::PCC_ParenthesizedExpression:
   4050     return CodeCompletionContext::CCC_ParenthesizedExpression;
   4051 
   4052   case Sema::PCC_LocalDeclarationSpecifiers:
   4053     return CodeCompletionContext::CCC_Type;
   4054   }
   4055 
   4056   llvm_unreachable("Invalid ParserCompletionContext!");
   4057 }
   4058 
   4059 /// If we're in a C++ virtual member function, add completion results
   4060 /// that invoke the functions we override, since it's common to invoke the
   4061 /// overridden function as well as adding new functionality.
   4062 ///
   4063 /// \param S The semantic analysis object for which we are generating results.
   4064 ///
   4065 /// \param InContext This context in which the nested-name-specifier preceding
   4066 /// the code-completion point
   4067 static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext,
   4068                                   ResultBuilder &Results) {
   4069   // Look through blocks.
   4070   DeclContext *CurContext = S.CurContext;
   4071   while (isa<BlockDecl>(CurContext))
   4072     CurContext = CurContext->getParent();
   4073 
   4074   CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext);
   4075   if (!Method || !Method->isVirtual())
   4076     return;
   4077 
   4078   // We need to have names for all of the parameters, if we're going to
   4079   // generate a forwarding call.
   4080   for (auto P : Method->parameters())
   4081     if (!P->getDeclName())
   4082       return;
   4083 
   4084   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
   4085   for (const CXXMethodDecl *Overridden : Method->overridden_methods()) {
   4086     CodeCompletionBuilder Builder(Results.getAllocator(),
   4087                                   Results.getCodeCompletionTUInfo());
   4088     if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl())
   4089       continue;
   4090 
   4091     // If we need a nested-name-specifier, add one now.
   4092     if (!InContext) {
   4093       NestedNameSpecifier *NNS = getRequiredQualification(
   4094           S.Context, CurContext, Overridden->getDeclContext());
   4095       if (NNS) {
   4096         std::string Str;
   4097         llvm::raw_string_ostream OS(Str);
   4098         NNS->print(OS, Policy);
   4099         Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str()));
   4100       }
   4101     } else if (!InContext->Equals(Overridden->getDeclContext()))
   4102       continue;
   4103 
   4104     Builder.AddTypedTextChunk(
   4105         Results.getAllocator().CopyString(Overridden->getNameAsString()));
   4106     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   4107     bool FirstParam = true;
   4108     for (auto P : Method->parameters()) {
   4109       if (FirstParam)
   4110         FirstParam = false;
   4111       else
   4112         Builder.AddChunk(CodeCompletionString::CK_Comma);
   4113 
   4114       Builder.AddPlaceholderChunk(
   4115           Results.getAllocator().CopyString(P->getIdentifier()->getName()));
   4116     }
   4117     Builder.AddChunk(CodeCompletionString::CK_RightParen);
   4118     Results.AddResult(CodeCompletionResult(
   4119         Builder.TakeString(), CCP_SuperCompletion, CXCursor_CXXMethod,
   4120         CXAvailability_Available, Overridden));
   4121     Results.Ignore(Overridden);
   4122   }
   4123 }
   4124 
   4125 void Sema::CodeCompleteModuleImport(SourceLocation ImportLoc,
   4126                                     ModuleIdPath Path) {
   4127   typedef CodeCompletionResult Result;
   4128   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   4129                         CodeCompleter->getCodeCompletionTUInfo(),
   4130                         CodeCompletionContext::CCC_Other);
   4131   Results.EnterNewScope();
   4132 
   4133   CodeCompletionAllocator &Allocator = Results.getAllocator();
   4134   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
   4135   typedef CodeCompletionResult Result;
   4136   if (Path.empty()) {
   4137     // Enumerate all top-level modules.
   4138     SmallVector<Module *, 8> Modules;
   4139     PP.getHeaderSearchInfo().collectAllModules(Modules);
   4140     for (unsigned I = 0, N = Modules.size(); I != N; ++I) {
   4141       Builder.AddTypedTextChunk(
   4142           Builder.getAllocator().CopyString(Modules[I]->Name));
   4143       Results.AddResult(Result(
   4144           Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl,
   4145           Modules[I]->isAvailable() ? CXAvailability_Available
   4146                                     : CXAvailability_NotAvailable));
   4147     }
   4148   } else if (getLangOpts().Modules) {
   4149     // Load the named module.
   4150     Module *Mod =
   4151         PP.getModuleLoader().loadModule(ImportLoc, Path, Module::AllVisible,
   4152                                         /*IsInclusionDirective=*/false);
   4153     // Enumerate submodules.
   4154     if (Mod) {
   4155       for (Module::submodule_iterator Sub = Mod->submodule_begin(),
   4156                                       SubEnd = Mod->submodule_end();
   4157            Sub != SubEnd; ++Sub) {
   4158 
   4159         Builder.AddTypedTextChunk(
   4160             Builder.getAllocator().CopyString((*Sub)->Name));
   4161         Results.AddResult(Result(
   4162             Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl,
   4163             (*Sub)->isAvailable() ? CXAvailability_Available
   4164                                   : CXAvailability_NotAvailable));
   4165       }
   4166     }
   4167   }
   4168   Results.ExitScope();
   4169   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   4170                             Results.data(), Results.size());
   4171 }
   4172 
   4173 void Sema::CodeCompleteOrdinaryName(Scope *S,
   4174                                     ParserCompletionContext CompletionContext) {
   4175   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   4176                         CodeCompleter->getCodeCompletionTUInfo(),
   4177                         mapCodeCompletionContext(*this, CompletionContext));
   4178   Results.EnterNewScope();
   4179 
   4180   // Determine how to filter results, e.g., so that the names of
   4181   // values (functions, enumerators, function templates, etc.) are
   4182   // only allowed where we can have an expression.
   4183   switch (CompletionContext) {
   4184   case PCC_Namespace:
   4185   case PCC_Class:
   4186   case PCC_ObjCInterface:
   4187   case PCC_ObjCImplementation:
   4188   case PCC_ObjCInstanceVariableList:
   4189   case PCC_Template:
   4190   case PCC_MemberTemplate:
   4191   case PCC_Type:
   4192   case PCC_LocalDeclarationSpecifiers:
   4193     Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
   4194     break;
   4195 
   4196   case PCC_Statement:
   4197   case PCC_ParenthesizedExpression:
   4198   case PCC_Expression:
   4199   case PCC_ForInit:
   4200   case PCC_Condition:
   4201     if (WantTypesInContext(CompletionContext, getLangOpts()))
   4202       Results.setFilter(&ResultBuilder::IsOrdinaryName);
   4203     else
   4204       Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
   4205 
   4206     if (getLangOpts().CPlusPlus)
   4207       MaybeAddOverrideCalls(*this, /*InContext=*/nullptr, Results);
   4208     break;
   4209 
   4210   case PCC_RecoveryInFunction:
   4211     // Unfiltered
   4212     break;
   4213   }
   4214 
   4215   // If we are in a C++ non-static member function, check the qualifiers on
   4216   // the member function to filter/prioritize the results list.
   4217   auto ThisType = getCurrentThisType();
   4218   if (!ThisType.isNull())
   4219     Results.setObjectTypeQualifiers(ThisType->getPointeeType().getQualifiers(),
   4220                                     VK_LValue);
   4221 
   4222   CodeCompletionDeclConsumer Consumer(Results, CurContext);
   4223   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
   4224                      CodeCompleter->includeGlobals(),
   4225                      CodeCompleter->loadExternal());
   4226 
   4227   AddOrdinaryNameResults(CompletionContext, S, *this, Results);
   4228   Results.ExitScope();
   4229 
   4230   switch (CompletionContext) {
   4231   case PCC_ParenthesizedExpression:
   4232   case PCC_Expression:
   4233   case PCC_Statement:
   4234   case PCC_RecoveryInFunction:
   4235     if (S->getFnParent())
   4236       AddPrettyFunctionResults(getLangOpts(), Results);
   4237     break;
   4238 
   4239   case PCC_Namespace:
   4240   case PCC_Class:
   4241   case PCC_ObjCInterface:
   4242   case PCC_ObjCImplementation:
   4243   case PCC_ObjCInstanceVariableList:
   4244   case PCC_Template:
   4245   case PCC_MemberTemplate:
   4246   case PCC_ForInit:
   4247   case PCC_Condition:
   4248   case PCC_Type:
   4249   case PCC_LocalDeclarationSpecifiers:
   4250     break;
   4251   }
   4252 
   4253   if (CodeCompleter->includeMacros())
   4254     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
   4255 
   4256   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   4257                             Results.data(), Results.size());
   4258 }
   4259 
   4260 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
   4261                                        ParsedType Receiver,
   4262                                        ArrayRef<IdentifierInfo *> SelIdents,
   4263                                        bool AtArgumentExpression, bool IsSuper,
   4264                                        ResultBuilder &Results);
   4265 
   4266 void Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS,
   4267                                 bool AllowNonIdentifiers,
   4268                                 bool AllowNestedNameSpecifiers) {
   4269   typedef CodeCompletionResult Result;
   4270   ResultBuilder Results(
   4271       *this, CodeCompleter->getAllocator(),
   4272       CodeCompleter->getCodeCompletionTUInfo(),
   4273       AllowNestedNameSpecifiers
   4274           // FIXME: Try to separate codepath leading here to deduce whether we
   4275           // need an existing symbol or a new one.
   4276           ? CodeCompletionContext::CCC_SymbolOrNewName
   4277           : CodeCompletionContext::CCC_NewName);
   4278   Results.EnterNewScope();
   4279 
   4280   // Type qualifiers can come after names.
   4281   Results.AddResult(Result("const"));
   4282   Results.AddResult(Result("volatile"));
   4283   if (getLangOpts().C99)
   4284     Results.AddResult(Result("restrict"));
   4285 
   4286   if (getLangOpts().CPlusPlus) {
   4287     if (getLangOpts().CPlusPlus11 &&
   4288         (DS.getTypeSpecType() == DeclSpec::TST_class ||
   4289          DS.getTypeSpecType() == DeclSpec::TST_struct))
   4290       Results.AddResult("final");
   4291 
   4292     if (AllowNonIdentifiers) {
   4293       Results.AddResult(Result("operator"));
   4294     }
   4295 
   4296     // Add nested-name-specifiers.
   4297     if (AllowNestedNameSpecifiers) {
   4298       Results.allowNestedNameSpecifiers();
   4299       Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy);
   4300       CodeCompletionDeclConsumer Consumer(Results, CurContext);
   4301       LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer,
   4302                          CodeCompleter->includeGlobals(),
   4303                          CodeCompleter->loadExternal());
   4304       Results.setFilter(nullptr);
   4305     }
   4306   }
   4307   Results.ExitScope();
   4308 
   4309   // If we're in a context where we might have an expression (rather than a
   4310   // declaration), and what we've seen so far is an Objective-C type that could
   4311   // be a receiver of a class message, this may be a class message send with
   4312   // the initial opening bracket '[' missing. Add appropriate completions.
   4313   if (AllowNonIdentifiers && !AllowNestedNameSpecifiers &&
   4314       DS.getParsedSpecifiers() == DeclSpec::PQ_TypeSpecifier &&
   4315       DS.getTypeSpecType() == DeclSpec::TST_typename &&
   4316       DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified &&
   4317       DS.getTypeSpecSign() == TypeSpecifierSign::Unspecified &&
   4318       !DS.isTypeAltiVecVector() && S &&
   4319       (S->getFlags() & Scope::DeclScope) != 0 &&
   4320       (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope |
   4321                         Scope::FunctionPrototypeScope | Scope::AtCatchScope)) ==
   4322           0) {
   4323     ParsedType T = DS.getRepAsType();
   4324     if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType())
   4325       AddClassMessageCompletions(*this, S, T, None, false, false, Results);
   4326   }
   4327 
   4328   // Note that we intentionally suppress macro results here, since we do not
   4329   // encourage using macros to produce the names of entities.
   4330 
   4331   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   4332                             Results.data(), Results.size());
   4333 }
   4334 
   4335 struct Sema::CodeCompleteExpressionData {
   4336   CodeCompleteExpressionData(QualType PreferredType = QualType(),
   4337                              bool IsParenthesized = false)
   4338       : PreferredType(PreferredType), IntegralConstantExpression(false),
   4339         ObjCCollection(false), IsParenthesized(IsParenthesized) {}
   4340 
   4341   QualType PreferredType;
   4342   bool IntegralConstantExpression;
   4343   bool ObjCCollection;
   4344   bool IsParenthesized;
   4345   SmallVector<Decl *, 4> IgnoreDecls;
   4346 };
   4347 
   4348 namespace {
   4349 /// Information that allows to avoid completing redundant enumerators.
   4350 struct CoveredEnumerators {
   4351   llvm::SmallPtrSet<EnumConstantDecl *, 8> Seen;
   4352   NestedNameSpecifier *SuggestedQualifier = nullptr;
   4353 };
   4354 } // namespace
   4355 
   4356 static void AddEnumerators(ResultBuilder &Results, ASTContext &Context,
   4357                            EnumDecl *Enum, DeclContext *CurContext,
   4358                            const CoveredEnumerators &Enumerators) {
   4359   NestedNameSpecifier *Qualifier = Enumerators.SuggestedQualifier;
   4360   if (Context.getLangOpts().CPlusPlus && !Qualifier && Enumerators.Seen.empty()) {
   4361     // If there are no prior enumerators in C++, check whether we have to
   4362     // qualify the names of the enumerators that we suggest, because they
   4363     // may not be visible in this scope.
   4364     Qualifier = getRequiredQualification(Context, CurContext, Enum);
   4365   }
   4366 
   4367   Results.EnterNewScope();
   4368   for (auto *E : Enum->enumerators()) {
   4369     if (Enumerators.Seen.count(E))
   4370       continue;
   4371 
   4372     CodeCompletionResult R(E, CCP_EnumInCase, Qualifier);
   4373     Results.AddResult(R, CurContext, nullptr, false);
   4374   }
   4375   Results.ExitScope();
   4376 }
   4377 
   4378 /// Try to find a corresponding FunctionProtoType for function-like types (e.g.
   4379 /// function pointers, std::function, etc).
   4380 static const FunctionProtoType *TryDeconstructFunctionLike(QualType T) {
   4381   assert(!T.isNull());
   4382   // Try to extract first template argument from std::function<> and similar.
   4383   // Note we only handle the sugared types, they closely match what users wrote.
   4384   // We explicitly choose to not handle ClassTemplateSpecializationDecl.
   4385   if (auto *Specialization = T->getAs<TemplateSpecializationType>()) {
   4386     if (Specialization->getNumArgs() != 1)
   4387       return nullptr;
   4388     const TemplateArgument &Argument = Specialization->getArg(0);
   4389     if (Argument.getKind() != TemplateArgument::Type)
   4390       return nullptr;
   4391     return Argument.getAsType()->getAs<FunctionProtoType>();
   4392   }
   4393   // Handle other cases.
   4394   if (T->isPointerType())
   4395     T = T->getPointeeType();
   4396   return T->getAs<FunctionProtoType>();
   4397 }
   4398 
   4399 /// Adds a pattern completion for a lambda expression with the specified
   4400 /// parameter types and placeholders for parameter names.
   4401 static void AddLambdaCompletion(ResultBuilder &Results,
   4402                                 llvm::ArrayRef<QualType> Parameters,
   4403                                 const LangOptions &LangOpts) {
   4404   if (!Results.includeCodePatterns())
   4405     return;
   4406   CodeCompletionBuilder Completion(Results.getAllocator(),
   4407                                    Results.getCodeCompletionTUInfo());
   4408   // [](<parameters>) {}
   4409   Completion.AddChunk(CodeCompletionString::CK_LeftBracket);
   4410   Completion.AddPlaceholderChunk("=");
   4411   Completion.AddChunk(CodeCompletionString::CK_RightBracket);
   4412   if (!Parameters.empty()) {
   4413     Completion.AddChunk(CodeCompletionString::CK_LeftParen);
   4414     bool First = true;
   4415     for (auto Parameter : Parameters) {
   4416       if (!First)
   4417         Completion.AddChunk(CodeCompletionString::ChunkKind::CK_Comma);
   4418       else
   4419         First = false;
   4420 
   4421       constexpr llvm::StringLiteral NamePlaceholder = "!#!NAME_GOES_HERE!#!";
   4422       std::string Type = std::string(NamePlaceholder);
   4423       Parameter.getAsStringInternal(Type, PrintingPolicy(LangOpts));
   4424       llvm::StringRef Prefix, Suffix;
   4425       std::tie(Prefix, Suffix) = llvm::StringRef(Type).split(NamePlaceholder);
   4426       Prefix = Prefix.rtrim();
   4427       Suffix = Suffix.ltrim();
   4428 
   4429       Completion.AddTextChunk(Completion.getAllocator().CopyString(Prefix));
   4430       Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   4431       Completion.AddPlaceholderChunk("parameter");
   4432       Completion.AddTextChunk(Completion.getAllocator().CopyString(Suffix));
   4433     };
   4434     Completion.AddChunk(CodeCompletionString::CK_RightParen);
   4435   }
   4436   Completion.AddChunk(clang::CodeCompletionString::CK_HorizontalSpace);
   4437   Completion.AddChunk(CodeCompletionString::CK_LeftBrace);
   4438   Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   4439   Completion.AddPlaceholderChunk("body");
   4440   Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   4441   Completion.AddChunk(CodeCompletionString::CK_RightBrace);
   4442 
   4443   Results.AddResult(Completion.TakeString());
   4444 }
   4445 
   4446 /// Perform code-completion in an expression context when we know what
   4447 /// type we're looking for.
   4448 void Sema::CodeCompleteExpression(Scope *S,
   4449                                   const CodeCompleteExpressionData &Data) {
   4450   ResultBuilder Results(
   4451       *this, CodeCompleter->getAllocator(),
   4452       CodeCompleter->getCodeCompletionTUInfo(),
   4453       CodeCompletionContext(
   4454           Data.IsParenthesized
   4455               ? CodeCompletionContext::CCC_ParenthesizedExpression
   4456               : CodeCompletionContext::CCC_Expression,
   4457           Data.PreferredType));
   4458   auto PCC =
   4459       Data.IsParenthesized ? PCC_ParenthesizedExpression : PCC_Expression;
   4460   if (Data.ObjCCollection)
   4461     Results.setFilter(&ResultBuilder::IsObjCCollection);
   4462   else if (Data.IntegralConstantExpression)
   4463     Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
   4464   else if (WantTypesInContext(PCC, getLangOpts()))
   4465     Results.setFilter(&ResultBuilder::IsOrdinaryName);
   4466   else
   4467     Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
   4468 
   4469   if (!Data.PreferredType.isNull())
   4470     Results.setPreferredType(Data.PreferredType.getNonReferenceType());
   4471 
   4472   // Ignore any declarations that we were told that we don't care about.
   4473   for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I)
   4474     Results.Ignore(Data.IgnoreDecls[I]);
   4475 
   4476   CodeCompletionDeclConsumer Consumer(Results, CurContext);
   4477   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
   4478                      CodeCompleter->includeGlobals(),
   4479                      CodeCompleter->loadExternal());
   4480 
   4481   Results.EnterNewScope();
   4482   AddOrdinaryNameResults(PCC, S, *this, Results);
   4483   Results.ExitScope();
   4484 
   4485   bool PreferredTypeIsPointer = false;
   4486   if (!Data.PreferredType.isNull()) {
   4487     PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() ||
   4488                              Data.PreferredType->isMemberPointerType() ||
   4489                              Data.PreferredType->isBlockPointerType();
   4490     if (Data.PreferredType->isEnumeralType()) {
   4491       EnumDecl *Enum = Data.PreferredType->castAs<EnumType>()->getDecl();
   4492       if (auto *Def = Enum->getDefinition())
   4493         Enum = Def;
   4494       // FIXME: collect covered enumerators in cases like:
   4495       //        if (x == my_enum::one) { ... } else if (x == ^) {}
   4496       AddEnumerators(Results, Context, Enum, CurContext, CoveredEnumerators());
   4497     }
   4498   }
   4499 
   4500   if (S->getFnParent() && !Data.ObjCCollection &&
   4501       !Data.IntegralConstantExpression)
   4502     AddPrettyFunctionResults(getLangOpts(), Results);
   4503 
   4504   if (CodeCompleter->includeMacros())
   4505     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false,
   4506                     PreferredTypeIsPointer);
   4507 
   4508   // Complete a lambda expression when preferred type is a function.
   4509   if (!Data.PreferredType.isNull() && getLangOpts().CPlusPlus11) {
   4510     if (const FunctionProtoType *F =
   4511             TryDeconstructFunctionLike(Data.PreferredType))
   4512       AddLambdaCompletion(Results, F->getParamTypes(), getLangOpts());
   4513   }
   4514 
   4515   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   4516                             Results.data(), Results.size());
   4517 }
   4518 
   4519 void Sema::CodeCompleteExpression(Scope *S, QualType PreferredType,
   4520                                   bool IsParenthesized) {
   4521   return CodeCompleteExpression(
   4522       S, CodeCompleteExpressionData(PreferredType, IsParenthesized));
   4523 }
   4524 
   4525 void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E,
   4526                                          QualType PreferredType) {
   4527   if (E.isInvalid())
   4528     CodeCompleteExpression(S, PreferredType);
   4529   else if (getLangOpts().ObjC)
   4530     CodeCompleteObjCInstanceMessage(S, E.get(), None, false);
   4531 }
   4532 
   4533 /// The set of properties that have already been added, referenced by
   4534 /// property name.
   4535 typedef llvm::SmallPtrSet<IdentifierInfo *, 16> AddedPropertiesSet;
   4536 
   4537 /// Retrieve the container definition, if any?
   4538 static ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) {
   4539   if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) {
   4540     if (Interface->hasDefinition())
   4541       return Interface->getDefinition();
   4542 
   4543     return Interface;
   4544   }
   4545 
   4546   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
   4547     if (Protocol->hasDefinition())
   4548       return Protocol->getDefinition();
   4549 
   4550     return Protocol;
   4551   }
   4552   return Container;
   4553 }
   4554 
   4555 /// Adds a block invocation code completion result for the given block
   4556 /// declaration \p BD.
   4557 static void AddObjCBlockCall(ASTContext &Context, const PrintingPolicy &Policy,
   4558                              CodeCompletionBuilder &Builder,
   4559                              const NamedDecl *BD,
   4560                              const FunctionTypeLoc &BlockLoc,
   4561                              const FunctionProtoTypeLoc &BlockProtoLoc) {
   4562   Builder.AddResultTypeChunk(
   4563       GetCompletionTypeString(BlockLoc.getReturnLoc().getType(), Context,
   4564                               Policy, Builder.getAllocator()));
   4565 
   4566   AddTypedNameChunk(Context, Policy, BD, Builder);
   4567   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   4568 
   4569   if (BlockProtoLoc && BlockProtoLoc.getTypePtr()->isVariadic()) {
   4570     Builder.AddPlaceholderChunk("...");
   4571   } else {
   4572     for (unsigned I = 0, N = BlockLoc.getNumParams(); I != N; ++I) {
   4573       if (I)
   4574         Builder.AddChunk(CodeCompletionString::CK_Comma);
   4575 
   4576       // Format the placeholder string.
   4577       std::string PlaceholderStr =
   4578           FormatFunctionParameter(Policy, BlockLoc.getParam(I));
   4579 
   4580       if (I == N - 1 && BlockProtoLoc &&
   4581           BlockProtoLoc.getTypePtr()->isVariadic())
   4582         PlaceholderStr += ", ...";
   4583 
   4584       // Add the placeholder string.
   4585       Builder.AddPlaceholderChunk(
   4586           Builder.getAllocator().CopyString(PlaceholderStr));
   4587     }
   4588   }
   4589 
   4590   Builder.AddChunk(CodeCompletionString::CK_RightParen);
   4591 }
   4592 
   4593 static void
   4594 AddObjCProperties(const CodeCompletionContext &CCContext,
   4595                   ObjCContainerDecl *Container, bool AllowCategories,
   4596                   bool AllowNullaryMethods, DeclContext *CurContext,
   4597                   AddedPropertiesSet &AddedProperties, ResultBuilder &Results,
   4598                   bool IsBaseExprStatement = false,
   4599                   bool IsClassProperty = false, bool InOriginalClass = true) {
   4600   typedef CodeCompletionResult Result;
   4601 
   4602   // Retrieve the definition.
   4603   Container = getContainerDef(Container);
   4604 
   4605   // Add properties in this container.
   4606   const auto AddProperty = [&](const ObjCPropertyDecl *P) {
   4607     if (!AddedProperties.insert(P->getIdentifier()).second)
   4608       return;
   4609 
   4610     // FIXME: Provide block invocation completion for non-statement
   4611     // expressions.
   4612     if (!P->getType().getTypePtr()->isBlockPointerType() ||
   4613         !IsBaseExprStatement) {
   4614       Result R = Result(P, Results.getBasePriority(P), nullptr);
   4615       if (!InOriginalClass)
   4616         setInBaseClass(R);
   4617       Results.MaybeAddResult(R, CurContext);
   4618       return;
   4619     }
   4620 
   4621     // Block setter and invocation completion is provided only when we are able
   4622     // to find the FunctionProtoTypeLoc with parameter names for the block.
   4623     FunctionTypeLoc BlockLoc;
   4624     FunctionProtoTypeLoc BlockProtoLoc;
   4625     findTypeLocationForBlockDecl(P->getTypeSourceInfo(), BlockLoc,
   4626                                  BlockProtoLoc);
   4627     if (!BlockLoc) {
   4628       Result R = Result(P, Results.getBasePriority(P), nullptr);
   4629       if (!InOriginalClass)
   4630         setInBaseClass(R);
   4631       Results.MaybeAddResult(R, CurContext);
   4632       return;
   4633     }
   4634 
   4635     // The default completion result for block properties should be the block
   4636     // invocation completion when the base expression is a statement.
   4637     CodeCompletionBuilder Builder(Results.getAllocator(),
   4638                                   Results.getCodeCompletionTUInfo());
   4639     AddObjCBlockCall(Container->getASTContext(),
   4640                      getCompletionPrintingPolicy(Results.getSema()), Builder, P,
   4641                      BlockLoc, BlockProtoLoc);
   4642     Result R = Result(Builder.TakeString(), P, Results.getBasePriority(P));
   4643     if (!InOriginalClass)
   4644       setInBaseClass(R);
   4645     Results.MaybeAddResult(R, CurContext);
   4646 
   4647     // Provide additional block setter completion iff the base expression is a
   4648     // statement and the block property is mutable.
   4649     if (!P->isReadOnly()) {
   4650       CodeCompletionBuilder Builder(Results.getAllocator(),
   4651                                     Results.getCodeCompletionTUInfo());
   4652       AddResultTypeChunk(Container->getASTContext(),
   4653                          getCompletionPrintingPolicy(Results.getSema()), P,
   4654                          CCContext.getBaseType(), Builder);
   4655       Builder.AddTypedTextChunk(
   4656           Results.getAllocator().CopyString(P->getName()));
   4657       Builder.AddChunk(CodeCompletionString::CK_Equal);
   4658 
   4659       std::string PlaceholderStr = formatBlockPlaceholder(
   4660           getCompletionPrintingPolicy(Results.getSema()), P, BlockLoc,
   4661           BlockProtoLoc, /*SuppressBlockName=*/true);
   4662       // Add the placeholder string.
   4663       Builder.AddPlaceholderChunk(
   4664           Builder.getAllocator().CopyString(PlaceholderStr));
   4665 
   4666       // When completing blocks properties that return void the default
   4667       // property completion result should show up before the setter,
   4668       // otherwise the setter completion should show up before the default
   4669       // property completion, as we normally want to use the result of the
   4670       // call.
   4671       Result R =
   4672           Result(Builder.TakeString(), P,
   4673                  Results.getBasePriority(P) +
   4674                      (BlockLoc.getTypePtr()->getReturnType()->isVoidType()
   4675                           ? CCD_BlockPropertySetter
   4676                           : -CCD_BlockPropertySetter));
   4677       if (!InOriginalClass)
   4678         setInBaseClass(R);
   4679       Results.MaybeAddResult(R, CurContext);
   4680     }
   4681   };
   4682 
   4683   if (IsClassProperty) {
   4684     for (const auto *P : Container->class_properties())
   4685       AddProperty(P);
   4686   } else {
   4687     for (const auto *P : Container->instance_properties())
   4688       AddProperty(P);
   4689   }
   4690 
   4691   // Add nullary methods or implicit class properties
   4692   if (AllowNullaryMethods) {
   4693     ASTContext &Context = Container->getASTContext();
   4694     PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
   4695     // Adds a method result
   4696     const auto AddMethod = [&](const ObjCMethodDecl *M) {
   4697       IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0);
   4698       if (!Name)
   4699         return;
   4700       if (!AddedProperties.insert(Name).second)
   4701         return;
   4702       CodeCompletionBuilder Builder(Results.getAllocator(),
   4703                                     Results.getCodeCompletionTUInfo());
   4704       AddResultTypeChunk(Context, Policy, M, CCContext.getBaseType(), Builder);
   4705       Builder.AddTypedTextChunk(
   4706           Results.getAllocator().CopyString(Name->getName()));
   4707       Result R = Result(Builder.TakeString(), M,
   4708                         CCP_MemberDeclaration + CCD_MethodAsProperty);
   4709       if (!InOriginalClass)
   4710         setInBaseClass(R);
   4711       Results.MaybeAddResult(R, CurContext);
   4712     };
   4713 
   4714     if (IsClassProperty) {
   4715       for (const auto *M : Container->methods()) {
   4716         // Gather the class method that can be used as implicit property
   4717         // getters. Methods with arguments or methods that return void aren't
   4718         // added to the results as they can't be used as a getter.
   4719         if (!M->getSelector().isUnarySelector() ||
   4720             M->getReturnType()->isVoidType() || M->isInstanceMethod())
   4721           continue;
   4722         AddMethod(M);
   4723       }
   4724     } else {
   4725       for (auto *M : Container->methods()) {
   4726         if (M->getSelector().isUnarySelector())
   4727           AddMethod(M);
   4728       }
   4729     }
   4730   }
   4731 
   4732   // Add properties in referenced protocols.
   4733   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
   4734     for (auto *P : Protocol->protocols())
   4735       AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods,
   4736                         CurContext, AddedProperties, Results,
   4737                         IsBaseExprStatement, IsClassProperty,
   4738                         /*InOriginalClass*/ false);
   4739   } else if (ObjCInterfaceDecl *IFace =
   4740                  dyn_cast<ObjCInterfaceDecl>(Container)) {
   4741     if (AllowCategories) {
   4742       // Look through categories.
   4743       for (auto *Cat : IFace->known_categories())
   4744         AddObjCProperties(CCContext, Cat, AllowCategories, AllowNullaryMethods,
   4745                           CurContext, AddedProperties, Results,
   4746                           IsBaseExprStatement, IsClassProperty,
   4747                           InOriginalClass);
   4748     }
   4749 
   4750     // Look through protocols.
   4751     for (auto *I : IFace->all_referenced_protocols())
   4752       AddObjCProperties(CCContext, I, AllowCategories, AllowNullaryMethods,
   4753                         CurContext, AddedProperties, Results,
   4754                         IsBaseExprStatement, IsClassProperty,
   4755                         /*InOriginalClass*/ false);
   4756 
   4757     // Look in the superclass.
   4758     if (IFace->getSuperClass())
   4759       AddObjCProperties(CCContext, IFace->getSuperClass(), AllowCategories,
   4760                         AllowNullaryMethods, CurContext, AddedProperties,
   4761                         Results, IsBaseExprStatement, IsClassProperty,
   4762                         /*InOriginalClass*/ false);
   4763   } else if (const auto *Category =
   4764                  dyn_cast<ObjCCategoryDecl>(Container)) {
   4765     // Look through protocols.
   4766     for (auto *P : Category->protocols())
   4767       AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods,
   4768                         CurContext, AddedProperties, Results,
   4769                         IsBaseExprStatement, IsClassProperty,
   4770                         /*InOriginalClass*/ false);
   4771   }
   4772 }
   4773 
   4774 static void AddRecordMembersCompletionResults(
   4775     Sema &SemaRef, ResultBuilder &Results, Scope *S, QualType BaseType,
   4776     ExprValueKind BaseKind, RecordDecl *RD, Optional<FixItHint> AccessOpFixIt) {
   4777   // Indicate that we are performing a member access, and the cv-qualifiers
   4778   // for the base object type.
   4779   Results.setObjectTypeQualifiers(BaseType.getQualifiers(), BaseKind);
   4780 
   4781   // Access to a C/C++ class, struct, or union.
   4782   Results.allowNestedNameSpecifiers();
   4783   std::vector<FixItHint> FixIts;
   4784   if (AccessOpFixIt)
   4785     FixIts.emplace_back(AccessOpFixIt.getValue());
   4786   CodeCompletionDeclConsumer Consumer(Results, RD, BaseType, std::move(FixIts));
   4787   SemaRef.LookupVisibleDecls(RD, Sema::LookupMemberName, Consumer,
   4788                              SemaRef.CodeCompleter->includeGlobals(),
   4789                              /*IncludeDependentBases=*/true,
   4790                              SemaRef.CodeCompleter->loadExternal());
   4791 
   4792   if (SemaRef.getLangOpts().CPlusPlus) {
   4793     if (!Results.empty()) {
   4794       // The "template" keyword can follow "->" or "." in the grammar.
   4795       // However, we only want to suggest the template keyword if something
   4796       // is dependent.
   4797       bool IsDependent = BaseType->isDependentType();
   4798       if (!IsDependent) {
   4799         for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent())
   4800           if (DeclContext *Ctx = DepScope->getEntity()) {
   4801             IsDependent = Ctx->isDependentContext();
   4802             break;
   4803           }
   4804       }
   4805 
   4806       if (IsDependent)
   4807         Results.AddResult(CodeCompletionResult("template"));
   4808     }
   4809   }
   4810 }
   4811 
   4812 // Returns the RecordDecl inside the BaseType, falling back to primary template
   4813 // in case of specializations. Since we might not have a decl for the
   4814 // instantiation/specialization yet, e.g. dependent code.
   4815 static RecordDecl *getAsRecordDecl(const QualType BaseType) {
   4816   if (auto *RD = BaseType->getAsRecordDecl()) {
   4817     if (const auto *CTSD =
   4818             llvm::dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
   4819       // Template might not be instantiated yet, fall back to primary template
   4820       // in such cases.
   4821       if (CTSD->getTemplateSpecializationKind() == TSK_Undeclared)
   4822         RD = CTSD->getSpecializedTemplate()->getTemplatedDecl();
   4823     }
   4824     return RD;
   4825   }
   4826 
   4827   if (const auto *TST = BaseType->getAs<TemplateSpecializationType>()) {
   4828     if (const auto *TD = dyn_cast_or_null<ClassTemplateDecl>(
   4829             TST->getTemplateName().getAsTemplateDecl())) {
   4830       return TD->getTemplatedDecl();
   4831     }
   4832   }
   4833 
   4834   return nullptr;
   4835 }
   4836 
   4837 namespace {
   4838 // Collects completion-relevant information about a concept-constrainted type T.
   4839 // In particular, examines the constraint expressions to find members of T.
   4840 //
   4841 // The design is very simple: we walk down each constraint looking for
   4842 // expressions of the form T.foo().
   4843 // If we're extra lucky, the return type is specified.
   4844 // We don't do any clever handling of && or || in constraint expressions, we
   4845 // take members from both branches.
   4846 //
   4847 // For example, given:
   4848 //   template <class T> concept X = requires (T t, string& s) { t.print(s); };
   4849 //   template <X U> void foo(U u) { u.^ }
   4850 // We want to suggest the inferred member function 'print(string)'.
   4851 // We see that u has type U, so X<U> holds.
   4852 // X<U> requires t.print(s) to be valid, where t has type U (substituted for T).
   4853 // By looking at the CallExpr we find the signature of print().
   4854 //
   4855 // While we tend to know in advance which kind of members (access via . -> ::)
   4856 // we want, it's simpler just to gather them all and post-filter.
   4857 //
   4858 // FIXME: some of this machinery could be used for non-concept type-parms too,
   4859 // enabling completion for type parameters based on other uses of that param.
   4860 //
   4861 // FIXME: there are other cases where a type can be constrained by a concept,
   4862 // e.g. inside `if constexpr(ConceptSpecializationExpr) { ... }`
   4863 class ConceptInfo {
   4864 public:
   4865   // Describes a likely member of a type, inferred by concept constraints.
   4866   // Offered as a code completion for T. T-> and T:: contexts.
   4867   struct Member {
   4868     // Always non-null: we only handle members with ordinary identifier names.
   4869     const IdentifierInfo *Name = nullptr;
   4870     // Set for functions we've seen called.
   4871     // We don't have the declared parameter types, only the actual types of
   4872     // arguments we've seen. These are still valuable, as it's hard to render
   4873     // a useful function completion with neither parameter types nor names!
   4874     llvm::Optional<SmallVector<QualType, 1>> ArgTypes;
   4875     // Whether this is accessed as T.member, T->member, or T::member.
   4876     enum AccessOperator {
   4877       Colons,
   4878       Arrow,
   4879       Dot,
   4880     } Operator = Dot;
   4881     // What's known about the type of a variable or return type of a function.
   4882     const TypeConstraint *ResultType = nullptr;
   4883     // FIXME: also track:
   4884     //   - kind of entity (function/variable/type), to expose structured results
   4885     //   - template args kinds/types, as a proxy for template params
   4886 
   4887     // For now we simply return these results as "pattern" strings.
   4888     CodeCompletionString *render(Sema &S, CodeCompletionAllocator &Alloc,
   4889                                  CodeCompletionTUInfo &Info) const {
   4890       CodeCompletionBuilder B(Alloc, Info);
   4891       // Result type
   4892       if (ResultType) {
   4893         std::string AsString;
   4894         {
   4895           llvm::raw_string_ostream OS(AsString);
   4896           QualType ExactType = deduceType(*ResultType);
   4897           if (!ExactType.isNull())
   4898             ExactType.print(OS, getCompletionPrintingPolicy(S));
   4899           else
   4900             ResultType->print(OS, getCompletionPrintingPolicy(S));
   4901         }
   4902         B.AddResultTypeChunk(Alloc.CopyString(AsString));
   4903       }
   4904       // Member name
   4905       B.AddTypedTextChunk(Alloc.CopyString(Name->getName()));
   4906       // Function argument list
   4907       if (ArgTypes) {
   4908         B.AddChunk(clang::CodeCompletionString::CK_LeftParen);
   4909         bool First = true;
   4910         for (QualType Arg : *ArgTypes) {
   4911           if (First)
   4912             First = false;
   4913           else {
   4914             B.AddChunk(clang::CodeCompletionString::CK_Comma);
   4915             B.AddChunk(clang::CodeCompletionString::CK_HorizontalSpace);
   4916           }
   4917           B.AddPlaceholderChunk(Alloc.CopyString(
   4918               Arg.getAsString(getCompletionPrintingPolicy(S))));
   4919         }
   4920         B.AddChunk(clang::CodeCompletionString::CK_RightParen);
   4921       }
   4922       return B.TakeString();
   4923     }
   4924   };
   4925 
   4926   // BaseType is the type parameter T to infer members from.
   4927   // T must be accessible within S, as we use it to find the template entity
   4928   // that T is attached to in order to gather the relevant constraints.
   4929   ConceptInfo(const TemplateTypeParmType &BaseType, Scope *S) {
   4930     auto *TemplatedEntity = getTemplatedEntity(BaseType.getDecl(), S);
   4931     for (const Expr *E : constraintsForTemplatedEntity(TemplatedEntity))
   4932       believe(E, &BaseType);
   4933   }
   4934 
   4935   std::vector<Member> members() {
   4936     std::vector<Member> Results;
   4937     for (const auto &E : this->Results)
   4938       Results.push_back(E.second);
   4939     llvm::sort(Results, [](const Member &L, const Member &R) {
   4940       return L.Name->getName() < R.Name->getName();
   4941     });
   4942     return Results;
   4943   }
   4944 
   4945 private:
   4946   // Infer members of T, given that the expression E (dependent on T) is true.
   4947   void believe(const Expr *E, const TemplateTypeParmType *T) {
   4948     if (!E || !T)
   4949       return;
   4950     if (auto *CSE = dyn_cast<ConceptSpecializationExpr>(E)) {
   4951       // If the concept is
   4952       //   template <class A, class B> concept CD = f<A, B>();
   4953       // And the concept specialization is
   4954       //   CD<int, T>
   4955       // Then we're substituting T for B, so we want to make f<A, B>() true
   4956       // by adding members to B - i.e. believe(f<A, B>(), B);
   4957       //
   4958       // For simplicity:
   4959       // - we don't attempt to substitute int for A
   4960       // - when T is used in other ways (like CD<T*>) we ignore it
   4961       ConceptDecl *CD = CSE->getNamedConcept();
   4962       TemplateParameterList *Params = CD->getTemplateParameters();
   4963       unsigned Index = 0;
   4964       for (const auto &Arg : CSE->getTemplateArguments()) {
   4965         if (Index >= Params->size())
   4966           break; // Won't happen in valid code.
   4967         if (isApprox(Arg, T)) {
   4968           auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Params->getParam(Index));
   4969           if (!TTPD)
   4970             continue;
   4971           // T was used as an argument, and bound to the parameter TT.
   4972           auto *TT = cast<TemplateTypeParmType>(TTPD->getTypeForDecl());
   4973           // So now we know the constraint as a function of TT is true.
   4974           believe(CD->getConstraintExpr(), TT);
   4975           // (concepts themselves have no associated constraints to require)
   4976         }
   4977 
   4978         ++Index;
   4979       }
   4980     } else if (auto *BO = dyn_cast<BinaryOperator>(E)) {
   4981       // For A && B, we can infer members from both branches.
   4982       // For A || B, the union is still more useful than the intersection.
   4983       if (BO->getOpcode() == BO_LAnd || BO->getOpcode() == BO_LOr) {
   4984         believe(BO->getLHS(), T);
   4985         believe(BO->getRHS(), T);
   4986       }
   4987     } else if (auto *RE = dyn_cast<RequiresExpr>(E)) {
   4988       // A requires(){...} lets us infer members from each requirement.
   4989       for (const concepts::Requirement *Req : RE->getRequirements()) {
   4990         if (!Req->isDependent())
   4991           continue; // Can't tell us anything about T.
   4992         // Now Req cannot a substitution-error: those aren't dependent.
   4993 
   4994         if (auto *TR = dyn_cast<concepts::TypeRequirement>(Req)) {
   4995           // Do a full traversal so we get `foo` from `typename T::foo::bar`.
   4996           QualType AssertedType = TR->getType()->getType();
   4997           ValidVisitor(this, T).TraverseType(AssertedType);
   4998         } else if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
   4999           ValidVisitor Visitor(this, T);
   5000           // If we have a type constraint on the value of the expression,
   5001           // AND the whole outer expression describes a member, then we'll
   5002           // be able to use the constraint to provide the return type.
   5003           if (ER->getReturnTypeRequirement().isTypeConstraint()) {
   5004             Visitor.OuterType =
   5005                 ER->getReturnTypeRequirement().getTypeConstraint();
   5006             Visitor.OuterExpr = ER->getExpr();
   5007           }
   5008           Visitor.TraverseStmt(ER->getExpr());
   5009         } else if (auto *NR = dyn_cast<concepts::NestedRequirement>(Req)) {
   5010           believe(NR->getConstraintExpr(), T);
   5011         }
   5012       }
   5013     }
   5014   }
   5015 
   5016   // This visitor infers members of T based on traversing expressions/types
   5017   // that involve T. It is invoked with code known to be valid for T.
   5018   class ValidVisitor : public RecursiveASTVisitor<ValidVisitor> {
   5019     ConceptInfo *Outer;
   5020     const TemplateTypeParmType *T;
   5021 
   5022     CallExpr *Caller = nullptr;
   5023     Expr *Callee = nullptr;
   5024 
   5025   public:
   5026     // If set, OuterExpr is constrained by OuterType.
   5027     Expr *OuterExpr = nullptr;
   5028     const TypeConstraint *OuterType = nullptr;
   5029 
   5030     ValidVisitor(ConceptInfo *Outer, const TemplateTypeParmType *T)
   5031         : Outer(Outer), T(T) {
   5032       assert(T);
   5033     }
   5034 
   5035     // In T.foo or T->foo, `foo` is a member function/variable.
   5036     bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) {
   5037       const Type *Base = E->getBaseType().getTypePtr();
   5038       bool IsArrow = E->isArrow();
   5039       if (Base->isPointerType() && IsArrow) {
   5040         IsArrow = false;
   5041         Base = Base->getPointeeType().getTypePtr();
   5042       }
   5043       if (isApprox(Base, T))
   5044         addValue(E, E->getMember(), IsArrow ? Member::Arrow : Member::Dot);
   5045       return true;
   5046     }
   5047 
   5048     // In T::foo, `foo` is a static member function/variable.
   5049     bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
   5050       if (E->getQualifier() && isApprox(E->getQualifier()->getAsType(), T))
   5051         addValue(E, E->getDeclName(), Member::Colons);
   5052       return true;
   5053     }
   5054 
   5055     // In T::typename foo, `foo` is a type.
   5056     bool VisitDependentNameType(DependentNameType *DNT) {
   5057       const auto *Q = DNT->getQualifier();
   5058       if (Q && isApprox(Q->getAsType(), T))
   5059         addType(DNT->getIdentifier());
   5060       return true;
   5061     }
   5062 
   5063     // In T::foo::bar, `foo` must be a type.
   5064     // VisitNNS() doesn't exist, and TraverseNNS isn't always called :-(
   5065     bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNSL) {
   5066       if (NNSL) {
   5067         NestedNameSpecifier *NNS = NNSL.getNestedNameSpecifier();
   5068         const auto *Q = NNS->getPrefix();
   5069         if (Q && isApprox(Q->getAsType(), T))
   5070           addType(NNS->getAsIdentifier());
   5071       }
   5072       // FIXME: also handle T::foo<X>::bar
   5073       return RecursiveASTVisitor::TraverseNestedNameSpecifierLoc(NNSL);
   5074     }
   5075 
   5076     // FIXME also handle T::foo<X>
   5077 
   5078     // Track the innermost caller/callee relationship so we can tell if a
   5079     // nested expr is being called as a function.
   5080     bool VisitCallExpr(CallExpr *CE) {
   5081       Caller = CE;
   5082       Callee = CE->getCallee();
   5083       return true;
   5084     }
   5085 
   5086   private:
   5087     void addResult(Member &&M) {
   5088       auto R = Outer->Results.try_emplace(M.Name);
   5089       Member &O = R.first->second;
   5090       // Overwrite existing if the new member has more info.
   5091       // The preference of . vs :: vs -> is fairly arbitrary.
   5092       if (/*Inserted*/ R.second ||
   5093           std::make_tuple(M.ArgTypes.hasValue(), M.ResultType != nullptr,
   5094                           M.Operator) > std::make_tuple(O.ArgTypes.hasValue(),
   5095                                                         O.ResultType != nullptr,
   5096                                                         O.Operator))
   5097         O = std::move(M);
   5098     }
   5099 
   5100     void addType(const IdentifierInfo *Name) {
   5101       if (!Name)
   5102         return;
   5103       Member M;
   5104       M.Name = Name;
   5105       M.Operator = Member::Colons;
   5106       addResult(std::move(M));
   5107     }
   5108 
   5109     void addValue(Expr *E, DeclarationName Name,
   5110                   Member::AccessOperator Operator) {
   5111       if (!Name.isIdentifier())
   5112         return;
   5113       Member Result;
   5114       Result.Name = Name.getAsIdentifierInfo();
   5115       Result.Operator = Operator;
   5116       // If this is the callee of an immediately-enclosing CallExpr, then
   5117       // treat it as a method, otherwise it's a variable.
   5118       if (Caller != nullptr && Callee == E) {
   5119         Result.ArgTypes.emplace();
   5120         for (const auto *Arg : Caller->arguments())
   5121           Result.ArgTypes->push_back(Arg->getType());
   5122         if (Caller == OuterExpr) {
   5123           Result.ResultType = OuterType;
   5124         }
   5125       } else {
   5126         if (E == OuterExpr)
   5127           Result.ResultType = OuterType;
   5128       }
   5129       addResult(std::move(Result));
   5130     }
   5131   };
   5132 
   5133   static bool isApprox(const TemplateArgument &Arg, const Type *T) {
   5134     return Arg.getKind() == TemplateArgument::Type &&
   5135            isApprox(Arg.getAsType().getTypePtr(), T);
   5136   }
   5137 
   5138   static bool isApprox(const Type *T1, const Type *T2) {
   5139     return T1 && T2 &&
   5140            T1->getCanonicalTypeUnqualified() ==
   5141                T2->getCanonicalTypeUnqualified();
   5142   }
   5143 
   5144   // Returns the DeclContext immediately enclosed by the template parameter
   5145   // scope. For primary templates, this is the templated (e.g.) CXXRecordDecl.
   5146   // For specializations, this is e.g. ClassTemplatePartialSpecializationDecl.
   5147   static DeclContext *getTemplatedEntity(const TemplateTypeParmDecl *D,
   5148                                          Scope *S) {
   5149     if (D == nullptr)
   5150       return nullptr;
   5151     Scope *Inner = nullptr;
   5152     while (S) {
   5153       if (S->isTemplateParamScope() && S->isDeclScope(D))
   5154         return Inner ? Inner->getEntity() : nullptr;
   5155       Inner = S;
   5156       S = S->getParent();
   5157     }
   5158     return nullptr;
   5159   }
   5160 
   5161   // Gets all the type constraint expressions that might apply to the type
   5162   // variables associated with DC (as returned by getTemplatedEntity()).
   5163   static SmallVector<const Expr *, 1>
   5164   constraintsForTemplatedEntity(DeclContext *DC) {
   5165     SmallVector<const Expr *, 1> Result;
   5166     if (DC == nullptr)
   5167       return Result;
   5168     // Primary templates can have constraints.
   5169     if (const auto *TD = cast<Decl>(DC)->getDescribedTemplate())
   5170       TD->getAssociatedConstraints(Result);
   5171     // Partial specializations may have constraints.
   5172     if (const auto *CTPSD =
   5173             dyn_cast<ClassTemplatePartialSpecializationDecl>(DC))
   5174       CTPSD->getAssociatedConstraints(Result);
   5175     if (const auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(DC))
   5176       VTPSD->getAssociatedConstraints(Result);
   5177     return Result;
   5178   }
   5179 
   5180   // Attempt to find the unique type satisfying a constraint.
   5181   // This lets us show e.g. `int` instead of `std::same_as<int>`.
   5182   static QualType deduceType(const TypeConstraint &T) {
   5183     // Assume a same_as<T> return type constraint is std::same_as or equivalent.
   5184     // In this case the return type is T.
   5185     DeclarationName DN = T.getNamedConcept()->getDeclName();
   5186     if (DN.isIdentifier() && DN.getAsIdentifierInfo()->isStr("same_as"))
   5187       if (const auto *Args = T.getTemplateArgsAsWritten())
   5188         if (Args->getNumTemplateArgs() == 1) {
   5189           const auto &Arg = Args->arguments().front().getArgument();
   5190           if (Arg.getKind() == TemplateArgument::Type)
   5191             return Arg.getAsType();
   5192         }
   5193     return {};
   5194   }
   5195 
   5196   llvm::DenseMap<const IdentifierInfo *, Member> Results;
   5197 };
   5198 
   5199 // Returns a type for E that yields acceptable member completions.
   5200 // In particular, when E->getType() is DependentTy, try to guess a likely type.
   5201 // We accept some lossiness (like dropping parameters).
   5202 // We only try to handle common expressions on the LHS of MemberExpr.
   5203 QualType getApproximateType(const Expr *E) {
   5204   QualType Unresolved = E->getType();
   5205   if (Unresolved.isNull() ||
   5206       !Unresolved->isSpecificBuiltinType(BuiltinType::Dependent))
   5207     return Unresolved;
   5208   E = E->IgnoreParens();
   5209   // A call: approximate-resolve callee to a function type, get its return type
   5210   if (const CallExpr *CE = llvm::dyn_cast<CallExpr>(E)) {
   5211     QualType Callee = getApproximateType(CE->getCallee());
   5212     if (Callee.isNull() ||
   5213         Callee->isSpecificPlaceholderType(BuiltinType::BoundMember))
   5214       Callee = Expr::findBoundMemberType(CE->getCallee());
   5215     if (Callee.isNull())
   5216       return Unresolved;
   5217 
   5218     if (const auto *FnTypePtr = Callee->getAs<PointerType>()) {
   5219       Callee = FnTypePtr->getPointeeType();
   5220     } else if (const auto *BPT = Callee->getAs<BlockPointerType>()) {
   5221       Callee = BPT->getPointeeType();
   5222     }
   5223     if (const FunctionType *FnType = Callee->getAs<FunctionType>())
   5224       return FnType->getReturnType().getNonReferenceType();
   5225 
   5226     // Unresolved call: try to guess the return type.
   5227     if (const auto *OE = llvm::dyn_cast<OverloadExpr>(CE->getCallee())) {
   5228       // If all candidates have the same approximate return type, use it.
   5229       // Discard references and const to allow more to be "the same".
   5230       // (In particular, if there's one candidate + ADL, resolve it).
   5231       const Type *Common = nullptr;
   5232       for (const auto *D : OE->decls()) {
   5233         QualType ReturnType;
   5234         if (const auto *FD = llvm::dyn_cast<FunctionDecl>(D))
   5235           ReturnType = FD->getReturnType();
   5236         else if (const auto *FTD = llvm::dyn_cast<FunctionTemplateDecl>(D))
   5237           ReturnType = FTD->getTemplatedDecl()->getReturnType();
   5238         if (ReturnType.isNull())
   5239           continue;
   5240         const Type *Candidate =
   5241             ReturnType.getNonReferenceType().getCanonicalType().getTypePtr();
   5242         if (Common && Common != Candidate)
   5243           return Unresolved; // Multiple candidates.
   5244         Common = Candidate;
   5245       }
   5246       if (Common != nullptr)
   5247         return QualType(Common, 0);
   5248     }
   5249   }
   5250   // A dependent member: approximate-resolve the base, then lookup.
   5251   if (const auto *CDSME = llvm::dyn_cast<CXXDependentScopeMemberExpr>(E)) {
   5252     QualType Base = CDSME->isImplicitAccess()
   5253                         ? CDSME->getBaseType()
   5254                         : getApproximateType(CDSME->getBase());
   5255     if (CDSME->isArrow() && !Base.isNull())
   5256       Base = Base->getPointeeType(); // could handle unique_ptr etc here?
   5257     RecordDecl *RD = Base.isNull() ? nullptr : getAsRecordDecl(Base);
   5258     if (RD && RD->isCompleteDefinition()) {
   5259       for (const auto *Member : RD->lookup(CDSME->getMember()))
   5260         if (const ValueDecl *VD = llvm::dyn_cast<ValueDecl>(Member))
   5261           return VD->getType().getNonReferenceType();
   5262     }
   5263   }
   5264   return Unresolved;
   5265 }
   5266 
   5267 // If \p Base is ParenListExpr, assume a chain of comma operators and pick the
   5268 // last expr. We expect other ParenListExprs to be resolved to e.g. constructor
   5269 // calls before here. (So the ParenListExpr should be nonempty, but check just
   5270 // in case)
   5271 Expr *unwrapParenList(Expr *Base) {
   5272   if (auto *PLE = llvm::dyn_cast_or_null<ParenListExpr>(Base)) {
   5273     if (PLE->getNumExprs() == 0)
   5274       return nullptr;
   5275     Base = PLE->getExpr(PLE->getNumExprs() - 1);
   5276   }
   5277   return Base;
   5278 }
   5279 
   5280 } // namespace
   5281 
   5282 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base,
   5283                                            Expr *OtherOpBase,
   5284                                            SourceLocation OpLoc, bool IsArrow,
   5285                                            bool IsBaseExprStatement,
   5286                                            QualType PreferredType) {
   5287   Base = unwrapParenList(Base);
   5288   OtherOpBase = unwrapParenList(OtherOpBase);
   5289   if (!Base || !CodeCompleter)
   5290     return;
   5291 
   5292   ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow);
   5293   if (ConvertedBase.isInvalid())
   5294     return;
   5295   QualType ConvertedBaseType = getApproximateType(ConvertedBase.get());
   5296 
   5297   enum CodeCompletionContext::Kind contextKind;
   5298 
   5299   if (IsArrow) {
   5300     if (const auto *Ptr = ConvertedBaseType->getAs<PointerType>())
   5301       ConvertedBaseType = Ptr->getPointeeType();
   5302   }
   5303 
   5304   if (IsArrow) {
   5305     contextKind = CodeCompletionContext::CCC_ArrowMemberAccess;
   5306   } else {
   5307     if (ConvertedBaseType->isObjCObjectPointerType() ||
   5308         ConvertedBaseType->isObjCObjectOrInterfaceType()) {
   5309       contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess;
   5310     } else {
   5311       contextKind = CodeCompletionContext::CCC_DotMemberAccess;
   5312     }
   5313   }
   5314 
   5315   CodeCompletionContext CCContext(contextKind, ConvertedBaseType);
   5316   CCContext.setPreferredType(PreferredType);
   5317   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   5318                         CodeCompleter->getCodeCompletionTUInfo(), CCContext,
   5319                         &ResultBuilder::IsMember);
   5320 
   5321   auto DoCompletion = [&](Expr *Base, bool IsArrow,
   5322                           Optional<FixItHint> AccessOpFixIt) -> bool {
   5323     if (!Base)
   5324       return false;
   5325 
   5326     ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow);
   5327     if (ConvertedBase.isInvalid())
   5328       return false;
   5329     Base = ConvertedBase.get();
   5330 
   5331     QualType BaseType = getApproximateType(Base);
   5332     if (BaseType.isNull())
   5333       return false;
   5334     ExprValueKind BaseKind = Base->getValueKind();
   5335 
   5336     if (IsArrow) {
   5337       if (const PointerType *Ptr = BaseType->getAs<PointerType>()) {
   5338         BaseType = Ptr->getPointeeType();
   5339         BaseKind = VK_LValue;
   5340       } else if (BaseType->isObjCObjectPointerType() ||
   5341                  BaseType->isTemplateTypeParmType()) {
   5342         // Both cases (dot/arrow) handled below.
   5343       } else {
   5344         return false;
   5345       }
   5346     }
   5347 
   5348     if (RecordDecl *RD = getAsRecordDecl(BaseType)) {
   5349       AddRecordMembersCompletionResults(*this, Results, S, BaseType, BaseKind,
   5350                                         RD, std::move(AccessOpFixIt));
   5351     } else if (const auto *TTPT =
   5352                    dyn_cast<TemplateTypeParmType>(BaseType.getTypePtr())) {
   5353       auto Operator =
   5354           IsArrow ? ConceptInfo::Member::Arrow : ConceptInfo::Member::Dot;
   5355       for (const auto &R : ConceptInfo(*TTPT, S).members()) {
   5356         if (R.Operator != Operator)
   5357           continue;
   5358         CodeCompletionResult Result(
   5359             R.render(*this, CodeCompleter->getAllocator(),
   5360                      CodeCompleter->getCodeCompletionTUInfo()));
   5361         if (AccessOpFixIt)
   5362           Result.FixIts.push_back(*AccessOpFixIt);
   5363         Results.AddResult(std::move(Result));
   5364       }
   5365     } else if (!IsArrow && BaseType->isObjCObjectPointerType()) {
   5366       // Objective-C property reference. Bail if we're performing fix-it code
   5367       // completion since Objective-C properties are normally backed by ivars,
   5368       // most Objective-C fix-its here would have little value.
   5369       if (AccessOpFixIt.hasValue()) {
   5370         return false;
   5371       }
   5372       AddedPropertiesSet AddedProperties;
   5373 
   5374       if (const ObjCObjectPointerType *ObjCPtr =
   5375               BaseType->getAsObjCInterfacePointerType()) {
   5376         // Add property results based on our interface.
   5377         assert(ObjCPtr && "Non-NULL pointer guaranteed above!");
   5378         AddObjCProperties(CCContext, ObjCPtr->getInterfaceDecl(), true,
   5379                           /*AllowNullaryMethods=*/true, CurContext,
   5380                           AddedProperties, Results, IsBaseExprStatement);
   5381       }
   5382 
   5383       // Add properties from the protocols in a qualified interface.
   5384       for (auto *I : BaseType->castAs<ObjCObjectPointerType>()->quals())
   5385         AddObjCProperties(CCContext, I, true, /*AllowNullaryMethods=*/true,
   5386                           CurContext, AddedProperties, Results,
   5387                           IsBaseExprStatement, /*IsClassProperty*/ false,
   5388                           /*InOriginalClass*/ false);
   5389     } else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
   5390                (!IsArrow && BaseType->isObjCObjectType())) {
   5391       // Objective-C instance variable access. Bail if we're performing fix-it
   5392       // code completion since Objective-C properties are normally backed by
   5393       // ivars, most Objective-C fix-its here would have little value.
   5394       if (AccessOpFixIt.hasValue()) {
   5395         return false;
   5396       }
   5397       ObjCInterfaceDecl *Class = nullptr;
   5398       if (const ObjCObjectPointerType *ObjCPtr =
   5399               BaseType->getAs<ObjCObjectPointerType>())
   5400         Class = ObjCPtr->getInterfaceDecl();
   5401       else
   5402         Class = BaseType->castAs<ObjCObjectType>()->getInterface();
   5403 
   5404       // Add all ivars from this class and its superclasses.
   5405       if (Class) {
   5406         CodeCompletionDeclConsumer Consumer(Results, Class, BaseType);
   5407         Results.setFilter(&ResultBuilder::IsObjCIvar);
   5408         LookupVisibleDecls(
   5409             Class, LookupMemberName, Consumer, CodeCompleter->includeGlobals(),
   5410             /*IncludeDependentBases=*/false, CodeCompleter->loadExternal());
   5411       }
   5412     }
   5413 
   5414     // FIXME: How do we cope with isa?
   5415     return true;
   5416   };
   5417 
   5418   Results.EnterNewScope();
   5419 
   5420   bool CompletionSucceded = DoCompletion(Base, IsArrow, None);
   5421   if (CodeCompleter->includeFixIts()) {
   5422     const CharSourceRange OpRange =
   5423         CharSourceRange::getTokenRange(OpLoc, OpLoc);
   5424     CompletionSucceded |= DoCompletion(
   5425         OtherOpBase, !IsArrow,
   5426         FixItHint::CreateReplacement(OpRange, IsArrow ? "." : "->"));
   5427   }
   5428 
   5429   Results.ExitScope();
   5430 
   5431   if (!CompletionSucceded)
   5432     return;
   5433 
   5434   // Hand off the results found for code completion.
   5435   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   5436                             Results.data(), Results.size());
   5437 }
   5438 
   5439 void Sema::CodeCompleteObjCClassPropertyRefExpr(Scope *S,
   5440                                                 IdentifierInfo &ClassName,
   5441                                                 SourceLocation ClassNameLoc,
   5442                                                 bool IsBaseExprStatement) {
   5443   IdentifierInfo *ClassNamePtr = &ClassName;
   5444   ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(ClassNamePtr, ClassNameLoc);
   5445   if (!IFace)
   5446     return;
   5447   CodeCompletionContext CCContext(
   5448       CodeCompletionContext::CCC_ObjCPropertyAccess);
   5449   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   5450                         CodeCompleter->getCodeCompletionTUInfo(), CCContext,
   5451                         &ResultBuilder::IsMember);
   5452   Results.EnterNewScope();
   5453   AddedPropertiesSet AddedProperties;
   5454   AddObjCProperties(CCContext, IFace, true,
   5455                     /*AllowNullaryMethods=*/true, CurContext, AddedProperties,
   5456                     Results, IsBaseExprStatement,
   5457                     /*IsClassProperty=*/true);
   5458   Results.ExitScope();
   5459   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   5460                             Results.data(), Results.size());
   5461 }
   5462 
   5463 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) {
   5464   if (!CodeCompleter)
   5465     return;
   5466 
   5467   ResultBuilder::LookupFilter Filter = nullptr;
   5468   enum CodeCompletionContext::Kind ContextKind =
   5469       CodeCompletionContext::CCC_Other;
   5470   switch ((DeclSpec::TST)TagSpec) {
   5471   case DeclSpec::TST_enum:
   5472     Filter = &ResultBuilder::IsEnum;
   5473     ContextKind = CodeCompletionContext::CCC_EnumTag;
   5474     break;
   5475 
   5476   case DeclSpec::TST_union:
   5477     Filter = &ResultBuilder::IsUnion;
   5478     ContextKind = CodeCompletionContext::CCC_UnionTag;
   5479     break;
   5480 
   5481   case DeclSpec::TST_struct:
   5482   case DeclSpec::TST_class:
   5483   case DeclSpec::TST_interface:
   5484     Filter = &ResultBuilder::IsClassOrStruct;
   5485     ContextKind = CodeCompletionContext::CCC_ClassOrStructTag;
   5486     break;
   5487 
   5488   default:
   5489     llvm_unreachable("Unknown type specifier kind in CodeCompleteTag");
   5490   }
   5491 
   5492   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   5493                         CodeCompleter->getCodeCompletionTUInfo(), ContextKind);
   5494   CodeCompletionDeclConsumer Consumer(Results, CurContext);
   5495 
   5496   // First pass: look for tags.
   5497   Results.setFilter(Filter);
   5498   LookupVisibleDecls(S, LookupTagName, Consumer,
   5499                      CodeCompleter->includeGlobals(),
   5500                      CodeCompleter->loadExternal());
   5501 
   5502   if (CodeCompleter->includeGlobals()) {
   5503     // Second pass: look for nested name specifiers.
   5504     Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
   5505     LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer,
   5506                        CodeCompleter->includeGlobals(),
   5507                        CodeCompleter->loadExternal());
   5508   }
   5509 
   5510   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   5511                             Results.data(), Results.size());
   5512 }
   5513 
   5514 static void AddTypeQualifierResults(DeclSpec &DS, ResultBuilder &Results,
   5515                                     const LangOptions &LangOpts) {
   5516   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const))
   5517     Results.AddResult("const");
   5518   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile))
   5519     Results.AddResult("volatile");
   5520   if (LangOpts.C99 && !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict))
   5521     Results.AddResult("restrict");
   5522   if (LangOpts.C11 && !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic))
   5523     Results.AddResult("_Atomic");
   5524   if (LangOpts.MSVCCompat && !(DS.getTypeQualifiers() & DeclSpec::TQ_unaligned))
   5525     Results.AddResult("__unaligned");
   5526 }
   5527 
   5528 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) {
   5529   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   5530                         CodeCompleter->getCodeCompletionTUInfo(),
   5531                         CodeCompletionContext::CCC_TypeQualifiers);
   5532   Results.EnterNewScope();
   5533   AddTypeQualifierResults(DS, Results, LangOpts);
   5534   Results.ExitScope();
   5535   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   5536                             Results.data(), Results.size());
   5537 }
   5538 
   5539 void Sema::CodeCompleteFunctionQualifiers(DeclSpec &DS, Declarator &D,
   5540                                           const VirtSpecifiers *VS) {
   5541   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   5542                         CodeCompleter->getCodeCompletionTUInfo(),
   5543                         CodeCompletionContext::CCC_TypeQualifiers);
   5544   Results.EnterNewScope();
   5545   AddTypeQualifierResults(DS, Results, LangOpts);
   5546   if (LangOpts.CPlusPlus11) {
   5547     Results.AddResult("noexcept");
   5548     if (D.getContext() == DeclaratorContext::Member && !D.isCtorOrDtor() &&
   5549         !D.isStaticMember()) {
   5550       if (!VS || !VS->isFinalSpecified())
   5551         Results.AddResult("final");
   5552       if (!VS || !VS->isOverrideSpecified())
   5553         Results.AddResult("override");
   5554     }
   5555   }
   5556   Results.ExitScope();
   5557   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   5558                             Results.data(), Results.size());
   5559 }
   5560 
   5561 void Sema::CodeCompleteBracketDeclarator(Scope *S) {
   5562   CodeCompleteExpression(S, QualType(getASTContext().getSizeType()));
   5563 }
   5564 
   5565 void Sema::CodeCompleteCase(Scope *S) {
   5566   if (getCurFunction()->SwitchStack.empty() || !CodeCompleter)
   5567     return;
   5568 
   5569   SwitchStmt *Switch = getCurFunction()->SwitchStack.back().getPointer();
   5570   // Condition expression might be invalid, do not continue in this case.
   5571   if (!Switch->getCond())
   5572     return;
   5573   QualType type = Switch->getCond()->IgnoreImplicit()->getType();
   5574   if (!type->isEnumeralType()) {
   5575     CodeCompleteExpressionData Data(type);
   5576     Data.IntegralConstantExpression = true;
   5577     CodeCompleteExpression(S, Data);
   5578     return;
   5579   }
   5580 
   5581   // Code-complete the cases of a switch statement over an enumeration type
   5582   // by providing the list of
   5583   EnumDecl *Enum = type->castAs<EnumType>()->getDecl();
   5584   if (EnumDecl *Def = Enum->getDefinition())
   5585     Enum = Def;
   5586 
   5587   // Determine which enumerators we have already seen in the switch statement.
   5588   // FIXME: Ideally, we would also be able to look *past* the code-completion
   5589   // token, in case we are code-completing in the middle of the switch and not
   5590   // at the end. However, we aren't able to do so at the moment.
   5591   CoveredEnumerators Enumerators;
   5592   for (SwitchCase *SC = Switch->getSwitchCaseList(); SC;
   5593        SC = SC->getNextSwitchCase()) {
   5594     CaseStmt *Case = dyn_cast<CaseStmt>(SC);
   5595     if (!Case)
   5596       continue;
   5597 
   5598     Expr *CaseVal = Case->getLHS()->IgnoreParenCasts();
   5599     if (auto *DRE = dyn_cast<DeclRefExpr>(CaseVal))
   5600       if (auto *Enumerator =
   5601               dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
   5602         // We look into the AST of the case statement to determine which
   5603         // enumerator was named. Alternatively, we could compute the value of
   5604         // the integral constant expression, then compare it against the
   5605         // values of each enumerator. However, value-based approach would not
   5606         // work as well with C++ templates where enumerators declared within a
   5607         // template are type- and value-dependent.
   5608         Enumerators.Seen.insert(Enumerator);
   5609 
   5610         // If this is a qualified-id, keep track of the nested-name-specifier
   5611         // so that we can reproduce it as part of code completion, e.g.,
   5612         //
   5613         //   switch (TagD.getKind()) {
   5614         //     case TagDecl::TK_enum:
   5615         //       break;
   5616         //     case XXX
   5617         //
   5618         // At the XXX, our completions are TagDecl::TK_union,
   5619         // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union,
   5620         // TK_struct, and TK_class.
   5621         Enumerators.SuggestedQualifier = DRE->getQualifier();
   5622       }
   5623   }
   5624 
   5625   // Add any enumerators that have not yet been mentioned.
   5626   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   5627                         CodeCompleter->getCodeCompletionTUInfo(),
   5628                         CodeCompletionContext::CCC_Expression);
   5629   AddEnumerators(Results, Context, Enum, CurContext, Enumerators);
   5630 
   5631   if (CodeCompleter->includeMacros()) {
   5632     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
   5633   }
   5634   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   5635                             Results.data(), Results.size());
   5636 }
   5637 
   5638 static bool anyNullArguments(ArrayRef<Expr *> Args) {
   5639   if (Args.size() && !Args.data())
   5640     return true;
   5641 
   5642   for (unsigned I = 0; I != Args.size(); ++I)
   5643     if (!Args[I])
   5644       return true;
   5645 
   5646   return false;
   5647 }
   5648 
   5649 typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate;
   5650 
   5651 static void mergeCandidatesWithResults(
   5652     Sema &SemaRef, SmallVectorImpl<ResultCandidate> &Results,
   5653     OverloadCandidateSet &CandidateSet, SourceLocation Loc, size_t ArgSize) {
   5654   // Sort the overload candidate set by placing the best overloads first.
   5655   llvm::stable_sort(CandidateSet, [&](const OverloadCandidate &X,
   5656                                       const OverloadCandidate &Y) {
   5657     return isBetterOverloadCandidate(SemaRef, X, Y, Loc,
   5658                                      CandidateSet.getKind());
   5659   });
   5660 
   5661   // Add the remaining viable overload candidates as code-completion results.
   5662   for (OverloadCandidate &Candidate : CandidateSet) {
   5663     if (Candidate.Function) {
   5664       if (Candidate.Function->isDeleted())
   5665         continue;
   5666       if (!Candidate.Function->isVariadic() &&
   5667           Candidate.Function->getNumParams() <= ArgSize &&
   5668           // Having zero args is annoying, normally we don't surface a function
   5669           // with 2 params, if you already have 2 params, because you are
   5670           // inserting the 3rd now. But with zero, it helps the user to figure
   5671           // out there are no overloads that take any arguments. Hence we are
   5672           // keeping the overload.
   5673           ArgSize > 0)
   5674         continue;
   5675     }
   5676     if (Candidate.Viable)
   5677       Results.push_back(ResultCandidate(Candidate.Function));
   5678   }
   5679 }
   5680 
   5681 /// Get the type of the Nth parameter from a given set of overload
   5682 /// candidates.
   5683 static QualType getParamType(Sema &SemaRef,
   5684                              ArrayRef<ResultCandidate> Candidates, unsigned N) {
   5685 
   5686   // Given the overloads 'Candidates' for a function call matching all arguments
   5687   // up to N, return the type of the Nth parameter if it is the same for all
   5688   // overload candidates.
   5689   QualType ParamType;
   5690   for (auto &Candidate : Candidates) {
   5691     if (const auto *FType = Candidate.getFunctionType())
   5692       if (const auto *Proto = dyn_cast<FunctionProtoType>(FType))
   5693         if (N < Proto->getNumParams()) {
   5694           if (ParamType.isNull())
   5695             ParamType = Proto->getParamType(N);
   5696           else if (!SemaRef.Context.hasSameUnqualifiedType(
   5697                        ParamType.getNonReferenceType(),
   5698                        Proto->getParamType(N).getNonReferenceType()))
   5699             // Otherwise return a default-constructed QualType.
   5700             return QualType();
   5701         }
   5702   }
   5703 
   5704   return ParamType;
   5705 }
   5706 
   5707 static QualType
   5708 ProduceSignatureHelp(Sema &SemaRef, Scope *S,
   5709                      MutableArrayRef<ResultCandidate> Candidates,
   5710                      unsigned CurrentArg, SourceLocation OpenParLoc) {
   5711   if (Candidates.empty())
   5712     return QualType();
   5713   if (SemaRef.getPreprocessor().isCodeCompletionReached())
   5714     SemaRef.CodeCompleter->ProcessOverloadCandidates(
   5715         SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc);
   5716   return getParamType(SemaRef, Candidates, CurrentArg);
   5717 }
   5718 
   5719 QualType Sema::ProduceCallSignatureHelp(Scope *S, Expr *Fn,
   5720                                         ArrayRef<Expr *> Args,
   5721                                         SourceLocation OpenParLoc) {
   5722   Fn = unwrapParenList(Fn);
   5723   if (!CodeCompleter || !Fn)
   5724     return QualType();
   5725 
   5726   // FIXME: Provide support for variadic template functions.
   5727   // Ignore type-dependent call expressions entirely.
   5728   if (Fn->isTypeDependent() || anyNullArguments(Args))
   5729     return QualType();
   5730   // In presence of dependent args we surface all possible signatures using the
   5731   // non-dependent args in the prefix. Afterwards we do a post filtering to make
   5732   // sure provided candidates satisfy parameter count restrictions.
   5733   auto ArgsWithoutDependentTypes =
   5734       Args.take_while([](Expr *Arg) { return !Arg->isTypeDependent(); });
   5735 
   5736   SmallVector<ResultCandidate, 8> Results;
   5737 
   5738   Expr *NakedFn = Fn->IgnoreParenCasts();
   5739   // Build an overload candidate set based on the functions we find.
   5740   SourceLocation Loc = Fn->getExprLoc();
   5741   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
   5742 
   5743   if (auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) {
   5744     AddOverloadedCallCandidates(ULE, ArgsWithoutDependentTypes, CandidateSet,
   5745                                 /*PartialOverloading=*/true);
   5746   } else if (auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) {
   5747     TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr;
   5748     if (UME->hasExplicitTemplateArgs()) {
   5749       UME->copyTemplateArgumentsInto(TemplateArgsBuffer);
   5750       TemplateArgs = &TemplateArgsBuffer;
   5751     }
   5752 
   5753     // Add the base as first argument (use a nullptr if the base is implicit).
   5754     SmallVector<Expr *, 12> ArgExprs(
   5755         1, UME->isImplicitAccess() ? nullptr : UME->getBase());
   5756     ArgExprs.append(ArgsWithoutDependentTypes.begin(),
   5757                     ArgsWithoutDependentTypes.end());
   5758     UnresolvedSet<8> Decls;
   5759     Decls.append(UME->decls_begin(), UME->decls_end());
   5760     const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase();
   5761     AddFunctionCandidates(Decls, ArgExprs, CandidateSet, TemplateArgs,
   5762                           /*SuppressUserConversions=*/false,
   5763                           /*PartialOverloading=*/true, FirstArgumentIsBase);
   5764   } else {
   5765     FunctionDecl *FD = nullptr;
   5766     if (auto *MCE = dyn_cast<MemberExpr>(NakedFn))
   5767       FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl());
   5768     else if (auto *DRE = dyn_cast<DeclRefExpr>(NakedFn))
   5769       FD = dyn_cast<FunctionDecl>(DRE->getDecl());
   5770     if (FD) { // We check whether it's a resolved function declaration.
   5771       if (!getLangOpts().CPlusPlus ||
   5772           !FD->getType()->getAs<FunctionProtoType>())
   5773         Results.push_back(ResultCandidate(FD));
   5774       else
   5775         AddOverloadCandidate(FD, DeclAccessPair::make(FD, FD->getAccess()),
   5776                              ArgsWithoutDependentTypes, CandidateSet,
   5777                              /*SuppressUserConversions=*/false,
   5778                              /*PartialOverloading=*/true);
   5779 
   5780     } else if (auto DC = NakedFn->getType()->getAsCXXRecordDecl()) {
   5781       // If expression's type is CXXRecordDecl, it may overload the function
   5782       // call operator, so we check if it does and add them as candidates.
   5783       // A complete type is needed to lookup for member function call operators.
   5784       if (isCompleteType(Loc, NakedFn->getType())) {
   5785         DeclarationName OpName =
   5786             Context.DeclarationNames.getCXXOperatorName(OO_Call);
   5787         LookupResult R(*this, OpName, Loc, LookupOrdinaryName);
   5788         LookupQualifiedName(R, DC);
   5789         R.suppressDiagnostics();
   5790         SmallVector<Expr *, 12> ArgExprs(1, NakedFn);
   5791         ArgExprs.append(ArgsWithoutDependentTypes.begin(),
   5792                         ArgsWithoutDependentTypes.end());
   5793         AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs, CandidateSet,
   5794                               /*ExplicitArgs=*/nullptr,
   5795                               /*SuppressUserConversions=*/false,
   5796                               /*PartialOverloading=*/true);
   5797       }
   5798     } else {
   5799       // Lastly we check whether expression's type is function pointer or
   5800       // function.
   5801       QualType T = NakedFn->getType();
   5802       if (!T->getPointeeType().isNull())
   5803         T = T->getPointeeType();
   5804 
   5805       if (auto FP = T->getAs<FunctionProtoType>()) {
   5806         if (!TooManyArguments(FP->getNumParams(),
   5807                               ArgsWithoutDependentTypes.size(),
   5808                               /*PartialOverloading=*/true) ||
   5809             FP->isVariadic())
   5810           Results.push_back(ResultCandidate(FP));
   5811       } else if (auto FT = T->getAs<FunctionType>())
   5812         // No prototype and declaration, it may be a K & R style function.
   5813         Results.push_back(ResultCandidate(FT));
   5814     }
   5815   }
   5816   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc, Args.size());
   5817   QualType ParamType =
   5818       ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc);
   5819   return !CandidateSet.empty() ? ParamType : QualType();
   5820 }
   5821 
   5822 QualType Sema::ProduceConstructorSignatureHelp(Scope *S, QualType Type,
   5823                                                SourceLocation Loc,
   5824                                                ArrayRef<Expr *> Args,
   5825                                                SourceLocation OpenParLoc) {
   5826   if (!CodeCompleter)
   5827     return QualType();
   5828 
   5829   // A complete type is needed to lookup for constructors.
   5830   CXXRecordDecl *RD =
   5831       isCompleteType(Loc, Type) ? Type->getAsCXXRecordDecl() : nullptr;
   5832   if (!RD)
   5833     return Type;
   5834 
   5835   // FIXME: Provide support for member initializers.
   5836   // FIXME: Provide support for variadic template constructors.
   5837 
   5838   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
   5839 
   5840   for (NamedDecl *C : LookupConstructors(RD)) {
   5841     if (auto *FD = dyn_cast<FunctionDecl>(C)) {
   5842       AddOverloadCandidate(FD, DeclAccessPair::make(FD, C->getAccess()), Args,
   5843                            CandidateSet,
   5844                            /*SuppressUserConversions=*/false,
   5845                            /*PartialOverloading=*/true,
   5846                            /*AllowExplicit*/ true);
   5847     } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(C)) {
   5848       AddTemplateOverloadCandidate(
   5849           FTD, DeclAccessPair::make(FTD, C->getAccess()),
   5850           /*ExplicitTemplateArgs=*/nullptr, Args, CandidateSet,
   5851           /*SuppressUserConversions=*/false,
   5852           /*PartialOverloading=*/true);
   5853     }
   5854   }
   5855 
   5856   SmallVector<ResultCandidate, 8> Results;
   5857   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc, Args.size());
   5858   return ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc);
   5859 }
   5860 
   5861 QualType Sema::ProduceCtorInitMemberSignatureHelp(
   5862     Scope *S, Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy,
   5863     ArrayRef<Expr *> ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc) {
   5864   if (!CodeCompleter)
   5865     return QualType();
   5866 
   5867   CXXConstructorDecl *Constructor =
   5868       dyn_cast<CXXConstructorDecl>(ConstructorDecl);
   5869   if (!Constructor)
   5870     return QualType();
   5871   // FIXME: Add support for Base class constructors as well.
   5872   if (ValueDecl *MemberDecl = tryLookupCtorInitMemberDecl(
   5873           Constructor->getParent(), SS, TemplateTypeTy, II))
   5874     return ProduceConstructorSignatureHelp(getCurScope(), MemberDecl->getType(),
   5875                                            MemberDecl->getLocation(), ArgExprs,
   5876                                            OpenParLoc);
   5877   return QualType();
   5878 }
   5879 
   5880 static QualType getDesignatedType(QualType BaseType, const Designation &Desig) {
   5881   for (unsigned I = 0; I < Desig.getNumDesignators(); ++I) {
   5882     if (BaseType.isNull())
   5883       break;
   5884     QualType NextType;
   5885     const auto &D = Desig.getDesignator(I);
   5886     if (D.isArrayDesignator() || D.isArrayRangeDesignator()) {
   5887       if (BaseType->isArrayType())
   5888         NextType = BaseType->getAsArrayTypeUnsafe()->getElementType();
   5889     } else {
   5890       assert(D.isFieldDesignator());
   5891       auto *RD = getAsRecordDecl(BaseType);
   5892       if (RD && RD->isCompleteDefinition()) {
   5893         for (const auto *Member : RD->lookup(D.getField()))
   5894           if (const FieldDecl *FD = llvm::dyn_cast<FieldDecl>(Member)) {
   5895             NextType = FD->getType();
   5896             break;
   5897           }
   5898       }
   5899     }
   5900     BaseType = NextType;
   5901   }
   5902   return BaseType;
   5903 }
   5904 
   5905 void Sema::CodeCompleteDesignator(QualType BaseType,
   5906                                   llvm::ArrayRef<Expr *> InitExprs,
   5907                                   const Designation &D) {
   5908   BaseType = getDesignatedType(BaseType, D);
   5909   if (BaseType.isNull())
   5910     return;
   5911   const auto *RD = getAsRecordDecl(BaseType);
   5912   if (!RD || RD->fields().empty())
   5913     return;
   5914 
   5915   CodeCompletionContext CCC(CodeCompletionContext::CCC_DotMemberAccess,
   5916                             BaseType);
   5917   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   5918                         CodeCompleter->getCodeCompletionTUInfo(), CCC);
   5919 
   5920   Results.EnterNewScope();
   5921   for (const auto *FD : RD->fields()) {
   5922     // FIXME: Make use of previous designators to mark any fields before those
   5923     // inaccessible, and also compute the next initializer priority.
   5924     ResultBuilder::Result Result(FD, Results.getBasePriority(FD));
   5925     Results.AddResult(Result, CurContext, /*Hiding=*/nullptr);
   5926   }
   5927   Results.ExitScope();
   5928   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   5929                             Results.data(), Results.size());
   5930 }
   5931 
   5932 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) {
   5933   ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
   5934   if (!VD) {
   5935     CodeCompleteOrdinaryName(S, PCC_Expression);
   5936     return;
   5937   }
   5938 
   5939   CodeCompleteExpressionData Data;
   5940   Data.PreferredType = VD->getType();
   5941   // Ignore VD to avoid completing the variable itself, e.g. in 'int foo = ^'.
   5942   Data.IgnoreDecls.push_back(VD);
   5943 
   5944   CodeCompleteExpression(S, Data);
   5945 }
   5946 
   5947 void Sema::CodeCompleteAfterIf(Scope *S, bool IsBracedThen) {
   5948   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   5949                         CodeCompleter->getCodeCompletionTUInfo(),
   5950                         mapCodeCompletionContext(*this, PCC_Statement));
   5951   Results.setFilter(&ResultBuilder::IsOrdinaryName);
   5952   Results.EnterNewScope();
   5953 
   5954   CodeCompletionDeclConsumer Consumer(Results, CurContext);
   5955   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
   5956                      CodeCompleter->includeGlobals(),
   5957                      CodeCompleter->loadExternal());
   5958 
   5959   AddOrdinaryNameResults(PCC_Statement, S, *this, Results);
   5960 
   5961   // "else" block
   5962   CodeCompletionBuilder Builder(Results.getAllocator(),
   5963                                 Results.getCodeCompletionTUInfo());
   5964 
   5965   auto AddElseBodyPattern = [&] {
   5966     if (IsBracedThen) {
   5967       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   5968       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   5969       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   5970       Builder.AddPlaceholderChunk("statements");
   5971       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   5972       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   5973     } else {
   5974       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   5975       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   5976       Builder.AddPlaceholderChunk("statement");
   5977       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   5978     }
   5979   };
   5980   Builder.AddTypedTextChunk("else");
   5981   if (Results.includeCodePatterns())
   5982     AddElseBodyPattern();
   5983   Results.AddResult(Builder.TakeString());
   5984 
   5985   // "else if" block
   5986   Builder.AddTypedTextChunk("else if");
   5987   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   5988   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   5989   if (getLangOpts().CPlusPlus)
   5990     Builder.AddPlaceholderChunk("condition");
   5991   else
   5992     Builder.AddPlaceholderChunk("expression");
   5993   Builder.AddChunk(CodeCompletionString::CK_RightParen);
   5994   if (Results.includeCodePatterns()) {
   5995     AddElseBodyPattern();
   5996   }
   5997   Results.AddResult(Builder.TakeString());
   5998 
   5999   Results.ExitScope();
   6000 
   6001   if (S->getFnParent())
   6002     AddPrettyFunctionResults(getLangOpts(), Results);
   6003 
   6004   if (CodeCompleter->includeMacros())
   6005     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
   6006 
   6007   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6008                             Results.data(), Results.size());
   6009 }
   6010 
   6011 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
   6012                                    bool EnteringContext,
   6013                                    bool IsUsingDeclaration, QualType BaseType,
   6014                                    QualType PreferredType) {
   6015   if (SS.isEmpty() || !CodeCompleter)
   6016     return;
   6017 
   6018   CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol, PreferredType);
   6019   CC.setIsUsingDeclaration(IsUsingDeclaration);
   6020   CC.setCXXScopeSpecifier(SS);
   6021 
   6022   // We want to keep the scope specifier even if it's invalid (e.g. the scope
   6023   // "a::b::" is not corresponding to any context/namespace in the AST), since
   6024   // it can be useful for global code completion which have information about
   6025   // contexts/symbols that are not in the AST.
   6026   if (SS.isInvalid()) {
   6027     // As SS is invalid, we try to collect accessible contexts from the current
   6028     // scope with a dummy lookup so that the completion consumer can try to
   6029     // guess what the specified scope is.
   6030     ResultBuilder DummyResults(*this, CodeCompleter->getAllocator(),
   6031                                CodeCompleter->getCodeCompletionTUInfo(), CC);
   6032     if (!PreferredType.isNull())
   6033       DummyResults.setPreferredType(PreferredType);
   6034     if (S->getEntity()) {
   6035       CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(),
   6036                                           BaseType);
   6037       LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
   6038                          /*IncludeGlobalScope=*/false,
   6039                          /*LoadExternal=*/false);
   6040     }
   6041     HandleCodeCompleteResults(this, CodeCompleter,
   6042                               DummyResults.getCompletionContext(), nullptr, 0);
   6043     return;
   6044   }
   6045   // Always pretend to enter a context to ensure that a dependent type
   6046   // resolves to a dependent record.
   6047   DeclContext *Ctx = computeDeclContext(SS, /*EnteringContext=*/true);
   6048 
   6049   // Try to instantiate any non-dependent declaration contexts before
   6050   // we look in them. Bail out if we fail.
   6051   NestedNameSpecifier *NNS = SS.getScopeRep();
   6052   if (NNS != nullptr && SS.isValid() && !NNS->isDependent()) {
   6053     if (Ctx == nullptr || RequireCompleteDeclContext(SS, Ctx))
   6054       return;
   6055   }
   6056 
   6057   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6058                         CodeCompleter->getCodeCompletionTUInfo(), CC);
   6059   if (!PreferredType.isNull())
   6060     Results.setPreferredType(PreferredType);
   6061   Results.EnterNewScope();
   6062 
   6063   // The "template" keyword can follow "::" in the grammar, but only
   6064   // put it into the grammar if the nested-name-specifier is dependent.
   6065   // FIXME: results is always empty, this appears to be dead.
   6066   if (!Results.empty() && NNS->isDependent())
   6067     Results.AddResult("template");
   6068 
   6069   // If the scope is a concept-constrained type parameter, infer nested
   6070   // members based on the constraints.
   6071   if (const auto *TTPT =
   6072           dyn_cast_or_null<TemplateTypeParmType>(NNS->getAsType())) {
   6073     for (const auto &R : ConceptInfo(*TTPT, S).members()) {
   6074       if (R.Operator != ConceptInfo::Member::Colons)
   6075         continue;
   6076       Results.AddResult(CodeCompletionResult(
   6077           R.render(*this, CodeCompleter->getAllocator(),
   6078                    CodeCompleter->getCodeCompletionTUInfo())));
   6079     }
   6080   }
   6081 
   6082   // Add calls to overridden virtual functions, if there are any.
   6083   //
   6084   // FIXME: This isn't wonderful, because we don't know whether we're actually
   6085   // in a context that permits expressions. This is a general issue with
   6086   // qualified-id completions.
   6087   if (Ctx && !EnteringContext)
   6088     MaybeAddOverrideCalls(*this, Ctx, Results);
   6089   Results.ExitScope();
   6090 
   6091   if (Ctx &&
   6092       (CodeCompleter->includeNamespaceLevelDecls() || !Ctx->isFileContext())) {
   6093     CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType);
   6094     LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer,
   6095                        /*IncludeGlobalScope=*/true,
   6096                        /*IncludeDependentBases=*/true,
   6097                        CodeCompleter->loadExternal());
   6098   }
   6099 
   6100   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6101                             Results.data(), Results.size());
   6102 }
   6103 
   6104 void Sema::CodeCompleteUsing(Scope *S) {
   6105   if (!CodeCompleter)
   6106     return;
   6107 
   6108   // This can be both a using alias or using declaration, in the former we
   6109   // expect a new name and a symbol in the latter case.
   6110   CodeCompletionContext Context(CodeCompletionContext::CCC_SymbolOrNewName);
   6111   Context.setIsUsingDeclaration(true);
   6112 
   6113   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6114                         CodeCompleter->getCodeCompletionTUInfo(), Context,
   6115                         &ResultBuilder::IsNestedNameSpecifier);
   6116   Results.EnterNewScope();
   6117 
   6118   // If we aren't in class scope, we could see the "namespace" keyword.
   6119   if (!S->isClassScope())
   6120     Results.AddResult(CodeCompletionResult("namespace"));
   6121 
   6122   // After "using", we can see anything that would start a
   6123   // nested-name-specifier.
   6124   CodeCompletionDeclConsumer Consumer(Results, CurContext);
   6125   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
   6126                      CodeCompleter->includeGlobals(),
   6127                      CodeCompleter->loadExternal());
   6128   Results.ExitScope();
   6129 
   6130   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6131                             Results.data(), Results.size());
   6132 }
   6133 
   6134 void Sema::CodeCompleteUsingDirective(Scope *S) {
   6135   if (!CodeCompleter)
   6136     return;
   6137 
   6138   // After "using namespace", we expect to see a namespace name or namespace
   6139   // alias.
   6140   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6141                         CodeCompleter->getCodeCompletionTUInfo(),
   6142                         CodeCompletionContext::CCC_Namespace,
   6143                         &ResultBuilder::IsNamespaceOrAlias);
   6144   Results.EnterNewScope();
   6145   CodeCompletionDeclConsumer Consumer(Results, CurContext);
   6146   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
   6147                      CodeCompleter->includeGlobals(),
   6148                      CodeCompleter->loadExternal());
   6149   Results.ExitScope();
   6150   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6151                             Results.data(), Results.size());
   6152 }
   6153 
   6154 void Sema::CodeCompleteNamespaceDecl(Scope *S) {
   6155   if (!CodeCompleter)
   6156     return;
   6157 
   6158   DeclContext *Ctx = S->getEntity();
   6159   if (!S->getParent())
   6160     Ctx = Context.getTranslationUnitDecl();
   6161 
   6162   bool SuppressedGlobalResults =
   6163       Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
   6164 
   6165   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6166                         CodeCompleter->getCodeCompletionTUInfo(),
   6167                         SuppressedGlobalResults
   6168                             ? CodeCompletionContext::CCC_Namespace
   6169                             : CodeCompletionContext::CCC_Other,
   6170                         &ResultBuilder::IsNamespace);
   6171 
   6172   if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
   6173     // We only want to see those namespaces that have already been defined
   6174     // within this scope, because its likely that the user is creating an
   6175     // extended namespace declaration. Keep track of the most recent
   6176     // definition of each namespace.
   6177     std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
   6178     for (DeclContext::specific_decl_iterator<NamespaceDecl>
   6179              NS(Ctx->decls_begin()),
   6180          NSEnd(Ctx->decls_end());
   6181          NS != NSEnd; ++NS)
   6182       OrigToLatest[NS->getOriginalNamespace()] = *NS;
   6183 
   6184     // Add the most recent definition (or extended definition) of each
   6185     // namespace to the list of results.
   6186     Results.EnterNewScope();
   6187     for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
   6188              NS = OrigToLatest.begin(),
   6189              NSEnd = OrigToLatest.end();
   6190          NS != NSEnd; ++NS)
   6191       Results.AddResult(
   6192           CodeCompletionResult(NS->second, Results.getBasePriority(NS->second),
   6193                                nullptr),
   6194           CurContext, nullptr, false);
   6195     Results.ExitScope();
   6196   }
   6197 
   6198   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6199                             Results.data(), Results.size());
   6200 }
   6201 
   6202 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S) {
   6203   if (!CodeCompleter)
   6204     return;
   6205 
   6206   // After "namespace", we expect to see a namespace or alias.
   6207   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6208                         CodeCompleter->getCodeCompletionTUInfo(),
   6209                         CodeCompletionContext::CCC_Namespace,
   6210                         &ResultBuilder::IsNamespaceOrAlias);
   6211   CodeCompletionDeclConsumer Consumer(Results, CurContext);
   6212   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
   6213                      CodeCompleter->includeGlobals(),
   6214                      CodeCompleter->loadExternal());
   6215   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6216                             Results.data(), Results.size());
   6217 }
   6218 
   6219 void Sema::CodeCompleteOperatorName(Scope *S) {
   6220   if (!CodeCompleter)
   6221     return;
   6222 
   6223   typedef CodeCompletionResult Result;
   6224   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6225                         CodeCompleter->getCodeCompletionTUInfo(),
   6226                         CodeCompletionContext::CCC_Type,
   6227                         &ResultBuilder::IsType);
   6228   Results.EnterNewScope();
   6229 
   6230   // Add the names of overloadable operators. Note that OO_Conditional is not
   6231   // actually overloadable.
   6232 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
   6233   if (OO_##Name != OO_Conditional)                                             \
   6234     Results.AddResult(Result(Spelling));
   6235 #include "clang/Basic/OperatorKinds.def"
   6236 
   6237   // Add any type names visible from the current scope
   6238   Results.allowNestedNameSpecifiers();
   6239   CodeCompletionDeclConsumer Consumer(Results, CurContext);
   6240   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
   6241                      CodeCompleter->includeGlobals(),
   6242                      CodeCompleter->loadExternal());
   6243 
   6244   // Add any type specifiers
   6245   AddTypeSpecifierResults(getLangOpts(), Results);
   6246   Results.ExitScope();
   6247 
   6248   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6249                             Results.data(), Results.size());
   6250 }
   6251 
   6252 void Sema::CodeCompleteConstructorInitializer(
   6253     Decl *ConstructorD, ArrayRef<CXXCtorInitializer *> Initializers) {
   6254   if (!ConstructorD)
   6255     return;
   6256 
   6257   AdjustDeclIfTemplate(ConstructorD);
   6258 
   6259   auto *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD);
   6260   if (!Constructor)
   6261     return;
   6262 
   6263   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6264                         CodeCompleter->getCodeCompletionTUInfo(),
   6265                         CodeCompletionContext::CCC_Symbol);
   6266   Results.EnterNewScope();
   6267 
   6268   // Fill in any already-initialized fields or base classes.
   6269   llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
   6270   llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
   6271   for (unsigned I = 0, E = Initializers.size(); I != E; ++I) {
   6272     if (Initializers[I]->isBaseInitializer())
   6273       InitializedBases.insert(Context.getCanonicalType(
   6274           QualType(Initializers[I]->getBaseClass(), 0)));
   6275     else
   6276       InitializedFields.insert(
   6277           cast<FieldDecl>(Initializers[I]->getAnyMember()));
   6278   }
   6279 
   6280   // Add completions for base classes.
   6281   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
   6282   bool SawLastInitializer = Initializers.empty();
   6283   CXXRecordDecl *ClassDecl = Constructor->getParent();
   6284 
   6285   auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) {
   6286     CodeCompletionBuilder Builder(Results.getAllocator(),
   6287                                   Results.getCodeCompletionTUInfo());
   6288     Builder.AddTypedTextChunk(Name);
   6289     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   6290     if (const auto *Function = dyn_cast<FunctionDecl>(ND))
   6291       AddFunctionParameterChunks(PP, Policy, Function, Builder);
   6292     else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND))
   6293       AddFunctionParameterChunks(PP, Policy, FunTemplDecl->getTemplatedDecl(),
   6294                                  Builder);
   6295     Builder.AddChunk(CodeCompletionString::CK_RightParen);
   6296     return Builder.TakeString();
   6297   };
   6298   auto AddDefaultCtorInit = [&](const char *Name, const char *Type,
   6299                                 const NamedDecl *ND) {
   6300     CodeCompletionBuilder Builder(Results.getAllocator(),
   6301                                   Results.getCodeCompletionTUInfo());
   6302     Builder.AddTypedTextChunk(Name);
   6303     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   6304     Builder.AddPlaceholderChunk(Type);
   6305     Builder.AddChunk(CodeCompletionString::CK_RightParen);
   6306     if (ND) {
   6307       auto CCR = CodeCompletionResult(
   6308           Builder.TakeString(), ND,
   6309           SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration);
   6310       if (isa<FieldDecl>(ND))
   6311         CCR.CursorKind = CXCursor_MemberRef;
   6312       return Results.AddResult(CCR);
   6313     }
   6314     return Results.AddResult(CodeCompletionResult(
   6315         Builder.TakeString(),
   6316         SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration));
   6317   };
   6318   auto AddCtorsWithName = [&](const CXXRecordDecl *RD, unsigned int Priority,
   6319                               const char *Name, const FieldDecl *FD) {
   6320     if (!RD)
   6321       return AddDefaultCtorInit(Name,
   6322                                 FD ? Results.getAllocator().CopyString(
   6323                                          FD->getType().getAsString(Policy))
   6324                                    : Name,
   6325                                 FD);
   6326     auto Ctors = getConstructors(Context, RD);
   6327     if (Ctors.begin() == Ctors.end())
   6328       return AddDefaultCtorInit(Name, Name, RD);
   6329     for (const NamedDecl *Ctor : Ctors) {
   6330       auto CCR = CodeCompletionResult(GenerateCCS(Ctor, Name), RD, Priority);
   6331       CCR.CursorKind = getCursorKindForDecl(Ctor);
   6332       Results.AddResult(CCR);
   6333     }
   6334   };
   6335   auto AddBase = [&](const CXXBaseSpecifier &Base) {
   6336     const char *BaseName =
   6337         Results.getAllocator().CopyString(Base.getType().getAsString(Policy));
   6338     const auto *RD = Base.getType()->getAsCXXRecordDecl();
   6339     AddCtorsWithName(
   6340         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
   6341         BaseName, nullptr);
   6342   };
   6343   auto AddField = [&](const FieldDecl *FD) {
   6344     const char *FieldName =
   6345         Results.getAllocator().CopyString(FD->getIdentifier()->getName());
   6346     const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl();
   6347     AddCtorsWithName(
   6348         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
   6349         FieldName, FD);
   6350   };
   6351 
   6352   for (const auto &Base : ClassDecl->bases()) {
   6353     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
   6354              .second) {
   6355       SawLastInitializer =
   6356           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
   6357           Context.hasSameUnqualifiedType(
   6358               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
   6359       continue;
   6360     }
   6361 
   6362     AddBase(Base);
   6363     SawLastInitializer = false;
   6364   }
   6365 
   6366   // Add completions for virtual base classes.
   6367   for (const auto &Base : ClassDecl->vbases()) {
   6368     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
   6369              .second) {
   6370       SawLastInitializer =
   6371           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
   6372           Context.hasSameUnqualifiedType(
   6373               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
   6374       continue;
   6375     }
   6376 
   6377     AddBase(Base);
   6378     SawLastInitializer = false;
   6379   }
   6380 
   6381   // Add completions for members.
   6382   for (auto *Field : ClassDecl->fields()) {
   6383     if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))
   6384              .second) {
   6385       SawLastInitializer = !Initializers.empty() &&
   6386                            Initializers.back()->isAnyMemberInitializer() &&
   6387                            Initializers.back()->getAnyMember() == Field;
   6388       continue;
   6389     }
   6390 
   6391     if (!Field->getDeclName())
   6392       continue;
   6393 
   6394     AddField(Field);
   6395     SawLastInitializer = false;
   6396   }
   6397   Results.ExitScope();
   6398 
   6399   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6400                             Results.data(), Results.size());
   6401 }
   6402 
   6403 /// Determine whether this scope denotes a namespace.
   6404 static bool isNamespaceScope(Scope *S) {
   6405   DeclContext *DC = S->getEntity();
   6406   if (!DC)
   6407     return false;
   6408 
   6409   return DC->isFileContext();
   6410 }
   6411 
   6412 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro,
   6413                                         bool AfterAmpersand) {
   6414   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6415                         CodeCompleter->getCodeCompletionTUInfo(),
   6416                         CodeCompletionContext::CCC_Other);
   6417   Results.EnterNewScope();
   6418 
   6419   // Note what has already been captured.
   6420   llvm::SmallPtrSet<IdentifierInfo *, 4> Known;
   6421   bool IncludedThis = false;
   6422   for (const auto &C : Intro.Captures) {
   6423     if (C.Kind == LCK_This) {
   6424       IncludedThis = true;
   6425       continue;
   6426     }
   6427 
   6428     Known.insert(C.Id);
   6429   }
   6430 
   6431   // Look for other capturable variables.
   6432   for (; S && !isNamespaceScope(S); S = S->getParent()) {
   6433     for (const auto *D : S->decls()) {
   6434       const auto *Var = dyn_cast<VarDecl>(D);
   6435       if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>())
   6436         continue;
   6437 
   6438       if (Known.insert(Var->getIdentifier()).second)
   6439         Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration),
   6440                           CurContext, nullptr, false);
   6441     }
   6442   }
   6443 
   6444   // Add 'this', if it would be valid.
   6445   if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy)
   6446     addThisCompletion(*this, Results);
   6447 
   6448   Results.ExitScope();
   6449 
   6450   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6451                             Results.data(), Results.size());
   6452 }
   6453 
   6454 void Sema::CodeCompleteAfterFunctionEquals(Declarator &D) {
   6455   if (!LangOpts.CPlusPlus11)
   6456     return;
   6457   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6458                         CodeCompleter->getCodeCompletionTUInfo(),
   6459                         CodeCompletionContext::CCC_Other);
   6460   auto ShouldAddDefault = [&D, this]() {
   6461     if (!D.isFunctionDeclarator())
   6462       return false;
   6463     auto &Id = D.getName();
   6464     if (Id.getKind() == UnqualifiedIdKind::IK_DestructorName)
   6465       return true;
   6466     // FIXME(liuhui): Ideally, we should check the constructor parameter list to
   6467     // verify that it is the default, copy or move constructor?
   6468     if (Id.getKind() == UnqualifiedIdKind::IK_ConstructorName &&
   6469         D.getFunctionTypeInfo().NumParams <= 1)
   6470       return true;
   6471     if (Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId) {
   6472       auto Op = Id.OperatorFunctionId.Operator;
   6473       // FIXME(liuhui): Ideally, we should check the function parameter list to
   6474       // verify that it is the copy or move assignment?
   6475       if (Op == OverloadedOperatorKind::OO_Equal)
   6476         return true;
   6477       if (LangOpts.CPlusPlus20 &&
   6478           (Op == OverloadedOperatorKind::OO_EqualEqual ||
   6479            Op == OverloadedOperatorKind::OO_ExclaimEqual ||
   6480            Op == OverloadedOperatorKind::OO_Less ||
   6481            Op == OverloadedOperatorKind::OO_LessEqual ||
   6482            Op == OverloadedOperatorKind::OO_Greater ||
   6483            Op == OverloadedOperatorKind::OO_GreaterEqual ||
   6484            Op == OverloadedOperatorKind::OO_Spaceship))
   6485         return true;
   6486     }
   6487     return false;
   6488   };
   6489 
   6490   Results.EnterNewScope();
   6491   if (ShouldAddDefault())
   6492     Results.AddResult("default");
   6493   // FIXME(liuhui): Ideally, we should only provide `delete` completion for the
   6494   // first function declaration.
   6495   Results.AddResult("delete");
   6496   Results.ExitScope();
   6497   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6498                             Results.data(), Results.size());
   6499 }
   6500 
   6501 /// Macro that optionally prepends an "@" to the string literal passed in via
   6502 /// Keyword, depending on whether NeedAt is true or false.
   6503 #define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword)
   6504 
   6505 static void AddObjCImplementationResults(const LangOptions &LangOpts,
   6506                                          ResultBuilder &Results, bool NeedAt) {
   6507   typedef CodeCompletionResult Result;
   6508   // Since we have an implementation, we can end it.
   6509   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
   6510 
   6511   CodeCompletionBuilder Builder(Results.getAllocator(),
   6512                                 Results.getCodeCompletionTUInfo());
   6513   if (LangOpts.ObjC) {
   6514     // @dynamic
   6515     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "dynamic"));
   6516     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6517     Builder.AddPlaceholderChunk("property");
   6518     Results.AddResult(Result(Builder.TakeString()));
   6519 
   6520     // @synthesize
   6521     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synthesize"));
   6522     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6523     Builder.AddPlaceholderChunk("property");
   6524     Results.AddResult(Result(Builder.TakeString()));
   6525   }
   6526 }
   6527 
   6528 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
   6529                                     ResultBuilder &Results, bool NeedAt) {
   6530   typedef CodeCompletionResult Result;
   6531 
   6532   // Since we have an interface or protocol, we can end it.
   6533   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
   6534 
   6535   if (LangOpts.ObjC) {
   6536     // @property
   6537     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "property")));
   6538 
   6539     // @required
   6540     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "required")));
   6541 
   6542     // @optional
   6543     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "optional")));
   6544   }
   6545 }
   6546 
   6547 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
   6548   typedef CodeCompletionResult Result;
   6549   CodeCompletionBuilder Builder(Results.getAllocator(),
   6550                                 Results.getCodeCompletionTUInfo());
   6551 
   6552   // @class name ;
   6553   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "class"));
   6554   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6555   Builder.AddPlaceholderChunk("name");
   6556   Results.AddResult(Result(Builder.TakeString()));
   6557 
   6558   if (Results.includeCodePatterns()) {
   6559     // @interface name
   6560     // FIXME: Could introduce the whole pattern, including superclasses and
   6561     // such.
   6562     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "interface"));
   6563     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6564     Builder.AddPlaceholderChunk("class");
   6565     Results.AddResult(Result(Builder.TakeString()));
   6566 
   6567     // @protocol name
   6568     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
   6569     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6570     Builder.AddPlaceholderChunk("protocol");
   6571     Results.AddResult(Result(Builder.TakeString()));
   6572 
   6573     // @implementation name
   6574     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "implementation"));
   6575     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6576     Builder.AddPlaceholderChunk("class");
   6577     Results.AddResult(Result(Builder.TakeString()));
   6578   }
   6579 
   6580   // @compatibility_alias name
   6581   Builder.AddTypedTextChunk(
   6582       OBJC_AT_KEYWORD_NAME(NeedAt, "compatibility_alias"));
   6583   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6584   Builder.AddPlaceholderChunk("alias");
   6585   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6586   Builder.AddPlaceholderChunk("class");
   6587   Results.AddResult(Result(Builder.TakeString()));
   6588 
   6589   if (Results.getSema().getLangOpts().Modules) {
   6590     // @import name
   6591     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import"));
   6592     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6593     Builder.AddPlaceholderChunk("module");
   6594     Results.AddResult(Result(Builder.TakeString()));
   6595   }
   6596 }
   6597 
   6598 void Sema::CodeCompleteObjCAtDirective(Scope *S) {
   6599   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6600                         CodeCompleter->getCodeCompletionTUInfo(),
   6601                         CodeCompletionContext::CCC_Other);
   6602   Results.EnterNewScope();
   6603   if (isa<ObjCImplDecl>(CurContext))
   6604     AddObjCImplementationResults(getLangOpts(), Results, false);
   6605   else if (CurContext->isObjCContainer())
   6606     AddObjCInterfaceResults(getLangOpts(), Results, false);
   6607   else
   6608     AddObjCTopLevelResults(Results, false);
   6609   Results.ExitScope();
   6610   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6611                             Results.data(), Results.size());
   6612 }
   6613 
   6614 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
   6615   typedef CodeCompletionResult Result;
   6616   CodeCompletionBuilder Builder(Results.getAllocator(),
   6617                                 Results.getCodeCompletionTUInfo());
   6618 
   6619   // @encode ( type-name )
   6620   const char *EncodeType = "char[]";
   6621   if (Results.getSema().getLangOpts().CPlusPlus ||
   6622       Results.getSema().getLangOpts().ConstStrings)
   6623     EncodeType = "const char[]";
   6624   Builder.AddResultTypeChunk(EncodeType);
   6625   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "encode"));
   6626   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   6627   Builder.AddPlaceholderChunk("type-name");
   6628   Builder.AddChunk(CodeCompletionString::CK_RightParen);
   6629   Results.AddResult(Result(Builder.TakeString()));
   6630 
   6631   // @protocol ( protocol-name )
   6632   Builder.AddResultTypeChunk("Protocol *");
   6633   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
   6634   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   6635   Builder.AddPlaceholderChunk("protocol-name");
   6636   Builder.AddChunk(CodeCompletionString::CK_RightParen);
   6637   Results.AddResult(Result(Builder.TakeString()));
   6638 
   6639   // @selector ( selector )
   6640   Builder.AddResultTypeChunk("SEL");
   6641   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "selector"));
   6642   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   6643   Builder.AddPlaceholderChunk("selector");
   6644   Builder.AddChunk(CodeCompletionString::CK_RightParen);
   6645   Results.AddResult(Result(Builder.TakeString()));
   6646 
   6647   // @"string"
   6648   Builder.AddResultTypeChunk("NSString *");
   6649   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "\""));
   6650   Builder.AddPlaceholderChunk("string");
   6651   Builder.AddTextChunk("\"");
   6652   Results.AddResult(Result(Builder.TakeString()));
   6653 
   6654   // @[objects, ...]
   6655   Builder.AddResultTypeChunk("NSArray *");
   6656   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "["));
   6657   Builder.AddPlaceholderChunk("objects, ...");
   6658   Builder.AddChunk(CodeCompletionString::CK_RightBracket);
   6659   Results.AddResult(Result(Builder.TakeString()));
   6660 
   6661   // @{key : object, ...}
   6662   Builder.AddResultTypeChunk("NSDictionary *");
   6663   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "{"));
   6664   Builder.AddPlaceholderChunk("key");
   6665   Builder.AddChunk(CodeCompletionString::CK_Colon);
   6666   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6667   Builder.AddPlaceholderChunk("object, ...");
   6668   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   6669   Results.AddResult(Result(Builder.TakeString()));
   6670 
   6671   // @(expression)
   6672   Builder.AddResultTypeChunk("id");
   6673   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "("));
   6674   Builder.AddPlaceholderChunk("expression");
   6675   Builder.AddChunk(CodeCompletionString::CK_RightParen);
   6676   Results.AddResult(Result(Builder.TakeString()));
   6677 }
   6678 
   6679 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
   6680   typedef CodeCompletionResult Result;
   6681   CodeCompletionBuilder Builder(Results.getAllocator(),
   6682                                 Results.getCodeCompletionTUInfo());
   6683 
   6684   if (Results.includeCodePatterns()) {
   6685     // @try { statements } @catch ( declaration ) { statements } @finally
   6686     //   { statements }
   6687     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "try"));
   6688     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   6689     Builder.AddPlaceholderChunk("statements");
   6690     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   6691     Builder.AddTextChunk("@catch");
   6692     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   6693     Builder.AddPlaceholderChunk("parameter");
   6694     Builder.AddChunk(CodeCompletionString::CK_RightParen);
   6695     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   6696     Builder.AddPlaceholderChunk("statements");
   6697     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   6698     Builder.AddTextChunk("@finally");
   6699     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   6700     Builder.AddPlaceholderChunk("statements");
   6701     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   6702     Results.AddResult(Result(Builder.TakeString()));
   6703   }
   6704 
   6705   // @throw
   6706   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "throw"));
   6707   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6708   Builder.AddPlaceholderChunk("expression");
   6709   Results.AddResult(Result(Builder.TakeString()));
   6710 
   6711   if (Results.includeCodePatterns()) {
   6712     // @synchronized ( expression ) { statements }
   6713     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synchronized"));
   6714     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   6715     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   6716     Builder.AddPlaceholderChunk("expression");
   6717     Builder.AddChunk(CodeCompletionString::CK_RightParen);
   6718     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   6719     Builder.AddPlaceholderChunk("statements");
   6720     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   6721     Results.AddResult(Result(Builder.TakeString()));
   6722   }
   6723 }
   6724 
   6725 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
   6726                                      ResultBuilder &Results, bool NeedAt) {
   6727   typedef CodeCompletionResult Result;
   6728   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "private")));
   6729   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "protected")));
   6730   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "public")));
   6731   if (LangOpts.ObjC)
   6732     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "package")));
   6733 }
   6734 
   6735 void Sema::CodeCompleteObjCAtVisibility(Scope *S) {
   6736   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6737                         CodeCompleter->getCodeCompletionTUInfo(),
   6738                         CodeCompletionContext::CCC_Other);
   6739   Results.EnterNewScope();
   6740   AddObjCVisibilityResults(getLangOpts(), Results, false);
   6741   Results.ExitScope();
   6742   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6743                             Results.data(), Results.size());
   6744 }
   6745 
   6746 void Sema::CodeCompleteObjCAtStatement(Scope *S) {
   6747   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6748                         CodeCompleter->getCodeCompletionTUInfo(),
   6749                         CodeCompletionContext::CCC_Other);
   6750   Results.EnterNewScope();
   6751   AddObjCStatementResults(Results, false);
   6752   AddObjCExpressionResults(Results, false);
   6753   Results.ExitScope();
   6754   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6755                             Results.data(), Results.size());
   6756 }
   6757 
   6758 void Sema::CodeCompleteObjCAtExpression(Scope *S) {
   6759   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6760                         CodeCompleter->getCodeCompletionTUInfo(),
   6761                         CodeCompletionContext::CCC_Other);
   6762   Results.EnterNewScope();
   6763   AddObjCExpressionResults(Results, false);
   6764   Results.ExitScope();
   6765   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6766                             Results.data(), Results.size());
   6767 }
   6768 
   6769 /// Determine whether the addition of the given flag to an Objective-C
   6770 /// property's attributes will cause a conflict.
   6771 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
   6772   // Check if we've already added this flag.
   6773   if (Attributes & NewFlag)
   6774     return true;
   6775 
   6776   Attributes |= NewFlag;
   6777 
   6778   // Check for collisions with "readonly".
   6779   if ((Attributes & ObjCPropertyAttribute::kind_readonly) &&
   6780       (Attributes & ObjCPropertyAttribute::kind_readwrite))
   6781     return true;
   6782 
   6783   // Check for more than one of { assign, copy, retain, strong, weak }.
   6784   unsigned AssignCopyRetMask =
   6785       Attributes &
   6786       (ObjCPropertyAttribute::kind_assign |
   6787        ObjCPropertyAttribute::kind_unsafe_unretained |
   6788        ObjCPropertyAttribute::kind_copy | ObjCPropertyAttribute::kind_retain |
   6789        ObjCPropertyAttribute::kind_strong | ObjCPropertyAttribute::kind_weak);
   6790   if (AssignCopyRetMask &&
   6791       AssignCopyRetMask != ObjCPropertyAttribute::kind_assign &&
   6792       AssignCopyRetMask != ObjCPropertyAttribute::kind_unsafe_unretained &&
   6793       AssignCopyRetMask != ObjCPropertyAttribute::kind_copy &&
   6794       AssignCopyRetMask != ObjCPropertyAttribute::kind_retain &&
   6795       AssignCopyRetMask != ObjCPropertyAttribute::kind_strong &&
   6796       AssignCopyRetMask != ObjCPropertyAttribute::kind_weak)
   6797     return true;
   6798 
   6799   return false;
   6800 }
   6801 
   6802 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
   6803   if (!CodeCompleter)
   6804     return;
   6805 
   6806   unsigned Attributes = ODS.getPropertyAttributes();
   6807 
   6808   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   6809                         CodeCompleter->getCodeCompletionTUInfo(),
   6810                         CodeCompletionContext::CCC_Other);
   6811   Results.EnterNewScope();
   6812   if (!ObjCPropertyFlagConflicts(Attributes,
   6813                                  ObjCPropertyAttribute::kind_readonly))
   6814     Results.AddResult(CodeCompletionResult("readonly"));
   6815   if (!ObjCPropertyFlagConflicts(Attributes,
   6816                                  ObjCPropertyAttribute::kind_assign))
   6817     Results.AddResult(CodeCompletionResult("assign"));
   6818   if (!ObjCPropertyFlagConflicts(Attributes,
   6819                                  ObjCPropertyAttribute::kind_unsafe_unretained))
   6820     Results.AddResult(CodeCompletionResult("unsafe_unretained"));
   6821   if (!ObjCPropertyFlagConflicts(Attributes,
   6822                                  ObjCPropertyAttribute::kind_readwrite))
   6823     Results.AddResult(CodeCompletionResult("readwrite"));
   6824   if (!ObjCPropertyFlagConflicts(Attributes,
   6825                                  ObjCPropertyAttribute::kind_retain))
   6826     Results.AddResult(CodeCompletionResult("retain"));
   6827   if (!ObjCPropertyFlagConflicts(Attributes,
   6828                                  ObjCPropertyAttribute::kind_strong))
   6829     Results.AddResult(CodeCompletionResult("strong"));
   6830   if (!ObjCPropertyFlagConflicts(Attributes, ObjCPropertyAttribute::kind_copy))
   6831     Results.AddResult(CodeCompletionResult("copy"));
   6832   if (!ObjCPropertyFlagConflicts(Attributes,
   6833                                  ObjCPropertyAttribute::kind_nonatomic))
   6834     Results.AddResult(CodeCompletionResult("nonatomic"));
   6835   if (!ObjCPropertyFlagConflicts(Attributes,
   6836                                  ObjCPropertyAttribute::kind_atomic))
   6837     Results.AddResult(CodeCompletionResult("atomic"));
   6838 
   6839   // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC.
   6840   if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC)
   6841     if (!ObjCPropertyFlagConflicts(Attributes,
   6842                                    ObjCPropertyAttribute::kind_weak))
   6843       Results.AddResult(CodeCompletionResult("weak"));
   6844 
   6845   if (!ObjCPropertyFlagConflicts(Attributes,
   6846                                  ObjCPropertyAttribute::kind_setter)) {
   6847     CodeCompletionBuilder Setter(Results.getAllocator(),
   6848                                  Results.getCodeCompletionTUInfo());
   6849     Setter.AddTypedTextChunk("setter");
   6850     Setter.AddTextChunk("=");
   6851     Setter.AddPlaceholderChunk("method");
   6852     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
   6853   }
   6854   if (!ObjCPropertyFlagConflicts(Attributes,
   6855                                  ObjCPropertyAttribute::kind_getter)) {
   6856     CodeCompletionBuilder Getter(Results.getAllocator(),
   6857                                  Results.getCodeCompletionTUInfo());
   6858     Getter.AddTypedTextChunk("getter");
   6859     Getter.AddTextChunk("=");
   6860     Getter.AddPlaceholderChunk("method");
   6861     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
   6862   }
   6863   if (!ObjCPropertyFlagConflicts(Attributes,
   6864                                  ObjCPropertyAttribute::kind_nullability)) {
   6865     Results.AddResult(CodeCompletionResult("nonnull"));
   6866     Results.AddResult(CodeCompletionResult("nullable"));
   6867     Results.AddResult(CodeCompletionResult("null_unspecified"));
   6868     Results.AddResult(CodeCompletionResult("null_resettable"));
   6869   }
   6870   Results.ExitScope();
   6871   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   6872                             Results.data(), Results.size());
   6873 }
   6874 
   6875 /// Describes the kind of Objective-C method that we want to find
   6876 /// via code completion.
   6877 enum ObjCMethodKind {
   6878   MK_Any, ///< Any kind of method, provided it means other specified criteria.
   6879   MK_ZeroArgSelector, ///< Zero-argument (unary) selector.
   6880   MK_OneArgSelector   ///< One-argument selector.
   6881 };
   6882 
   6883 static bool isAcceptableObjCSelector(Selector Sel, ObjCMethodKind WantKind,
   6884                                      ArrayRef<IdentifierInfo *> SelIdents,
   6885                                      bool AllowSameLength = true) {
   6886   unsigned NumSelIdents = SelIdents.size();
   6887   if (NumSelIdents > Sel.getNumArgs())
   6888     return false;
   6889 
   6890   switch (WantKind) {
   6891   case MK_Any:
   6892     break;
   6893   case MK_ZeroArgSelector:
   6894     return Sel.isUnarySelector();
   6895   case MK_OneArgSelector:
   6896     return Sel.getNumArgs() == 1;
   6897   }
   6898 
   6899   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
   6900     return false;
   6901 
   6902   for (unsigned I = 0; I != NumSelIdents; ++I)
   6903     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
   6904       return false;
   6905 
   6906   return true;
   6907 }
   6908 
   6909 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
   6910                                    ObjCMethodKind WantKind,
   6911                                    ArrayRef<IdentifierInfo *> SelIdents,
   6912                                    bool AllowSameLength = true) {
   6913   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
   6914                                   AllowSameLength);
   6915 }
   6916 
   6917 /// A set of selectors, which is used to avoid introducing multiple
   6918 /// completions with the same selector into the result set.
   6919 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
   6920 
   6921 /// Add all of the Objective-C methods in the given Objective-C
   6922 /// container to the set of results.
   6923 ///
   6924 /// The container will be a class, protocol, category, or implementation of
   6925 /// any of the above. This mether will recurse to include methods from
   6926 /// the superclasses of classes along with their categories, protocols, and
   6927 /// implementations.
   6928 ///
   6929 /// \param Container the container in which we'll look to find methods.
   6930 ///
   6931 /// \param WantInstanceMethods Whether to add instance methods (only); if
   6932 /// false, this routine will add factory methods (only).
   6933 ///
   6934 /// \param CurContext the context in which we're performing the lookup that
   6935 /// finds methods.
   6936 ///
   6937 /// \param AllowSameLength Whether we allow a method to be added to the list
   6938 /// when it has the same number of parameters as we have selector identifiers.
   6939 ///
   6940 /// \param Results the structure into which we'll add results.
   6941 static void AddObjCMethods(ObjCContainerDecl *Container,
   6942                            bool WantInstanceMethods, ObjCMethodKind WantKind,
   6943                            ArrayRef<IdentifierInfo *> SelIdents,
   6944                            DeclContext *CurContext,
   6945                            VisitedSelectorSet &Selectors, bool AllowSameLength,
   6946                            ResultBuilder &Results, bool InOriginalClass = true,
   6947                            bool IsRootClass = false) {
   6948   typedef CodeCompletionResult Result;
   6949   Container = getContainerDef(Container);
   6950   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
   6951   IsRootClass = IsRootClass || (IFace && !IFace->getSuperClass());
   6952   for (ObjCMethodDecl *M : Container->methods()) {
   6953     // The instance methods on the root class can be messaged via the
   6954     // metaclass.
   6955     if (M->isInstanceMethod() == WantInstanceMethods ||
   6956         (IsRootClass && !WantInstanceMethods)) {
   6957       // Check whether the selector identifiers we've been given are a
   6958       // subset of the identifiers for this particular method.
   6959       if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength))
   6960         continue;
   6961 
   6962       if (!Selectors.insert(M->getSelector()).second)
   6963         continue;
   6964 
   6965       Result R = Result(M, Results.getBasePriority(M), nullptr);
   6966       R.StartParameter = SelIdents.size();
   6967       R.AllParametersAreInformative = (WantKind != MK_Any);
   6968       if (!InOriginalClass)
   6969         setInBaseClass(R);
   6970       Results.MaybeAddResult(R, CurContext);
   6971     }
   6972   }
   6973 
   6974   // Visit the protocols of protocols.
   6975   if (const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
   6976     if (Protocol->hasDefinition()) {
   6977       const ObjCList<ObjCProtocolDecl> &Protocols =
   6978           Protocol->getReferencedProtocols();
   6979       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
   6980                                                 E = Protocols.end();
   6981            I != E; ++I)
   6982         AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
   6983                        Selectors, AllowSameLength, Results, false, IsRootClass);
   6984     }
   6985   }
   6986 
   6987   if (!IFace || !IFace->hasDefinition())
   6988     return;
   6989 
   6990   // Add methods in protocols.
   6991   for (ObjCProtocolDecl *I : IFace->protocols())
   6992     AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext,
   6993                    Selectors, AllowSameLength, Results, false, IsRootClass);
   6994 
   6995   // Add methods in categories.
   6996   for (ObjCCategoryDecl *CatDecl : IFace->known_categories()) {
   6997     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
   6998                    CurContext, Selectors, AllowSameLength, Results,
   6999                    InOriginalClass, IsRootClass);
   7000 
   7001     // Add a categories protocol methods.
   7002     const ObjCList<ObjCProtocolDecl> &Protocols =
   7003         CatDecl->getReferencedProtocols();
   7004     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
   7005                                               E = Protocols.end();
   7006          I != E; ++I)
   7007       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
   7008                      Selectors, AllowSameLength, Results, false, IsRootClass);
   7009 
   7010     // Add methods in category implementations.
   7011     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
   7012       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
   7013                      Selectors, AllowSameLength, Results, InOriginalClass,
   7014                      IsRootClass);
   7015   }
   7016 
   7017   // Add methods in superclass.
   7018   // Avoid passing in IsRootClass since root classes won't have super classes.
   7019   if (IFace->getSuperClass())
   7020     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
   7021                    SelIdents, CurContext, Selectors, AllowSameLength, Results,
   7022                    /*IsRootClass=*/false);
   7023 
   7024   // Add methods in our implementation, if any.
   7025   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
   7026     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
   7027                    Selectors, AllowSameLength, Results, InOriginalClass,
   7028                    IsRootClass);
   7029 }
   7030 
   7031 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) {
   7032   // Try to find the interface where getters might live.
   7033   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
   7034   if (!Class) {
   7035     if (ObjCCategoryDecl *Category =
   7036             dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
   7037       Class = Category->getClassInterface();
   7038 
   7039     if (!Class)
   7040       return;
   7041   }
   7042 
   7043   // Find all of the potential getters.
   7044   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   7045                         CodeCompleter->getCodeCompletionTUInfo(),
   7046                         CodeCompletionContext::CCC_Other);
   7047   Results.EnterNewScope();
   7048 
   7049   VisitedSelectorSet Selectors;
   7050   AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors,
   7051                  /*AllowSameLength=*/true, Results);
   7052   Results.ExitScope();
   7053   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7054                             Results.data(), Results.size());
   7055 }
   7056 
   7057 void Sema::CodeCompleteObjCPropertySetter(Scope *S) {
   7058   // Try to find the interface where setters might live.
   7059   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
   7060   if (!Class) {
   7061     if (ObjCCategoryDecl *Category =
   7062             dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
   7063       Class = Category->getClassInterface();
   7064 
   7065     if (!Class)
   7066       return;
   7067   }
   7068 
   7069   // Find all of the potential getters.
   7070   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   7071                         CodeCompleter->getCodeCompletionTUInfo(),
   7072                         CodeCompletionContext::CCC_Other);
   7073   Results.EnterNewScope();
   7074 
   7075   VisitedSelectorSet Selectors;
   7076   AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext, Selectors,
   7077                  /*AllowSameLength=*/true, Results);
   7078 
   7079   Results.ExitScope();
   7080   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7081                             Results.data(), Results.size());
   7082 }
   7083 
   7084 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
   7085                                        bool IsParameter) {
   7086   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   7087                         CodeCompleter->getCodeCompletionTUInfo(),
   7088                         CodeCompletionContext::CCC_Type);
   7089   Results.EnterNewScope();
   7090 
   7091   // Add context-sensitive, Objective-C parameter-passing keywords.
   7092   bool AddedInOut = false;
   7093   if ((DS.getObjCDeclQualifier() &
   7094        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
   7095     Results.AddResult("in");
   7096     Results.AddResult("inout");
   7097     AddedInOut = true;
   7098   }
   7099   if ((DS.getObjCDeclQualifier() &
   7100        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
   7101     Results.AddResult("out");
   7102     if (!AddedInOut)
   7103       Results.AddResult("inout");
   7104   }
   7105   if ((DS.getObjCDeclQualifier() &
   7106        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
   7107         ObjCDeclSpec::DQ_Oneway)) == 0) {
   7108     Results.AddResult("bycopy");
   7109     Results.AddResult("byref");
   7110     Results.AddResult("oneway");
   7111   }
   7112   if ((DS.getObjCDeclQualifier() & ObjCDeclSpec::DQ_CSNullability) == 0) {
   7113     Results.AddResult("nonnull");
   7114     Results.AddResult("nullable");
   7115     Results.AddResult("null_unspecified");
   7116   }
   7117 
   7118   // If we're completing the return type of an Objective-C method and the
   7119   // identifier IBAction refers to a macro, provide a completion item for
   7120   // an action, e.g.,
   7121   //   IBAction)<#selector#>:(id)sender
   7122   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
   7123       PP.isMacroDefined("IBAction")) {
   7124     CodeCompletionBuilder Builder(Results.getAllocator(),
   7125                                   Results.getCodeCompletionTUInfo(),
   7126                                   CCP_CodePattern, CXAvailability_Available);
   7127     Builder.AddTypedTextChunk("IBAction");
   7128     Builder.AddChunk(CodeCompletionString::CK_RightParen);
   7129     Builder.AddPlaceholderChunk("selector");
   7130     Builder.AddChunk(CodeCompletionString::CK_Colon);
   7131     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   7132     Builder.AddTextChunk("id");
   7133     Builder.AddChunk(CodeCompletionString::CK_RightParen);
   7134     Builder.AddTextChunk("sender");
   7135     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
   7136   }
   7137 
   7138   // If we're completing the return type, provide 'instancetype'.
   7139   if (!IsParameter) {
   7140     Results.AddResult(CodeCompletionResult("instancetype"));
   7141   }
   7142 
   7143   // Add various builtin type names and specifiers.
   7144   AddOrdinaryNameResults(PCC_Type, S, *this, Results);
   7145   Results.ExitScope();
   7146 
   7147   // Add the various type names
   7148   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
   7149   CodeCompletionDeclConsumer Consumer(Results, CurContext);
   7150   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
   7151                      CodeCompleter->includeGlobals(),
   7152                      CodeCompleter->loadExternal());
   7153 
   7154   if (CodeCompleter->includeMacros())
   7155     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
   7156 
   7157   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7158                             Results.data(), Results.size());
   7159 }
   7160 
   7161 /// When we have an expression with type "id", we may assume
   7162 /// that it has some more-specific class type based on knowledge of
   7163 /// common uses of Objective-C. This routine returns that class type,
   7164 /// or NULL if no better result could be determined.
   7165 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
   7166   auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
   7167   if (!Msg)
   7168     return nullptr;
   7169 
   7170   Selector Sel = Msg->getSelector();
   7171   if (Sel.isNull())
   7172     return nullptr;
   7173 
   7174   IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
   7175   if (!Id)
   7176     return nullptr;
   7177 
   7178   ObjCMethodDecl *Method = Msg->getMethodDecl();
   7179   if (!Method)
   7180     return nullptr;
   7181 
   7182   // Determine the class that we're sending the message to.
   7183   ObjCInterfaceDecl *IFace = nullptr;
   7184   switch (Msg->getReceiverKind()) {
   7185   case ObjCMessageExpr::Class:
   7186     if (const ObjCObjectType *ObjType =
   7187             Msg->getClassReceiver()->getAs<ObjCObjectType>())
   7188       IFace = ObjType->getInterface();
   7189     break;
   7190 
   7191   case ObjCMessageExpr::Instance: {
   7192     QualType T = Msg->getInstanceReceiver()->getType();
   7193     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
   7194       IFace = Ptr->getInterfaceDecl();
   7195     break;
   7196   }
   7197 
   7198   case ObjCMessageExpr::SuperInstance:
   7199   case ObjCMessageExpr::SuperClass:
   7200     break;
   7201   }
   7202 
   7203   if (!IFace)
   7204     return nullptr;
   7205 
   7206   ObjCInterfaceDecl *Super = IFace->getSuperClass();
   7207   if (Method->isInstanceMethod())
   7208     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
   7209         .Case("retain", IFace)
   7210         .Case("strong", IFace)
   7211         .Case("autorelease", IFace)
   7212         .Case("copy", IFace)
   7213         .Case("copyWithZone", IFace)
   7214         .Case("mutableCopy", IFace)
   7215         .Case("mutableCopyWithZone", IFace)
   7216         .Case("awakeFromCoder", IFace)
   7217         .Case("replacementObjectFromCoder", IFace)
   7218         .Case("class", IFace)
   7219         .Case("classForCoder", IFace)
   7220         .Case("superclass", Super)
   7221         .Default(nullptr);
   7222 
   7223   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
   7224       .Case("new", IFace)
   7225       .Case("alloc", IFace)
   7226       .Case("allocWithZone", IFace)
   7227       .Case("class", IFace)
   7228       .Case("superclass", Super)
   7229       .Default(nullptr);
   7230 }
   7231 
   7232 // Add a special completion for a message send to "super", which fills in the
   7233 // most likely case of forwarding all of our arguments to the superclass
   7234 // function.
   7235 ///
   7236 /// \param S The semantic analysis object.
   7237 ///
   7238 /// \param NeedSuperKeyword Whether we need to prefix this completion with
   7239 /// the "super" keyword. Otherwise, we just need to provide the arguments.
   7240 ///
   7241 /// \param SelIdents The identifiers in the selector that have already been
   7242 /// provided as arguments for a send to "super".
   7243 ///
   7244 /// \param Results The set of results to augment.
   7245 ///
   7246 /// \returns the Objective-C method declaration that would be invoked by
   7247 /// this "super" completion. If NULL, no completion was added.
   7248 static ObjCMethodDecl *
   7249 AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,
   7250                        ArrayRef<IdentifierInfo *> SelIdents,
   7251                        ResultBuilder &Results) {
   7252   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
   7253   if (!CurMethod)
   7254     return nullptr;
   7255 
   7256   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
   7257   if (!Class)
   7258     return nullptr;
   7259 
   7260   // Try to find a superclass method with the same selector.
   7261   ObjCMethodDecl *SuperMethod = nullptr;
   7262   while ((Class = Class->getSuperClass()) && !SuperMethod) {
   7263     // Check in the class
   7264     SuperMethod = Class->getMethod(CurMethod->getSelector(),
   7265                                    CurMethod->isInstanceMethod());
   7266 
   7267     // Check in categories or class extensions.
   7268     if (!SuperMethod) {
   7269       for (const auto *Cat : Class->known_categories()) {
   7270         if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(),
   7271                                           CurMethod->isInstanceMethod())))
   7272           break;
   7273       }
   7274     }
   7275   }
   7276 
   7277   if (!SuperMethod)
   7278     return nullptr;
   7279 
   7280   // Check whether the superclass method has the same signature.
   7281   if (CurMethod->param_size() != SuperMethod->param_size() ||
   7282       CurMethod->isVariadic() != SuperMethod->isVariadic())
   7283     return nullptr;
   7284 
   7285   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
   7286                                       CurPEnd = CurMethod->param_end(),
   7287                                       SuperP = SuperMethod->param_begin();
   7288        CurP != CurPEnd; ++CurP, ++SuperP) {
   7289     // Make sure the parameter types are compatible.
   7290     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
   7291                                           (*SuperP)->getType()))
   7292       return nullptr;
   7293 
   7294     // Make sure we have a parameter name to forward!
   7295     if (!(*CurP)->getIdentifier())
   7296       return nullptr;
   7297   }
   7298 
   7299   // We have a superclass method. Now, form the send-to-super completion.
   7300   CodeCompletionBuilder Builder(Results.getAllocator(),
   7301                                 Results.getCodeCompletionTUInfo());
   7302 
   7303   // Give this completion a return type.
   7304   AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod,
   7305                      Results.getCompletionContext().getBaseType(), Builder);
   7306 
   7307   // If we need the "super" keyword, add it (plus some spacing).
   7308   if (NeedSuperKeyword) {
   7309     Builder.AddTypedTextChunk("super");
   7310     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   7311   }
   7312 
   7313   Selector Sel = CurMethod->getSelector();
   7314   if (Sel.isUnarySelector()) {
   7315     if (NeedSuperKeyword)
   7316       Builder.AddTextChunk(
   7317           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
   7318     else
   7319       Builder.AddTypedTextChunk(
   7320           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
   7321   } else {
   7322     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
   7323     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
   7324       if (I > SelIdents.size())
   7325         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   7326 
   7327       if (I < SelIdents.size())
   7328         Builder.AddInformativeChunk(
   7329             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
   7330       else if (NeedSuperKeyword || I > SelIdents.size()) {
   7331         Builder.AddTextChunk(
   7332             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
   7333         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
   7334             (*CurP)->getIdentifier()->getName()));
   7335       } else {
   7336         Builder.AddTypedTextChunk(
   7337             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
   7338         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
   7339             (*CurP)->getIdentifier()->getName()));
   7340       }
   7341     }
   7342   }
   7343 
   7344   Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod,
   7345                                          CCP_SuperCompletion));
   7346   return SuperMethod;
   7347 }
   7348 
   7349 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {
   7350   typedef CodeCompletionResult Result;
   7351   ResultBuilder Results(
   7352       *this, CodeCompleter->getAllocator(),
   7353       CodeCompleter->getCodeCompletionTUInfo(),
   7354       CodeCompletionContext::CCC_ObjCMessageReceiver,
   7355       getLangOpts().CPlusPlus11
   7356           ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
   7357           : &ResultBuilder::IsObjCMessageReceiver);
   7358 
   7359   CodeCompletionDeclConsumer Consumer(Results, CurContext);
   7360   Results.EnterNewScope();
   7361   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
   7362                      CodeCompleter->includeGlobals(),
   7363                      CodeCompleter->loadExternal());
   7364 
   7365   // If we are in an Objective-C method inside a class that has a superclass,
   7366   // add "super" as an option.
   7367   if (ObjCMethodDecl *Method = getCurMethodDecl())
   7368     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
   7369       if (Iface->getSuperClass()) {
   7370         Results.AddResult(Result("super"));
   7371 
   7372         AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results);
   7373       }
   7374 
   7375   if (getLangOpts().CPlusPlus11)
   7376     addThisCompletion(*this, Results);
   7377 
   7378   Results.ExitScope();
   7379 
   7380   if (CodeCompleter->includeMacros())
   7381     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
   7382   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7383                             Results.data(), Results.size());
   7384 }
   7385 
   7386 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
   7387                                         ArrayRef<IdentifierInfo *> SelIdents,
   7388                                         bool AtArgumentExpression) {
   7389   ObjCInterfaceDecl *CDecl = nullptr;
   7390   if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
   7391     // Figure out which interface we're in.
   7392     CDecl = CurMethod->getClassInterface();
   7393     if (!CDecl)
   7394       return;
   7395 
   7396     // Find the superclass of this class.
   7397     CDecl = CDecl->getSuperClass();
   7398     if (!CDecl)
   7399       return;
   7400 
   7401     if (CurMethod->isInstanceMethod()) {
   7402       // We are inside an instance method, which means that the message
   7403       // send [super ...] is actually calling an instance method on the
   7404       // current object.
   7405       return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents,
   7406                                              AtArgumentExpression, CDecl);
   7407     }
   7408 
   7409     // Fall through to send to the superclass in CDecl.
   7410   } else {
   7411     // "super" may be the name of a type or variable. Figure out which
   7412     // it is.
   7413     IdentifierInfo *Super = getSuperIdentifier();
   7414     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, LookupOrdinaryName);
   7415     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
   7416       // "super" names an interface. Use it.
   7417     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
   7418       if (const ObjCObjectType *Iface =
   7419               Context.getTypeDeclType(TD)->getAs<ObjCObjectType>())
   7420         CDecl = Iface->getInterface();
   7421     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
   7422       // "super" names an unresolved type; we can't be more specific.
   7423     } else {
   7424       // Assume that "super" names some kind of value and parse that way.
   7425       CXXScopeSpec SS;
   7426       SourceLocation TemplateKWLoc;
   7427       UnqualifiedId id;
   7428       id.setIdentifier(Super, SuperLoc);
   7429       ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id,
   7430                                                /*HasTrailingLParen=*/false,
   7431                                                /*IsAddressOfOperand=*/false);
   7432       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
   7433                                              SelIdents, AtArgumentExpression);
   7434     }
   7435 
   7436     // Fall through
   7437   }
   7438 
   7439   ParsedType Receiver;
   7440   if (CDecl)
   7441     Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));
   7442   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
   7443                                       AtArgumentExpression,
   7444                                       /*IsSuper=*/true);
   7445 }
   7446 
   7447 /// Given a set of code-completion results for the argument of a message
   7448 /// send, determine the preferred type (if any) for that argument expression.
   7449 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
   7450                                                        unsigned NumSelIdents) {
   7451   typedef CodeCompletionResult Result;
   7452   ASTContext &Context = Results.getSema().Context;
   7453 
   7454   QualType PreferredType;
   7455   unsigned BestPriority = CCP_Unlikely * 2;
   7456   Result *ResultsData = Results.data();
   7457   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
   7458     Result &R = ResultsData[I];
   7459     if (R.Kind == Result::RK_Declaration &&
   7460         isa<ObjCMethodDecl>(R.Declaration)) {
   7461       if (R.Priority <= BestPriority) {
   7462         const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
   7463         if (NumSelIdents <= Method->param_size()) {
   7464           QualType MyPreferredType =
   7465               Method->parameters()[NumSelIdents - 1]->getType();
   7466           if (R.Priority < BestPriority || PreferredType.isNull()) {
   7467             BestPriority = R.Priority;
   7468             PreferredType = MyPreferredType;
   7469           } else if (!Context.hasSameUnqualifiedType(PreferredType,
   7470                                                      MyPreferredType)) {
   7471             PreferredType = QualType();
   7472           }
   7473         }
   7474       }
   7475     }
   7476   }
   7477 
   7478   return PreferredType;
   7479 }
   7480 
   7481 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
   7482                                        ParsedType Receiver,
   7483                                        ArrayRef<IdentifierInfo *> SelIdents,
   7484                                        bool AtArgumentExpression, bool IsSuper,
   7485                                        ResultBuilder &Results) {
   7486   typedef CodeCompletionResult Result;
   7487   ObjCInterfaceDecl *CDecl = nullptr;
   7488 
   7489   // If the given name refers to an interface type, retrieve the
   7490   // corresponding declaration.
   7491   if (Receiver) {
   7492     QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr);
   7493     if (!T.isNull())
   7494       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
   7495         CDecl = Interface->getInterface();
   7496   }
   7497 
   7498   // Add all of the factory methods in this Objective-C class, its protocols,
   7499   // superclasses, categories, implementation, etc.
   7500   Results.EnterNewScope();
   7501 
   7502   // If this is a send-to-super, try to add the special "super" send
   7503   // completion.
   7504   if (IsSuper) {
   7505     if (ObjCMethodDecl *SuperMethod =
   7506             AddSuperSendCompletion(SemaRef, false, SelIdents, Results))
   7507       Results.Ignore(SuperMethod);
   7508   }
   7509 
   7510   // If we're inside an Objective-C method definition, prefer its selector to
   7511   // others.
   7512   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
   7513     Results.setPreferredSelector(CurMethod->getSelector());
   7514 
   7515   VisitedSelectorSet Selectors;
   7516   if (CDecl)
   7517     AddObjCMethods(CDecl, false, MK_Any, SelIdents, SemaRef.CurContext,
   7518                    Selectors, AtArgumentExpression, Results);
   7519   else {
   7520     // We're messaging "id" as a type; provide all class/factory methods.
   7521 
   7522     // If we have an external source, load the entire class method
   7523     // pool from the AST file.
   7524     if (SemaRef.getExternalSource()) {
   7525       for (uint32_t I = 0,
   7526                     N = SemaRef.getExternalSource()->GetNumExternalSelectors();
   7527            I != N; ++I) {
   7528         Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I);
   7529         if (Sel.isNull() || SemaRef.MethodPool.count(Sel))
   7530           continue;
   7531 
   7532         SemaRef.ReadMethodPool(Sel);
   7533       }
   7534     }
   7535 
   7536     for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(),
   7537                                           MEnd = SemaRef.MethodPool.end();
   7538          M != MEnd; ++M) {
   7539       for (ObjCMethodList *MethList = &M->second.second;
   7540            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
   7541         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
   7542           continue;
   7543 
   7544         Result R(MethList->getMethod(),
   7545                  Results.getBasePriority(MethList->getMethod()), nullptr);
   7546         R.StartParameter = SelIdents.size();
   7547         R.AllParametersAreInformative = false;
   7548         Results.MaybeAddResult(R, SemaRef.CurContext);
   7549       }
   7550     }
   7551   }
   7552 
   7553   Results.ExitScope();
   7554 }
   7555 
   7556 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
   7557                                         ArrayRef<IdentifierInfo *> SelIdents,
   7558                                         bool AtArgumentExpression,
   7559                                         bool IsSuper) {
   7560 
   7561   QualType T = this->GetTypeFromParser(Receiver);
   7562 
   7563   ResultBuilder Results(
   7564       *this, CodeCompleter->getAllocator(),
   7565       CodeCompleter->getCodeCompletionTUInfo(),
   7566       CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, T,
   7567                             SelIdents));
   7568 
   7569   AddClassMessageCompletions(*this, S, Receiver, SelIdents,
   7570                              AtArgumentExpression, IsSuper, Results);
   7571 
   7572   // If we're actually at the argument expression (rather than prior to the
   7573   // selector), we're actually performing code completion for an expression.
   7574   // Determine whether we have a single, best method. If so, we can
   7575   // code-complete the expression using the corresponding parameter type as
   7576   // our preferred type, improving completion results.
   7577   if (AtArgumentExpression) {
   7578     QualType PreferredType =
   7579         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
   7580     if (PreferredType.isNull())
   7581       CodeCompleteOrdinaryName(S, PCC_Expression);
   7582     else
   7583       CodeCompleteExpression(S, PreferredType);
   7584     return;
   7585   }
   7586 
   7587   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7588                             Results.data(), Results.size());
   7589 }
   7590 
   7591 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,
   7592                                            ArrayRef<IdentifierInfo *> SelIdents,
   7593                                            bool AtArgumentExpression,
   7594                                            ObjCInterfaceDecl *Super) {
   7595   typedef CodeCompletionResult Result;
   7596 
   7597   Expr *RecExpr = static_cast<Expr *>(Receiver);
   7598 
   7599   // If necessary, apply function/array conversion to the receiver.
   7600   // C99 6.7.5.3p[7,8].
   7601   if (RecExpr) {
   7602     ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr);
   7603     if (Conv.isInvalid()) // conversion failed. bail.
   7604       return;
   7605     RecExpr = Conv.get();
   7606   }
   7607   QualType ReceiverType = RecExpr
   7608                               ? RecExpr->getType()
   7609                               : Super ? Context.getObjCObjectPointerType(
   7610                                             Context.getObjCInterfaceType(Super))
   7611                                       : Context.getObjCIdType();
   7612 
   7613   // If we're messaging an expression with type "id" or "Class", check
   7614   // whether we know something special about the receiver that allows
   7615   // us to assume a more-specific receiver type.
   7616   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) {
   7617     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
   7618       if (ReceiverType->isObjCClassType())
   7619         return CodeCompleteObjCClassMessage(
   7620             S, ParsedType::make(Context.getObjCInterfaceType(IFace)), SelIdents,
   7621             AtArgumentExpression, Super);
   7622 
   7623       ReceiverType =
   7624           Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace));
   7625     }
   7626   } else if (RecExpr && getLangOpts().CPlusPlus) {
   7627     ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr);
   7628     if (Conv.isUsable()) {
   7629       RecExpr = Conv.get();
   7630       ReceiverType = RecExpr->getType();
   7631     }
   7632   }
   7633 
   7634   // Build the set of methods we can see.
   7635   ResultBuilder Results(
   7636       *this, CodeCompleter->getAllocator(),
   7637       CodeCompleter->getCodeCompletionTUInfo(),
   7638       CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
   7639                             ReceiverType, SelIdents));
   7640 
   7641   Results.EnterNewScope();
   7642 
   7643   // If this is a send-to-super, try to add the special "super" send
   7644   // completion.
   7645   if (Super) {
   7646     if (ObjCMethodDecl *SuperMethod =
   7647             AddSuperSendCompletion(*this, false, SelIdents, Results))
   7648       Results.Ignore(SuperMethod);
   7649   }
   7650 
   7651   // If we're inside an Objective-C method definition, prefer its selector to
   7652   // others.
   7653   if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
   7654     Results.setPreferredSelector(CurMethod->getSelector());
   7655 
   7656   // Keep track of the selectors we've already added.
   7657   VisitedSelectorSet Selectors;
   7658 
   7659   // Handle messages to Class. This really isn't a message to an instance
   7660   // method, so we treat it the same way we would treat a message send to a
   7661   // class method.
   7662   if (ReceiverType->isObjCClassType() ||
   7663       ReceiverType->isObjCQualifiedClassType()) {
   7664     if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
   7665       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
   7666         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, CurContext,
   7667                        Selectors, AtArgumentExpression, Results);
   7668     }
   7669   }
   7670   // Handle messages to a qualified ID ("id<foo>").
   7671   else if (const ObjCObjectPointerType *QualID =
   7672                ReceiverType->getAsObjCQualifiedIdType()) {
   7673     // Search protocols for instance methods.
   7674     for (auto *I : QualID->quals())
   7675       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors,
   7676                      AtArgumentExpression, Results);
   7677   }
   7678   // Handle messages to a pointer to interface type.
   7679   else if (const ObjCObjectPointerType *IFacePtr =
   7680                ReceiverType->getAsObjCInterfacePointerType()) {
   7681     // Search the class, its superclasses, etc., for instance methods.
   7682     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
   7683                    CurContext, Selectors, AtArgumentExpression, Results);
   7684 
   7685     // Search protocols for instance methods.
   7686     for (auto *I : IFacePtr->quals())
   7687       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors,
   7688                      AtArgumentExpression, Results);
   7689   }
   7690   // Handle messages to "id".
   7691   else if (ReceiverType->isObjCIdType()) {
   7692     // We're messaging "id", so provide all instance methods we know
   7693     // about as code-completion results.
   7694 
   7695     // If we have an external source, load the entire class method
   7696     // pool from the AST file.
   7697     if (ExternalSource) {
   7698       for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
   7699            I != N; ++I) {
   7700         Selector Sel = ExternalSource->GetExternalSelector(I);
   7701         if (Sel.isNull() || MethodPool.count(Sel))
   7702           continue;
   7703 
   7704         ReadMethodPool(Sel);
   7705       }
   7706     }
   7707 
   7708     for (GlobalMethodPool::iterator M = MethodPool.begin(),
   7709                                     MEnd = MethodPool.end();
   7710          M != MEnd; ++M) {
   7711       for (ObjCMethodList *MethList = &M->second.first;
   7712            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
   7713         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
   7714           continue;
   7715 
   7716         if (!Selectors.insert(MethList->getMethod()->getSelector()).second)
   7717           continue;
   7718 
   7719         Result R(MethList->getMethod(),
   7720                  Results.getBasePriority(MethList->getMethod()), nullptr);
   7721         R.StartParameter = SelIdents.size();
   7722         R.AllParametersAreInformative = false;
   7723         Results.MaybeAddResult(R, CurContext);
   7724       }
   7725     }
   7726   }
   7727   Results.ExitScope();
   7728 
   7729   // If we're actually at the argument expression (rather than prior to the
   7730   // selector), we're actually performing code completion for an expression.
   7731   // Determine whether we have a single, best method. If so, we can
   7732   // code-complete the expression using the corresponding parameter type as
   7733   // our preferred type, improving completion results.
   7734   if (AtArgumentExpression) {
   7735     QualType PreferredType =
   7736         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
   7737     if (PreferredType.isNull())
   7738       CodeCompleteOrdinaryName(S, PCC_Expression);
   7739     else
   7740       CodeCompleteExpression(S, PreferredType);
   7741     return;
   7742   }
   7743 
   7744   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7745                             Results.data(), Results.size());
   7746 }
   7747 
   7748 void Sema::CodeCompleteObjCForCollection(Scope *S,
   7749                                          DeclGroupPtrTy IterationVar) {
   7750   CodeCompleteExpressionData Data;
   7751   Data.ObjCCollection = true;
   7752 
   7753   if (IterationVar.getAsOpaquePtr()) {
   7754     DeclGroupRef DG = IterationVar.get();
   7755     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
   7756       if (*I)
   7757         Data.IgnoreDecls.push_back(*I);
   7758     }
   7759   }
   7760 
   7761   CodeCompleteExpression(S, Data);
   7762 }
   7763 
   7764 void Sema::CodeCompleteObjCSelector(Scope *S,
   7765                                     ArrayRef<IdentifierInfo *> SelIdents) {
   7766   // If we have an external source, load the entire class method
   7767   // pool from the AST file.
   7768   if (ExternalSource) {
   7769     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N;
   7770          ++I) {
   7771       Selector Sel = ExternalSource->GetExternalSelector(I);
   7772       if (Sel.isNull() || MethodPool.count(Sel))
   7773         continue;
   7774 
   7775       ReadMethodPool(Sel);
   7776     }
   7777   }
   7778 
   7779   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   7780                         CodeCompleter->getCodeCompletionTUInfo(),
   7781                         CodeCompletionContext::CCC_SelectorName);
   7782   Results.EnterNewScope();
   7783   for (GlobalMethodPool::iterator M = MethodPool.begin(),
   7784                                   MEnd = MethodPool.end();
   7785        M != MEnd; ++M) {
   7786 
   7787     Selector Sel = M->first;
   7788     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents))
   7789       continue;
   7790 
   7791     CodeCompletionBuilder Builder(Results.getAllocator(),
   7792                                   Results.getCodeCompletionTUInfo());
   7793     if (Sel.isUnarySelector()) {
   7794       Builder.AddTypedTextChunk(
   7795           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
   7796       Results.AddResult(Builder.TakeString());
   7797       continue;
   7798     }
   7799 
   7800     std::string Accumulator;
   7801     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
   7802       if (I == SelIdents.size()) {
   7803         if (!Accumulator.empty()) {
   7804           Builder.AddInformativeChunk(
   7805               Builder.getAllocator().CopyString(Accumulator));
   7806           Accumulator.clear();
   7807         }
   7808       }
   7809 
   7810       Accumulator += Sel.getNameForSlot(I);
   7811       Accumulator += ':';
   7812     }
   7813     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator));
   7814     Results.AddResult(Builder.TakeString());
   7815   }
   7816   Results.ExitScope();
   7817 
   7818   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7819                             Results.data(), Results.size());
   7820 }
   7821 
   7822 /// Add all of the protocol declarations that we find in the given
   7823 /// (translation unit) context.
   7824 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
   7825                                bool OnlyForwardDeclarations,
   7826                                ResultBuilder &Results) {
   7827   typedef CodeCompletionResult Result;
   7828 
   7829   for (const auto *D : Ctx->decls()) {
   7830     // Record any protocols we find.
   7831     if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D))
   7832       if (!OnlyForwardDeclarations || !Proto->hasDefinition())
   7833         Results.AddResult(
   7834             Result(Proto, Results.getBasePriority(Proto), nullptr), CurContext,
   7835             nullptr, false);
   7836   }
   7837 }
   7838 
   7839 void Sema::CodeCompleteObjCProtocolReferences(
   7840     ArrayRef<IdentifierLocPair> Protocols) {
   7841   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   7842                         CodeCompleter->getCodeCompletionTUInfo(),
   7843                         CodeCompletionContext::CCC_ObjCProtocolName);
   7844 
   7845   if (CodeCompleter->includeGlobals()) {
   7846     Results.EnterNewScope();
   7847 
   7848     // Tell the result set to ignore all of the protocols we have
   7849     // already seen.
   7850     // FIXME: This doesn't work when caching code-completion results.
   7851     for (const IdentifierLocPair &Pair : Protocols)
   7852       if (ObjCProtocolDecl *Protocol = LookupProtocol(Pair.first, Pair.second))
   7853         Results.Ignore(Protocol);
   7854 
   7855     // Add all protocols.
   7856     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false,
   7857                        Results);
   7858 
   7859     Results.ExitScope();
   7860   }
   7861 
   7862   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7863                             Results.data(), Results.size());
   7864 }
   7865 
   7866 void Sema::CodeCompleteObjCProtocolDecl(Scope *) {
   7867   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   7868                         CodeCompleter->getCodeCompletionTUInfo(),
   7869                         CodeCompletionContext::CCC_ObjCProtocolName);
   7870 
   7871   if (CodeCompleter->includeGlobals()) {
   7872     Results.EnterNewScope();
   7873 
   7874     // Add all protocols.
   7875     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true,
   7876                        Results);
   7877 
   7878     Results.ExitScope();
   7879   }
   7880 
   7881   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7882                             Results.data(), Results.size());
   7883 }
   7884 
   7885 /// Add all of the Objective-C interface declarations that we find in
   7886 /// the given (translation unit) context.
   7887 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
   7888                                 bool OnlyForwardDeclarations,
   7889                                 bool OnlyUnimplemented,
   7890                                 ResultBuilder &Results) {
   7891   typedef CodeCompletionResult Result;
   7892 
   7893   for (const auto *D : Ctx->decls()) {
   7894     // Record any interfaces we find.
   7895     if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
   7896       if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
   7897           (!OnlyUnimplemented || !Class->getImplementation()))
   7898         Results.AddResult(
   7899             Result(Class, Results.getBasePriority(Class), nullptr), CurContext,
   7900             nullptr, false);
   7901   }
   7902 }
   7903 
   7904 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
   7905   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   7906                         CodeCompleter->getCodeCompletionTUInfo(),
   7907                         CodeCompletionContext::CCC_ObjCInterfaceName);
   7908   Results.EnterNewScope();
   7909 
   7910   if (CodeCompleter->includeGlobals()) {
   7911     // Add all classes.
   7912     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
   7913                         false, Results);
   7914   }
   7915 
   7916   Results.ExitScope();
   7917 
   7918   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7919                             Results.data(), Results.size());
   7920 }
   7921 
   7922 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
   7923                                       SourceLocation ClassNameLoc) {
   7924   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   7925                         CodeCompleter->getCodeCompletionTUInfo(),
   7926                         CodeCompletionContext::CCC_ObjCInterfaceName);
   7927   Results.EnterNewScope();
   7928 
   7929   // Make sure that we ignore the class we're currently defining.
   7930   NamedDecl *CurClass =
   7931       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
   7932   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
   7933     Results.Ignore(CurClass);
   7934 
   7935   if (CodeCompleter->includeGlobals()) {
   7936     // Add all classes.
   7937     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
   7938                         false, Results);
   7939   }
   7940 
   7941   Results.ExitScope();
   7942 
   7943   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7944                             Results.data(), Results.size());
   7945 }
   7946 
   7947 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
   7948   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   7949                         CodeCompleter->getCodeCompletionTUInfo(),
   7950                         CodeCompletionContext::CCC_ObjCImplementation);
   7951   Results.EnterNewScope();
   7952 
   7953   if (CodeCompleter->includeGlobals()) {
   7954     // Add all unimplemented classes.
   7955     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
   7956                         true, Results);
   7957   }
   7958 
   7959   Results.ExitScope();
   7960 
   7961   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7962                             Results.data(), Results.size());
   7963 }
   7964 
   7965 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
   7966                                              IdentifierInfo *ClassName,
   7967                                              SourceLocation ClassNameLoc) {
   7968   typedef CodeCompletionResult Result;
   7969 
   7970   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   7971                         CodeCompleter->getCodeCompletionTUInfo(),
   7972                         CodeCompletionContext::CCC_ObjCCategoryName);
   7973 
   7974   // Ignore any categories we find that have already been implemented by this
   7975   // interface.
   7976   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
   7977   NamedDecl *CurClass =
   7978       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
   7979   if (ObjCInterfaceDecl *Class =
   7980           dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) {
   7981     for (const auto *Cat : Class->visible_categories())
   7982       CategoryNames.insert(Cat->getIdentifier());
   7983   }
   7984 
   7985   // Add all of the categories we know about.
   7986   Results.EnterNewScope();
   7987   TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
   7988   for (const auto *D : TU->decls())
   7989     if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D))
   7990       if (CategoryNames.insert(Category->getIdentifier()).second)
   7991         Results.AddResult(
   7992             Result(Category, Results.getBasePriority(Category), nullptr),
   7993             CurContext, nullptr, false);
   7994   Results.ExitScope();
   7995 
   7996   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   7997                             Results.data(), Results.size());
   7998 }
   7999 
   8000 void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
   8001                                                   IdentifierInfo *ClassName,
   8002                                                   SourceLocation ClassNameLoc) {
   8003   typedef CodeCompletionResult Result;
   8004 
   8005   // Find the corresponding interface. If we couldn't find the interface, the
   8006   // program itself is ill-formed. However, we'll try to be helpful still by
   8007   // providing the list of all of the categories we know about.
   8008   NamedDecl *CurClass =
   8009       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
   8010   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
   8011   if (!Class)
   8012     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
   8013 
   8014   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   8015                         CodeCompleter->getCodeCompletionTUInfo(),
   8016                         CodeCompletionContext::CCC_ObjCCategoryName);
   8017 
   8018   // Add all of the categories that have have corresponding interface
   8019   // declarations in this class and any of its superclasses, except for
   8020   // already-implemented categories in the class itself.
   8021   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
   8022   Results.EnterNewScope();
   8023   bool IgnoreImplemented = true;
   8024   while (Class) {
   8025     for (const auto *Cat : Class->visible_categories()) {
   8026       if ((!IgnoreImplemented || !Cat->getImplementation()) &&
   8027           CategoryNames.insert(Cat->getIdentifier()).second)
   8028         Results.AddResult(Result(Cat, Results.getBasePriority(Cat), nullptr),
   8029                           CurContext, nullptr, false);
   8030     }
   8031 
   8032     Class = Class->getSuperClass();
   8033     IgnoreImplemented = false;
   8034   }
   8035   Results.ExitScope();
   8036 
   8037   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   8038                             Results.data(), Results.size());
   8039 }
   8040 
   8041 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) {
   8042   CodeCompletionContext CCContext(CodeCompletionContext::CCC_Other);
   8043   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   8044                         CodeCompleter->getCodeCompletionTUInfo(), CCContext);
   8045 
   8046   // Figure out where this @synthesize lives.
   8047   ObjCContainerDecl *Container =
   8048       dyn_cast_or_null<ObjCContainerDecl>(CurContext);
   8049   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
   8050                      !isa<ObjCCategoryImplDecl>(Container)))
   8051     return;
   8052 
   8053   // Ignore any properties that have already been implemented.
   8054   Container = getContainerDef(Container);
   8055   for (const auto *D : Container->decls())
   8056     if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D))
   8057       Results.Ignore(PropertyImpl->getPropertyDecl());
   8058 
   8059   // Add any properties that we find.
   8060   AddedPropertiesSet AddedProperties;
   8061   Results.EnterNewScope();
   8062   if (ObjCImplementationDecl *ClassImpl =
   8063           dyn_cast<ObjCImplementationDecl>(Container))
   8064     AddObjCProperties(CCContext, ClassImpl->getClassInterface(), false,
   8065                       /*AllowNullaryMethods=*/false, CurContext,
   8066                       AddedProperties, Results);
   8067   else
   8068     AddObjCProperties(CCContext,
   8069                       cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
   8070                       false, /*AllowNullaryMethods=*/false, CurContext,
   8071                       AddedProperties, Results);
   8072   Results.ExitScope();
   8073 
   8074   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   8075                             Results.data(), Results.size());
   8076 }
   8077 
   8078 void Sema::CodeCompleteObjCPropertySynthesizeIvar(
   8079     Scope *S, IdentifierInfo *PropertyName) {
   8080   typedef CodeCompletionResult Result;
   8081   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   8082                         CodeCompleter->getCodeCompletionTUInfo(),
   8083                         CodeCompletionContext::CCC_Other);
   8084 
   8085   // Figure out where this @synthesize lives.
   8086   ObjCContainerDecl *Container =
   8087       dyn_cast_or_null<ObjCContainerDecl>(CurContext);
   8088   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
   8089                      !isa<ObjCCategoryImplDecl>(Container)))
   8090     return;
   8091 
   8092   // Figure out which interface we're looking into.
   8093   ObjCInterfaceDecl *Class = nullptr;
   8094   if (ObjCImplementationDecl *ClassImpl =
   8095           dyn_cast<ObjCImplementationDecl>(Container))
   8096     Class = ClassImpl->getClassInterface();
   8097   else
   8098     Class = cast<ObjCCategoryImplDecl>(Container)
   8099                 ->getCategoryDecl()
   8100                 ->getClassInterface();
   8101 
   8102   // Determine the type of the property we're synthesizing.
   8103   QualType PropertyType = Context.getObjCIdType();
   8104   if (Class) {
   8105     if (ObjCPropertyDecl *Property = Class->FindPropertyDeclaration(
   8106             PropertyName, ObjCPropertyQueryKind::OBJC_PR_query_instance)) {
   8107       PropertyType =
   8108           Property->getType().getNonReferenceType().getUnqualifiedType();
   8109 
   8110       // Give preference to ivars
   8111       Results.setPreferredType(PropertyType);
   8112     }
   8113   }
   8114 
   8115   // Add all of the instance variables in this class and its superclasses.
   8116   Results.EnterNewScope();
   8117   bool SawSimilarlyNamedIvar = false;
   8118   std::string NameWithPrefix;
   8119   NameWithPrefix += '_';
   8120   NameWithPrefix += PropertyName->getName();
   8121   std::string NameWithSuffix = PropertyName->getName().str();
   8122   NameWithSuffix += '_';
   8123   for (; Class; Class = Class->getSuperClass()) {
   8124     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
   8125          Ivar = Ivar->getNextIvar()) {
   8126       Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), nullptr),
   8127                         CurContext, nullptr, false);
   8128 
   8129       // Determine whether we've seen an ivar with a name similar to the
   8130       // property.
   8131       if ((PropertyName == Ivar->getIdentifier() ||
   8132            NameWithPrefix == Ivar->getName() ||
   8133            NameWithSuffix == Ivar->getName())) {
   8134         SawSimilarlyNamedIvar = true;
   8135 
   8136         // Reduce the priority of this result by one, to give it a slight
   8137         // advantage over other results whose names don't match so closely.
   8138         if (Results.size() &&
   8139             Results.data()[Results.size() - 1].Kind ==
   8140                 CodeCompletionResult::RK_Declaration &&
   8141             Results.data()[Results.size() - 1].Declaration == Ivar)
   8142           Results.data()[Results.size() - 1].Priority--;
   8143       }
   8144     }
   8145   }
   8146 
   8147   if (!SawSimilarlyNamedIvar) {
   8148     // Create ivar result _propName, that the user can use to synthesize
   8149     // an ivar of the appropriate type.
   8150     unsigned Priority = CCP_MemberDeclaration + 1;
   8151     typedef CodeCompletionResult Result;
   8152     CodeCompletionAllocator &Allocator = Results.getAllocator();
   8153     CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(),
   8154                                   Priority, CXAvailability_Available);
   8155 
   8156     PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
   8157     Builder.AddResultTypeChunk(
   8158         GetCompletionTypeString(PropertyType, Context, Policy, Allocator));
   8159     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
   8160     Results.AddResult(
   8161         Result(Builder.TakeString(), Priority, CXCursor_ObjCIvarDecl));
   8162   }
   8163 
   8164   Results.ExitScope();
   8165 
   8166   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   8167                             Results.data(), Results.size());
   8168 }
   8169 
   8170 // Mapping from selectors to the methods that implement that selector, along
   8171 // with the "in original class" flag.
   8172 typedef llvm::DenseMap<Selector,
   8173                        llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>>
   8174     KnownMethodsMap;
   8175 
   8176 /// Find all of the methods that reside in the given container
   8177 /// (and its superclasses, protocols, etc.) that meet the given
   8178 /// criteria. Insert those methods into the map of known methods,
   8179 /// indexed by selector so they can be easily found.
   8180 static void FindImplementableMethods(ASTContext &Context,
   8181                                      ObjCContainerDecl *Container,
   8182                                      Optional<bool> WantInstanceMethods,
   8183                                      QualType ReturnType,
   8184                                      KnownMethodsMap &KnownMethods,
   8185                                      bool InOriginalClass = true) {
   8186   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
   8187     // Make sure we have a definition; that's what we'll walk.
   8188     if (!IFace->hasDefinition())
   8189       return;
   8190 
   8191     IFace = IFace->getDefinition();
   8192     Container = IFace;
   8193 
   8194     const ObjCList<ObjCProtocolDecl> &Protocols =
   8195         IFace->getReferencedProtocols();
   8196     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
   8197                                               E = Protocols.end();
   8198          I != E; ++I)
   8199       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
   8200                                KnownMethods, InOriginalClass);
   8201 
   8202     // Add methods from any class extensions and categories.
   8203     for (auto *Cat : IFace->visible_categories()) {
   8204       FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType,
   8205                                KnownMethods, false);
   8206     }
   8207 
   8208     // Visit the superclass.
   8209     if (IFace->getSuperClass())
   8210       FindImplementableMethods(Context, IFace->getSuperClass(),
   8211                                WantInstanceMethods, ReturnType, KnownMethods,
   8212                                false);
   8213   }
   8214 
   8215   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
   8216     // Recurse into protocols.
   8217     const ObjCList<ObjCProtocolDecl> &Protocols =
   8218         Category->getReferencedProtocols();
   8219     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
   8220                                               E = Protocols.end();
   8221          I != E; ++I)
   8222       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
   8223                                KnownMethods, InOriginalClass);
   8224 
   8225     // If this category is the original class, jump to the interface.
   8226     if (InOriginalClass && Category->getClassInterface())
   8227       FindImplementableMethods(Context, Category->getClassInterface(),
   8228                                WantInstanceMethods, ReturnType, KnownMethods,
   8229                                false);
   8230   }
   8231 
   8232   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
   8233     // Make sure we have a definition; that's what we'll walk.
   8234     if (!Protocol->hasDefinition())
   8235       return;
   8236     Protocol = Protocol->getDefinition();
   8237     Container = Protocol;
   8238 
   8239     // Recurse into protocols.
   8240     const ObjCList<ObjCProtocolDecl> &Protocols =
   8241         Protocol->getReferencedProtocols();
   8242     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
   8243                                               E = Protocols.end();
   8244          I != E; ++I)
   8245       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
   8246                                KnownMethods, false);
   8247   }
   8248 
   8249   // Add methods in this container. This operation occurs last because
   8250   // we want the methods from this container to override any methods
   8251   // we've previously seen with the same selector.
   8252   for (auto *M : Container->methods()) {
   8253     if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) {
   8254       if (!ReturnType.isNull() &&
   8255           !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType()))
   8256         continue;
   8257 
   8258       KnownMethods[M->getSelector()] =
   8259           KnownMethodsMap::mapped_type(M, InOriginalClass);
   8260     }
   8261   }
   8262 }
   8263 
   8264 /// Add the parenthesized return or parameter type chunk to a code
   8265 /// completion string.
   8266 static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals,
   8267                                     ASTContext &Context,
   8268                                     const PrintingPolicy &Policy,
   8269                                     CodeCompletionBuilder &Builder) {
   8270   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8271   std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals, Type);
   8272   if (!Quals.empty())
   8273     Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
   8274   Builder.AddTextChunk(
   8275       GetCompletionTypeString(Type, Context, Policy, Builder.getAllocator()));
   8276   Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8277 }
   8278 
   8279 /// Determine whether the given class is or inherits from a class by
   8280 /// the given name.
   8281 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name) {
   8282   if (!Class)
   8283     return false;
   8284 
   8285   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
   8286     return true;
   8287 
   8288   return InheritsFromClassNamed(Class->getSuperClass(), Name);
   8289 }
   8290 
   8291 /// Add code completions for Objective-C Key-Value Coding (KVC) and
   8292 /// Key-Value Observing (KVO).
   8293 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
   8294                                        bool IsInstanceMethod,
   8295                                        QualType ReturnType, ASTContext &Context,
   8296                                        VisitedSelectorSet &KnownSelectors,
   8297                                        ResultBuilder &Results) {
   8298   IdentifierInfo *PropName = Property->getIdentifier();
   8299   if (!PropName || PropName->getLength() == 0)
   8300     return;
   8301 
   8302   PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
   8303 
   8304   // Builder that will create each code completion.
   8305   typedef CodeCompletionResult Result;
   8306   CodeCompletionAllocator &Allocator = Results.getAllocator();
   8307   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
   8308 
   8309   // The selector table.
   8310   SelectorTable &Selectors = Context.Selectors;
   8311 
   8312   // The property name, copied into the code completion allocation region
   8313   // on demand.
   8314   struct KeyHolder {
   8315     CodeCompletionAllocator &Allocator;
   8316     StringRef Key;
   8317     const char *CopiedKey;
   8318 
   8319     KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key)
   8320         : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {}
   8321 
   8322     operator const char *() {
   8323       if (CopiedKey)
   8324         return CopiedKey;
   8325 
   8326       return CopiedKey = Allocator.CopyString(Key);
   8327     }
   8328   } Key(Allocator, PropName->getName());
   8329 
   8330   // The uppercased name of the property name.
   8331   std::string UpperKey = std::string(PropName->getName());
   8332   if (!UpperKey.empty())
   8333     UpperKey[0] = toUppercase(UpperKey[0]);
   8334 
   8335   bool ReturnTypeMatchesProperty =
   8336       ReturnType.isNull() ||
   8337       Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
   8338                                      Property->getType());
   8339   bool ReturnTypeMatchesVoid = ReturnType.isNull() || ReturnType->isVoidType();
   8340 
   8341   // Add the normal accessor -(type)key.
   8342   if (IsInstanceMethod &&
   8343       KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second &&
   8344       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
   8345     if (ReturnType.isNull())
   8346       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
   8347                               Builder);
   8348 
   8349     Builder.AddTypedTextChunk(Key);
   8350     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
   8351                              CXCursor_ObjCInstanceMethodDecl));
   8352   }
   8353 
   8354   // If we have an integral or boolean property (or the user has provided
   8355   // an integral or boolean return type), add the accessor -(type)isKey.
   8356   if (IsInstanceMethod &&
   8357       ((!ReturnType.isNull() &&
   8358         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
   8359        (ReturnType.isNull() && (Property->getType()->isIntegerType() ||
   8360                                 Property->getType()->isBooleanType())))) {
   8361     std::string SelectorName = (Twine("is") + UpperKey).str();
   8362     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8363     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
   8364             .second) {
   8365       if (ReturnType.isNull()) {
   8366         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8367         Builder.AddTextChunk("BOOL");
   8368         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8369       }
   8370 
   8371       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
   8372       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
   8373                                CXCursor_ObjCInstanceMethodDecl));
   8374     }
   8375   }
   8376 
   8377   // Add the normal mutator.
   8378   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
   8379       !Property->getSetterMethodDecl()) {
   8380     std::string SelectorName = (Twine("set") + UpperKey).str();
   8381     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8382     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
   8383       if (ReturnType.isNull()) {
   8384         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8385         Builder.AddTextChunk("void");
   8386         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8387       }
   8388 
   8389       Builder.AddTypedTextChunk(
   8390           Allocator.CopyString(SelectorId->getName() + ":"));
   8391       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
   8392                               Builder);
   8393       Builder.AddTextChunk(Key);
   8394       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
   8395                                CXCursor_ObjCInstanceMethodDecl));
   8396     }
   8397   }
   8398 
   8399   // Indexed and unordered accessors
   8400   unsigned IndexedGetterPriority = CCP_CodePattern;
   8401   unsigned IndexedSetterPriority = CCP_CodePattern;
   8402   unsigned UnorderedGetterPriority = CCP_CodePattern;
   8403   unsigned UnorderedSetterPriority = CCP_CodePattern;
   8404   if (const auto *ObjCPointer =
   8405           Property->getType()->getAs<ObjCObjectPointerType>()) {
   8406     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
   8407       // If this interface type is not provably derived from a known
   8408       // collection, penalize the corresponding completions.
   8409       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
   8410         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
   8411         if (!InheritsFromClassNamed(IFace, "NSArray"))
   8412           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
   8413       }
   8414 
   8415       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
   8416         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
   8417         if (!InheritsFromClassNamed(IFace, "NSSet"))
   8418           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
   8419       }
   8420     }
   8421   } else {
   8422     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
   8423     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
   8424     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
   8425     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
   8426   }
   8427 
   8428   // Add -(NSUInteger)countOf<key>
   8429   if (IsInstanceMethod &&
   8430       (ReturnType.isNull() || ReturnType->isIntegerType())) {
   8431     std::string SelectorName = (Twine("countOf") + UpperKey).str();
   8432     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8433     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
   8434             .second) {
   8435       if (ReturnType.isNull()) {
   8436         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8437         Builder.AddTextChunk("NSUInteger");
   8438         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8439       }
   8440 
   8441       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
   8442       Results.AddResult(
   8443           Result(Builder.TakeString(),
   8444                  std::min(IndexedGetterPriority, UnorderedGetterPriority),
   8445                  CXCursor_ObjCInstanceMethodDecl));
   8446     }
   8447   }
   8448 
   8449   // Indexed getters
   8450   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
   8451   if (IsInstanceMethod &&
   8452       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
   8453     std::string SelectorName = (Twine("objectIn") + UpperKey + "AtIndex").str();
   8454     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8455     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
   8456       if (ReturnType.isNull()) {
   8457         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8458         Builder.AddTextChunk("id");
   8459         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8460       }
   8461 
   8462       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8463       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8464       Builder.AddTextChunk("NSUInteger");
   8465       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8466       Builder.AddTextChunk("index");
   8467       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
   8468                                CXCursor_ObjCInstanceMethodDecl));
   8469     }
   8470   }
   8471 
   8472   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
   8473   if (IsInstanceMethod &&
   8474       (ReturnType.isNull() ||
   8475        (ReturnType->isObjCObjectPointerType() &&
   8476         ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
   8477         ReturnType->castAs<ObjCObjectPointerType>()
   8478                 ->getInterfaceDecl()
   8479                 ->getName() == "NSArray"))) {
   8480     std::string SelectorName = (Twine(Property->getName()) + "AtIndexes").str();
   8481     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8482     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
   8483       if (ReturnType.isNull()) {
   8484         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8485         Builder.AddTextChunk("NSArray *");
   8486         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8487       }
   8488 
   8489       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8490       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8491       Builder.AddTextChunk("NSIndexSet *");
   8492       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8493       Builder.AddTextChunk("indexes");
   8494       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
   8495                                CXCursor_ObjCInstanceMethodDecl));
   8496     }
   8497   }
   8498 
   8499   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
   8500   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8501     std::string SelectorName = (Twine("get") + UpperKey).str();
   8502     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
   8503                                       &Context.Idents.get("range")};
   8504 
   8505     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
   8506       if (ReturnType.isNull()) {
   8507         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8508         Builder.AddTextChunk("void");
   8509         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8510       }
   8511 
   8512       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8513       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8514       Builder.AddPlaceholderChunk("object-type");
   8515       Builder.AddTextChunk(" **");
   8516       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8517       Builder.AddTextChunk("buffer");
   8518       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   8519       Builder.AddTypedTextChunk("range:");
   8520       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8521       Builder.AddTextChunk("NSRange");
   8522       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8523       Builder.AddTextChunk("inRange");
   8524       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
   8525                                CXCursor_ObjCInstanceMethodDecl));
   8526     }
   8527   }
   8528 
   8529   // Mutable indexed accessors
   8530 
   8531   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
   8532   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8533     std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str();
   8534     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get("insertObject"),
   8535                                       &Context.Idents.get(SelectorName)};
   8536 
   8537     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
   8538       if (ReturnType.isNull()) {
   8539         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8540         Builder.AddTextChunk("void");
   8541         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8542       }
   8543 
   8544       Builder.AddTypedTextChunk("insertObject:");
   8545       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8546       Builder.AddPlaceholderChunk("object-type");
   8547       Builder.AddTextChunk(" *");
   8548       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8549       Builder.AddTextChunk("object");
   8550       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   8551       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8552       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8553       Builder.AddPlaceholderChunk("NSUInteger");
   8554       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8555       Builder.AddTextChunk("index");
   8556       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
   8557                                CXCursor_ObjCInstanceMethodDecl));
   8558     }
   8559   }
   8560 
   8561   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
   8562   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8563     std::string SelectorName = (Twine("insert") + UpperKey).str();
   8564     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
   8565                                       &Context.Idents.get("atIndexes")};
   8566 
   8567     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
   8568       if (ReturnType.isNull()) {
   8569         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8570         Builder.AddTextChunk("void");
   8571         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8572       }
   8573 
   8574       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8575       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8576       Builder.AddTextChunk("NSArray *");
   8577       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8578       Builder.AddTextChunk("array");
   8579       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   8580       Builder.AddTypedTextChunk("atIndexes:");
   8581       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8582       Builder.AddPlaceholderChunk("NSIndexSet *");
   8583       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8584       Builder.AddTextChunk("indexes");
   8585       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
   8586                                CXCursor_ObjCInstanceMethodDecl));
   8587     }
   8588   }
   8589 
   8590   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
   8591   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8592     std::string SelectorName =
   8593         (Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
   8594     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8595     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
   8596       if (ReturnType.isNull()) {
   8597         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8598         Builder.AddTextChunk("void");
   8599         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8600       }
   8601 
   8602       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8603       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8604       Builder.AddTextChunk("NSUInteger");
   8605       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8606       Builder.AddTextChunk("index");
   8607       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
   8608                                CXCursor_ObjCInstanceMethodDecl));
   8609     }
   8610   }
   8611 
   8612   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
   8613   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8614     std::string SelectorName = (Twine("remove") + UpperKey + "AtIndexes").str();
   8615     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8616     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
   8617       if (ReturnType.isNull()) {
   8618         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8619         Builder.AddTextChunk("void");
   8620         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8621       }
   8622 
   8623       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8624       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8625       Builder.AddTextChunk("NSIndexSet *");
   8626       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8627       Builder.AddTextChunk("indexes");
   8628       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
   8629                                CXCursor_ObjCInstanceMethodDecl));
   8630     }
   8631   }
   8632 
   8633   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
   8634   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8635     std::string SelectorName =
   8636         (Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
   8637     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
   8638                                       &Context.Idents.get("withObject")};
   8639 
   8640     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
   8641       if (ReturnType.isNull()) {
   8642         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8643         Builder.AddTextChunk("void");
   8644         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8645       }
   8646 
   8647       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8648       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8649       Builder.AddPlaceholderChunk("NSUInteger");
   8650       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8651       Builder.AddTextChunk("index");
   8652       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   8653       Builder.AddTypedTextChunk("withObject:");
   8654       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8655       Builder.AddTextChunk("id");
   8656       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8657       Builder.AddTextChunk("object");
   8658       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
   8659                                CXCursor_ObjCInstanceMethodDecl));
   8660     }
   8661   }
   8662 
   8663   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
   8664   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8665     std::string SelectorName1 =
   8666         (Twine("replace") + UpperKey + "AtIndexes").str();
   8667     std::string SelectorName2 = (Twine("with") + UpperKey).str();
   8668     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1),
   8669                                       &Context.Idents.get(SelectorName2)};
   8670 
   8671     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
   8672       if (ReturnType.isNull()) {
   8673         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8674         Builder.AddTextChunk("void");
   8675         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8676       }
   8677 
   8678       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
   8679       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8680       Builder.AddPlaceholderChunk("NSIndexSet *");
   8681       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8682       Builder.AddTextChunk("indexes");
   8683       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   8684       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
   8685       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8686       Builder.AddTextChunk("NSArray *");
   8687       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8688       Builder.AddTextChunk("array");
   8689       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
   8690                                CXCursor_ObjCInstanceMethodDecl));
   8691     }
   8692   }
   8693 
   8694   // Unordered getters
   8695   // - (NSEnumerator *)enumeratorOfKey
   8696   if (IsInstanceMethod &&
   8697       (ReturnType.isNull() ||
   8698        (ReturnType->isObjCObjectPointerType() &&
   8699         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
   8700         ReturnType->getAs<ObjCObjectPointerType>()
   8701                 ->getInterfaceDecl()
   8702                 ->getName() == "NSEnumerator"))) {
   8703     std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str();
   8704     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8705     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
   8706             .second) {
   8707       if (ReturnType.isNull()) {
   8708         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8709         Builder.AddTextChunk("NSEnumerator *");
   8710         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8711       }
   8712 
   8713       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
   8714       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
   8715                                CXCursor_ObjCInstanceMethodDecl));
   8716     }
   8717   }
   8718 
   8719   // - (type *)memberOfKey:(type *)object
   8720   if (IsInstanceMethod &&
   8721       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
   8722     std::string SelectorName = (Twine("memberOf") + UpperKey).str();
   8723     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8724     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
   8725       if (ReturnType.isNull()) {
   8726         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8727         Builder.AddPlaceholderChunk("object-type");
   8728         Builder.AddTextChunk(" *");
   8729         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8730       }
   8731 
   8732       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8733       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8734       if (ReturnType.isNull()) {
   8735         Builder.AddPlaceholderChunk("object-type");
   8736         Builder.AddTextChunk(" *");
   8737       } else {
   8738         Builder.AddTextChunk(GetCompletionTypeString(
   8739             ReturnType, Context, Policy, Builder.getAllocator()));
   8740       }
   8741       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8742       Builder.AddTextChunk("object");
   8743       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
   8744                                CXCursor_ObjCInstanceMethodDecl));
   8745     }
   8746   }
   8747 
   8748   // Mutable unordered accessors
   8749   // - (void)addKeyObject:(type *)object
   8750   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8751     std::string SelectorName =
   8752         (Twine("add") + UpperKey + Twine("Object")).str();
   8753     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8754     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
   8755       if (ReturnType.isNull()) {
   8756         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8757         Builder.AddTextChunk("void");
   8758         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8759       }
   8760 
   8761       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8762       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8763       Builder.AddPlaceholderChunk("object-type");
   8764       Builder.AddTextChunk(" *");
   8765       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8766       Builder.AddTextChunk("object");
   8767       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
   8768                                CXCursor_ObjCInstanceMethodDecl));
   8769     }
   8770   }
   8771 
   8772   // - (void)addKey:(NSSet *)objects
   8773   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8774     std::string SelectorName = (Twine("add") + UpperKey).str();
   8775     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8776     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
   8777       if (ReturnType.isNull()) {
   8778         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8779         Builder.AddTextChunk("void");
   8780         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8781       }
   8782 
   8783       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8784       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8785       Builder.AddTextChunk("NSSet *");
   8786       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8787       Builder.AddTextChunk("objects");
   8788       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
   8789                                CXCursor_ObjCInstanceMethodDecl));
   8790     }
   8791   }
   8792 
   8793   // - (void)removeKeyObject:(type *)object
   8794   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8795     std::string SelectorName =
   8796         (Twine("remove") + UpperKey + Twine("Object")).str();
   8797     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8798     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
   8799       if (ReturnType.isNull()) {
   8800         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8801         Builder.AddTextChunk("void");
   8802         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8803       }
   8804 
   8805       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8806       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8807       Builder.AddPlaceholderChunk("object-type");
   8808       Builder.AddTextChunk(" *");
   8809       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8810       Builder.AddTextChunk("object");
   8811       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
   8812                                CXCursor_ObjCInstanceMethodDecl));
   8813     }
   8814   }
   8815 
   8816   // - (void)removeKey:(NSSet *)objects
   8817   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8818     std::string SelectorName = (Twine("remove") + UpperKey).str();
   8819     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8820     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
   8821       if (ReturnType.isNull()) {
   8822         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8823         Builder.AddTextChunk("void");
   8824         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8825       }
   8826 
   8827       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8828       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8829       Builder.AddTextChunk("NSSet *");
   8830       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8831       Builder.AddTextChunk("objects");
   8832       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
   8833                                CXCursor_ObjCInstanceMethodDecl));
   8834     }
   8835   }
   8836 
   8837   // - (void)intersectKey:(NSSet *)objects
   8838   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
   8839     std::string SelectorName = (Twine("intersect") + UpperKey).str();
   8840     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8841     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
   8842       if (ReturnType.isNull()) {
   8843         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8844         Builder.AddTextChunk("void");
   8845         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8846       }
   8847 
   8848       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
   8849       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8850       Builder.AddTextChunk("NSSet *");
   8851       Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8852       Builder.AddTextChunk("objects");
   8853       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
   8854                                CXCursor_ObjCInstanceMethodDecl));
   8855     }
   8856   }
   8857 
   8858   // Key-Value Observing
   8859   // + (NSSet *)keyPathsForValuesAffectingKey
   8860   if (!IsInstanceMethod &&
   8861       (ReturnType.isNull() ||
   8862        (ReturnType->isObjCObjectPointerType() &&
   8863         ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
   8864         ReturnType->castAs<ObjCObjectPointerType>()
   8865                 ->getInterfaceDecl()
   8866                 ->getName() == "NSSet"))) {
   8867     std::string SelectorName =
   8868         (Twine("keyPathsForValuesAffecting") + UpperKey).str();
   8869     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8870     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
   8871             .second) {
   8872       if (ReturnType.isNull()) {
   8873         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8874         Builder.AddTextChunk("NSSet<NSString *> *");
   8875         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8876       }
   8877 
   8878       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
   8879       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
   8880                                CXCursor_ObjCClassMethodDecl));
   8881     }
   8882   }
   8883 
   8884   // + (BOOL)automaticallyNotifiesObserversForKey
   8885   if (!IsInstanceMethod &&
   8886       (ReturnType.isNull() || ReturnType->isIntegerType() ||
   8887        ReturnType->isBooleanType())) {
   8888     std::string SelectorName =
   8889         (Twine("automaticallyNotifiesObserversOf") + UpperKey).str();
   8890     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
   8891     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
   8892             .second) {
   8893       if (ReturnType.isNull()) {
   8894         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   8895         Builder.AddTextChunk("BOOL");
   8896         Builder.AddChunk(CodeCompletionString::CK_RightParen);
   8897       }
   8898 
   8899       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
   8900       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
   8901                                CXCursor_ObjCClassMethodDecl));
   8902     }
   8903   }
   8904 }
   8905 
   8906 void Sema::CodeCompleteObjCMethodDecl(Scope *S, Optional<bool> IsInstanceMethod,
   8907                                       ParsedType ReturnTy) {
   8908   // Determine the return type of the method we're declaring, if
   8909   // provided.
   8910   QualType ReturnType = GetTypeFromParser(ReturnTy);
   8911   Decl *IDecl = nullptr;
   8912   if (CurContext->isObjCContainer()) {
   8913     ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext);
   8914     IDecl = OCD;
   8915   }
   8916   // Determine where we should start searching for methods.
   8917   ObjCContainerDecl *SearchDecl = nullptr;
   8918   bool IsInImplementation = false;
   8919   if (Decl *D = IDecl) {
   8920     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
   8921       SearchDecl = Impl->getClassInterface();
   8922       IsInImplementation = true;
   8923     } else if (ObjCCategoryImplDecl *CatImpl =
   8924                    dyn_cast<ObjCCategoryImplDecl>(D)) {
   8925       SearchDecl = CatImpl->getCategoryDecl();
   8926       IsInImplementation = true;
   8927     } else
   8928       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
   8929   }
   8930 
   8931   if (!SearchDecl && S) {
   8932     if (DeclContext *DC = S->getEntity())
   8933       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
   8934   }
   8935 
   8936   if (!SearchDecl) {
   8937     HandleCodeCompleteResults(this, CodeCompleter,
   8938                               CodeCompletionContext::CCC_Other, nullptr, 0);
   8939     return;
   8940   }
   8941 
   8942   // Find all of the methods that we could declare/implement here.
   8943   KnownMethodsMap KnownMethods;
   8944   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, ReturnType,
   8945                            KnownMethods);
   8946 
   8947   // Add declarations or definitions for each of the known methods.
   8948   typedef CodeCompletionResult Result;
   8949   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   8950                         CodeCompleter->getCodeCompletionTUInfo(),
   8951                         CodeCompletionContext::CCC_Other);
   8952   Results.EnterNewScope();
   8953   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
   8954   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
   8955                                  MEnd = KnownMethods.end();
   8956        M != MEnd; ++M) {
   8957     ObjCMethodDecl *Method = M->second.getPointer();
   8958     CodeCompletionBuilder Builder(Results.getAllocator(),
   8959                                   Results.getCodeCompletionTUInfo());
   8960 
   8961     // Add the '-'/'+' prefix if it wasn't provided yet.
   8962     if (!IsInstanceMethod) {
   8963       Builder.AddTextChunk(Method->isInstanceMethod() ? "-" : "+");
   8964       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   8965     }
   8966 
   8967     // If the result type was not already provided, add it to the
   8968     // pattern as (type).
   8969     if (ReturnType.isNull()) {
   8970       QualType ResTy = Method->getSendResultType().stripObjCKindOfType(Context);
   8971       AttributedType::stripOuterNullability(ResTy);
   8972       AddObjCPassingTypeChunk(ResTy, Method->getObjCDeclQualifier(), Context,
   8973                               Policy, Builder);
   8974     }
   8975 
   8976     Selector Sel = Method->getSelector();
   8977 
   8978     if (Sel.isUnarySelector()) {
   8979       // Unary selectors have no arguments.
   8980       Builder.AddTypedTextChunk(
   8981           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
   8982     } else {
   8983       // Add all parameters to the pattern.
   8984       unsigned I = 0;
   8985       for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
   8986                                           PEnd = Method->param_end();
   8987            P != PEnd; (void)++P, ++I) {
   8988         // Add the part of the selector name.
   8989         if (I == 0)
   8990           Builder.AddTypedTextChunk(
   8991               Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
   8992         else if (I < Sel.getNumArgs()) {
   8993           Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   8994           Builder.AddTypedTextChunk(
   8995               Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
   8996         } else
   8997           break;
   8998 
   8999         // Add the parameter type.
   9000         QualType ParamType;
   9001         if ((*P)->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability)
   9002           ParamType = (*P)->getType();
   9003         else
   9004           ParamType = (*P)->getOriginalType();
   9005         ParamType = ParamType.substObjCTypeArgs(
   9006             Context, {}, ObjCSubstitutionContext::Parameter);
   9007         AttributedType::stripOuterNullability(ParamType);
   9008         AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(),
   9009                                 Context, Policy, Builder);
   9010 
   9011         if (IdentifierInfo *Id = (*P)->getIdentifier())
   9012           Builder.AddTextChunk(
   9013               Builder.getAllocator().CopyString(Id->getName()));
   9014       }
   9015     }
   9016 
   9017     if (Method->isVariadic()) {
   9018       if (Method->param_size() > 0)
   9019         Builder.AddChunk(CodeCompletionString::CK_Comma);
   9020       Builder.AddTextChunk("...");
   9021     }
   9022 
   9023     if (IsInImplementation && Results.includeCodePatterns()) {
   9024       // We will be defining the method here, so add a compound statement.
   9025       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9026       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
   9027       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   9028       if (!Method->getReturnType()->isVoidType()) {
   9029         // If the result type is not void, add a return clause.
   9030         Builder.AddTextChunk("return");
   9031         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9032         Builder.AddPlaceholderChunk("expression");
   9033         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
   9034       } else
   9035         Builder.AddPlaceholderChunk("statements");
   9036 
   9037       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
   9038       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
   9039     }
   9040 
   9041     unsigned Priority = CCP_CodePattern;
   9042     auto R = Result(Builder.TakeString(), Method, Priority);
   9043     if (!M->second.getInt())
   9044       setInBaseClass(R);
   9045     Results.AddResult(std::move(R));
   9046   }
   9047 
   9048   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
   9049   // the properties in this class and its categories.
   9050   if (Context.getLangOpts().ObjC) {
   9051     SmallVector<ObjCContainerDecl *, 4> Containers;
   9052     Containers.push_back(SearchDecl);
   9053 
   9054     VisitedSelectorSet KnownSelectors;
   9055     for (KnownMethodsMap::iterator M = KnownMethods.begin(),
   9056                                    MEnd = KnownMethods.end();
   9057          M != MEnd; ++M)
   9058       KnownSelectors.insert(M->first);
   9059 
   9060     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
   9061     if (!IFace)
   9062       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
   9063         IFace = Category->getClassInterface();
   9064 
   9065     if (IFace)
   9066       for (auto *Cat : IFace->visible_categories())
   9067         Containers.push_back(Cat);
   9068 
   9069     if (IsInstanceMethod) {
   9070       for (unsigned I = 0, N = Containers.size(); I != N; ++I)
   9071         for (auto *P : Containers[I]->instance_properties())
   9072           AddObjCKeyValueCompletions(P, *IsInstanceMethod, ReturnType, Context,
   9073                                      KnownSelectors, Results);
   9074     }
   9075   }
   9076 
   9077   Results.ExitScope();
   9078 
   9079   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   9080                             Results.data(), Results.size());
   9081 }
   9082 
   9083 void Sema::CodeCompleteObjCMethodDeclSelector(
   9084     Scope *S, bool IsInstanceMethod, bool AtParameterName, ParsedType ReturnTy,
   9085     ArrayRef<IdentifierInfo *> SelIdents) {
   9086   // If we have an external source, load the entire class method
   9087   // pool from the AST file.
   9088   if (ExternalSource) {
   9089     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N;
   9090          ++I) {
   9091       Selector Sel = ExternalSource->GetExternalSelector(I);
   9092       if (Sel.isNull() || MethodPool.count(Sel))
   9093         continue;
   9094 
   9095       ReadMethodPool(Sel);
   9096     }
   9097   }
   9098 
   9099   // Build the set of methods we can see.
   9100   typedef CodeCompletionResult Result;
   9101   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   9102                         CodeCompleter->getCodeCompletionTUInfo(),
   9103                         CodeCompletionContext::CCC_Other);
   9104 
   9105   if (ReturnTy)
   9106     Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType());
   9107 
   9108   Results.EnterNewScope();
   9109   for (GlobalMethodPool::iterator M = MethodPool.begin(),
   9110                                   MEnd = MethodPool.end();
   9111        M != MEnd; ++M) {
   9112     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first
   9113                                                      : &M->second.second;
   9114          MethList && MethList->getMethod(); MethList = MethList->getNext()) {
   9115       if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
   9116         continue;
   9117 
   9118       if (AtParameterName) {
   9119         // Suggest parameter names we've seen before.
   9120         unsigned NumSelIdents = SelIdents.size();
   9121         if (NumSelIdents &&
   9122             NumSelIdents <= MethList->getMethod()->param_size()) {
   9123           ParmVarDecl *Param =
   9124               MethList->getMethod()->parameters()[NumSelIdents - 1];
   9125           if (Param->getIdentifier()) {
   9126             CodeCompletionBuilder Builder(Results.getAllocator(),
   9127                                           Results.getCodeCompletionTUInfo());
   9128             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
   9129                 Param->getIdentifier()->getName()));
   9130             Results.AddResult(Builder.TakeString());
   9131           }
   9132         }
   9133 
   9134         continue;
   9135       }
   9136 
   9137       Result R(MethList->getMethod(),
   9138                Results.getBasePriority(MethList->getMethod()), nullptr);
   9139       R.StartParameter = SelIdents.size();
   9140       R.AllParametersAreInformative = false;
   9141       R.DeclaringEntity = true;
   9142       Results.MaybeAddResult(R, CurContext);
   9143     }
   9144   }
   9145 
   9146   Results.ExitScope();
   9147 
   9148   if (!AtParameterName && !SelIdents.empty() &&
   9149       SelIdents.front()->getName().startswith("init")) {
   9150     for (const auto &M : PP.macros()) {
   9151       if (M.first->getName() != "NS_DESIGNATED_INITIALIZER")
   9152         continue;
   9153       Results.EnterNewScope();
   9154       CodeCompletionBuilder Builder(Results.getAllocator(),
   9155                                     Results.getCodeCompletionTUInfo());
   9156       Builder.AddTypedTextChunk(
   9157           Builder.getAllocator().CopyString(M.first->getName()));
   9158       Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_Macro,
   9159                                              CXCursor_MacroDefinition));
   9160       Results.ExitScope();
   9161     }
   9162   }
   9163 
   9164   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   9165                             Results.data(), Results.size());
   9166 }
   9167 
   9168 void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
   9169   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   9170                         CodeCompleter->getCodeCompletionTUInfo(),
   9171                         CodeCompletionContext::CCC_PreprocessorDirective);
   9172   Results.EnterNewScope();
   9173 
   9174   // #if <condition>
   9175   CodeCompletionBuilder Builder(Results.getAllocator(),
   9176                                 Results.getCodeCompletionTUInfo());
   9177   Builder.AddTypedTextChunk("if");
   9178   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9179   Builder.AddPlaceholderChunk("condition");
   9180   Results.AddResult(Builder.TakeString());
   9181 
   9182   // #ifdef <macro>
   9183   Builder.AddTypedTextChunk("ifdef");
   9184   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9185   Builder.AddPlaceholderChunk("macro");
   9186   Results.AddResult(Builder.TakeString());
   9187 
   9188   // #ifndef <macro>
   9189   Builder.AddTypedTextChunk("ifndef");
   9190   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9191   Builder.AddPlaceholderChunk("macro");
   9192   Results.AddResult(Builder.TakeString());
   9193 
   9194   if (InConditional) {
   9195     // #elif <condition>
   9196     Builder.AddTypedTextChunk("elif");
   9197     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9198     Builder.AddPlaceholderChunk("condition");
   9199     Results.AddResult(Builder.TakeString());
   9200 
   9201     // #else
   9202     Builder.AddTypedTextChunk("else");
   9203     Results.AddResult(Builder.TakeString());
   9204 
   9205     // #endif
   9206     Builder.AddTypedTextChunk("endif");
   9207     Results.AddResult(Builder.TakeString());
   9208   }
   9209 
   9210   // #include "header"
   9211   Builder.AddTypedTextChunk("include");
   9212   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9213   Builder.AddTextChunk("\"");
   9214   Builder.AddPlaceholderChunk("header");
   9215   Builder.AddTextChunk("\"");
   9216   Results.AddResult(Builder.TakeString());
   9217 
   9218   // #include <header>
   9219   Builder.AddTypedTextChunk("include");
   9220   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9221   Builder.AddTextChunk("<");
   9222   Builder.AddPlaceholderChunk("header");
   9223   Builder.AddTextChunk(">");
   9224   Results.AddResult(Builder.TakeString());
   9225 
   9226   // #define <macro>
   9227   Builder.AddTypedTextChunk("define");
   9228   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9229   Builder.AddPlaceholderChunk("macro");
   9230   Results.AddResult(Builder.TakeString());
   9231 
   9232   // #define <macro>(<args>)
   9233   Builder.AddTypedTextChunk("define");
   9234   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9235   Builder.AddPlaceholderChunk("macro");
   9236   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   9237   Builder.AddPlaceholderChunk("args");
   9238   Builder.AddChunk(CodeCompletionString::CK_RightParen);
   9239   Results.AddResult(Builder.TakeString());
   9240 
   9241   // #undef <macro>
   9242   Builder.AddTypedTextChunk("undef");
   9243   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9244   Builder.AddPlaceholderChunk("macro");
   9245   Results.AddResult(Builder.TakeString());
   9246 
   9247   // #line <number>
   9248   Builder.AddTypedTextChunk("line");
   9249   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9250   Builder.AddPlaceholderChunk("number");
   9251   Results.AddResult(Builder.TakeString());
   9252 
   9253   // #line <number> "filename"
   9254   Builder.AddTypedTextChunk("line");
   9255   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9256   Builder.AddPlaceholderChunk("number");
   9257   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9258   Builder.AddTextChunk("\"");
   9259   Builder.AddPlaceholderChunk("filename");
   9260   Builder.AddTextChunk("\"");
   9261   Results.AddResult(Builder.TakeString());
   9262 
   9263   // #error <message>
   9264   Builder.AddTypedTextChunk("error");
   9265   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9266   Builder.AddPlaceholderChunk("message");
   9267   Results.AddResult(Builder.TakeString());
   9268 
   9269   // #pragma <arguments>
   9270   Builder.AddTypedTextChunk("pragma");
   9271   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9272   Builder.AddPlaceholderChunk("arguments");
   9273   Results.AddResult(Builder.TakeString());
   9274 
   9275   if (getLangOpts().ObjC) {
   9276     // #import "header"
   9277     Builder.AddTypedTextChunk("import");
   9278     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9279     Builder.AddTextChunk("\"");
   9280     Builder.AddPlaceholderChunk("header");
   9281     Builder.AddTextChunk("\"");
   9282     Results.AddResult(Builder.TakeString());
   9283 
   9284     // #import <header>
   9285     Builder.AddTypedTextChunk("import");
   9286     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9287     Builder.AddTextChunk("<");
   9288     Builder.AddPlaceholderChunk("header");
   9289     Builder.AddTextChunk(">");
   9290     Results.AddResult(Builder.TakeString());
   9291   }
   9292 
   9293   // #include_next "header"
   9294   Builder.AddTypedTextChunk("include_next");
   9295   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9296   Builder.AddTextChunk("\"");
   9297   Builder.AddPlaceholderChunk("header");
   9298   Builder.AddTextChunk("\"");
   9299   Results.AddResult(Builder.TakeString());
   9300 
   9301   // #include_next <header>
   9302   Builder.AddTypedTextChunk("include_next");
   9303   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9304   Builder.AddTextChunk("<");
   9305   Builder.AddPlaceholderChunk("header");
   9306   Builder.AddTextChunk(">");
   9307   Results.AddResult(Builder.TakeString());
   9308 
   9309   // #warning <message>
   9310   Builder.AddTypedTextChunk("warning");
   9311   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9312   Builder.AddPlaceholderChunk("message");
   9313   Results.AddResult(Builder.TakeString());
   9314 
   9315   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
   9316   // completions for them. And __include_macros is a Clang-internal extension
   9317   // that we don't want to encourage anyone to use.
   9318 
   9319   // FIXME: we don't support #assert or #unassert, so don't suggest them.
   9320   Results.ExitScope();
   9321 
   9322   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   9323                             Results.data(), Results.size());
   9324 }
   9325 
   9326 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
   9327   CodeCompleteOrdinaryName(S, S->getFnParent() ? Sema::PCC_RecoveryInFunction
   9328                                                : Sema::PCC_Namespace);
   9329 }
   9330 
   9331 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
   9332   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   9333                         CodeCompleter->getCodeCompletionTUInfo(),
   9334                         IsDefinition ? CodeCompletionContext::CCC_MacroName
   9335                                      : CodeCompletionContext::CCC_MacroNameUse);
   9336   if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
   9337     // Add just the names of macros, not their arguments.
   9338     CodeCompletionBuilder Builder(Results.getAllocator(),
   9339                                   Results.getCodeCompletionTUInfo());
   9340     Results.EnterNewScope();
   9341     for (Preprocessor::macro_iterator M = PP.macro_begin(),
   9342                                       MEnd = PP.macro_end();
   9343          M != MEnd; ++M) {
   9344       Builder.AddTypedTextChunk(
   9345           Builder.getAllocator().CopyString(M->first->getName()));
   9346       Results.AddResult(CodeCompletionResult(
   9347           Builder.TakeString(), CCP_CodePattern, CXCursor_MacroDefinition));
   9348     }
   9349     Results.ExitScope();
   9350   } else if (IsDefinition) {
   9351     // FIXME: Can we detect when the user just wrote an include guard above?
   9352   }
   9353 
   9354   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   9355                             Results.data(), Results.size());
   9356 }
   9357 
   9358 void Sema::CodeCompletePreprocessorExpression() {
   9359   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   9360                         CodeCompleter->getCodeCompletionTUInfo(),
   9361                         CodeCompletionContext::CCC_PreprocessorExpression);
   9362 
   9363   if (!CodeCompleter || CodeCompleter->includeMacros())
   9364     AddMacroResults(PP, Results,
   9365                     !CodeCompleter || CodeCompleter->loadExternal(), true);
   9366 
   9367   // defined (<macro>)
   9368   Results.EnterNewScope();
   9369   CodeCompletionBuilder Builder(Results.getAllocator(),
   9370                                 Results.getCodeCompletionTUInfo());
   9371   Builder.AddTypedTextChunk("defined");
   9372   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
   9373   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
   9374   Builder.AddPlaceholderChunk("macro");
   9375   Builder.AddChunk(CodeCompletionString::CK_RightParen);
   9376   Results.AddResult(Builder.TakeString());
   9377   Results.ExitScope();
   9378 
   9379   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   9380                             Results.data(), Results.size());
   9381 }
   9382 
   9383 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
   9384                                                  IdentifierInfo *Macro,
   9385                                                  MacroInfo *MacroInfo,
   9386                                                  unsigned Argument) {
   9387   // FIXME: In the future, we could provide "overload" results, much like we
   9388   // do for function calls.
   9389 
   9390   // Now just ignore this. There will be another code-completion callback
   9391   // for the expanded tokens.
   9392 }
   9393 
   9394 // This handles completion inside an #include filename, e.g. #include <foo/ba
   9395 // We look for the directory "foo" under each directory on the include path,
   9396 // list its files, and reassemble the appropriate #include.
   9397 void Sema::CodeCompleteIncludedFile(llvm::StringRef Dir, bool Angled) {
   9398   // RelDir should use /, but unescaped \ is possible on windows!
   9399   // Our completions will normalize to / for simplicity, this case is rare.
   9400   std::string RelDir = llvm::sys::path::convert_to_slash(Dir);
   9401   // We need the native slashes for the actual file system interactions.
   9402   SmallString<128> NativeRelDir = StringRef(RelDir);
   9403   llvm::sys::path::native(NativeRelDir);
   9404   llvm::vfs::FileSystem &FS =
   9405       getSourceManager().getFileManager().getVirtualFileSystem();
   9406 
   9407   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   9408                         CodeCompleter->getCodeCompletionTUInfo(),
   9409                         CodeCompletionContext::CCC_IncludedFile);
   9410   llvm::DenseSet<StringRef> SeenResults; // To deduplicate results.
   9411 
   9412   // Helper: adds one file or directory completion result.
   9413   auto AddCompletion = [&](StringRef Filename, bool IsDirectory) {
   9414     SmallString<64> TypedChunk = Filename;
   9415     // Directory completion is up to the slash, e.g. <sys/
   9416     TypedChunk.push_back(IsDirectory ? '/' : Angled ? '>' : '"');
   9417     auto R = SeenResults.insert(TypedChunk);
   9418     if (R.second) { // New completion
   9419       const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk);
   9420       *R.first = InternedTyped; // Avoid dangling StringRef.
   9421       CodeCompletionBuilder Builder(CodeCompleter->getAllocator(),
   9422                                     CodeCompleter->getCodeCompletionTUInfo());
   9423       Builder.AddTypedTextChunk(InternedTyped);
   9424       // The result is a "Pattern", which is pretty opaque.
   9425       // We may want to include the real filename to allow smart ranking.
   9426       Results.AddResult(CodeCompletionResult(Builder.TakeString()));
   9427     }
   9428   };
   9429 
   9430   // Helper: scans IncludeDir for nice files, and adds results for each.
   9431   auto AddFilesFromIncludeDir = [&](StringRef IncludeDir,
   9432                                     bool IsSystem,
   9433                                     DirectoryLookup::LookupType_t LookupType) {
   9434     llvm::SmallString<128> Dir = IncludeDir;
   9435     if (!NativeRelDir.empty()) {
   9436       if (LookupType == DirectoryLookup::LT_Framework) {
   9437         // For a framework dir, #include <Foo/Bar/> actually maps to
   9438         // a path of Foo.framework/Headers/Bar/.
   9439         auto Begin = llvm::sys::path::begin(NativeRelDir);
   9440         auto End = llvm::sys::path::end(NativeRelDir);
   9441 
   9442         llvm::sys::path::append(Dir, *Begin + ".framework", "Headers");
   9443         llvm::sys::path::append(Dir, ++Begin, End);
   9444       } else {
   9445         llvm::sys::path::append(Dir, NativeRelDir);
   9446       }
   9447     }
   9448 
   9449     std::error_code EC;
   9450     unsigned Count = 0;
   9451     for (auto It = FS.dir_begin(Dir, EC);
   9452          !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) {
   9453       if (++Count == 2500) // If we happen to hit a huge directory,
   9454         break;             // bail out early so we're not too slow.
   9455       StringRef Filename = llvm::sys::path::filename(It->path());
   9456 
   9457       // To know whether a symlink should be treated as file or a directory, we
   9458       // have to stat it. This should be cheap enough as there shouldn't be many
   9459       // symlinks.
   9460       llvm::sys::fs::file_type Type = It->type();
   9461       if (Type == llvm::sys::fs::file_type::symlink_file) {
   9462         if (auto FileStatus = FS.status(It->path()))
   9463           Type = FileStatus->getType();
   9464       }
   9465       switch (Type) {
   9466       case llvm::sys::fs::file_type::directory_file:
   9467         // All entries in a framework directory must have a ".framework" suffix,
   9468         // but the suffix does not appear in the source code's include/import.
   9469         if (LookupType == DirectoryLookup::LT_Framework &&
   9470             NativeRelDir.empty() && !Filename.consume_back(".framework"))
   9471           break;
   9472 
   9473         AddCompletion(Filename, /*IsDirectory=*/true);
   9474         break;
   9475       case llvm::sys::fs::file_type::regular_file:
   9476         // Only files that really look like headers. (Except in system dirs).
   9477         if (!IsSystem) {
   9478           // Header extensions from Types.def, which we can't depend on here.
   9479           if (!(Filename.endswith_lower(".h") ||
   9480                 Filename.endswith_lower(".hh") ||
   9481                 Filename.endswith_lower(".hpp") ||
   9482                 Filename.endswith_lower(".inc")))
   9483             break;
   9484         }
   9485         AddCompletion(Filename, /*IsDirectory=*/false);
   9486         break;
   9487       default:
   9488         break;
   9489       }
   9490     }
   9491   };
   9492 
   9493   // Helper: adds results relative to IncludeDir, if possible.
   9494   auto AddFilesFromDirLookup = [&](const DirectoryLookup &IncludeDir,
   9495                                    bool IsSystem) {
   9496     switch (IncludeDir.getLookupType()) {
   9497     case DirectoryLookup::LT_HeaderMap:
   9498       // header maps are not (currently) enumerable.
   9499       break;
   9500     case DirectoryLookup::LT_NormalDir:
   9501       AddFilesFromIncludeDir(IncludeDir.getDir()->getName(), IsSystem,
   9502                              DirectoryLookup::LT_NormalDir);
   9503       break;
   9504     case DirectoryLookup::LT_Framework:
   9505       AddFilesFromIncludeDir(IncludeDir.getFrameworkDir()->getName(), IsSystem,
   9506                              DirectoryLookup::LT_Framework);
   9507       break;
   9508     }
   9509   };
   9510 
   9511   // Finally with all our helpers, we can scan the include path.
   9512   // Do this in standard order so deduplication keeps the right file.
   9513   // (In case we decide to add more details to the results later).
   9514   const auto &S = PP.getHeaderSearchInfo();
   9515   using llvm::make_range;
   9516   if (!Angled) {
   9517     // The current directory is on the include path for "quoted" includes.
   9518     auto *CurFile = PP.getCurrentFileLexer()->getFileEntry();
   9519     if (CurFile && CurFile->getDir())
   9520       AddFilesFromIncludeDir(CurFile->getDir()->getName(), false,
   9521                              DirectoryLookup::LT_NormalDir);
   9522     for (const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end()))
   9523       AddFilesFromDirLookup(D, false);
   9524   }
   9525   for (const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end()))
   9526     AddFilesFromDirLookup(D, false);
   9527   for (const auto &D : make_range(S.system_dir_begin(), S.system_dir_end()))
   9528     AddFilesFromDirLookup(D, true);
   9529 
   9530   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   9531                             Results.data(), Results.size());
   9532 }
   9533 
   9534 void Sema::CodeCompleteNaturalLanguage() {
   9535   HandleCodeCompleteResults(this, CodeCompleter,
   9536                             CodeCompletionContext::CCC_NaturalLanguage, nullptr,
   9537                             0);
   9538 }
   9539 
   9540 void Sema::CodeCompleteAvailabilityPlatformName() {
   9541   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
   9542                         CodeCompleter->getCodeCompletionTUInfo(),
   9543                         CodeCompletionContext::CCC_Other);
   9544   Results.EnterNewScope();
   9545   static const char *Platforms[] = {"macOS", "iOS", "watchOS", "tvOS"};
   9546   for (const char *Platform : llvm::makeArrayRef(Platforms)) {
   9547     Results.AddResult(CodeCompletionResult(Platform));
   9548     Results.AddResult(CodeCompletionResult(Results.getAllocator().CopyString(
   9549         Twine(Platform) + "ApplicationExtension")));
   9550   }
   9551   Results.ExitScope();
   9552   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
   9553                             Results.data(), Results.size());
   9554 }
   9555 
   9556 void Sema::GatherGlobalCodeCompletions(
   9557     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
   9558     SmallVectorImpl<CodeCompletionResult> &Results) {
   9559   ResultBuilder Builder(*this, Allocator, CCTUInfo,
   9560                         CodeCompletionContext::CCC_Recovery);
   9561   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
   9562     CodeCompletionDeclConsumer Consumer(Builder,
   9563                                         Context.getTranslationUnitDecl());
   9564     LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName,
   9565                        Consumer,
   9566                        !CodeCompleter || CodeCompleter->loadExternal());
   9567   }
   9568 
   9569   if (!CodeCompleter || CodeCompleter->includeMacros())
   9570     AddMacroResults(PP, Builder,
   9571                     !CodeCompleter || CodeCompleter->loadExternal(), true);
   9572 
   9573   Results.clear();
   9574   Results.insert(Results.end(), Builder.data(),
   9575                  Builder.data() + Builder.size());
   9576 }
   9577