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