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       // For pointers, suggest 'return nullptr' in C++.
2316       if (SemaRef.getLangOpts().CPlusPlus11 &&
2317           (ReturnType->isPointerType() || ReturnType->isMemberPointerType())) {
2318         Builder.AddTypedTextChunk("return nullptr");
2319         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2320         Results.AddResult(Result(Builder.TakeString()));
2321       }
2322     }
2323 
2324     // goto identifier ;
2325     Builder.AddTypedTextChunk("goto");
2326     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2327     Builder.AddPlaceholderChunk("label");
2328     Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2329     Results.AddResult(Result(Builder.TakeString()));
2330 
2331     // Using directives
2332     Builder.AddTypedTextChunk("using namespace");
2333     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2334     Builder.AddPlaceholderChunk("identifier");
2335     Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2336     Results.AddResult(Result(Builder.TakeString()));
2337 
2338     AddStaticAssertResult(Builder, Results, SemaRef.getLangOpts());
2339   }
2340     LLVM_FALLTHROUGH;
2341 
2342   // Fall through (for statement expressions).
2343   case Sema::PCC_ForInit:
2344   case Sema::PCC_Condition:
2345     AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2346     // Fall through: conditions and statements can have expressions.
2347     LLVM_FALLTHROUGH;
2348 
2349   case Sema::PCC_ParenthesizedExpression:
2350     if (SemaRef.getLangOpts().ObjCAutoRefCount &&
2351         CCC == Sema::PCC_ParenthesizedExpression) {
2352       // (__bridge <type>)<expression>
2353       Builder.AddTypedTextChunk("__bridge");
2354       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2355       Builder.AddPlaceholderChunk("type");
2356       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2357       Builder.AddPlaceholderChunk("expression");
2358       Results.AddResult(Result(Builder.TakeString()));
2359 
2360       // (__bridge_transfer <Objective-C type>)<expression>
2361       Builder.AddTypedTextChunk("__bridge_transfer");
2362       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2363       Builder.AddPlaceholderChunk("Objective-C type");
2364       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2365       Builder.AddPlaceholderChunk("expression");
2366       Results.AddResult(Result(Builder.TakeString()));
2367 
2368       // (__bridge_retained <CF type>)<expression>
2369       Builder.AddTypedTextChunk("__bridge_retained");
2370       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2371       Builder.AddPlaceholderChunk("CF type");
2372       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2373       Builder.AddPlaceholderChunk("expression");
2374       Results.AddResult(Result(Builder.TakeString()));
2375     }
2376     // Fall through
2377     LLVM_FALLTHROUGH;
2378 
2379   case Sema::PCC_Expression: {
2380     if (SemaRef.getLangOpts().CPlusPlus) {
2381       // 'this', if we're in a non-static member function.
2382       addThisCompletion(SemaRef, Results);
2383 
2384       // true
2385       Builder.AddResultTypeChunk("bool");
2386       Builder.AddTypedTextChunk("true");
2387       Results.AddResult(Result(Builder.TakeString()));
2388 
2389       // false
2390       Builder.AddResultTypeChunk("bool");
2391       Builder.AddTypedTextChunk("false");
2392       Results.AddResult(Result(Builder.TakeString()));
2393 
2394       if (SemaRef.getLangOpts().RTTI) {
2395         // dynamic_cast < type-id > ( expression )
2396         Builder.AddTypedTextChunk("dynamic_cast");
2397         Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2398         Builder.AddPlaceholderChunk("type");
2399         Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2400         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2401         Builder.AddPlaceholderChunk("expression");
2402         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2403         Results.AddResult(Result(Builder.TakeString()));
2404       }
2405 
2406       // static_cast < type-id > ( expression )
2407       Builder.AddTypedTextChunk("static_cast");
2408       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2409       Builder.AddPlaceholderChunk("type");
2410       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2411       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2412       Builder.AddPlaceholderChunk("expression");
2413       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2414       Results.AddResult(Result(Builder.TakeString()));
2415 
2416       // reinterpret_cast < type-id > ( expression )
2417       Builder.AddTypedTextChunk("reinterpret_cast");
2418       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2419       Builder.AddPlaceholderChunk("type");
2420       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2421       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2422       Builder.AddPlaceholderChunk("expression");
2423       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2424       Results.AddResult(Result(Builder.TakeString()));
2425 
2426       // const_cast < type-id > ( expression )
2427       Builder.AddTypedTextChunk("const_cast");
2428       Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2429       Builder.AddPlaceholderChunk("type");
2430       Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2431       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2432       Builder.AddPlaceholderChunk("expression");
2433       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2434       Results.AddResult(Result(Builder.TakeString()));
2435 
2436       if (SemaRef.getLangOpts().RTTI) {
2437         // typeid ( expression-or-type )
2438         Builder.AddResultTypeChunk("std::type_info");
2439         Builder.AddTypedTextChunk("typeid");
2440         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2441         Builder.AddPlaceholderChunk("expression-or-type");
2442         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2443         Results.AddResult(Result(Builder.TakeString()));
2444       }
2445 
2446       // new T ( ... )
2447       Builder.AddTypedTextChunk("new");
2448       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2449       Builder.AddPlaceholderChunk("type");
2450       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2451       Builder.AddPlaceholderChunk("expressions");
2452       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2453       Results.AddResult(Result(Builder.TakeString()));
2454 
2455       // new T [ ] ( ... )
2456       Builder.AddTypedTextChunk("new");
2457       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2458       Builder.AddPlaceholderChunk("type");
2459       Builder.AddChunk(CodeCompletionString::CK_LeftBracket);
2460       Builder.AddPlaceholderChunk("size");
2461       Builder.AddChunk(CodeCompletionString::CK_RightBracket);
2462       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2463       Builder.AddPlaceholderChunk("expressions");
2464       Builder.AddChunk(CodeCompletionString::CK_RightParen);
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.AddPlaceholderChunk("expression");
2472       Results.AddResult(Result(Builder.TakeString()));
2473 
2474       // delete [] expression
2475       Builder.AddResultTypeChunk("void");
2476       Builder.AddTypedTextChunk("delete");
2477       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2478       Builder.AddChunk(CodeCompletionString::CK_LeftBracket);
2479       Builder.AddChunk(CodeCompletionString::CK_RightBracket);
2480       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2481       Builder.AddPlaceholderChunk("expression");
2482       Results.AddResult(Result(Builder.TakeString()));
2483 
2484       if (SemaRef.getLangOpts().CXXExceptions) {
2485         // throw expression
2486         Builder.AddResultTypeChunk("void");
2487         Builder.AddTypedTextChunk("throw");
2488         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
2489         Builder.AddPlaceholderChunk("expression");
2490         Results.AddResult(Result(Builder.TakeString()));
2491       }
2492 
2493       // FIXME: Rethrow?
2494 
2495       if (SemaRef.getLangOpts().CPlusPlus11) {
2496         // nullptr
2497         Builder.AddResultTypeChunk("std::nullptr_t");
2498         Builder.AddTypedTextChunk("nullptr");
2499         Results.AddResult(Result(Builder.TakeString()));
2500 
2501         // alignof
2502         Builder.AddResultTypeChunk("size_t");
2503         Builder.AddTypedTextChunk("alignof");
2504         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2505         Builder.AddPlaceholderChunk("type");
2506         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2507         Results.AddResult(Result(Builder.TakeString()));
2508 
2509         // noexcept
2510         Builder.AddResultTypeChunk("bool");
2511         Builder.AddTypedTextChunk("noexcept");
2512         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2513         Builder.AddPlaceholderChunk("expression");
2514         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2515         Results.AddResult(Result(Builder.TakeString()));
2516 
2517         // sizeof... expression
2518         Builder.AddResultTypeChunk("size_t");
2519         Builder.AddTypedTextChunk("sizeof...");
2520         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2521         Builder.AddPlaceholderChunk("parameter-pack");
2522         Builder.AddChunk(CodeCompletionString::CK_RightParen);
2523         Results.AddResult(Result(Builder.TakeString()));
2524       }
2525     }
2526 
2527     if (SemaRef.getLangOpts().ObjC) {
2528       // Add "super", if we're in an Objective-C class with a superclass.
2529       if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) {
2530         // The interface can be NULL.
2531         if (ObjCInterfaceDecl *ID = Method->getClassInterface())
2532           if (ID->getSuperClass()) {
2533             std::string SuperType;
2534             SuperType = ID->getSuperClass()->getNameAsString();
2535             if (Method->isInstanceMethod())
2536               SuperType += " *";
2537 
2538             Builder.AddResultTypeChunk(Allocator.CopyString(SuperType));
2539             Builder.AddTypedTextChunk("super");
2540             Results.AddResult(Result(Builder.TakeString()));
2541           }
2542       }
2543 
2544       AddObjCExpressionResults(Results, true);
2545     }
2546 
2547     if (SemaRef.getLangOpts().C11) {
2548       // _Alignof
2549       Builder.AddResultTypeChunk("size_t");
2550       if (SemaRef.PP.isMacroDefined("alignof"))
2551         Builder.AddTypedTextChunk("alignof");
2552       else
2553         Builder.AddTypedTextChunk("_Alignof");
2554       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2555       Builder.AddPlaceholderChunk("type");
2556       Builder.AddChunk(CodeCompletionString::CK_RightParen);
2557       Results.AddResult(Result(Builder.TakeString()));
2558     }
2559 
2560     // sizeof expression
2561     Builder.AddResultTypeChunk("size_t");
2562     Builder.AddTypedTextChunk("sizeof");
2563     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2564     Builder.AddPlaceholderChunk("expression-or-type");
2565     Builder.AddChunk(CodeCompletionString::CK_RightParen);
2566     Results.AddResult(Result(Builder.TakeString()));
2567     break;
2568   }
2569 
2570   case Sema::PCC_Type:
2571   case Sema::PCC_LocalDeclarationSpecifiers:
2572     break;
2573   }
2574 
2575   if (WantTypesInContext(CCC, SemaRef.getLangOpts()))
2576     AddTypeSpecifierResults(SemaRef.getLangOpts(), Results);
2577 
2578   if (SemaRef.getLangOpts().CPlusPlus && CCC != Sema::PCC_Type)
2579     Results.AddResult(Result("operator"));
2580 }
2581 
2582 /// If the given declaration has an associated type, add it as a result
2583 /// type chunk.
2584 static void AddResultTypeChunk(ASTContext &Context,
2585                                const PrintingPolicy &Policy,
2586                                const NamedDecl *ND, QualType BaseType,
2587                                CodeCompletionBuilder &Result) {
2588   if (!ND)
2589     return;
2590 
2591   // Skip constructors and conversion functions, which have their return types
2592   // built into their names.
2593   if (isConstructor(ND) || isa<CXXConversionDecl>(ND))
2594     return;
2595 
2596   // Determine the type of the declaration (if it has a type).
2597   QualType T;
2598   if (const FunctionDecl *Function = ND->getAsFunction())
2599     T = Function->getReturnType();
2600   else if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) {
2601     if (!BaseType.isNull())
2602       T = Method->getSendResultType(BaseType);
2603     else
2604       T = Method->getReturnType();
2605   } else if (const auto *Enumerator = dyn_cast<EnumConstantDecl>(ND)) {
2606     T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext()));
2607     T = clang::TypeName::getFullyQualifiedType(T, Context);
2608   } else if (isa<UnresolvedUsingValueDecl>(ND)) {
2609     /* Do nothing: ignore unresolved using declarations*/
2610   } else if (const auto *Ivar = dyn_cast<ObjCIvarDecl>(ND)) {
2611     if (!BaseType.isNull())
2612       T = Ivar->getUsageType(BaseType);
2613     else
2614       T = Ivar->getType();
2615   } else if (const auto *Value = dyn_cast<ValueDecl>(ND)) {
2616     T = Value->getType();
2617   } else if (const auto *Property = dyn_cast<ObjCPropertyDecl>(ND)) {
2618     if (!BaseType.isNull())
2619       T = Property->getUsageType(BaseType);
2620     else
2621       T = Property->getType();
2622   }
2623 
2624   if (T.isNull() || Context.hasSameType(T, Context.DependentTy))
2625     return;
2626 
2627   Result.AddResultTypeChunk(
2628       GetCompletionTypeString(T, Context, Policy, Result.getAllocator()));
2629 }
2630 
2631 static void MaybeAddSentinel(Preprocessor &PP,
2632                              const NamedDecl *FunctionOrMethod,
2633                              CodeCompletionBuilder &Result) {
2634   if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>())
2635     if (Sentinel->getSentinel() == 0) {
2636       if (PP.getLangOpts().ObjC && PP.isMacroDefined("nil"))
2637         Result.AddTextChunk(", nil");
2638       else if (PP.isMacroDefined("NULL"))
2639         Result.AddTextChunk(", NULL");
2640       else
2641         Result.AddTextChunk(", (void*)0");
2642     }
2643 }
2644 
2645 static std::string formatObjCParamQualifiers(unsigned ObjCQuals,
2646                                              QualType &Type) {
2647   std::string Result;
2648   if (ObjCQuals & Decl::OBJC_TQ_In)
2649     Result += "in ";
2650   else if (ObjCQuals & Decl::OBJC_TQ_Inout)
2651     Result += "inout ";
2652   else if (ObjCQuals & Decl::OBJC_TQ_Out)
2653     Result += "out ";
2654   if (ObjCQuals & Decl::OBJC_TQ_Bycopy)
2655     Result += "bycopy ";
2656   else if (ObjCQuals & Decl::OBJC_TQ_Byref)
2657     Result += "byref ";
2658   if (ObjCQuals & Decl::OBJC_TQ_Oneway)
2659     Result += "oneway ";
2660   if (ObjCQuals & Decl::OBJC_TQ_CSNullability) {
2661     if (auto nullability = AttributedType::stripOuterNullability(Type)) {
2662       switch (*nullability) {
2663       case NullabilityKind::NonNull:
2664         Result += "nonnull ";
2665         break;
2666 
2667       case NullabilityKind::Nullable:
2668         Result += "nullable ";
2669         break;
2670 
2671       case NullabilityKind::Unspecified:
2672         Result += "null_unspecified ";
2673         break;
2674       }
2675     }
2676   }
2677   return Result;
2678 }
2679 
2680 /// Tries to find the most appropriate type location for an Objective-C
2681 /// block placeholder.
2682 ///
2683 /// This function ignores things like typedefs and qualifiers in order to
2684 /// present the most relevant and accurate block placeholders in code completion
2685 /// results.
2686 static void findTypeLocationForBlockDecl(const TypeSourceInfo *TSInfo,
2687                                          FunctionTypeLoc &Block,
2688                                          FunctionProtoTypeLoc &BlockProto,
2689                                          bool SuppressBlock = false) {
2690   if (!TSInfo)
2691     return;
2692   TypeLoc TL = TSInfo->getTypeLoc().getUnqualifiedLoc();
2693   while (true) {
2694     // Look through typedefs.
2695     if (!SuppressBlock) {
2696       if (TypedefTypeLoc TypedefTL = TL.getAs<TypedefTypeLoc>()) {
2697         if (TypeSourceInfo *InnerTSInfo =
2698                 TypedefTL.getTypedefNameDecl()->getTypeSourceInfo()) {
2699           TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc();
2700           continue;
2701         }
2702       }
2703 
2704       // Look through qualified types
2705       if (QualifiedTypeLoc QualifiedTL = TL.getAs<QualifiedTypeLoc>()) {
2706         TL = QualifiedTL.getUnqualifiedLoc();
2707         continue;
2708       }
2709 
2710       if (AttributedTypeLoc AttrTL = TL.getAs<AttributedTypeLoc>()) {
2711         TL = AttrTL.getModifiedLoc();
2712         continue;
2713       }
2714     }
2715 
2716     // Try to get the function prototype behind the block pointer type,
2717     // then we're done.
2718     if (BlockPointerTypeLoc BlockPtr = TL.getAs<BlockPointerTypeLoc>()) {
2719       TL = BlockPtr.getPointeeLoc().IgnoreParens();
2720       Block = TL.getAs<FunctionTypeLoc>();
2721       BlockProto = TL.getAs<FunctionProtoTypeLoc>();
2722     }
2723     break;
2724   }
2725 }
2726 
2727 static std::string
2728 formatBlockPlaceholder(const PrintingPolicy &Policy, const NamedDecl *BlockDecl,
2729                        FunctionTypeLoc &Block, FunctionProtoTypeLoc &BlockProto,
2730                        bool SuppressBlockName = false,
2731                        bool SuppressBlock = false,
2732                        Optional<ArrayRef<QualType>> ObjCSubsts = None);
2733 
2734 static std::string
2735 FormatFunctionParameter(const PrintingPolicy &Policy, const ParmVarDecl *Param,
2736                         bool SuppressName = false, bool SuppressBlock = false,
2737                         Optional<ArrayRef<QualType>> ObjCSubsts = None) {
2738   // Params are unavailable in FunctionTypeLoc if the FunctionType is invalid.
2739   // It would be better to pass in the param Type, which is usually avaliable.
2740   // But this case is rare, so just pretend we fell back to int as elsewhere.
2741   if (!Param)
2742     return "int";
2743   bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext());
2744   if (Param->getType()->isDependentType() ||
2745       !Param->getType()->isBlockPointerType()) {
2746     // The argument for a dependent or non-block parameter is a placeholder
2747     // containing that parameter's type.
2748     std::string Result;
2749 
2750     if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName)
2751       Result = Param->getIdentifier()->getName();
2752 
2753     QualType Type = Param->getType();
2754     if (ObjCSubsts)
2755       Type = Type.substObjCTypeArgs(Param->getASTContext(), *ObjCSubsts,
2756                                     ObjCSubstitutionContext::Parameter);
2757     if (ObjCMethodParam) {
2758       Result =
2759           "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier(), Type);
2760       Result += Type.getAsString(Policy) + ")";
2761       if (Param->getIdentifier() && !SuppressName)
2762         Result += Param->getIdentifier()->getName();
2763     } else {
2764       Type.getAsStringInternal(Result, Policy);
2765     }
2766     return Result;
2767   }
2768 
2769   // The argument for a block pointer parameter is a block literal with
2770   // the appropriate type.
2771   FunctionTypeLoc Block;
2772   FunctionProtoTypeLoc BlockProto;
2773   findTypeLocationForBlockDecl(Param->getTypeSourceInfo(), Block, BlockProto,
2774                                SuppressBlock);
2775   // Try to retrieve the block type information from the property if this is a
2776   // parameter in a setter.
2777   if (!Block && ObjCMethodParam &&
2778       cast<ObjCMethodDecl>(Param->getDeclContext())->isPropertyAccessor()) {
2779     if (const auto *PD = cast<ObjCMethodDecl>(Param->getDeclContext())
2780                              ->findPropertyDecl(/*CheckOverrides=*/false))
2781       findTypeLocationForBlockDecl(PD->getTypeSourceInfo(), Block, BlockProto,
2782                                    SuppressBlock);
2783   }
2784 
2785   if (!Block) {
2786     // We were unable to find a FunctionProtoTypeLoc with parameter names
2787     // for the block; just use the parameter type as a placeholder.
2788     std::string Result;
2789     if (!ObjCMethodParam && Param->getIdentifier())
2790       Result = Param->getIdentifier()->getName();
2791 
2792     QualType Type = Param->getType().getUnqualifiedType();
2793 
2794     if (ObjCMethodParam) {
2795       Result = Type.getAsString(Policy);
2796       std::string Quals =
2797           formatObjCParamQualifiers(Param->getObjCDeclQualifier(), Type);
2798       if (!Quals.empty())
2799         Result = "(" + Quals + " " + Result + ")";
2800       if (Result.back() != ')')
2801         Result += " ";
2802       if (Param->getIdentifier())
2803         Result += Param->getIdentifier()->getName();
2804     } else {
2805       Type.getAsStringInternal(Result, Policy);
2806     }
2807 
2808     return Result;
2809   }
2810 
2811   // We have the function prototype behind the block pointer type, as it was
2812   // written in the source.
2813   return formatBlockPlaceholder(Policy, Param, Block, BlockProto,
2814                                 /*SuppressBlockName=*/false, SuppressBlock,
2815                                 ObjCSubsts);
2816 }
2817 
2818 /// Returns a placeholder string that corresponds to an Objective-C block
2819 /// declaration.
2820 ///
2821 /// \param BlockDecl A declaration with an Objective-C block type.
2822 ///
2823 /// \param Block The most relevant type location for that block type.
2824 ///
2825 /// \param SuppressBlockName Determines whether or not the name of the block
2826 /// declaration is included in the resulting string.
2827 static std::string
2828 formatBlockPlaceholder(const PrintingPolicy &Policy, const NamedDecl *BlockDecl,
2829                        FunctionTypeLoc &Block, FunctionProtoTypeLoc &BlockProto,
2830                        bool SuppressBlockName, bool SuppressBlock,
2831                        Optional<ArrayRef<QualType>> ObjCSubsts) {
2832   std::string Result;
2833   QualType ResultType = Block.getTypePtr()->getReturnType();
2834   if (ObjCSubsts)
2835     ResultType =
2836         ResultType.substObjCTypeArgs(BlockDecl->getASTContext(), *ObjCSubsts,
2837                                      ObjCSubstitutionContext::Result);
2838   if (!ResultType->isVoidType() || SuppressBlock)
2839     ResultType.getAsStringInternal(Result, Policy);
2840 
2841   // Format the parameter list.
2842   std::string Params;
2843   if (!BlockProto || Block.getNumParams() == 0) {
2844     if (BlockProto && BlockProto.getTypePtr()->isVariadic())
2845       Params = "(...)";
2846     else
2847       Params = "(void)";
2848   } else {
2849     Params += "(";
2850     for (unsigned I = 0, N = Block.getNumParams(); I != N; ++I) {
2851       if (I)
2852         Params += ", ";
2853       Params += FormatFunctionParameter(Policy, Block.getParam(I),
2854                                         /*SuppressName=*/false,
2855                                         /*SuppressBlock=*/true, ObjCSubsts);
2856 
2857       if (I == N - 1 && BlockProto.getTypePtr()->isVariadic())
2858         Params += ", ...";
2859     }
2860     Params += ")";
2861   }
2862 
2863   if (SuppressBlock) {
2864     // Format as a parameter.
2865     Result = Result + " (^";
2866     if (!SuppressBlockName && BlockDecl->getIdentifier())
2867       Result += BlockDecl->getIdentifier()->getName();
2868     Result += ")";
2869     Result += Params;
2870   } else {
2871     // Format as a block literal argument.
2872     Result = '^' + Result;
2873     Result += Params;
2874 
2875     if (!SuppressBlockName && BlockDecl->getIdentifier())
2876       Result += BlockDecl->getIdentifier()->getName();
2877   }
2878 
2879   return Result;
2880 }
2881 
2882 static std::string GetDefaultValueString(const ParmVarDecl *Param,
2883                                          const SourceManager &SM,
2884                                          const LangOptions &LangOpts) {
2885   const SourceRange SrcRange = Param->getDefaultArgRange();
2886   CharSourceRange CharSrcRange = CharSourceRange::getTokenRange(SrcRange);
2887   bool Invalid = CharSrcRange.isInvalid();
2888   if (Invalid)
2889     return "";
2890   StringRef srcText =
2891       Lexer::getSourceText(CharSrcRange, SM, LangOpts, &Invalid);
2892   if (Invalid)
2893     return "";
2894 
2895   if (srcText.empty() || srcText == "=") {
2896     // Lexer can't determine the value.
2897     // This happens if the code is incorrect (for example class is forward
2898     // declared).
2899     return "";
2900   }
2901   std::string DefValue(srcText.str());
2902   // FIXME: remove this check if the Lexer::getSourceText value is fixed and
2903   // this value always has (or always does not have) '=' in front of it
2904   if (DefValue.at(0) != '=') {
2905     // If we don't have '=' in front of value.
2906     // Lexer returns built-in types values without '=' and user-defined types
2907     // values with it.
2908     return " = " + DefValue;
2909   }
2910   return " " + DefValue;
2911 }
2912 
2913 /// Add function parameter chunks to the given code completion string.
2914 static void AddFunctionParameterChunks(Preprocessor &PP,
2915                                        const PrintingPolicy &Policy,
2916                                        const FunctionDecl *Function,
2917                                        CodeCompletionBuilder &Result,
2918                                        unsigned Start = 0,
2919                                        bool InOptional = false) {
2920   bool FirstParameter = true;
2921 
2922   for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) {
2923     const ParmVarDecl *Param = Function->getParamDecl(P);
2924 
2925     if (Param->hasDefaultArg() && !InOptional) {
2926       // When we see an optional default argument, put that argument and
2927       // the remaining default arguments into a new, optional string.
2928       CodeCompletionBuilder Opt(Result.getAllocator(),
2929                                 Result.getCodeCompletionTUInfo());
2930       if (!FirstParameter)
2931         Opt.AddChunk(CodeCompletionString::CK_Comma);
2932       AddFunctionParameterChunks(PP, Policy, Function, Opt, P, true);
2933       Result.AddOptionalChunk(Opt.TakeString());
2934       break;
2935     }
2936 
2937     if (FirstParameter)
2938       FirstParameter = false;
2939     else
2940       Result.AddChunk(CodeCompletionString::CK_Comma);
2941 
2942     InOptional = false;
2943 
2944     // Format the placeholder string.
2945     std::string PlaceholderStr = FormatFunctionParameter(Policy, Param);
2946     if (Param->hasDefaultArg())
2947       PlaceholderStr +=
2948           GetDefaultValueString(Param, PP.getSourceManager(), PP.getLangOpts());
2949 
2950     if (Function->isVariadic() && P == N - 1)
2951       PlaceholderStr += ", ...";
2952 
2953     // Add the placeholder string.
2954     Result.AddPlaceholderChunk(
2955         Result.getAllocator().CopyString(PlaceholderStr));
2956   }
2957 
2958   if (const auto *Proto = Function->getType()->getAs<FunctionProtoType>())
2959     if (Proto->isVariadic()) {
2960       if (Proto->getNumParams() == 0)
2961         Result.AddPlaceholderChunk("...");
2962 
2963       MaybeAddSentinel(PP, Function, Result);
2964     }
2965 }
2966 
2967 /// Add template parameter chunks to the given code completion string.
2968 static void AddTemplateParameterChunks(
2969     ASTContext &Context, const PrintingPolicy &Policy,
2970     const TemplateDecl *Template, CodeCompletionBuilder &Result,
2971     unsigned MaxParameters = 0, unsigned Start = 0, bool InDefaultArg = false) {
2972   bool FirstParameter = true;
2973 
2974   // Prefer to take the template parameter names from the first declaration of
2975   // the template.
2976   Template = cast<TemplateDecl>(Template->getCanonicalDecl());
2977 
2978   TemplateParameterList *Params = Template->getTemplateParameters();
2979   TemplateParameterList::iterator PEnd = Params->end();
2980   if (MaxParameters)
2981     PEnd = Params->begin() + MaxParameters;
2982   for (TemplateParameterList::iterator P = Params->begin() + Start; P != PEnd;
2983        ++P) {
2984     bool HasDefaultArg = false;
2985     std::string PlaceholderStr;
2986     if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
2987       if (TTP->wasDeclaredWithTypename())
2988         PlaceholderStr = "typename";
2989       else
2990         PlaceholderStr = "class";
2991 
2992       if (TTP->getIdentifier()) {
2993         PlaceholderStr += ' ';
2994         PlaceholderStr += TTP->getIdentifier()->getName();
2995       }
2996 
2997       HasDefaultArg = TTP->hasDefaultArgument();
2998     } else if (NonTypeTemplateParmDecl *NTTP =
2999                    dyn_cast<NonTypeTemplateParmDecl>(*P)) {
3000       if (NTTP->getIdentifier())
3001         PlaceholderStr = NTTP->getIdentifier()->getName();
3002       NTTP->getType().getAsStringInternal(PlaceholderStr, Policy);
3003       HasDefaultArg = NTTP->hasDefaultArgument();
3004     } else {
3005       assert(isa<TemplateTemplateParmDecl>(*P));
3006       TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P);
3007 
3008       // Since putting the template argument list into the placeholder would
3009       // be very, very long, we just use an abbreviation.
3010       PlaceholderStr = "template<...> class";
3011       if (TTP->getIdentifier()) {
3012         PlaceholderStr += ' ';
3013         PlaceholderStr += TTP->getIdentifier()->getName();
3014       }
3015 
3016       HasDefaultArg = TTP->hasDefaultArgument();
3017     }
3018 
3019     if (HasDefaultArg && !InDefaultArg) {
3020       // When we see an optional default argument, put that argument and
3021       // the remaining default arguments into a new, optional string.
3022       CodeCompletionBuilder Opt(Result.getAllocator(),
3023                                 Result.getCodeCompletionTUInfo());
3024       if (!FirstParameter)
3025         Opt.AddChunk(CodeCompletionString::CK_Comma);
3026       AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters,
3027                                  P - Params->begin(), true);
3028       Result.AddOptionalChunk(Opt.TakeString());
3029       break;
3030     }
3031 
3032     InDefaultArg = false;
3033 
3034     if (FirstParameter)
3035       FirstParameter = false;
3036     else
3037       Result.AddChunk(CodeCompletionString::CK_Comma);
3038 
3039     // Add the placeholder string.
3040     Result.AddPlaceholderChunk(
3041         Result.getAllocator().CopyString(PlaceholderStr));
3042   }
3043 }
3044 
3045 /// Add a qualifier to the given code-completion string, if the
3046 /// provided nested-name-specifier is non-NULL.
3047 static void AddQualifierToCompletionString(CodeCompletionBuilder &Result,
3048                                            NestedNameSpecifier *Qualifier,
3049                                            bool QualifierIsInformative,
3050                                            ASTContext &Context,
3051                                            const PrintingPolicy &Policy) {
3052   if (!Qualifier)
3053     return;
3054 
3055   std::string PrintedNNS;
3056   {
3057     llvm::raw_string_ostream OS(PrintedNNS);
3058     Qualifier->print(OS, Policy);
3059   }
3060   if (QualifierIsInformative)
3061     Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS));
3062   else
3063     Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS));
3064 }
3065 
3066 static void
3067 AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result,
3068                                        const FunctionDecl *Function) {
3069   const auto *Proto = Function->getType()->getAs<FunctionProtoType>();
3070   if (!Proto || !Proto->getMethodQuals())
3071     return;
3072 
3073   // FIXME: Add ref-qualifier!
3074 
3075   // Handle single qualifiers without copying
3076   if (Proto->getMethodQuals().hasOnlyConst()) {
3077     Result.AddInformativeChunk(" const");
3078     return;
3079   }
3080 
3081   if (Proto->getMethodQuals().hasOnlyVolatile()) {
3082     Result.AddInformativeChunk(" volatile");
3083     return;
3084   }
3085 
3086   if (Proto->getMethodQuals().hasOnlyRestrict()) {
3087     Result.AddInformativeChunk(" restrict");
3088     return;
3089   }
3090 
3091   // Handle multiple qualifiers.
3092   std::string QualsStr;
3093   if (Proto->isConst())
3094     QualsStr += " const";
3095   if (Proto->isVolatile())
3096     QualsStr += " volatile";
3097   if (Proto->isRestrict())
3098     QualsStr += " restrict";
3099   Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr));
3100 }
3101 
3102 /// Add the name of the given declaration
3103 static void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy,
3104                               const NamedDecl *ND,
3105                               CodeCompletionBuilder &Result) {
3106   DeclarationName Name = ND->getDeclName();
3107   if (!Name)
3108     return;
3109 
3110   switch (Name.getNameKind()) {
3111   case DeclarationName::CXXOperatorName: {
3112     const char *OperatorName = nullptr;
3113     switch (Name.getCXXOverloadedOperator()) {
3114     case OO_None:
3115     case OO_Conditional:
3116     case NUM_OVERLOADED_OPERATORS:
3117       OperatorName = "operator";
3118       break;
3119 
3120 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
3121   case OO_##Name:                                                              \
3122     OperatorName = "operator" Spelling;                                        \
3123     break;
3124 #define OVERLOADED_OPERATOR_MULTI(Name, Spelling, Unary, Binary, MemberOnly)
3125 #include "clang/Basic/OperatorKinds.def"
3126 
3127     case OO_New:
3128       OperatorName = "operator new";
3129       break;
3130     case OO_Delete:
3131       OperatorName = "operator delete";
3132       break;
3133     case OO_Array_New:
3134       OperatorName = "operator new[]";
3135       break;
3136     case OO_Array_Delete:
3137       OperatorName = "operator delete[]";
3138       break;
3139     case OO_Call:
3140       OperatorName = "operator()";
3141       break;
3142     case OO_Subscript:
3143       OperatorName = "operator[]";
3144       break;
3145     }
3146     Result.AddTypedTextChunk(OperatorName);
3147     break;
3148   }
3149 
3150   case DeclarationName::Identifier:
3151   case DeclarationName::CXXConversionFunctionName:
3152   case DeclarationName::CXXDestructorName:
3153   case DeclarationName::CXXLiteralOperatorName:
3154     Result.AddTypedTextChunk(
3155         Result.getAllocator().CopyString(ND->getNameAsString()));
3156     break;
3157 
3158   case DeclarationName::CXXDeductionGuideName:
3159   case DeclarationName::CXXUsingDirective:
3160   case DeclarationName::ObjCZeroArgSelector:
3161   case DeclarationName::ObjCOneArgSelector:
3162   case DeclarationName::ObjCMultiArgSelector:
3163     break;
3164 
3165   case DeclarationName::CXXConstructorName: {
3166     CXXRecordDecl *Record = nullptr;
3167     QualType Ty = Name.getCXXNameType();
3168     if (const auto *RecordTy = Ty->getAs<RecordType>())
3169       Record = cast<CXXRecordDecl>(RecordTy->getDecl());
3170     else if (const auto *InjectedTy = Ty->getAs<InjectedClassNameType>())
3171       Record = InjectedTy->getDecl();
3172     else {
3173       Result.AddTypedTextChunk(
3174           Result.getAllocator().CopyString(ND->getNameAsString()));
3175       break;
3176     }
3177 
3178     Result.AddTypedTextChunk(
3179         Result.getAllocator().CopyString(Record->getNameAsString()));
3180     if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) {
3181       Result.AddChunk(CodeCompletionString::CK_LeftAngle);
3182       AddTemplateParameterChunks(Context, Policy, Template, Result);
3183       Result.AddChunk(CodeCompletionString::CK_RightAngle);
3184     }
3185     break;
3186   }
3187   }
3188 }
3189 
3190 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(
3191     Sema &S, const CodeCompletionContext &CCContext,
3192     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
3193     bool IncludeBriefComments) {
3194   return CreateCodeCompletionString(S.Context, S.PP, CCContext, Allocator,
3195                                     CCTUInfo, IncludeBriefComments);
3196 }
3197 
3198 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionStringForMacro(
3199     Preprocessor &PP, CodeCompletionAllocator &Allocator,
3200     CodeCompletionTUInfo &CCTUInfo) {
3201   assert(Kind == RK_Macro);
3202   CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability);
3203   const MacroInfo *MI = PP.getMacroInfo(Macro);
3204   Result.AddTypedTextChunk(Result.getAllocator().CopyString(Macro->getName()));
3205 
3206   if (!MI || !MI->isFunctionLike())
3207     return Result.TakeString();
3208 
3209   // Format a function-like macro with placeholders for the arguments.
3210   Result.AddChunk(CodeCompletionString::CK_LeftParen);
3211   MacroInfo::param_iterator A = MI->param_begin(), AEnd = MI->param_end();
3212 
3213   // C99 variadic macros add __VA_ARGS__ at the end. Skip it.
3214   if (MI->isC99Varargs()) {
3215     --AEnd;
3216 
3217     if (A == AEnd) {
3218       Result.AddPlaceholderChunk("...");
3219     }
3220   }
3221 
3222   for (MacroInfo::param_iterator A = MI->param_begin(); A != AEnd; ++A) {
3223     if (A != MI->param_begin())
3224       Result.AddChunk(CodeCompletionString::CK_Comma);
3225 
3226     if (MI->isVariadic() && (A + 1) == AEnd) {
3227       SmallString<32> Arg = (*A)->getName();
3228       if (MI->isC99Varargs())
3229         Arg += ", ...";
3230       else
3231         Arg += "...";
3232       Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg));
3233       break;
3234     }
3235 
3236     // Non-variadic macros are simple.
3237     Result.AddPlaceholderChunk(
3238         Result.getAllocator().CopyString((*A)->getName()));
3239   }
3240   Result.AddChunk(CodeCompletionString::CK_RightParen);
3241   return Result.TakeString();
3242 }
3243 
3244 /// If possible, create a new code completion string for the given
3245 /// result.
3246 ///
3247 /// \returns Either a new, heap-allocated code completion string describing
3248 /// how to use this result, or NULL to indicate that the string or name of the
3249 /// result is all that is needed.
3250 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(
3251     ASTContext &Ctx, Preprocessor &PP, const CodeCompletionContext &CCContext,
3252     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
3253     bool IncludeBriefComments) {
3254   if (Kind == RK_Macro)
3255     return CreateCodeCompletionStringForMacro(PP, Allocator, CCTUInfo);
3256 
3257   CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability);
3258 
3259   PrintingPolicy Policy = getCompletionPrintingPolicy(Ctx, PP);
3260   if (Kind == RK_Pattern) {
3261     Pattern->Priority = Priority;
3262     Pattern->Availability = Availability;
3263 
3264     if (Declaration) {
3265       Result.addParentContext(Declaration->getDeclContext());
3266       Pattern->ParentName = Result.getParentName();
3267       if (const RawComment *RC =
3268               getPatternCompletionComment(Ctx, Declaration)) {
3269         Result.addBriefComment(RC->getBriefText(Ctx));
3270         Pattern->BriefComment = Result.getBriefComment();
3271       }
3272     }
3273 
3274     return Pattern;
3275   }
3276 
3277   if (Kind == RK_Keyword) {
3278     Result.AddTypedTextChunk(Keyword);
3279     return Result.TakeString();
3280   }
3281   assert(Kind == RK_Declaration && "Missed a result kind?");
3282   return createCodeCompletionStringForDecl(
3283       PP, Ctx, Result, IncludeBriefComments, CCContext, Policy);
3284 }
3285 
3286 static void printOverrideString(const CodeCompletionString &CCS,
3287                                 std::string &BeforeName,
3288                                 std::string &NameAndSignature) {
3289   bool SeenTypedChunk = false;
3290   for (auto &Chunk : CCS) {
3291     if (Chunk.Kind == CodeCompletionString::CK_Optional) {
3292       assert(SeenTypedChunk && "optional parameter before name");
3293       // Note that we put all chunks inside into NameAndSignature.
3294       printOverrideString(*Chunk.Optional, NameAndSignature, NameAndSignature);
3295       continue;
3296     }
3297     SeenTypedChunk |= Chunk.Kind == CodeCompletionString::CK_TypedText;
3298     if (SeenTypedChunk)
3299       NameAndSignature += Chunk.Text;
3300     else
3301       BeforeName += Chunk.Text;
3302   }
3303 }
3304 
3305 CodeCompletionString *
3306 CodeCompletionResult::createCodeCompletionStringForOverride(
3307     Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result,
3308     bool IncludeBriefComments, const CodeCompletionContext &CCContext,
3309     PrintingPolicy &Policy) {
3310   auto *CCS = createCodeCompletionStringForDecl(PP, Ctx, Result,
3311                                                 /*IncludeBriefComments=*/false,
3312                                                 CCContext, Policy);
3313   std::string BeforeName;
3314   std::string NameAndSignature;
3315   // For overrides all chunks go into the result, none are informative.
3316   printOverrideString(*CCS, BeforeName, NameAndSignature);
3317   NameAndSignature += " override";
3318 
3319   Result.AddTextChunk(Result.getAllocator().CopyString(BeforeName));
3320   Result.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3321   Result.AddTypedTextChunk(Result.getAllocator().CopyString(NameAndSignature));
3322   return Result.TakeString();
3323 }
3324 
3325 // FIXME: Right now this works well with lambdas. Add support for other functor
3326 // types like std::function.
3327 static const NamedDecl *extractFunctorCallOperator(const NamedDecl *ND) {
3328   const auto *VD = dyn_cast<VarDecl>(ND);
3329   if (!VD)
3330     return nullptr;
3331   const auto *RecordDecl = VD->getType()->getAsCXXRecordDecl();
3332   if (!RecordDecl || !RecordDecl->isLambda())
3333     return nullptr;
3334   return RecordDecl->getLambdaCallOperator();
3335 }
3336 
3337 CodeCompletionString *CodeCompletionResult::createCodeCompletionStringForDecl(
3338     Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result,
3339     bool IncludeBriefComments, const CodeCompletionContext &CCContext,
3340     PrintingPolicy &Policy) {
3341   const NamedDecl *ND = Declaration;
3342   Result.addParentContext(ND->getDeclContext());
3343 
3344   if (IncludeBriefComments) {
3345     // Add documentation comment, if it exists.
3346     if (const RawComment *RC = getCompletionComment(Ctx, Declaration)) {
3347       Result.addBriefComment(RC->getBriefText(Ctx));
3348     }
3349   }
3350 
3351   if (StartsNestedNameSpecifier) {
3352     Result.AddTypedTextChunk(
3353         Result.getAllocator().CopyString(ND->getNameAsString()));
3354     Result.AddTextChunk("::");
3355     return Result.TakeString();
3356   }
3357 
3358   for (const auto *I : ND->specific_attrs<AnnotateAttr>())
3359     Result.AddAnnotation(Result.getAllocator().CopyString(I->getAnnotation()));
3360 
3361   auto AddFunctionTypeAndResult = [&](const FunctionDecl *Function) {
3362     AddResultTypeChunk(Ctx, Policy, Function, CCContext.getBaseType(), Result);
3363     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
3364                                    Ctx, Policy);
3365     AddTypedNameChunk(Ctx, Policy, ND, Result);
3366     Result.AddChunk(CodeCompletionString::CK_LeftParen);
3367     AddFunctionParameterChunks(PP, Policy, Function, Result);
3368     Result.AddChunk(CodeCompletionString::CK_RightParen);
3369     AddFunctionTypeQualsToCompletionString(Result, Function);
3370   };
3371 
3372   if (const auto *Function = dyn_cast<FunctionDecl>(ND)) {
3373     AddFunctionTypeAndResult(Function);
3374     return Result.TakeString();
3375   }
3376 
3377   if (const auto *CallOperator =
3378           dyn_cast_or_null<FunctionDecl>(extractFunctorCallOperator(ND))) {
3379     AddFunctionTypeAndResult(CallOperator);
3380     return Result.TakeString();
3381   }
3382 
3383   AddResultTypeChunk(Ctx, Policy, ND, CCContext.getBaseType(), Result);
3384 
3385   if (const FunctionTemplateDecl *FunTmpl =
3386           dyn_cast<FunctionTemplateDecl>(ND)) {
3387     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
3388                                    Ctx, Policy);
3389     FunctionDecl *Function = FunTmpl->getTemplatedDecl();
3390     AddTypedNameChunk(Ctx, Policy, Function, Result);
3391 
3392     // Figure out which template parameters are deduced (or have default
3393     // arguments).
3394     llvm::SmallBitVector Deduced;
3395     Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced);
3396     unsigned LastDeducibleArgument;
3397     for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0;
3398          --LastDeducibleArgument) {
3399       if (!Deduced[LastDeducibleArgument - 1]) {
3400         // C++0x: Figure out if the template argument has a default. If so,
3401         // the user doesn't need to type this argument.
3402         // FIXME: We need to abstract template parameters better!
3403         bool HasDefaultArg = false;
3404         NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam(
3405             LastDeducibleArgument - 1);
3406         if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
3407           HasDefaultArg = TTP->hasDefaultArgument();
3408         else if (NonTypeTemplateParmDecl *NTTP =
3409                      dyn_cast<NonTypeTemplateParmDecl>(Param))
3410           HasDefaultArg = NTTP->hasDefaultArgument();
3411         else {
3412           assert(isa<TemplateTemplateParmDecl>(Param));
3413           HasDefaultArg =
3414               cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument();
3415         }
3416 
3417         if (!HasDefaultArg)
3418           break;
3419       }
3420     }
3421 
3422     if (LastDeducibleArgument) {
3423       // Some of the function template arguments cannot be deduced from a
3424       // function call, so we introduce an explicit template argument list
3425       // containing all of the arguments up to the first deducible argument.
3426       Result.AddChunk(CodeCompletionString::CK_LeftAngle);
3427       AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result,
3428                                  LastDeducibleArgument);
3429       Result.AddChunk(CodeCompletionString::CK_RightAngle);
3430     }
3431 
3432     // Add the function parameters
3433     Result.AddChunk(CodeCompletionString::CK_LeftParen);
3434     AddFunctionParameterChunks(PP, Policy, Function, Result);
3435     Result.AddChunk(CodeCompletionString::CK_RightParen);
3436     AddFunctionTypeQualsToCompletionString(Result, Function);
3437     return Result.TakeString();
3438   }
3439 
3440   if (const auto *Template = dyn_cast<TemplateDecl>(ND)) {
3441     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
3442                                    Ctx, Policy);
3443     Result.AddTypedTextChunk(
3444         Result.getAllocator().CopyString(Template->getNameAsString()));
3445     Result.AddChunk(CodeCompletionString::CK_LeftAngle);
3446     AddTemplateParameterChunks(Ctx, Policy, Template, Result);
3447     Result.AddChunk(CodeCompletionString::CK_RightAngle);
3448     return Result.TakeString();
3449   }
3450 
3451   if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) {
3452     Selector Sel = Method->getSelector();
3453     if (Sel.isUnarySelector()) {
3454       Result.AddTypedTextChunk(
3455           Result.getAllocator().CopyString(Sel.getNameForSlot(0)));
3456       return Result.TakeString();
3457     }
3458 
3459     std::string SelName = Sel.getNameForSlot(0).str();
3460     SelName += ':';
3461     if (StartParameter == 0)
3462       Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName));
3463     else {
3464       Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName));
3465 
3466       // If there is only one parameter, and we're past it, add an empty
3467       // typed-text chunk since there is nothing to type.
3468       if (Method->param_size() == 1)
3469         Result.AddTypedTextChunk("");
3470     }
3471     unsigned Idx = 0;
3472     for (ObjCMethodDecl::param_const_iterator P = Method->param_begin(),
3473                                               PEnd = Method->param_end();
3474          P != PEnd; (void)++P, ++Idx) {
3475       if (Idx > 0) {
3476         std::string Keyword;
3477         if (Idx > StartParameter)
3478           Result.AddChunk(CodeCompletionString::CK_HorizontalSpace);
3479         if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx))
3480           Keyword += II->getName();
3481         Keyword += ":";
3482         if (Idx < StartParameter || AllParametersAreInformative)
3483           Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword));
3484         else
3485           Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword));
3486       }
3487 
3488       // If we're before the starting parameter, skip the placeholder.
3489       if (Idx < StartParameter)
3490         continue;
3491 
3492       std::string Arg;
3493       QualType ParamType = (*P)->getType();
3494       Optional<ArrayRef<QualType>> ObjCSubsts;
3495       if (!CCContext.getBaseType().isNull())
3496         ObjCSubsts = CCContext.getBaseType()->getObjCSubstitutions(Method);
3497 
3498       if (ParamType->isBlockPointerType() && !DeclaringEntity)
3499         Arg = FormatFunctionParameter(Policy, *P, true,
3500                                       /*SuppressBlock=*/false, ObjCSubsts);
3501       else {
3502         if (ObjCSubsts)
3503           ParamType = ParamType.substObjCTypeArgs(
3504               Ctx, *ObjCSubsts, ObjCSubstitutionContext::Parameter);
3505         Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier(),
3506                                               ParamType);
3507         Arg += ParamType.getAsString(Policy) + ")";
3508         if (IdentifierInfo *II = (*P)->getIdentifier())
3509           if (DeclaringEntity || AllParametersAreInformative)
3510             Arg += II->getName();
3511       }
3512 
3513       if (Method->isVariadic() && (P + 1) == PEnd)
3514         Arg += ", ...";
3515 
3516       if (DeclaringEntity)
3517         Result.AddTextChunk(Result.getAllocator().CopyString(Arg));
3518       else if (AllParametersAreInformative)
3519         Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg));
3520       else
3521         Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg));
3522     }
3523 
3524     if (Method->isVariadic()) {
3525       if (Method->param_size() == 0) {
3526         if (DeclaringEntity)
3527           Result.AddTextChunk(", ...");
3528         else if (AllParametersAreInformative)
3529           Result.AddInformativeChunk(", ...");
3530         else
3531           Result.AddPlaceholderChunk(", ...");
3532       }
3533 
3534       MaybeAddSentinel(PP, Method, Result);
3535     }
3536 
3537     return Result.TakeString();
3538   }
3539 
3540   if (Qualifier)
3541     AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative,
3542                                    Ctx, Policy);
3543 
3544   Result.AddTypedTextChunk(
3545       Result.getAllocator().CopyString(ND->getNameAsString()));
3546   return Result.TakeString();
3547 }
3548 
3549 const RawComment *clang::getCompletionComment(const ASTContext &Ctx,
3550                                               const NamedDecl *ND) {
3551   if (!ND)
3552     return nullptr;
3553   if (auto *RC = Ctx.getRawCommentForAnyRedecl(ND))
3554     return RC;
3555 
3556   // Try to find comment from a property for ObjC methods.
3557   const auto *M = dyn_cast<ObjCMethodDecl>(ND);
3558   if (!M)
3559     return nullptr;
3560   const ObjCPropertyDecl *PDecl = M->findPropertyDecl();
3561   if (!PDecl)
3562     return nullptr;
3563 
3564   return Ctx.getRawCommentForAnyRedecl(PDecl);
3565 }
3566 
3567 const RawComment *clang::getPatternCompletionComment(const ASTContext &Ctx,
3568                                                      const NamedDecl *ND) {
3569   const auto *M = dyn_cast_or_null<ObjCMethodDecl>(ND);
3570   if (!M || !M->isPropertyAccessor())
3571     return nullptr;
3572 
3573   // Provide code completion comment for self.GetterName where
3574   // GetterName is the getter method for a property with name
3575   // different from the property name (declared via a property
3576   // getter attribute.
3577   const ObjCPropertyDecl *PDecl = M->findPropertyDecl();
3578   if (!PDecl)
3579     return nullptr;
3580   if (PDecl->getGetterName() == M->getSelector() &&
3581       PDecl->getIdentifier() != M->getIdentifier()) {
3582     if (auto *RC = Ctx.getRawCommentForAnyRedecl(M))
3583       return RC;
3584     if (auto *RC = Ctx.getRawCommentForAnyRedecl(PDecl))
3585       return RC;
3586   }
3587   return nullptr;
3588 }
3589 
3590 const RawComment *clang::getParameterComment(
3591     const ASTContext &Ctx,
3592     const CodeCompleteConsumer::OverloadCandidate &Result, unsigned ArgIndex) {
3593   auto FDecl = Result.getFunction();
3594   if (!FDecl)
3595     return nullptr;
3596   if (ArgIndex < FDecl->getNumParams())
3597     return Ctx.getRawCommentForAnyRedecl(FDecl->getParamDecl(ArgIndex));
3598   return nullptr;
3599 }
3600 
3601 /// Add function overload parameter chunks to the given code completion
3602 /// string.
3603 static void AddOverloadParameterChunks(ASTContext &Context,
3604                                        const PrintingPolicy &Policy,
3605                                        const FunctionDecl *Function,
3606                                        const FunctionProtoType *Prototype,
3607                                        CodeCompletionBuilder &Result,
3608                                        unsigned CurrentArg, unsigned Start = 0,
3609                                        bool InOptional = false) {
3610   bool FirstParameter = true;
3611   unsigned NumParams =
3612       Function ? Function->getNumParams() : Prototype->getNumParams();
3613 
3614   for (unsigned P = Start; P != NumParams; ++P) {
3615     if (Function && Function->getParamDecl(P)->hasDefaultArg() && !InOptional) {
3616       // When we see an optional default argument, put that argument and
3617       // the remaining default arguments into a new, optional string.
3618       CodeCompletionBuilder Opt(Result.getAllocator(),
3619                                 Result.getCodeCompletionTUInfo());
3620       if (!FirstParameter)
3621         Opt.AddChunk(CodeCompletionString::CK_Comma);
3622       // Optional sections are nested.
3623       AddOverloadParameterChunks(Context, Policy, Function, Prototype, Opt,
3624                                  CurrentArg, P, /*InOptional=*/true);
3625       Result.AddOptionalChunk(Opt.TakeString());
3626       return;
3627     }
3628 
3629     if (FirstParameter)
3630       FirstParameter = false;
3631     else
3632       Result.AddChunk(CodeCompletionString::CK_Comma);
3633 
3634     InOptional = false;
3635 
3636     // Format the placeholder string.
3637     std::string Placeholder;
3638     if (Function) {
3639       const ParmVarDecl *Param = Function->getParamDecl(P);
3640       Placeholder = FormatFunctionParameter(Policy, Param);
3641       if (Param->hasDefaultArg())
3642         Placeholder += GetDefaultValueString(Param, Context.getSourceManager(),
3643                                              Context.getLangOpts());
3644     } else {
3645       Placeholder = Prototype->getParamType(P).getAsString(Policy);
3646     }
3647 
3648     if (P == CurrentArg)
3649       Result.AddCurrentParameterChunk(
3650           Result.getAllocator().CopyString(Placeholder));
3651     else
3652       Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Placeholder));
3653   }
3654 
3655   if (Prototype && Prototype->isVariadic()) {
3656     CodeCompletionBuilder Opt(Result.getAllocator(),
3657                               Result.getCodeCompletionTUInfo());
3658     if (!FirstParameter)
3659       Opt.AddChunk(CodeCompletionString::CK_Comma);
3660 
3661     if (CurrentArg < NumParams)
3662       Opt.AddPlaceholderChunk("...");
3663     else
3664       Opt.AddCurrentParameterChunk("...");
3665 
3666     Result.AddOptionalChunk(Opt.TakeString());
3667   }
3668 }
3669 
3670 CodeCompletionString *
3671 CodeCompleteConsumer::OverloadCandidate::CreateSignatureString(
3672     unsigned CurrentArg, Sema &S, CodeCompletionAllocator &Allocator,
3673     CodeCompletionTUInfo &CCTUInfo, bool IncludeBriefComments) const {
3674   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
3675   // Show signatures of constructors as they are declared:
3676   //   vector(int n) rather than vector<string>(int n)
3677   // This is less noisy without being less clear, and avoids tricky cases.
3678   Policy.SuppressTemplateArgsInCXXConstructors = true;
3679 
3680   // FIXME: Set priority, availability appropriately.
3681   CodeCompletionBuilder Result(Allocator, CCTUInfo, 1,
3682                                CXAvailability_Available);
3683   FunctionDecl *FDecl = getFunction();
3684   const FunctionProtoType *Proto =
3685       dyn_cast<FunctionProtoType>(getFunctionType());
3686   if (!FDecl && !Proto) {
3687     // Function without a prototype. Just give the return type and a
3688     // highlighted ellipsis.
3689     const FunctionType *FT = getFunctionType();
3690     Result.AddResultTypeChunk(Result.getAllocator().CopyString(
3691         FT->getReturnType().getAsString(Policy)));
3692     Result.AddChunk(CodeCompletionString::CK_LeftParen);
3693     Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "...");
3694     Result.AddChunk(CodeCompletionString::CK_RightParen);
3695     return Result.TakeString();
3696   }
3697 
3698   if (FDecl) {
3699     if (IncludeBriefComments) {
3700       if (auto RC = getParameterComment(S.getASTContext(), *this, CurrentArg))
3701         Result.addBriefComment(RC->getBriefText(S.getASTContext()));
3702     }
3703     AddResultTypeChunk(S.Context, Policy, FDecl, QualType(), Result);
3704     Result.AddTextChunk(
3705         Result.getAllocator().CopyString(FDecl->getNameAsString()));
3706   } else {
3707     Result.AddResultTypeChunk(Result.getAllocator().CopyString(
3708         Proto->getReturnType().getAsString(Policy)));
3709   }
3710 
3711   Result.AddChunk(CodeCompletionString::CK_LeftParen);
3712   AddOverloadParameterChunks(S.getASTContext(), Policy, FDecl, Proto, Result,
3713                              CurrentArg);
3714   Result.AddChunk(CodeCompletionString::CK_RightParen);
3715 
3716   return Result.TakeString();
3717 }
3718 
3719 unsigned clang::getMacroUsagePriority(StringRef MacroName,
3720                                       const LangOptions &LangOpts,
3721                                       bool PreferredTypeIsPointer) {
3722   unsigned Priority = CCP_Macro;
3723 
3724   // Treat the "nil", "Nil" and "NULL" macros as null pointer constants.
3725   if (MacroName.equals("nil") || MacroName.equals("NULL") ||
3726       MacroName.equals("Nil")) {
3727     Priority = CCP_Constant;
3728     if (PreferredTypeIsPointer)
3729       Priority = Priority / CCF_SimilarTypeMatch;
3730   }
3731   // Treat "YES", "NO", "true", and "false" as constants.
3732   else if (MacroName.equals("YES") || MacroName.equals("NO") ||
3733            MacroName.equals("true") || MacroName.equals("false"))
3734     Priority = CCP_Constant;
3735   // Treat "bool" as a type.
3736   else if (MacroName.equals("bool"))
3737     Priority = CCP_Type + (LangOpts.ObjC ? CCD_bool_in_ObjC : 0);
3738 
3739   return Priority;
3740 }
3741 
3742 CXCursorKind clang::getCursorKindForDecl(const Decl *D) {
3743   if (!D)
3744     return CXCursor_UnexposedDecl;
3745 
3746   switch (D->getKind()) {
3747   case Decl::Enum:
3748     return CXCursor_EnumDecl;
3749   case Decl::EnumConstant:
3750     return CXCursor_EnumConstantDecl;
3751   case Decl::Field:
3752     return CXCursor_FieldDecl;
3753   case Decl::Function:
3754     return CXCursor_FunctionDecl;
3755   case Decl::ObjCCategory:
3756     return CXCursor_ObjCCategoryDecl;
3757   case Decl::ObjCCategoryImpl:
3758     return CXCursor_ObjCCategoryImplDecl;
3759   case Decl::ObjCImplementation:
3760     return CXCursor_ObjCImplementationDecl;
3761 
3762   case Decl::ObjCInterface:
3763     return CXCursor_ObjCInterfaceDecl;
3764   case Decl::ObjCIvar:
3765     return CXCursor_ObjCIvarDecl;
3766   case Decl::ObjCMethod:
3767     return cast<ObjCMethodDecl>(D)->isInstanceMethod()
3768                ? CXCursor_ObjCInstanceMethodDecl
3769                : CXCursor_ObjCClassMethodDecl;
3770   case Decl::CXXMethod:
3771     return CXCursor_CXXMethod;
3772   case Decl::CXXConstructor:
3773     return CXCursor_Constructor;
3774   case Decl::CXXDestructor:
3775     return CXCursor_Destructor;
3776   case Decl::CXXConversion:
3777     return CXCursor_ConversionFunction;
3778   case Decl::ObjCProperty:
3779     return CXCursor_ObjCPropertyDecl;
3780   case Decl::ObjCProtocol:
3781     return CXCursor_ObjCProtocolDecl;
3782   case Decl::ParmVar:
3783     return CXCursor_ParmDecl;
3784   case Decl::Typedef:
3785     return CXCursor_TypedefDecl;
3786   case Decl::TypeAlias:
3787     return CXCursor_TypeAliasDecl;
3788   case Decl::TypeAliasTemplate:
3789     return CXCursor_TypeAliasTemplateDecl;
3790   case Decl::Var:
3791     return CXCursor_VarDecl;
3792   case Decl::Namespace:
3793     return CXCursor_Namespace;
3794   case Decl::NamespaceAlias:
3795     return CXCursor_NamespaceAlias;
3796   case Decl::TemplateTypeParm:
3797     return CXCursor_TemplateTypeParameter;
3798   case Decl::NonTypeTemplateParm:
3799     return CXCursor_NonTypeTemplateParameter;
3800   case Decl::TemplateTemplateParm:
3801     return CXCursor_TemplateTemplateParameter;
3802   case Decl::FunctionTemplate:
3803     return CXCursor_FunctionTemplate;
3804   case Decl::ClassTemplate:
3805     return CXCursor_ClassTemplate;
3806   case Decl::AccessSpec:
3807     return CXCursor_CXXAccessSpecifier;
3808   case Decl::ClassTemplatePartialSpecialization:
3809     return CXCursor_ClassTemplatePartialSpecialization;
3810   case Decl::UsingDirective:
3811     return CXCursor_UsingDirective;
3812   case Decl::StaticAssert:
3813     return CXCursor_StaticAssert;
3814   case Decl::Friend:
3815     return CXCursor_FriendDecl;
3816   case Decl::TranslationUnit:
3817     return CXCursor_TranslationUnit;
3818 
3819   case Decl::Using:
3820   case Decl::UnresolvedUsingValue:
3821   case Decl::UnresolvedUsingTypename:
3822     return CXCursor_UsingDeclaration;
3823 
3824   case Decl::ObjCPropertyImpl:
3825     switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) {
3826     case ObjCPropertyImplDecl::Dynamic:
3827       return CXCursor_ObjCDynamicDecl;
3828 
3829     case ObjCPropertyImplDecl::Synthesize:
3830       return CXCursor_ObjCSynthesizeDecl;
3831     }
3832     llvm_unreachable("Unexpected Kind!");
3833 
3834   case Decl::Import:
3835     return CXCursor_ModuleImportDecl;
3836 
3837   case Decl::ObjCTypeParam:
3838     return CXCursor_TemplateTypeParameter;
3839 
3840   default:
3841     if (const auto *TD = dyn_cast<TagDecl>(D)) {
3842       switch (TD->getTagKind()) {
3843       case TTK_Interface: // fall through
3844       case TTK_Struct:
3845         return CXCursor_StructDecl;
3846       case TTK_Class:
3847         return CXCursor_ClassDecl;
3848       case TTK_Union:
3849         return CXCursor_UnionDecl;
3850       case TTK_Enum:
3851         return CXCursor_EnumDecl;
3852       }
3853     }
3854   }
3855 
3856   return CXCursor_UnexposedDecl;
3857 }
3858 
3859 static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results,
3860                             bool LoadExternal, bool IncludeUndefined,
3861                             bool TargetTypeIsPointer = false) {
3862   typedef CodeCompletionResult Result;
3863 
3864   Results.EnterNewScope();
3865 
3866   for (Preprocessor::macro_iterator M = PP.macro_begin(LoadExternal),
3867                                     MEnd = PP.macro_end(LoadExternal);
3868        M != MEnd; ++M) {
3869     auto MD = PP.getMacroDefinition(M->first);
3870     if (IncludeUndefined || MD) {
3871       MacroInfo *MI = MD.getMacroInfo();
3872       if (MI && MI->isUsedForHeaderGuard())
3873         continue;
3874 
3875       Results.AddResult(
3876           Result(M->first, MI,
3877                  getMacroUsagePriority(M->first->getName(), PP.getLangOpts(),
3878                                        TargetTypeIsPointer)));
3879     }
3880   }
3881 
3882   Results.ExitScope();
3883 }
3884 
3885 static void AddPrettyFunctionResults(const LangOptions &LangOpts,
3886                                      ResultBuilder &Results) {
3887   typedef CodeCompletionResult Result;
3888 
3889   Results.EnterNewScope();
3890 
3891   Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant));
3892   Results.AddResult(Result("__FUNCTION__", CCP_Constant));
3893   if (LangOpts.C99 || LangOpts.CPlusPlus11)
3894     Results.AddResult(Result("__func__", CCP_Constant));
3895   Results.ExitScope();
3896 }
3897 
3898 static void HandleCodeCompleteResults(Sema *S,
3899                                       CodeCompleteConsumer *CodeCompleter,
3900                                       CodeCompletionContext Context,
3901                                       CodeCompletionResult *Results,
3902                                       unsigned NumResults) {
3903   if (CodeCompleter)
3904     CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults);
3905 }
3906 
3907 static CodeCompletionContext
3908 mapCodeCompletionContext(Sema &S, Sema::ParserCompletionContext PCC) {
3909   switch (PCC) {
3910   case Sema::PCC_Namespace:
3911     return CodeCompletionContext::CCC_TopLevel;
3912 
3913   case Sema::PCC_Class:
3914     return CodeCompletionContext::CCC_ClassStructUnion;
3915 
3916   case Sema::PCC_ObjCInterface:
3917     return CodeCompletionContext::CCC_ObjCInterface;
3918 
3919   case Sema::PCC_ObjCImplementation:
3920     return CodeCompletionContext::CCC_ObjCImplementation;
3921 
3922   case Sema::PCC_ObjCInstanceVariableList:
3923     return CodeCompletionContext::CCC_ObjCIvarList;
3924 
3925   case Sema::PCC_Template:
3926   case Sema::PCC_MemberTemplate:
3927     if (S.CurContext->isFileContext())
3928       return CodeCompletionContext::CCC_TopLevel;
3929     if (S.CurContext->isRecord())
3930       return CodeCompletionContext::CCC_ClassStructUnion;
3931     return CodeCompletionContext::CCC_Other;
3932 
3933   case Sema::PCC_RecoveryInFunction:
3934     return CodeCompletionContext::CCC_Recovery;
3935 
3936   case Sema::PCC_ForInit:
3937     if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 ||
3938         S.getLangOpts().ObjC)
3939       return CodeCompletionContext::CCC_ParenthesizedExpression;
3940     else
3941       return CodeCompletionContext::CCC_Expression;
3942 
3943   case Sema::PCC_Expression:
3944     return CodeCompletionContext::CCC_Expression;
3945   case Sema::PCC_Condition:
3946     return CodeCompletionContext(CodeCompletionContext::CCC_Expression,
3947                                  S.getASTContext().BoolTy);
3948 
3949   case Sema::PCC_Statement:
3950     return CodeCompletionContext::CCC_Statement;
3951 
3952   case Sema::PCC_Type:
3953     return CodeCompletionContext::CCC_Type;
3954 
3955   case Sema::PCC_ParenthesizedExpression:
3956     return CodeCompletionContext::CCC_ParenthesizedExpression;
3957 
3958   case Sema::PCC_LocalDeclarationSpecifiers:
3959     return CodeCompletionContext::CCC_Type;
3960   }
3961 
3962   llvm_unreachable("Invalid ParserCompletionContext!");
3963 }
3964 
3965 /// If we're in a C++ virtual member function, add completion results
3966 /// that invoke the functions we override, since it's common to invoke the
3967 /// overridden function as well as adding new functionality.
3968 ///
3969 /// \param S The semantic analysis object for which we are generating results.
3970 ///
3971 /// \param InContext This context in which the nested-name-specifier preceding
3972 /// the code-completion point
3973 static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext,
3974                                   ResultBuilder &Results) {
3975   // Look through blocks.
3976   DeclContext *CurContext = S.CurContext;
3977   while (isa<BlockDecl>(CurContext))
3978     CurContext = CurContext->getParent();
3979 
3980   CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext);
3981   if (!Method || !Method->isVirtual())
3982     return;
3983 
3984   // We need to have names for all of the parameters, if we're going to
3985   // generate a forwarding call.
3986   for (auto P : Method->parameters())
3987     if (!P->getDeclName())
3988       return;
3989 
3990   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
3991   for (const CXXMethodDecl *Overridden : Method->overridden_methods()) {
3992     CodeCompletionBuilder Builder(Results.getAllocator(),
3993                                   Results.getCodeCompletionTUInfo());
3994     if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl())
3995       continue;
3996 
3997     // If we need a nested-name-specifier, add one now.
3998     if (!InContext) {
3999       NestedNameSpecifier *NNS = getRequiredQualification(
4000           S.Context, CurContext, Overridden->getDeclContext());
4001       if (NNS) {
4002         std::string Str;
4003         llvm::raw_string_ostream OS(Str);
4004         NNS->print(OS, Policy);
4005         Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str()));
4006       }
4007     } else if (!InContext->Equals(Overridden->getDeclContext()))
4008       continue;
4009 
4010     Builder.AddTypedTextChunk(
4011         Results.getAllocator().CopyString(Overridden->getNameAsString()));
4012     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4013     bool FirstParam = true;
4014     for (auto P : Method->parameters()) {
4015       if (FirstParam)
4016         FirstParam = false;
4017       else
4018         Builder.AddChunk(CodeCompletionString::CK_Comma);
4019 
4020       Builder.AddPlaceholderChunk(
4021           Results.getAllocator().CopyString(P->getIdentifier()->getName()));
4022     }
4023     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4024     Results.AddResult(CodeCompletionResult(
4025         Builder.TakeString(), CCP_SuperCompletion, CXCursor_CXXMethod,
4026         CXAvailability_Available, Overridden));
4027     Results.Ignore(Overridden);
4028   }
4029 }
4030 
4031 void Sema::CodeCompleteModuleImport(SourceLocation ImportLoc,
4032                                     ModuleIdPath Path) {
4033   typedef CodeCompletionResult Result;
4034   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4035                         CodeCompleter->getCodeCompletionTUInfo(),
4036                         CodeCompletionContext::CCC_Other);
4037   Results.EnterNewScope();
4038 
4039   CodeCompletionAllocator &Allocator = Results.getAllocator();
4040   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
4041   typedef CodeCompletionResult Result;
4042   if (Path.empty()) {
4043     // Enumerate all top-level modules.
4044     SmallVector<Module *, 8> Modules;
4045     PP.getHeaderSearchInfo().collectAllModules(Modules);
4046     for (unsigned I = 0, N = Modules.size(); I != N; ++I) {
4047       Builder.AddTypedTextChunk(
4048           Builder.getAllocator().CopyString(Modules[I]->Name));
4049       Results.AddResult(Result(
4050           Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl,
4051           Modules[I]->isAvailable() ? CXAvailability_Available
4052                                     : CXAvailability_NotAvailable));
4053     }
4054   } else if (getLangOpts().Modules) {
4055     // Load the named module.
4056     Module *Mod =
4057         PP.getModuleLoader().loadModule(ImportLoc, Path, Module::AllVisible,
4058                                         /*IsInclusionDirective=*/false);
4059     // Enumerate submodules.
4060     if (Mod) {
4061       for (Module::submodule_iterator Sub = Mod->submodule_begin(),
4062                                       SubEnd = Mod->submodule_end();
4063            Sub != SubEnd; ++Sub) {
4064 
4065         Builder.AddTypedTextChunk(
4066             Builder.getAllocator().CopyString((*Sub)->Name));
4067         Results.AddResult(Result(
4068             Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl,
4069             (*Sub)->isAvailable() ? CXAvailability_Available
4070                                   : CXAvailability_NotAvailable));
4071       }
4072     }
4073   }
4074   Results.ExitScope();
4075   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4076                             Results.data(), Results.size());
4077 }
4078 
4079 void Sema::CodeCompleteOrdinaryName(Scope *S,
4080                                     ParserCompletionContext CompletionContext) {
4081   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4082                         CodeCompleter->getCodeCompletionTUInfo(),
4083                         mapCodeCompletionContext(*this, CompletionContext));
4084   Results.EnterNewScope();
4085 
4086   // Determine how to filter results, e.g., so that the names of
4087   // values (functions, enumerators, function templates, etc.) are
4088   // only allowed where we can have an expression.
4089   switch (CompletionContext) {
4090   case PCC_Namespace:
4091   case PCC_Class:
4092   case PCC_ObjCInterface:
4093   case PCC_ObjCImplementation:
4094   case PCC_ObjCInstanceVariableList:
4095   case PCC_Template:
4096   case PCC_MemberTemplate:
4097   case PCC_Type:
4098   case PCC_LocalDeclarationSpecifiers:
4099     Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
4100     break;
4101 
4102   case PCC_Statement:
4103   case PCC_ParenthesizedExpression:
4104   case PCC_Expression:
4105   case PCC_ForInit:
4106   case PCC_Condition:
4107     if (WantTypesInContext(CompletionContext, getLangOpts()))
4108       Results.setFilter(&ResultBuilder::IsOrdinaryName);
4109     else
4110       Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
4111 
4112     if (getLangOpts().CPlusPlus)
4113       MaybeAddOverrideCalls(*this, /*InContext=*/nullptr, Results);
4114     break;
4115 
4116   case PCC_RecoveryInFunction:
4117     // Unfiltered
4118     break;
4119   }
4120 
4121   // If we are in a C++ non-static member function, check the qualifiers on
4122   // the member function to filter/prioritize the results list.
4123   auto ThisType = getCurrentThisType();
4124   if (!ThisType.isNull())
4125     Results.setObjectTypeQualifiers(ThisType->getPointeeType().getQualifiers(),
4126                                     VK_LValue);
4127 
4128   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4129   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4130                      CodeCompleter->includeGlobals(),
4131                      CodeCompleter->loadExternal());
4132 
4133   AddOrdinaryNameResults(CompletionContext, S, *this, Results);
4134   Results.ExitScope();
4135 
4136   switch (CompletionContext) {
4137   case PCC_ParenthesizedExpression:
4138   case PCC_Expression:
4139   case PCC_Statement:
4140   case PCC_RecoveryInFunction:
4141     if (S->getFnParent())
4142       AddPrettyFunctionResults(getLangOpts(), Results);
4143     break;
4144 
4145   case PCC_Namespace:
4146   case PCC_Class:
4147   case PCC_ObjCInterface:
4148   case PCC_ObjCImplementation:
4149   case PCC_ObjCInstanceVariableList:
4150   case PCC_Template:
4151   case PCC_MemberTemplate:
4152   case PCC_ForInit:
4153   case PCC_Condition:
4154   case PCC_Type:
4155   case PCC_LocalDeclarationSpecifiers:
4156     break;
4157   }
4158 
4159   if (CodeCompleter->includeMacros())
4160     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
4161 
4162   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4163                             Results.data(), Results.size());
4164 }
4165 
4166 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
4167                                        ParsedType Receiver,
4168                                        ArrayRef<IdentifierInfo *> SelIdents,
4169                                        bool AtArgumentExpression, bool IsSuper,
4170                                        ResultBuilder &Results);
4171 
4172 void Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS,
4173                                 bool AllowNonIdentifiers,
4174                                 bool AllowNestedNameSpecifiers) {
4175   typedef CodeCompletionResult Result;
4176   ResultBuilder Results(
4177       *this, CodeCompleter->getAllocator(),
4178       CodeCompleter->getCodeCompletionTUInfo(),
4179       AllowNestedNameSpecifiers
4180           // FIXME: Try to separate codepath leading here to deduce whether we
4181           // need an existing symbol or a new one.
4182           ? CodeCompletionContext::CCC_SymbolOrNewName
4183           : CodeCompletionContext::CCC_NewName);
4184   Results.EnterNewScope();
4185 
4186   // Type qualifiers can come after names.
4187   Results.AddResult(Result("const"));
4188   Results.AddResult(Result("volatile"));
4189   if (getLangOpts().C99)
4190     Results.AddResult(Result("restrict"));
4191 
4192   if (getLangOpts().CPlusPlus) {
4193     if (getLangOpts().CPlusPlus11 &&
4194         (DS.getTypeSpecType() == DeclSpec::TST_class ||
4195          DS.getTypeSpecType() == DeclSpec::TST_struct))
4196       Results.AddResult("final");
4197 
4198     if (AllowNonIdentifiers) {
4199       Results.AddResult(Result("operator"));
4200     }
4201 
4202     // Add nested-name-specifiers.
4203     if (AllowNestedNameSpecifiers) {
4204       Results.allowNestedNameSpecifiers();
4205       Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy);
4206       CodeCompletionDeclConsumer Consumer(Results, CurContext);
4207       LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer,
4208                          CodeCompleter->includeGlobals(),
4209                          CodeCompleter->loadExternal());
4210       Results.setFilter(nullptr);
4211     }
4212   }
4213   Results.ExitScope();
4214 
4215   // If we're in a context where we might have an expression (rather than a
4216   // declaration), and what we've seen so far is an Objective-C type that could
4217   // be a receiver of a class message, this may be a class message send with
4218   // the initial opening bracket '[' missing. Add appropriate completions.
4219   if (AllowNonIdentifiers && !AllowNestedNameSpecifiers &&
4220       DS.getParsedSpecifiers() == DeclSpec::PQ_TypeSpecifier &&
4221       DS.getTypeSpecType() == DeclSpec::TST_typename &&
4222       DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified &&
4223       DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
4224       !DS.isTypeAltiVecVector() && S &&
4225       (S->getFlags() & Scope::DeclScope) != 0 &&
4226       (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope |
4227                         Scope::FunctionPrototypeScope | Scope::AtCatchScope)) ==
4228           0) {
4229     ParsedType T = DS.getRepAsType();
4230     if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType())
4231       AddClassMessageCompletions(*this, S, T, None, false, false, Results);
4232   }
4233 
4234   // Note that we intentionally suppress macro results here, since we do not
4235   // encourage using macros to produce the names of entities.
4236 
4237   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4238                             Results.data(), Results.size());
4239 }
4240 
4241 struct Sema::CodeCompleteExpressionData {
4242   CodeCompleteExpressionData(QualType PreferredType = QualType(),
4243                              bool IsParenthesized = false)
4244       : PreferredType(PreferredType), IntegralConstantExpression(false),
4245         ObjCCollection(false), IsParenthesized(IsParenthesized) {}
4246 
4247   QualType PreferredType;
4248   bool IntegralConstantExpression;
4249   bool ObjCCollection;
4250   bool IsParenthesized;
4251   SmallVector<Decl *, 4> IgnoreDecls;
4252 };
4253 
4254 namespace {
4255 /// Information that allows to avoid completing redundant enumerators.
4256 struct CoveredEnumerators {
4257   llvm::SmallPtrSet<EnumConstantDecl *, 8> Seen;
4258   NestedNameSpecifier *SuggestedQualifier = nullptr;
4259 };
4260 } // namespace
4261 
4262 static void AddEnumerators(ResultBuilder &Results, ASTContext &Context,
4263                            EnumDecl *Enum, DeclContext *CurContext,
4264                            const CoveredEnumerators &Enumerators) {
4265   NestedNameSpecifier *Qualifier = Enumerators.SuggestedQualifier;
4266   if (Context.getLangOpts().CPlusPlus && !Qualifier && Enumerators.Seen.empty()) {
4267     // If there are no prior enumerators in C++, check whether we have to
4268     // qualify the names of the enumerators that we suggest, because they
4269     // may not be visible in this scope.
4270     Qualifier = getRequiredQualification(Context, CurContext, Enum);
4271   }
4272 
4273   Results.EnterNewScope();
4274   for (auto *E : Enum->enumerators()) {
4275     if (Enumerators.Seen.count(E))
4276       continue;
4277 
4278     CodeCompletionResult R(E, CCP_EnumInCase, Qualifier);
4279     Results.AddResult(R, CurContext, nullptr, false);
4280   }
4281   Results.ExitScope();
4282 }
4283 
4284 /// Try to find a corresponding FunctionProtoType for function-like types (e.g.
4285 /// function pointers, std::function, etc).
4286 static const FunctionProtoType *TryDeconstructFunctionLike(QualType T) {
4287   assert(!T.isNull());
4288   // Try to extract first template argument from std::function<> and similar.
4289   // Note we only handle the sugared types, they closely match what users wrote.
4290   // We explicitly choose to not handle ClassTemplateSpecializationDecl.
4291   if (auto *Specialization = T->getAs<TemplateSpecializationType>()) {
4292     if (Specialization->getNumArgs() != 1)
4293       return nullptr;
4294     const TemplateArgument &Argument = Specialization->getArg(0);
4295     if (Argument.getKind() != TemplateArgument::Type)
4296       return nullptr;
4297     return Argument.getAsType()->getAs<FunctionProtoType>();
4298   }
4299   // Handle other cases.
4300   if (T->isPointerType())
4301     T = T->getPointeeType();
4302   return T->getAs<FunctionProtoType>();
4303 }
4304 
4305 /// Adds a pattern completion for a lambda expression with the specified
4306 /// parameter types and placeholders for parameter names.
4307 static void AddLambdaCompletion(ResultBuilder &Results,
4308                                 llvm::ArrayRef<QualType> Parameters,
4309                                 const LangOptions &LangOpts) {
4310   if (!Results.includeCodePatterns())
4311     return;
4312   CodeCompletionBuilder Completion(Results.getAllocator(),
4313                                    Results.getCodeCompletionTUInfo());
4314   // [](<parameters>) {}
4315   Completion.AddChunk(CodeCompletionString::CK_LeftBracket);
4316   Completion.AddPlaceholderChunk("=");
4317   Completion.AddChunk(CodeCompletionString::CK_RightBracket);
4318   if (!Parameters.empty()) {
4319     Completion.AddChunk(CodeCompletionString::CK_LeftParen);
4320     bool First = true;
4321     for (auto Parameter : Parameters) {
4322       if (!First)
4323         Completion.AddChunk(CodeCompletionString::ChunkKind::CK_Comma);
4324       else
4325         First = false;
4326 
4327       constexpr llvm::StringLiteral NamePlaceholder = "!#!NAME_GOES_HERE!#!";
4328       std::string Type = NamePlaceholder;
4329       Parameter.getAsStringInternal(Type, PrintingPolicy(LangOpts));
4330       llvm::StringRef Prefix, Suffix;
4331       std::tie(Prefix, Suffix) = llvm::StringRef(Type).split(NamePlaceholder);
4332       Prefix = Prefix.rtrim();
4333       Suffix = Suffix.ltrim();
4334 
4335       Completion.AddTextChunk(Completion.getAllocator().CopyString(Prefix));
4336       Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4337       Completion.AddPlaceholderChunk("parameter");
4338       Completion.AddTextChunk(Completion.getAllocator().CopyString(Suffix));
4339     };
4340     Completion.AddChunk(CodeCompletionString::CK_RightParen);
4341   }
4342   Completion.AddChunk(clang::CodeCompletionString::CK_HorizontalSpace);
4343   Completion.AddChunk(CodeCompletionString::CK_LeftBrace);
4344   Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4345   Completion.AddPlaceholderChunk("body");
4346   Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4347   Completion.AddChunk(CodeCompletionString::CK_RightBrace);
4348 
4349   Results.AddResult(Completion.TakeString());
4350 }
4351 
4352 /// Perform code-completion in an expression context when we know what
4353 /// type we're looking for.
4354 void Sema::CodeCompleteExpression(Scope *S,
4355                                   const CodeCompleteExpressionData &Data) {
4356   ResultBuilder Results(
4357       *this, CodeCompleter->getAllocator(),
4358       CodeCompleter->getCodeCompletionTUInfo(),
4359       CodeCompletionContext(
4360           Data.IsParenthesized
4361               ? CodeCompletionContext::CCC_ParenthesizedExpression
4362               : CodeCompletionContext::CCC_Expression,
4363           Data.PreferredType));
4364   auto PCC =
4365       Data.IsParenthesized ? PCC_ParenthesizedExpression : PCC_Expression;
4366   if (Data.ObjCCollection)
4367     Results.setFilter(&ResultBuilder::IsObjCCollection);
4368   else if (Data.IntegralConstantExpression)
4369     Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
4370   else if (WantTypesInContext(PCC, getLangOpts()))
4371     Results.setFilter(&ResultBuilder::IsOrdinaryName);
4372   else
4373     Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
4374 
4375   if (!Data.PreferredType.isNull())
4376     Results.setPreferredType(Data.PreferredType.getNonReferenceType());
4377 
4378   // Ignore any declarations that we were told that we don't care about.
4379   for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I)
4380     Results.Ignore(Data.IgnoreDecls[I]);
4381 
4382   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4383   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4384                      CodeCompleter->includeGlobals(),
4385                      CodeCompleter->loadExternal());
4386 
4387   Results.EnterNewScope();
4388   AddOrdinaryNameResults(PCC, S, *this, Results);
4389   Results.ExitScope();
4390 
4391   bool PreferredTypeIsPointer = false;
4392   if (!Data.PreferredType.isNull()) {
4393     PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() ||
4394                              Data.PreferredType->isMemberPointerType() ||
4395                              Data.PreferredType->isBlockPointerType();
4396     if (Data.PreferredType->isEnumeralType()) {
4397       EnumDecl *Enum = Data.PreferredType->castAs<EnumType>()->getDecl();
4398       if (auto *Def = Enum->getDefinition())
4399         Enum = Def;
4400       // FIXME: collect covered enumerators in cases like:
4401       //        if (x == my_enum::one) { ... } else if (x == ^) {}
4402       AddEnumerators(Results, Context, Enum, CurContext, CoveredEnumerators());
4403     }
4404   }
4405 
4406   if (S->getFnParent() && !Data.ObjCCollection &&
4407       !Data.IntegralConstantExpression)
4408     AddPrettyFunctionResults(getLangOpts(), Results);
4409 
4410   if (CodeCompleter->includeMacros())
4411     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false,
4412                     PreferredTypeIsPointer);
4413 
4414   // Complete a lambda expression when preferred type is a function.
4415   if (!Data.PreferredType.isNull() && getLangOpts().CPlusPlus11) {
4416     if (const FunctionProtoType *F =
4417             TryDeconstructFunctionLike(Data.PreferredType))
4418       AddLambdaCompletion(Results, F->getParamTypes(), getLangOpts());
4419   }
4420 
4421   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4422                             Results.data(), Results.size());
4423 }
4424 
4425 void Sema::CodeCompleteExpression(Scope *S, QualType PreferredType,
4426                                   bool IsParenthesized) {
4427   return CodeCompleteExpression(
4428       S, CodeCompleteExpressionData(PreferredType, IsParenthesized));
4429 }
4430 
4431 void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E,
4432                                          QualType PreferredType) {
4433   if (E.isInvalid())
4434     CodeCompleteExpression(S, PreferredType);
4435   else if (getLangOpts().ObjC)
4436     CodeCompleteObjCInstanceMessage(S, E.get(), None, false);
4437 }
4438 
4439 /// The set of properties that have already been added, referenced by
4440 /// property name.
4441 typedef llvm::SmallPtrSet<IdentifierInfo *, 16> AddedPropertiesSet;
4442 
4443 /// Retrieve the container definition, if any?
4444 static ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) {
4445   if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) {
4446     if (Interface->hasDefinition())
4447       return Interface->getDefinition();
4448 
4449     return Interface;
4450   }
4451 
4452   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
4453     if (Protocol->hasDefinition())
4454       return Protocol->getDefinition();
4455 
4456     return Protocol;
4457   }
4458   return Container;
4459 }
4460 
4461 /// Adds a block invocation code completion result for the given block
4462 /// declaration \p BD.
4463 static void AddObjCBlockCall(ASTContext &Context, const PrintingPolicy &Policy,
4464                              CodeCompletionBuilder &Builder,
4465                              const NamedDecl *BD,
4466                              const FunctionTypeLoc &BlockLoc,
4467                              const FunctionProtoTypeLoc &BlockProtoLoc) {
4468   Builder.AddResultTypeChunk(
4469       GetCompletionTypeString(BlockLoc.getReturnLoc().getType(), Context,
4470                               Policy, Builder.getAllocator()));
4471 
4472   AddTypedNameChunk(Context, Policy, BD, Builder);
4473   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4474 
4475   if (BlockProtoLoc && BlockProtoLoc.getTypePtr()->isVariadic()) {
4476     Builder.AddPlaceholderChunk("...");
4477   } else {
4478     for (unsigned I = 0, N = BlockLoc.getNumParams(); I != N; ++I) {
4479       if (I)
4480         Builder.AddChunk(CodeCompletionString::CK_Comma);
4481 
4482       // Format the placeholder string.
4483       std::string PlaceholderStr =
4484           FormatFunctionParameter(Policy, BlockLoc.getParam(I));
4485 
4486       if (I == N - 1 && BlockProtoLoc &&
4487           BlockProtoLoc.getTypePtr()->isVariadic())
4488         PlaceholderStr += ", ...";
4489 
4490       // Add the placeholder string.
4491       Builder.AddPlaceholderChunk(
4492           Builder.getAllocator().CopyString(PlaceholderStr));
4493     }
4494   }
4495 
4496   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4497 }
4498 
4499 static void
4500 AddObjCProperties(const CodeCompletionContext &CCContext,
4501                   ObjCContainerDecl *Container, bool AllowCategories,
4502                   bool AllowNullaryMethods, DeclContext *CurContext,
4503                   AddedPropertiesSet &AddedProperties, ResultBuilder &Results,
4504                   bool IsBaseExprStatement = false,
4505                   bool IsClassProperty = false, bool InOriginalClass = true) {
4506   typedef CodeCompletionResult Result;
4507 
4508   // Retrieve the definition.
4509   Container = getContainerDef(Container);
4510 
4511   // Add properties in this container.
4512   const auto AddProperty = [&](const ObjCPropertyDecl *P) {
4513     if (!AddedProperties.insert(P->getIdentifier()).second)
4514       return;
4515 
4516     // FIXME: Provide block invocation completion for non-statement
4517     // expressions.
4518     if (!P->getType().getTypePtr()->isBlockPointerType() ||
4519         !IsBaseExprStatement) {
4520       Result R = Result(P, Results.getBasePriority(P), nullptr);
4521       if (!InOriginalClass)
4522         setInBaseClass(R);
4523       Results.MaybeAddResult(R, CurContext);
4524       return;
4525     }
4526 
4527     // Block setter and invocation completion is provided only when we are able
4528     // to find the FunctionProtoTypeLoc with parameter names for the block.
4529     FunctionTypeLoc BlockLoc;
4530     FunctionProtoTypeLoc BlockProtoLoc;
4531     findTypeLocationForBlockDecl(P->getTypeSourceInfo(), BlockLoc,
4532                                  BlockProtoLoc);
4533     if (!BlockLoc) {
4534       Result R = Result(P, Results.getBasePriority(P), nullptr);
4535       if (!InOriginalClass)
4536         setInBaseClass(R);
4537       Results.MaybeAddResult(R, CurContext);
4538       return;
4539     }
4540 
4541     // The default completion result for block properties should be the block
4542     // invocation completion when the base expression is a statement.
4543     CodeCompletionBuilder Builder(Results.getAllocator(),
4544                                   Results.getCodeCompletionTUInfo());
4545     AddObjCBlockCall(Container->getASTContext(),
4546                      getCompletionPrintingPolicy(Results.getSema()), Builder, P,
4547                      BlockLoc, BlockProtoLoc);
4548     Result R = Result(Builder.TakeString(), P, Results.getBasePriority(P));
4549     if (!InOriginalClass)
4550       setInBaseClass(R);
4551     Results.MaybeAddResult(R, CurContext);
4552 
4553     // Provide additional block setter completion iff the base expression is a
4554     // statement and the block property is mutable.
4555     if (!P->isReadOnly()) {
4556       CodeCompletionBuilder Builder(Results.getAllocator(),
4557                                     Results.getCodeCompletionTUInfo());
4558       AddResultTypeChunk(Container->getASTContext(),
4559                          getCompletionPrintingPolicy(Results.getSema()), P,
4560                          CCContext.getBaseType(), Builder);
4561       Builder.AddTypedTextChunk(
4562           Results.getAllocator().CopyString(P->getName()));
4563       Builder.AddChunk(CodeCompletionString::CK_Equal);
4564 
4565       std::string PlaceholderStr = formatBlockPlaceholder(
4566           getCompletionPrintingPolicy(Results.getSema()), P, BlockLoc,
4567           BlockProtoLoc, /*SuppressBlockName=*/true);
4568       // Add the placeholder string.
4569       Builder.AddPlaceholderChunk(
4570           Builder.getAllocator().CopyString(PlaceholderStr));
4571 
4572       // When completing blocks properties that return void the default
4573       // property completion result should show up before the setter,
4574       // otherwise the setter completion should show up before the default
4575       // property completion, as we normally want to use the result of the
4576       // call.
4577       Result R =
4578           Result(Builder.TakeString(), P,
4579                  Results.getBasePriority(P) +
4580                      (BlockLoc.getTypePtr()->getReturnType()->isVoidType()
4581                           ? CCD_BlockPropertySetter
4582                           : -CCD_BlockPropertySetter));
4583       if (!InOriginalClass)
4584         setInBaseClass(R);
4585       Results.MaybeAddResult(R, CurContext);
4586     }
4587   };
4588 
4589   if (IsClassProperty) {
4590     for (const auto *P : Container->class_properties())
4591       AddProperty(P);
4592   } else {
4593     for (const auto *P : Container->instance_properties())
4594       AddProperty(P);
4595   }
4596 
4597   // Add nullary methods or implicit class properties
4598   if (AllowNullaryMethods) {
4599     ASTContext &Context = Container->getASTContext();
4600     PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
4601     // Adds a method result
4602     const auto AddMethod = [&](const ObjCMethodDecl *M) {
4603       IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0);
4604       if (!Name)
4605         return;
4606       if (!AddedProperties.insert(Name).second)
4607         return;
4608       CodeCompletionBuilder Builder(Results.getAllocator(),
4609                                     Results.getCodeCompletionTUInfo());
4610       AddResultTypeChunk(Context, Policy, M, CCContext.getBaseType(), Builder);
4611       Builder.AddTypedTextChunk(
4612           Results.getAllocator().CopyString(Name->getName()));
4613       Result R = Result(Builder.TakeString(), M,
4614                         CCP_MemberDeclaration + CCD_MethodAsProperty);
4615       if (!InOriginalClass)
4616         setInBaseClass(R);
4617       Results.MaybeAddResult(R, CurContext);
4618     };
4619 
4620     if (IsClassProperty) {
4621       for (const auto *M : Container->methods()) {
4622         // Gather the class method that can be used as implicit property
4623         // getters. Methods with arguments or methods that return void aren't
4624         // added to the results as they can't be used as a getter.
4625         if (!M->getSelector().isUnarySelector() ||
4626             M->getReturnType()->isVoidType() || M->isInstanceMethod())
4627           continue;
4628         AddMethod(M);
4629       }
4630     } else {
4631       for (auto *M : Container->methods()) {
4632         if (M->getSelector().isUnarySelector())
4633           AddMethod(M);
4634       }
4635     }
4636   }
4637 
4638   // Add properties in referenced protocols.
4639   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
4640     for (auto *P : Protocol->protocols())
4641       AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods,
4642                         CurContext, AddedProperties, Results,
4643                         IsBaseExprStatement, IsClassProperty,
4644                         /*InOriginalClass*/ false);
4645   } else if (ObjCInterfaceDecl *IFace =
4646                  dyn_cast<ObjCInterfaceDecl>(Container)) {
4647     if (AllowCategories) {
4648       // Look through categories.
4649       for (auto *Cat : IFace->known_categories())
4650         AddObjCProperties(CCContext, Cat, AllowCategories, AllowNullaryMethods,
4651                           CurContext, AddedProperties, Results,
4652                           IsBaseExprStatement, IsClassProperty,
4653                           InOriginalClass);
4654     }
4655 
4656     // Look through protocols.
4657     for (auto *I : IFace->all_referenced_protocols())
4658       AddObjCProperties(CCContext, I, AllowCategories, AllowNullaryMethods,
4659                         CurContext, AddedProperties, Results,
4660                         IsBaseExprStatement, IsClassProperty,
4661                         /*InOriginalClass*/ false);
4662 
4663     // Look in the superclass.
4664     if (IFace->getSuperClass())
4665       AddObjCProperties(CCContext, IFace->getSuperClass(), AllowCategories,
4666                         AllowNullaryMethods, CurContext, AddedProperties,
4667                         Results, IsBaseExprStatement, IsClassProperty,
4668                         /*InOriginalClass*/ false);
4669   } else if (const auto *Category =
4670                  dyn_cast<ObjCCategoryDecl>(Container)) {
4671     // Look through protocols.
4672     for (auto *P : Category->protocols())
4673       AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods,
4674                         CurContext, AddedProperties, Results,
4675                         IsBaseExprStatement, IsClassProperty,
4676                         /*InOriginalClass*/ false);
4677   }
4678 }
4679 
4680 static void AddRecordMembersCompletionResults(
4681     Sema &SemaRef, ResultBuilder &Results, Scope *S, QualType BaseType,
4682     ExprValueKind BaseKind, RecordDecl *RD, Optional<FixItHint> AccessOpFixIt) {
4683   // Indicate that we are performing a member access, and the cv-qualifiers
4684   // for the base object type.
4685   Results.setObjectTypeQualifiers(BaseType.getQualifiers(), BaseKind);
4686 
4687   // Access to a C/C++ class, struct, or union.
4688   Results.allowNestedNameSpecifiers();
4689   std::vector<FixItHint> FixIts;
4690   if (AccessOpFixIt)
4691     FixIts.emplace_back(AccessOpFixIt.getValue());
4692   CodeCompletionDeclConsumer Consumer(Results, RD, BaseType, std::move(FixIts));
4693   SemaRef.LookupVisibleDecls(RD, Sema::LookupMemberName, Consumer,
4694                              SemaRef.CodeCompleter->includeGlobals(),
4695                              /*IncludeDependentBases=*/true,
4696                              SemaRef.CodeCompleter->loadExternal());
4697 
4698   if (SemaRef.getLangOpts().CPlusPlus) {
4699     if (!Results.empty()) {
4700       // The "template" keyword can follow "->" or "." in the grammar.
4701       // However, we only want to suggest the template keyword if something
4702       // is dependent.
4703       bool IsDependent = BaseType->isDependentType();
4704       if (!IsDependent) {
4705         for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent())
4706           if (DeclContext *Ctx = DepScope->getEntity()) {
4707             IsDependent = Ctx->isDependentContext();
4708             break;
4709           }
4710       }
4711 
4712       if (IsDependent)
4713         Results.AddResult(CodeCompletionResult("template"));
4714     }
4715   }
4716 }
4717 
4718 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base,
4719                                            Expr *OtherOpBase,
4720                                            SourceLocation OpLoc, bool IsArrow,
4721                                            bool IsBaseExprStatement,
4722                                            QualType PreferredType) {
4723   if (!Base || !CodeCompleter)
4724     return;
4725 
4726   ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow);
4727   if (ConvertedBase.isInvalid())
4728     return;
4729   QualType ConvertedBaseType = ConvertedBase.get()->getType();
4730 
4731   enum CodeCompletionContext::Kind contextKind;
4732 
4733   if (IsArrow) {
4734     if (const auto *Ptr = ConvertedBaseType->getAs<PointerType>())
4735       ConvertedBaseType = Ptr->getPointeeType();
4736   }
4737 
4738   if (IsArrow) {
4739     contextKind = CodeCompletionContext::CCC_ArrowMemberAccess;
4740   } else {
4741     if (ConvertedBaseType->isObjCObjectPointerType() ||
4742         ConvertedBaseType->isObjCObjectOrInterfaceType()) {
4743       contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess;
4744     } else {
4745       contextKind = CodeCompletionContext::CCC_DotMemberAccess;
4746     }
4747   }
4748 
4749   CodeCompletionContext CCContext(contextKind, ConvertedBaseType);
4750   CCContext.setPreferredType(PreferredType);
4751   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4752                         CodeCompleter->getCodeCompletionTUInfo(), CCContext,
4753                         &ResultBuilder::IsMember);
4754 
4755   auto DoCompletion = [&](Expr *Base, bool IsArrow,
4756                           Optional<FixItHint> AccessOpFixIt) -> bool {
4757     if (!Base)
4758       return false;
4759 
4760     ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow);
4761     if (ConvertedBase.isInvalid())
4762       return false;
4763     Base = ConvertedBase.get();
4764 
4765     QualType BaseType = Base->getType();
4766     ExprValueKind BaseKind = Base->getValueKind();
4767 
4768     if (IsArrow) {
4769       if (const PointerType *Ptr = BaseType->getAs<PointerType>()) {
4770         BaseType = Ptr->getPointeeType();
4771         BaseKind = VK_LValue;
4772       } else if (BaseType->isObjCObjectPointerType())
4773         /*Do nothing*/;
4774       else
4775         return false;
4776     }
4777 
4778     if (const RecordType *Record = BaseType->getAs<RecordType>()) {
4779       AddRecordMembersCompletionResults(*this, Results, S, BaseType, BaseKind,
4780                                         Record->getDecl(),
4781                                         std::move(AccessOpFixIt));
4782     } else if (const auto *TST =
4783                    BaseType->getAs<TemplateSpecializationType>()) {
4784       TemplateName TN = TST->getTemplateName();
4785       if (const auto *TD =
4786               dyn_cast_or_null<ClassTemplateDecl>(TN.getAsTemplateDecl())) {
4787         CXXRecordDecl *RD = TD->getTemplatedDecl();
4788         AddRecordMembersCompletionResults(*this, Results, S, BaseType, BaseKind,
4789                                           RD, std::move(AccessOpFixIt));
4790       }
4791     } else if (const auto *ICNT = BaseType->getAs<InjectedClassNameType>()) {
4792       if (auto *RD = ICNT->getDecl())
4793         AddRecordMembersCompletionResults(*this, Results, S, BaseType, BaseKind,
4794                                           RD, std::move(AccessOpFixIt));
4795     } else if (!IsArrow && BaseType->isObjCObjectPointerType()) {
4796       // Objective-C property reference.
4797       AddedPropertiesSet AddedProperties;
4798 
4799       if (const ObjCObjectPointerType *ObjCPtr =
4800               BaseType->getAsObjCInterfacePointerType()) {
4801         // Add property results based on our interface.
4802         assert(ObjCPtr && "Non-NULL pointer guaranteed above!");
4803         AddObjCProperties(CCContext, ObjCPtr->getInterfaceDecl(), true,
4804                           /*AllowNullaryMethods=*/true, CurContext,
4805                           AddedProperties, Results, IsBaseExprStatement);
4806       }
4807 
4808       // Add properties from the protocols in a qualified interface.
4809       for (auto *I : BaseType->castAs<ObjCObjectPointerType>()->quals())
4810         AddObjCProperties(CCContext, I, true, /*AllowNullaryMethods=*/true,
4811                           CurContext, AddedProperties, Results,
4812                           IsBaseExprStatement, /*IsClassProperty*/ false,
4813                           /*InOriginalClass*/ false);
4814     } else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
4815                (!IsArrow && BaseType->isObjCObjectType())) {
4816       // Objective-C instance variable access.
4817       ObjCInterfaceDecl *Class = nullptr;
4818       if (const ObjCObjectPointerType *ObjCPtr =
4819               BaseType->getAs<ObjCObjectPointerType>())
4820         Class = ObjCPtr->getInterfaceDecl();
4821       else
4822         Class = BaseType->castAs<ObjCObjectType>()->getInterface();
4823 
4824       // Add all ivars from this class and its superclasses.
4825       if (Class) {
4826         CodeCompletionDeclConsumer Consumer(Results, Class, BaseType);
4827         Results.setFilter(&ResultBuilder::IsObjCIvar);
4828         LookupVisibleDecls(
4829             Class, LookupMemberName, Consumer, CodeCompleter->includeGlobals(),
4830             /*IncludeDependentBases=*/false, CodeCompleter->loadExternal());
4831       }
4832     }
4833 
4834     // FIXME: How do we cope with isa?
4835     return true;
4836   };
4837 
4838   Results.EnterNewScope();
4839 
4840   bool CompletionSucceded = DoCompletion(Base, IsArrow, None);
4841   if (CodeCompleter->includeFixIts()) {
4842     const CharSourceRange OpRange =
4843         CharSourceRange::getTokenRange(OpLoc, OpLoc);
4844     CompletionSucceded |= DoCompletion(
4845         OtherOpBase, !IsArrow,
4846         FixItHint::CreateReplacement(OpRange, IsArrow ? "." : "->"));
4847   }
4848 
4849   Results.ExitScope();
4850 
4851   if (!CompletionSucceded)
4852     return;
4853 
4854   // Hand off the results found for code completion.
4855   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4856                             Results.data(), Results.size());
4857 }
4858 
4859 void Sema::CodeCompleteObjCClassPropertyRefExpr(Scope *S,
4860                                                 IdentifierInfo &ClassName,
4861                                                 SourceLocation ClassNameLoc,
4862                                                 bool IsBaseExprStatement) {
4863   IdentifierInfo *ClassNamePtr = &ClassName;
4864   ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(ClassNamePtr, ClassNameLoc);
4865   if (!IFace)
4866     return;
4867   CodeCompletionContext CCContext(
4868       CodeCompletionContext::CCC_ObjCPropertyAccess);
4869   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4870                         CodeCompleter->getCodeCompletionTUInfo(), CCContext,
4871                         &ResultBuilder::IsMember);
4872   Results.EnterNewScope();
4873   AddedPropertiesSet AddedProperties;
4874   AddObjCProperties(CCContext, IFace, true,
4875                     /*AllowNullaryMethods=*/true, CurContext, AddedProperties,
4876                     Results, IsBaseExprStatement,
4877                     /*IsClassProperty=*/true);
4878   Results.ExitScope();
4879   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4880                             Results.data(), Results.size());
4881 }
4882 
4883 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) {
4884   if (!CodeCompleter)
4885     return;
4886 
4887   ResultBuilder::LookupFilter Filter = nullptr;
4888   enum CodeCompletionContext::Kind ContextKind =
4889       CodeCompletionContext::CCC_Other;
4890   switch ((DeclSpec::TST)TagSpec) {
4891   case DeclSpec::TST_enum:
4892     Filter = &ResultBuilder::IsEnum;
4893     ContextKind = CodeCompletionContext::CCC_EnumTag;
4894     break;
4895 
4896   case DeclSpec::TST_union:
4897     Filter = &ResultBuilder::IsUnion;
4898     ContextKind = CodeCompletionContext::CCC_UnionTag;
4899     break;
4900 
4901   case DeclSpec::TST_struct:
4902   case DeclSpec::TST_class:
4903   case DeclSpec::TST_interface:
4904     Filter = &ResultBuilder::IsClassOrStruct;
4905     ContextKind = CodeCompletionContext::CCC_ClassOrStructTag;
4906     break;
4907 
4908   default:
4909     llvm_unreachable("Unknown type specifier kind in CodeCompleteTag");
4910   }
4911 
4912   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4913                         CodeCompleter->getCodeCompletionTUInfo(), ContextKind);
4914   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4915 
4916   // First pass: look for tags.
4917   Results.setFilter(Filter);
4918   LookupVisibleDecls(S, LookupTagName, Consumer,
4919                      CodeCompleter->includeGlobals(),
4920                      CodeCompleter->loadExternal());
4921 
4922   if (CodeCompleter->includeGlobals()) {
4923     // Second pass: look for nested name specifiers.
4924     Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
4925     LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer,
4926                        CodeCompleter->includeGlobals(),
4927                        CodeCompleter->loadExternal());
4928   }
4929 
4930   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4931                             Results.data(), Results.size());
4932 }
4933 
4934 static void AddTypeQualifierResults(DeclSpec &DS, ResultBuilder &Results,
4935                                     const LangOptions &LangOpts) {
4936   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const))
4937     Results.AddResult("const");
4938   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile))
4939     Results.AddResult("volatile");
4940   if (LangOpts.C99 && !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict))
4941     Results.AddResult("restrict");
4942   if (LangOpts.C11 && !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic))
4943     Results.AddResult("_Atomic");
4944   if (LangOpts.MSVCCompat && !(DS.getTypeQualifiers() & DeclSpec::TQ_unaligned))
4945     Results.AddResult("__unaligned");
4946 }
4947 
4948 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) {
4949   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4950                         CodeCompleter->getCodeCompletionTUInfo(),
4951                         CodeCompletionContext::CCC_TypeQualifiers);
4952   Results.EnterNewScope();
4953   AddTypeQualifierResults(DS, Results, LangOpts);
4954   Results.ExitScope();
4955   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4956                             Results.data(), Results.size());
4957 }
4958 
4959 void Sema::CodeCompleteFunctionQualifiers(DeclSpec &DS, Declarator &D,
4960                                           const VirtSpecifiers *VS) {
4961   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4962                         CodeCompleter->getCodeCompletionTUInfo(),
4963                         CodeCompletionContext::CCC_TypeQualifiers);
4964   Results.EnterNewScope();
4965   AddTypeQualifierResults(DS, Results, LangOpts);
4966   if (LangOpts.CPlusPlus11) {
4967     Results.AddResult("noexcept");
4968     if (D.getContext() == DeclaratorContext::MemberContext &&
4969         !D.isCtorOrDtor() && !D.isStaticMember()) {
4970       if (!VS || !VS->isFinalSpecified())
4971         Results.AddResult("final");
4972       if (!VS || !VS->isOverrideSpecified())
4973         Results.AddResult("override");
4974     }
4975   }
4976   Results.ExitScope();
4977   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4978                             Results.data(), Results.size());
4979 }
4980 
4981 void Sema::CodeCompleteBracketDeclarator(Scope *S) {
4982   CodeCompleteExpression(S, QualType(getASTContext().getSizeType()));
4983 }
4984 
4985 void Sema::CodeCompleteCase(Scope *S) {
4986   if (getCurFunction()->SwitchStack.empty() || !CodeCompleter)
4987     return;
4988 
4989   SwitchStmt *Switch = getCurFunction()->SwitchStack.back().getPointer();
4990   // Condition expression might be invalid, do not continue in this case.
4991   if (!Switch->getCond())
4992     return;
4993   QualType type = Switch->getCond()->IgnoreImplicit()->getType();
4994   if (!type->isEnumeralType()) {
4995     CodeCompleteExpressionData Data(type);
4996     Data.IntegralConstantExpression = true;
4997     CodeCompleteExpression(S, Data);
4998     return;
4999   }
5000 
5001   // Code-complete the cases of a switch statement over an enumeration type
5002   // by providing the list of
5003   EnumDecl *Enum = type->castAs<EnumType>()->getDecl();
5004   if (EnumDecl *Def = Enum->getDefinition())
5005     Enum = Def;
5006 
5007   // Determine which enumerators we have already seen in the switch statement.
5008   // FIXME: Ideally, we would also be able to look *past* the code-completion
5009   // token, in case we are code-completing in the middle of the switch and not
5010   // at the end. However, we aren't able to do so at the moment.
5011   CoveredEnumerators Enumerators;
5012   for (SwitchCase *SC = Switch->getSwitchCaseList(); SC;
5013        SC = SC->getNextSwitchCase()) {
5014     CaseStmt *Case = dyn_cast<CaseStmt>(SC);
5015     if (!Case)
5016       continue;
5017 
5018     Expr *CaseVal = Case->getLHS()->IgnoreParenCasts();
5019     if (auto *DRE = dyn_cast<DeclRefExpr>(CaseVal))
5020       if (auto *Enumerator =
5021               dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
5022         // We look into the AST of the case statement to determine which
5023         // enumerator was named. Alternatively, we could compute the value of
5024         // the integral constant expression, then compare it against the
5025         // values of each enumerator. However, value-based approach would not
5026         // work as well with C++ templates where enumerators declared within a
5027         // template are type- and value-dependent.
5028         Enumerators.Seen.insert(Enumerator);
5029 
5030         // If this is a qualified-id, keep track of the nested-name-specifier
5031         // so that we can reproduce it as part of code completion, e.g.,
5032         //
5033         //   switch (TagD.getKind()) {
5034         //     case TagDecl::TK_enum:
5035         //       break;
5036         //     case XXX
5037         //
5038         // At the XXX, our completions are TagDecl::TK_union,
5039         // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union,
5040         // TK_struct, and TK_class.
5041         Enumerators.SuggestedQualifier = DRE->getQualifier();
5042       }
5043   }
5044 
5045   // Add any enumerators that have not yet been mentioned.
5046   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5047                         CodeCompleter->getCodeCompletionTUInfo(),
5048                         CodeCompletionContext::CCC_Expression);
5049   AddEnumerators(Results, Context, Enum, CurContext, Enumerators);
5050 
5051   if (CodeCompleter->includeMacros()) {
5052     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
5053   }
5054   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5055                             Results.data(), Results.size());
5056 }
5057 
5058 static bool anyNullArguments(ArrayRef<Expr *> Args) {
5059   if (Args.size() && !Args.data())
5060     return true;
5061 
5062   for (unsigned I = 0; I != Args.size(); ++I)
5063     if (!Args[I])
5064       return true;
5065 
5066   return false;
5067 }
5068 
5069 typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate;
5070 
5071 static void mergeCandidatesWithResults(
5072     Sema &SemaRef, SmallVectorImpl<ResultCandidate> &Results,
5073     OverloadCandidateSet &CandidateSet, SourceLocation Loc) {
5074   // Sort the overload candidate set by placing the best overloads first.
5075   llvm::stable_sort(CandidateSet, [&](const OverloadCandidate &X,
5076                                       const OverloadCandidate &Y) {
5077     return isBetterOverloadCandidate(SemaRef, X, Y, Loc,
5078                                      CandidateSet.getKind());
5079   });
5080 
5081   // Add the remaining viable overload candidates as code-completion results.
5082   for (OverloadCandidate &Candidate : CandidateSet) {
5083     if (Candidate.Function && Candidate.Function->isDeleted())
5084       continue;
5085     if (Candidate.Viable)
5086       Results.push_back(ResultCandidate(Candidate.Function));
5087   }
5088 }
5089 
5090 /// Get the type of the Nth parameter from a given set of overload
5091 /// candidates.
5092 static QualType getParamType(Sema &SemaRef,
5093                              ArrayRef<ResultCandidate> Candidates, unsigned N) {
5094 
5095   // Given the overloads 'Candidates' for a function call matching all arguments
5096   // up to N, return the type of the Nth parameter if it is the same for all
5097   // overload candidates.
5098   QualType ParamType;
5099   for (auto &Candidate : Candidates) {
5100     if (const auto *FType = Candidate.getFunctionType())
5101       if (const auto *Proto = dyn_cast<FunctionProtoType>(FType))
5102         if (N < Proto->getNumParams()) {
5103           if (ParamType.isNull())
5104             ParamType = Proto->getParamType(N);
5105           else if (!SemaRef.Context.hasSameUnqualifiedType(
5106                        ParamType.getNonReferenceType(),
5107                        Proto->getParamType(N).getNonReferenceType()))
5108             // Otherwise return a default-constructed QualType.
5109             return QualType();
5110         }
5111   }
5112 
5113   return ParamType;
5114 }
5115 
5116 static QualType
5117 ProduceSignatureHelp(Sema &SemaRef, Scope *S,
5118                      MutableArrayRef<ResultCandidate> Candidates,
5119                      unsigned CurrentArg, SourceLocation OpenParLoc) {
5120   if (Candidates.empty())
5121     return QualType();
5122   SemaRef.CodeCompleter->ProcessOverloadCandidates(
5123       SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc);
5124   return getParamType(SemaRef, Candidates, CurrentArg);
5125 }
5126 
5127 QualType Sema::ProduceCallSignatureHelp(Scope *S, Expr *Fn,
5128                                         ArrayRef<Expr *> Args,
5129                                         SourceLocation OpenParLoc) {
5130   if (!CodeCompleter)
5131     return QualType();
5132 
5133   // FIXME: Provide support for variadic template functions.
5134   // Ignore type-dependent call expressions entirely.
5135   if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) ||
5136       Expr::hasAnyTypeDependentArguments(Args)) {
5137     return QualType();
5138   }
5139 
5140   // Build an overload candidate set based on the functions we find.
5141   SourceLocation Loc = Fn->getExprLoc();
5142   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
5143 
5144   SmallVector<ResultCandidate, 8> Results;
5145 
5146   Expr *NakedFn = Fn->IgnoreParenCasts();
5147   if (auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn))
5148     AddOverloadedCallCandidates(ULE, Args, CandidateSet,
5149                                 /*PartialOverloading=*/true);
5150   else if (auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) {
5151     TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr;
5152     if (UME->hasExplicitTemplateArgs()) {
5153       UME->copyTemplateArgumentsInto(TemplateArgsBuffer);
5154       TemplateArgs = &TemplateArgsBuffer;
5155     }
5156 
5157     // Add the base as first argument (use a nullptr if the base is implicit).
5158     SmallVector<Expr *, 12> ArgExprs(
5159         1, UME->isImplicitAccess() ? nullptr : UME->getBase());
5160     ArgExprs.append(Args.begin(), Args.end());
5161     UnresolvedSet<8> Decls;
5162     Decls.append(UME->decls_begin(), UME->decls_end());
5163     const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase();
5164     AddFunctionCandidates(Decls, ArgExprs, CandidateSet, TemplateArgs,
5165                           /*SuppressUserConversions=*/false,
5166                           /*PartialOverloading=*/true, FirstArgumentIsBase);
5167   } else {
5168     FunctionDecl *FD = nullptr;
5169     if (auto *MCE = dyn_cast<MemberExpr>(NakedFn))
5170       FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl());
5171     else if (auto *DRE = dyn_cast<DeclRefExpr>(NakedFn))
5172       FD = dyn_cast<FunctionDecl>(DRE->getDecl());
5173     if (FD) { // We check whether it's a resolved function declaration.
5174       if (!getLangOpts().CPlusPlus ||
5175           !FD->getType()->getAs<FunctionProtoType>())
5176         Results.push_back(ResultCandidate(FD));
5177       else
5178         AddOverloadCandidate(FD, DeclAccessPair::make(FD, FD->getAccess()),
5179                              Args, CandidateSet,
5180                              /*SuppressUserConversions=*/false,
5181                              /*PartialOverloading=*/true);
5182 
5183     } else if (auto DC = NakedFn->getType()->getAsCXXRecordDecl()) {
5184       // If expression's type is CXXRecordDecl, it may overload the function
5185       // call operator, so we check if it does and add them as candidates.
5186       // A complete type is needed to lookup for member function call operators.
5187       if (isCompleteType(Loc, NakedFn->getType())) {
5188         DeclarationName OpName =
5189             Context.DeclarationNames.getCXXOperatorName(OO_Call);
5190         LookupResult R(*this, OpName, Loc, LookupOrdinaryName);
5191         LookupQualifiedName(R, DC);
5192         R.suppressDiagnostics();
5193         SmallVector<Expr *, 12> ArgExprs(1, NakedFn);
5194         ArgExprs.append(Args.begin(), Args.end());
5195         AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs, CandidateSet,
5196                               /*ExplicitArgs=*/nullptr,
5197                               /*SuppressUserConversions=*/false,
5198                               /*PartialOverloading=*/true);
5199       }
5200     } else {
5201       // Lastly we check whether expression's type is function pointer or
5202       // function.
5203       QualType T = NakedFn->getType();
5204       if (!T->getPointeeType().isNull())
5205         T = T->getPointeeType();
5206 
5207       if (auto FP = T->getAs<FunctionProtoType>()) {
5208         if (!TooManyArguments(FP->getNumParams(), Args.size(),
5209                               /*PartialOverloading=*/true) ||
5210             FP->isVariadic())
5211           Results.push_back(ResultCandidate(FP));
5212       } else if (auto FT = T->getAs<FunctionType>())
5213         // No prototype and declaration, it may be a K & R style function.
5214         Results.push_back(ResultCandidate(FT));
5215     }
5216   }
5217   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc);
5218   QualType ParamType =
5219       ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc);
5220   return !CandidateSet.empty() ? ParamType : QualType();
5221 }
5222 
5223 QualType Sema::ProduceConstructorSignatureHelp(Scope *S, QualType Type,
5224                                                SourceLocation Loc,
5225                                                ArrayRef<Expr *> Args,
5226                                                SourceLocation OpenParLoc) {
5227   if (!CodeCompleter)
5228     return QualType();
5229 
5230   // A complete type is needed to lookup for constructors.
5231   CXXRecordDecl *RD =
5232       isCompleteType(Loc, Type) ? Type->getAsCXXRecordDecl() : nullptr;
5233   if (!RD)
5234     return Type;
5235 
5236   // FIXME: Provide support for member initializers.
5237   // FIXME: Provide support for variadic template constructors.
5238 
5239   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
5240 
5241   for (NamedDecl *C : LookupConstructors(RD)) {
5242     if (auto *FD = dyn_cast<FunctionDecl>(C)) {
5243       AddOverloadCandidate(FD, DeclAccessPair::make(FD, C->getAccess()), Args,
5244                            CandidateSet,
5245                            /*SuppressUserConversions=*/false,
5246                            /*PartialOverloading=*/true,
5247                            /*AllowExplicit*/ true);
5248     } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(C)) {
5249       AddTemplateOverloadCandidate(
5250           FTD, DeclAccessPair::make(FTD, C->getAccess()),
5251           /*ExplicitTemplateArgs=*/nullptr, Args, CandidateSet,
5252           /*SuppressUserConversions=*/false,
5253           /*PartialOverloading=*/true);
5254     }
5255   }
5256 
5257   SmallVector<ResultCandidate, 8> Results;
5258   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc);
5259   return ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc);
5260 }
5261 
5262 QualType Sema::ProduceCtorInitMemberSignatureHelp(
5263     Scope *S, Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy,
5264     ArrayRef<Expr *> ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc) {
5265   if (!CodeCompleter)
5266     return QualType();
5267 
5268   CXXConstructorDecl *Constructor =
5269       dyn_cast<CXXConstructorDecl>(ConstructorDecl);
5270   if (!Constructor)
5271     return QualType();
5272   // FIXME: Add support for Base class constructors as well.
5273   if (ValueDecl *MemberDecl = tryLookupCtorInitMemberDecl(
5274           Constructor->getParent(), SS, TemplateTypeTy, II))
5275     return ProduceConstructorSignatureHelp(getCurScope(), MemberDecl->getType(),
5276                                            MemberDecl->getLocation(), ArgExprs,
5277                                            OpenParLoc);
5278   return QualType();
5279 }
5280 
5281 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) {
5282   ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
5283   if (!VD) {
5284     CodeCompleteOrdinaryName(S, PCC_Expression);
5285     return;
5286   }
5287 
5288   CodeCompleteExpressionData Data;
5289   Data.PreferredType = VD->getType();
5290   // Ignore VD to avoid completing the variable itself, e.g. in 'int foo = ^'.
5291   Data.IgnoreDecls.push_back(VD);
5292 
5293   CodeCompleteExpression(S, Data);
5294 }
5295 
5296 void Sema::CodeCompleteAfterIf(Scope *S) {
5297   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5298                         CodeCompleter->getCodeCompletionTUInfo(),
5299                         mapCodeCompletionContext(*this, PCC_Statement));
5300   Results.setFilter(&ResultBuilder::IsOrdinaryName);
5301   Results.EnterNewScope();
5302 
5303   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5304   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5305                      CodeCompleter->includeGlobals(),
5306                      CodeCompleter->loadExternal());
5307 
5308   AddOrdinaryNameResults(PCC_Statement, S, *this, Results);
5309 
5310   // "else" block
5311   CodeCompletionBuilder Builder(Results.getAllocator(),
5312                                 Results.getCodeCompletionTUInfo());
5313   Builder.AddTypedTextChunk("else");
5314   if (Results.includeCodePatterns()) {
5315     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5316     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5317     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5318     Builder.AddPlaceholderChunk("statements");
5319     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5320     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5321   }
5322   Results.AddResult(Builder.TakeString());
5323 
5324   // "else if" block
5325   Builder.AddTypedTextChunk("else if");
5326   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5327   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5328   if (getLangOpts().CPlusPlus)
5329     Builder.AddPlaceholderChunk("condition");
5330   else
5331     Builder.AddPlaceholderChunk("expression");
5332   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5333   if (Results.includeCodePatterns()) {
5334     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5335     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5336     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5337     Builder.AddPlaceholderChunk("statements");
5338     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5339     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5340   }
5341   Results.AddResult(Builder.TakeString());
5342 
5343   Results.ExitScope();
5344 
5345   if (S->getFnParent())
5346     AddPrettyFunctionResults(getLangOpts(), Results);
5347 
5348   if (CodeCompleter->includeMacros())
5349     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
5350 
5351   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5352                             Results.data(), Results.size());
5353 }
5354 
5355 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
5356                                    bool EnteringContext,
5357                                    bool IsUsingDeclaration, QualType BaseType,
5358                                    QualType PreferredType) {
5359   if (SS.isEmpty() || !CodeCompleter)
5360     return;
5361 
5362   CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol, PreferredType);
5363   CC.setIsUsingDeclaration(IsUsingDeclaration);
5364   CC.setCXXScopeSpecifier(SS);
5365 
5366   // We want to keep the scope specifier even if it's invalid (e.g. the scope
5367   // "a::b::" is not corresponding to any context/namespace in the AST), since
5368   // it can be useful for global code completion which have information about
5369   // contexts/symbols that are not in the AST.
5370   if (SS.isInvalid()) {
5371     // As SS is invalid, we try to collect accessible contexts from the current
5372     // scope with a dummy lookup so that the completion consumer can try to
5373     // guess what the specified scope is.
5374     ResultBuilder DummyResults(*this, CodeCompleter->getAllocator(),
5375                                CodeCompleter->getCodeCompletionTUInfo(), CC);
5376     if (!PreferredType.isNull())
5377       DummyResults.setPreferredType(PreferredType);
5378     if (S->getEntity()) {
5379       CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(),
5380                                           BaseType);
5381       LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5382                          /*IncludeGlobalScope=*/false,
5383                          /*LoadExternal=*/false);
5384     }
5385     HandleCodeCompleteResults(this, CodeCompleter,
5386                               DummyResults.getCompletionContext(), nullptr, 0);
5387     return;
5388   }
5389   // Always pretend to enter a context to ensure that a dependent type
5390   // resolves to a dependent record.
5391   DeclContext *Ctx = computeDeclContext(SS, /*EnteringContext=*/true);
5392   if (!Ctx)
5393     return;
5394 
5395   // Try to instantiate any non-dependent declaration contexts before
5396   // we look in them.
5397   if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx))
5398     return;
5399 
5400   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5401                         CodeCompleter->getCodeCompletionTUInfo(), CC);
5402   if (!PreferredType.isNull())
5403     Results.setPreferredType(PreferredType);
5404   Results.EnterNewScope();
5405 
5406   // The "template" keyword can follow "::" in the grammar, but only
5407   // put it into the grammar if the nested-name-specifier is dependent.
5408   NestedNameSpecifier *NNS = SS.getScopeRep();
5409   if (!Results.empty() && NNS->isDependent())
5410     Results.AddResult("template");
5411 
5412   // Add calls to overridden virtual functions, if there are any.
5413   //
5414   // FIXME: This isn't wonderful, because we don't know whether we're actually
5415   // in a context that permits expressions. This is a general issue with
5416   // qualified-id completions.
5417   if (!EnteringContext)
5418     MaybeAddOverrideCalls(*this, Ctx, Results);
5419   Results.ExitScope();
5420 
5421   if (CodeCompleter->includeNamespaceLevelDecls() ||
5422       (!Ctx->isNamespace() && !Ctx->isTranslationUnit())) {
5423     CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType);
5424     LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer,
5425                        /*IncludeGlobalScope=*/true,
5426                        /*IncludeDependentBases=*/true,
5427                        CodeCompleter->loadExternal());
5428   }
5429 
5430   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5431                             Results.data(), Results.size());
5432 }
5433 
5434 void Sema::CodeCompleteUsing(Scope *S) {
5435   if (!CodeCompleter)
5436     return;
5437 
5438   // This can be both a using alias or using declaration, in the former we
5439   // expect a new name and a symbol in the latter case.
5440   CodeCompletionContext Context(CodeCompletionContext::CCC_SymbolOrNewName);
5441   Context.setIsUsingDeclaration(true);
5442 
5443   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5444                         CodeCompleter->getCodeCompletionTUInfo(), Context,
5445                         &ResultBuilder::IsNestedNameSpecifier);
5446   Results.EnterNewScope();
5447 
5448   // If we aren't in class scope, we could see the "namespace" keyword.
5449   if (!S->isClassScope())
5450     Results.AddResult(CodeCompletionResult("namespace"));
5451 
5452   // After "using", we can see anything that would start a
5453   // nested-name-specifier.
5454   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5455   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5456                      CodeCompleter->includeGlobals(),
5457                      CodeCompleter->loadExternal());
5458   Results.ExitScope();
5459 
5460   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5461                             Results.data(), Results.size());
5462 }
5463 
5464 void Sema::CodeCompleteUsingDirective(Scope *S) {
5465   if (!CodeCompleter)
5466     return;
5467 
5468   // After "using namespace", we expect to see a namespace name or namespace
5469   // alias.
5470   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5471                         CodeCompleter->getCodeCompletionTUInfo(),
5472                         CodeCompletionContext::CCC_Namespace,
5473                         &ResultBuilder::IsNamespaceOrAlias);
5474   Results.EnterNewScope();
5475   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5476   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5477                      CodeCompleter->includeGlobals(),
5478                      CodeCompleter->loadExternal());
5479   Results.ExitScope();
5480   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5481                             Results.data(), Results.size());
5482 }
5483 
5484 void Sema::CodeCompleteNamespaceDecl(Scope *S) {
5485   if (!CodeCompleter)
5486     return;
5487 
5488   DeclContext *Ctx = S->getEntity();
5489   if (!S->getParent())
5490     Ctx = Context.getTranslationUnitDecl();
5491 
5492   bool SuppressedGlobalResults =
5493       Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
5494 
5495   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5496                         CodeCompleter->getCodeCompletionTUInfo(),
5497                         SuppressedGlobalResults
5498                             ? CodeCompletionContext::CCC_Namespace
5499                             : CodeCompletionContext::CCC_Other,
5500                         &ResultBuilder::IsNamespace);
5501 
5502   if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
5503     // We only want to see those namespaces that have already been defined
5504     // within this scope, because its likely that the user is creating an
5505     // extended namespace declaration. Keep track of the most recent
5506     // definition of each namespace.
5507     std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
5508     for (DeclContext::specific_decl_iterator<NamespaceDecl>
5509              NS(Ctx->decls_begin()),
5510          NSEnd(Ctx->decls_end());
5511          NS != NSEnd; ++NS)
5512       OrigToLatest[NS->getOriginalNamespace()] = *NS;
5513 
5514     // Add the most recent definition (or extended definition) of each
5515     // namespace to the list of results.
5516     Results.EnterNewScope();
5517     for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
5518              NS = OrigToLatest.begin(),
5519              NSEnd = OrigToLatest.end();
5520          NS != NSEnd; ++NS)
5521       Results.AddResult(
5522           CodeCompletionResult(NS->second, Results.getBasePriority(NS->second),
5523                                nullptr),
5524           CurContext, nullptr, false);
5525     Results.ExitScope();
5526   }
5527 
5528   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5529                             Results.data(), Results.size());
5530 }
5531 
5532 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S) {
5533   if (!CodeCompleter)
5534     return;
5535 
5536   // After "namespace", we expect to see a namespace or alias.
5537   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5538                         CodeCompleter->getCodeCompletionTUInfo(),
5539                         CodeCompletionContext::CCC_Namespace,
5540                         &ResultBuilder::IsNamespaceOrAlias);
5541   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5542   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5543                      CodeCompleter->includeGlobals(),
5544                      CodeCompleter->loadExternal());
5545   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5546                             Results.data(), Results.size());
5547 }
5548 
5549 void Sema::CodeCompleteOperatorName(Scope *S) {
5550   if (!CodeCompleter)
5551     return;
5552 
5553   typedef CodeCompletionResult Result;
5554   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5555                         CodeCompleter->getCodeCompletionTUInfo(),
5556                         CodeCompletionContext::CCC_Type,
5557                         &ResultBuilder::IsType);
5558   Results.EnterNewScope();
5559 
5560   // Add the names of overloadable operators. Note that OO_Conditional is not
5561   // actually overloadable.
5562 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
5563   if (OO_##Name != OO_Conditional)                                             \
5564     Results.AddResult(Result(Spelling));
5565 #include "clang/Basic/OperatorKinds.def"
5566 
5567   // Add any type names visible from the current scope
5568   Results.allowNestedNameSpecifiers();
5569   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5570   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5571                      CodeCompleter->includeGlobals(),
5572                      CodeCompleter->loadExternal());
5573 
5574   // Add any type specifiers
5575   AddTypeSpecifierResults(getLangOpts(), Results);
5576   Results.ExitScope();
5577 
5578   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5579                             Results.data(), Results.size());
5580 }
5581 
5582 void Sema::CodeCompleteConstructorInitializer(
5583     Decl *ConstructorD, ArrayRef<CXXCtorInitializer *> Initializers) {
5584   if (!ConstructorD)
5585     return;
5586 
5587   AdjustDeclIfTemplate(ConstructorD);
5588 
5589   auto *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD);
5590   if (!Constructor)
5591     return;
5592 
5593   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5594                         CodeCompleter->getCodeCompletionTUInfo(),
5595                         CodeCompletionContext::CCC_Symbol);
5596   Results.EnterNewScope();
5597 
5598   // Fill in any already-initialized fields or base classes.
5599   llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
5600   llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
5601   for (unsigned I = 0, E = Initializers.size(); I != E; ++I) {
5602     if (Initializers[I]->isBaseInitializer())
5603       InitializedBases.insert(Context.getCanonicalType(
5604           QualType(Initializers[I]->getBaseClass(), 0)));
5605     else
5606       InitializedFields.insert(
5607           cast<FieldDecl>(Initializers[I]->getAnyMember()));
5608   }
5609 
5610   // Add completions for base classes.
5611   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
5612   bool SawLastInitializer = Initializers.empty();
5613   CXXRecordDecl *ClassDecl = Constructor->getParent();
5614 
5615   auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) {
5616     CodeCompletionBuilder Builder(Results.getAllocator(),
5617                                   Results.getCodeCompletionTUInfo());
5618     Builder.AddTypedTextChunk(Name);
5619     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5620     if (const auto *Function = dyn_cast<FunctionDecl>(ND))
5621       AddFunctionParameterChunks(PP, Policy, Function, Builder);
5622     else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND))
5623       AddFunctionParameterChunks(PP, Policy, FunTemplDecl->getTemplatedDecl(),
5624                                  Builder);
5625     Builder.AddChunk(CodeCompletionString::CK_RightParen);
5626     return Builder.TakeString();
5627   };
5628   auto AddDefaultCtorInit = [&](const char *Name, const char *Type,
5629                                 const NamedDecl *ND) {
5630     CodeCompletionBuilder Builder(Results.getAllocator(),
5631                                   Results.getCodeCompletionTUInfo());
5632     Builder.AddTypedTextChunk(Name);
5633     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5634     Builder.AddPlaceholderChunk(Type);
5635     Builder.AddChunk(CodeCompletionString::CK_RightParen);
5636     if (ND) {
5637       auto CCR = CodeCompletionResult(
5638           Builder.TakeString(), ND,
5639           SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration);
5640       if (isa<FieldDecl>(ND))
5641         CCR.CursorKind = CXCursor_MemberRef;
5642       return Results.AddResult(CCR);
5643     }
5644     return Results.AddResult(CodeCompletionResult(
5645         Builder.TakeString(),
5646         SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration));
5647   };
5648   auto AddCtorsWithName = [&](const CXXRecordDecl *RD, unsigned int Priority,
5649                               const char *Name, const FieldDecl *FD) {
5650     if (!RD)
5651       return AddDefaultCtorInit(Name,
5652                                 FD ? Results.getAllocator().CopyString(
5653                                          FD->getType().getAsString(Policy))
5654                                    : Name,
5655                                 FD);
5656     auto Ctors = getConstructors(Context, RD);
5657     if (Ctors.begin() == Ctors.end())
5658       return AddDefaultCtorInit(Name, Name, RD);
5659     for (const NamedDecl *Ctor : Ctors) {
5660       auto CCR = CodeCompletionResult(GenerateCCS(Ctor, Name), RD, Priority);
5661       CCR.CursorKind = getCursorKindForDecl(Ctor);
5662       Results.AddResult(CCR);
5663     }
5664   };
5665   auto AddBase = [&](const CXXBaseSpecifier &Base) {
5666     const char *BaseName =
5667         Results.getAllocator().CopyString(Base.getType().getAsString(Policy));
5668     const auto *RD = Base.getType()->getAsCXXRecordDecl();
5669     AddCtorsWithName(
5670         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
5671         BaseName, nullptr);
5672   };
5673   auto AddField = [&](const FieldDecl *FD) {
5674     const char *FieldName =
5675         Results.getAllocator().CopyString(FD->getIdentifier()->getName());
5676     const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl();
5677     AddCtorsWithName(
5678         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
5679         FieldName, FD);
5680   };
5681 
5682   for (const auto &Base : ClassDecl->bases()) {
5683     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
5684              .second) {
5685       SawLastInitializer =
5686           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
5687           Context.hasSameUnqualifiedType(
5688               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
5689       continue;
5690     }
5691 
5692     AddBase(Base);
5693     SawLastInitializer = false;
5694   }
5695 
5696   // Add completions for virtual base classes.
5697   for (const auto &Base : ClassDecl->vbases()) {
5698     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
5699              .second) {
5700       SawLastInitializer =
5701           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
5702           Context.hasSameUnqualifiedType(
5703               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
5704       continue;
5705     }
5706 
5707     AddBase(Base);
5708     SawLastInitializer = false;
5709   }
5710 
5711   // Add completions for members.
5712   for (auto *Field : ClassDecl->fields()) {
5713     if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))
5714              .second) {
5715       SawLastInitializer = !Initializers.empty() &&
5716                            Initializers.back()->isAnyMemberInitializer() &&
5717                            Initializers.back()->getAnyMember() == Field;
5718       continue;
5719     }
5720 
5721     if (!Field->getDeclName())
5722       continue;
5723 
5724     AddField(Field);
5725     SawLastInitializer = false;
5726   }
5727   Results.ExitScope();
5728 
5729   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5730                             Results.data(), Results.size());
5731 }
5732 
5733 /// Determine whether this scope denotes a namespace.
5734 static bool isNamespaceScope(Scope *S) {
5735   DeclContext *DC = S->getEntity();
5736   if (!DC)
5737     return false;
5738 
5739   return DC->isFileContext();
5740 }
5741 
5742 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro,
5743                                         bool AfterAmpersand) {
5744   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5745                         CodeCompleter->getCodeCompletionTUInfo(),
5746                         CodeCompletionContext::CCC_Other);
5747   Results.EnterNewScope();
5748 
5749   // Note what has already been captured.
5750   llvm::SmallPtrSet<IdentifierInfo *, 4> Known;
5751   bool IncludedThis = false;
5752   for (const auto &C : Intro.Captures) {
5753     if (C.Kind == LCK_This) {
5754       IncludedThis = true;
5755       continue;
5756     }
5757 
5758     Known.insert(C.Id);
5759   }
5760 
5761   // Look for other capturable variables.
5762   for (; S && !isNamespaceScope(S); S = S->getParent()) {
5763     for (const auto *D : S->decls()) {
5764       const auto *Var = dyn_cast<VarDecl>(D);
5765       if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>())
5766         continue;
5767 
5768       if (Known.insert(Var->getIdentifier()).second)
5769         Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration),
5770                           CurContext, nullptr, false);
5771     }
5772   }
5773 
5774   // Add 'this', if it would be valid.
5775   if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy)
5776     addThisCompletion(*this, Results);
5777 
5778   Results.ExitScope();
5779 
5780   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5781                             Results.data(), Results.size());
5782 }
5783 
5784 /// Macro that optionally prepends an "@" to the string literal passed in via
5785 /// Keyword, depending on whether NeedAt is true or false.
5786 #define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword)
5787 
5788 static void AddObjCImplementationResults(const LangOptions &LangOpts,
5789                                          ResultBuilder &Results, bool NeedAt) {
5790   typedef CodeCompletionResult Result;
5791   // Since we have an implementation, we can end it.
5792   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
5793 
5794   CodeCompletionBuilder Builder(Results.getAllocator(),
5795                                 Results.getCodeCompletionTUInfo());
5796   if (LangOpts.ObjC) {
5797     // @dynamic
5798     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "dynamic"));
5799     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5800     Builder.AddPlaceholderChunk("property");
5801     Results.AddResult(Result(Builder.TakeString()));
5802 
5803     // @synthesize
5804     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synthesize"));
5805     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5806     Builder.AddPlaceholderChunk("property");
5807     Results.AddResult(Result(Builder.TakeString()));
5808   }
5809 }
5810 
5811 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
5812                                     ResultBuilder &Results, bool NeedAt) {
5813   typedef CodeCompletionResult Result;
5814 
5815   // Since we have an interface or protocol, we can end it.
5816   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
5817 
5818   if (LangOpts.ObjC) {
5819     // @property
5820     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "property")));
5821 
5822     // @required
5823     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "required")));
5824 
5825     // @optional
5826     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "optional")));
5827   }
5828 }
5829 
5830 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
5831   typedef CodeCompletionResult Result;
5832   CodeCompletionBuilder Builder(Results.getAllocator(),
5833                                 Results.getCodeCompletionTUInfo());
5834 
5835   // @class name ;
5836   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "class"));
5837   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5838   Builder.AddPlaceholderChunk("name");
5839   Results.AddResult(Result(Builder.TakeString()));
5840 
5841   if (Results.includeCodePatterns()) {
5842     // @interface name
5843     // FIXME: Could introduce the whole pattern, including superclasses and
5844     // such.
5845     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "interface"));
5846     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5847     Builder.AddPlaceholderChunk("class");
5848     Results.AddResult(Result(Builder.TakeString()));
5849 
5850     // @protocol name
5851     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
5852     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5853     Builder.AddPlaceholderChunk("protocol");
5854     Results.AddResult(Result(Builder.TakeString()));
5855 
5856     // @implementation name
5857     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "implementation"));
5858     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5859     Builder.AddPlaceholderChunk("class");
5860     Results.AddResult(Result(Builder.TakeString()));
5861   }
5862 
5863   // @compatibility_alias name
5864   Builder.AddTypedTextChunk(
5865       OBJC_AT_KEYWORD_NAME(NeedAt, "compatibility_alias"));
5866   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5867   Builder.AddPlaceholderChunk("alias");
5868   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5869   Builder.AddPlaceholderChunk("class");
5870   Results.AddResult(Result(Builder.TakeString()));
5871 
5872   if (Results.getSema().getLangOpts().Modules) {
5873     // @import name
5874     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import"));
5875     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5876     Builder.AddPlaceholderChunk("module");
5877     Results.AddResult(Result(Builder.TakeString()));
5878   }
5879 }
5880 
5881 void Sema::CodeCompleteObjCAtDirective(Scope *S) {
5882   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5883                         CodeCompleter->getCodeCompletionTUInfo(),
5884                         CodeCompletionContext::CCC_Other);
5885   Results.EnterNewScope();
5886   if (isa<ObjCImplDecl>(CurContext))
5887     AddObjCImplementationResults(getLangOpts(), Results, false);
5888   else if (CurContext->isObjCContainer())
5889     AddObjCInterfaceResults(getLangOpts(), Results, false);
5890   else
5891     AddObjCTopLevelResults(Results, false);
5892   Results.ExitScope();
5893   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5894                             Results.data(), Results.size());
5895 }
5896 
5897 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
5898   typedef CodeCompletionResult Result;
5899   CodeCompletionBuilder Builder(Results.getAllocator(),
5900                                 Results.getCodeCompletionTUInfo());
5901 
5902   // @encode ( type-name )
5903   const char *EncodeType = "char[]";
5904   if (Results.getSema().getLangOpts().CPlusPlus ||
5905       Results.getSema().getLangOpts().ConstStrings)
5906     EncodeType = "const char[]";
5907   Builder.AddResultTypeChunk(EncodeType);
5908   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "encode"));
5909   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5910   Builder.AddPlaceholderChunk("type-name");
5911   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5912   Results.AddResult(Result(Builder.TakeString()));
5913 
5914   // @protocol ( protocol-name )
5915   Builder.AddResultTypeChunk("Protocol *");
5916   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
5917   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5918   Builder.AddPlaceholderChunk("protocol-name");
5919   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5920   Results.AddResult(Result(Builder.TakeString()));
5921 
5922   // @selector ( selector )
5923   Builder.AddResultTypeChunk("SEL");
5924   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "selector"));
5925   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5926   Builder.AddPlaceholderChunk("selector");
5927   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5928   Results.AddResult(Result(Builder.TakeString()));
5929 
5930   // @"string"
5931   Builder.AddResultTypeChunk("NSString *");
5932   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "\""));
5933   Builder.AddPlaceholderChunk("string");
5934   Builder.AddTextChunk("\"");
5935   Results.AddResult(Result(Builder.TakeString()));
5936 
5937   // @[objects, ...]
5938   Builder.AddResultTypeChunk("NSArray *");
5939   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "["));
5940   Builder.AddPlaceholderChunk("objects, ...");
5941   Builder.AddChunk(CodeCompletionString::CK_RightBracket);
5942   Results.AddResult(Result(Builder.TakeString()));
5943 
5944   // @{key : object, ...}
5945   Builder.AddResultTypeChunk("NSDictionary *");
5946   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "{"));
5947   Builder.AddPlaceholderChunk("key");
5948   Builder.AddChunk(CodeCompletionString::CK_Colon);
5949   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5950   Builder.AddPlaceholderChunk("object, ...");
5951   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5952   Results.AddResult(Result(Builder.TakeString()));
5953 
5954   // @(expression)
5955   Builder.AddResultTypeChunk("id");
5956   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "("));
5957   Builder.AddPlaceholderChunk("expression");
5958   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5959   Results.AddResult(Result(Builder.TakeString()));
5960 }
5961 
5962 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
5963   typedef CodeCompletionResult Result;
5964   CodeCompletionBuilder Builder(Results.getAllocator(),
5965                                 Results.getCodeCompletionTUInfo());
5966 
5967   if (Results.includeCodePatterns()) {
5968     // @try { statements } @catch ( declaration ) { statements } @finally
5969     //   { statements }
5970     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "try"));
5971     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5972     Builder.AddPlaceholderChunk("statements");
5973     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5974     Builder.AddTextChunk("@catch");
5975     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5976     Builder.AddPlaceholderChunk("parameter");
5977     Builder.AddChunk(CodeCompletionString::CK_RightParen);
5978     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5979     Builder.AddPlaceholderChunk("statements");
5980     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5981     Builder.AddTextChunk("@finally");
5982     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5983     Builder.AddPlaceholderChunk("statements");
5984     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5985     Results.AddResult(Result(Builder.TakeString()));
5986   }
5987 
5988   // @throw
5989   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "throw"));
5990   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5991   Builder.AddPlaceholderChunk("expression");
5992   Results.AddResult(Result(Builder.TakeString()));
5993 
5994   if (Results.includeCodePatterns()) {
5995     // @synchronized ( expression ) { statements }
5996     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synchronized"));
5997     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5998     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5999     Builder.AddPlaceholderChunk("expression");
6000     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6001     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6002     Builder.AddPlaceholderChunk("statements");
6003     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6004     Results.AddResult(Result(Builder.TakeString()));
6005   }
6006 }
6007 
6008 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
6009                                      ResultBuilder &Results, bool NeedAt) {
6010   typedef CodeCompletionResult Result;
6011   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "private")));
6012   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "protected")));
6013   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "public")));
6014   if (LangOpts.ObjC)
6015     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "package")));
6016 }
6017 
6018 void Sema::CodeCompleteObjCAtVisibility(Scope *S) {
6019   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6020                         CodeCompleter->getCodeCompletionTUInfo(),
6021                         CodeCompletionContext::CCC_Other);
6022   Results.EnterNewScope();
6023   AddObjCVisibilityResults(getLangOpts(), Results, false);
6024   Results.ExitScope();
6025   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6026                             Results.data(), Results.size());
6027 }
6028 
6029 void Sema::CodeCompleteObjCAtStatement(Scope *S) {
6030   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6031                         CodeCompleter->getCodeCompletionTUInfo(),
6032                         CodeCompletionContext::CCC_Other);
6033   Results.EnterNewScope();
6034   AddObjCStatementResults(Results, false);
6035   AddObjCExpressionResults(Results, false);
6036   Results.ExitScope();
6037   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6038                             Results.data(), Results.size());
6039 }
6040 
6041 void Sema::CodeCompleteObjCAtExpression(Scope *S) {
6042   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6043                         CodeCompleter->getCodeCompletionTUInfo(),
6044                         CodeCompletionContext::CCC_Other);
6045   Results.EnterNewScope();
6046   AddObjCExpressionResults(Results, false);
6047   Results.ExitScope();
6048   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6049                             Results.data(), Results.size());
6050 }
6051 
6052 /// Determine whether the addition of the given flag to an Objective-C
6053 /// property's attributes will cause a conflict.
6054 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
6055   // Check if we've already added this flag.
6056   if (Attributes & NewFlag)
6057     return true;
6058 
6059   Attributes |= NewFlag;
6060 
6061   // Check for collisions with "readonly".
6062   if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
6063       (Attributes & ObjCDeclSpec::DQ_PR_readwrite))
6064     return true;
6065 
6066   // Check for more than one of { assign, copy, retain, strong, weak }.
6067   unsigned AssignCopyRetMask =
6068       Attributes &
6069       (ObjCDeclSpec::DQ_PR_assign | ObjCDeclSpec::DQ_PR_unsafe_unretained |
6070        ObjCDeclSpec::DQ_PR_copy | ObjCDeclSpec::DQ_PR_retain |
6071        ObjCDeclSpec::DQ_PR_strong | ObjCDeclSpec::DQ_PR_weak);
6072   if (AssignCopyRetMask && AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign &&
6073       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained &&
6074       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy &&
6075       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain &&
6076       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong &&
6077       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_weak)
6078     return true;
6079 
6080   return false;
6081 }
6082 
6083 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
6084   if (!CodeCompleter)
6085     return;
6086 
6087   unsigned Attributes = ODS.getPropertyAttributes();
6088 
6089   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6090                         CodeCompleter->getCodeCompletionTUInfo(),
6091                         CodeCompletionContext::CCC_Other);
6092   Results.EnterNewScope();
6093   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly))
6094     Results.AddResult(CodeCompletionResult("readonly"));
6095   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign))
6096     Results.AddResult(CodeCompletionResult("assign"));
6097   if (!ObjCPropertyFlagConflicts(Attributes,
6098                                  ObjCDeclSpec::DQ_PR_unsafe_unretained))
6099     Results.AddResult(CodeCompletionResult("unsafe_unretained"));
6100   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite))
6101     Results.AddResult(CodeCompletionResult("readwrite"));
6102   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain))
6103     Results.AddResult(CodeCompletionResult("retain"));
6104   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong))
6105     Results.AddResult(CodeCompletionResult("strong"));
6106   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy))
6107     Results.AddResult(CodeCompletionResult("copy"));
6108   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic))
6109     Results.AddResult(CodeCompletionResult("nonatomic"));
6110   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic))
6111     Results.AddResult(CodeCompletionResult("atomic"));
6112 
6113   // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC.
6114   if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC)
6115     if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_weak))
6116       Results.AddResult(CodeCompletionResult("weak"));
6117 
6118   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) {
6119     CodeCompletionBuilder Setter(Results.getAllocator(),
6120                                  Results.getCodeCompletionTUInfo());
6121     Setter.AddTypedTextChunk("setter");
6122     Setter.AddTextChunk("=");
6123     Setter.AddPlaceholderChunk("method");
6124     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
6125   }
6126   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) {
6127     CodeCompletionBuilder Getter(Results.getAllocator(),
6128                                  Results.getCodeCompletionTUInfo());
6129     Getter.AddTypedTextChunk("getter");
6130     Getter.AddTextChunk("=");
6131     Getter.AddPlaceholderChunk("method");
6132     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
6133   }
6134   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nullability)) {
6135     Results.AddResult(CodeCompletionResult("nonnull"));
6136     Results.AddResult(CodeCompletionResult("nullable"));
6137     Results.AddResult(CodeCompletionResult("null_unspecified"));
6138     Results.AddResult(CodeCompletionResult("null_resettable"));
6139   }
6140   Results.ExitScope();
6141   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6142                             Results.data(), Results.size());
6143 }
6144 
6145 /// Describes the kind of Objective-C method that we want to find
6146 /// via code completion.
6147 enum ObjCMethodKind {
6148   MK_Any, ///< Any kind of method, provided it means other specified criteria.
6149   MK_ZeroArgSelector, ///< Zero-argument (unary) selector.
6150   MK_OneArgSelector   ///< One-argument selector.
6151 };
6152 
6153 static bool isAcceptableObjCSelector(Selector Sel, ObjCMethodKind WantKind,
6154                                      ArrayRef<IdentifierInfo *> SelIdents,
6155                                      bool AllowSameLength = true) {
6156   unsigned NumSelIdents = SelIdents.size();
6157   if (NumSelIdents > Sel.getNumArgs())
6158     return false;
6159 
6160   switch (WantKind) {
6161   case MK_Any:
6162     break;
6163   case MK_ZeroArgSelector:
6164     return Sel.isUnarySelector();
6165   case MK_OneArgSelector:
6166     return Sel.getNumArgs() == 1;
6167   }
6168 
6169   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
6170     return false;
6171 
6172   for (unsigned I = 0; I != NumSelIdents; ++I)
6173     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
6174       return false;
6175 
6176   return true;
6177 }
6178 
6179 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
6180                                    ObjCMethodKind WantKind,
6181                                    ArrayRef<IdentifierInfo *> SelIdents,
6182                                    bool AllowSameLength = true) {
6183   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
6184                                   AllowSameLength);
6185 }
6186 
6187 /// A set of selectors, which is used to avoid introducing multiple
6188 /// completions with the same selector into the result set.
6189 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
6190 
6191 /// Add all of the Objective-C methods in the given Objective-C
6192 /// container to the set of results.
6193 ///
6194 /// The container will be a class, protocol, category, or implementation of
6195 /// any of the above. This mether will recurse to include methods from
6196 /// the superclasses of classes along with their categories, protocols, and
6197 /// implementations.
6198 ///
6199 /// \param Container the container in which we'll look to find methods.
6200 ///
6201 /// \param WantInstanceMethods Whether to add instance methods (only); if
6202 /// false, this routine will add factory methods (only).
6203 ///
6204 /// \param CurContext the context in which we're performing the lookup that
6205 /// finds methods.
6206 ///
6207 /// \param AllowSameLength Whether we allow a method to be added to the list
6208 /// when it has the same number of parameters as we have selector identifiers.
6209 ///
6210 /// \param Results the structure into which we'll add results.
6211 static void AddObjCMethods(ObjCContainerDecl *Container,
6212                            bool WantInstanceMethods, ObjCMethodKind WantKind,
6213                            ArrayRef<IdentifierInfo *> SelIdents,
6214                            DeclContext *CurContext,
6215                            VisitedSelectorSet &Selectors, bool AllowSameLength,
6216                            ResultBuilder &Results, bool InOriginalClass = true,
6217                            bool IsRootClass = false) {
6218   typedef CodeCompletionResult Result;
6219   Container = getContainerDef(Container);
6220   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
6221   IsRootClass = IsRootClass || (IFace && !IFace->getSuperClass());
6222   for (ObjCMethodDecl *M : Container->methods()) {
6223     // The instance methods on the root class can be messaged via the
6224     // metaclass.
6225     if (M->isInstanceMethod() == WantInstanceMethods ||
6226         (IsRootClass && !WantInstanceMethods)) {
6227       // Check whether the selector identifiers we've been given are a
6228       // subset of the identifiers for this particular method.
6229       if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength))
6230         continue;
6231 
6232       if (!Selectors.insert(M->getSelector()).second)
6233         continue;
6234 
6235       Result R = Result(M, Results.getBasePriority(M), nullptr);
6236       R.StartParameter = SelIdents.size();
6237       R.AllParametersAreInformative = (WantKind != MK_Any);
6238       if (!InOriginalClass)
6239         setInBaseClass(R);
6240       Results.MaybeAddResult(R, CurContext);
6241     }
6242   }
6243 
6244   // Visit the protocols of protocols.
6245   if (const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
6246     if (Protocol->hasDefinition()) {
6247       const ObjCList<ObjCProtocolDecl> &Protocols =
6248           Protocol->getReferencedProtocols();
6249       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
6250                                                 E = Protocols.end();
6251            I != E; ++I)
6252         AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
6253                        Selectors, AllowSameLength, Results, false, IsRootClass);
6254     }
6255   }
6256 
6257   if (!IFace || !IFace->hasDefinition())
6258     return;
6259 
6260   // Add methods in protocols.
6261   for (ObjCProtocolDecl *I : IFace->protocols())
6262     AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext,
6263                    Selectors, AllowSameLength, Results, false, IsRootClass);
6264 
6265   // Add methods in categories.
6266   for (ObjCCategoryDecl *CatDecl : IFace->known_categories()) {
6267     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
6268                    CurContext, Selectors, AllowSameLength, Results,
6269                    InOriginalClass, IsRootClass);
6270 
6271     // Add a categories protocol methods.
6272     const ObjCList<ObjCProtocolDecl> &Protocols =
6273         CatDecl->getReferencedProtocols();
6274     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
6275                                               E = Protocols.end();
6276          I != E; ++I)
6277       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
6278                      Selectors, AllowSameLength, Results, false, IsRootClass);
6279 
6280     // Add methods in category implementations.
6281     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
6282       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
6283                      Selectors, AllowSameLength, Results, InOriginalClass,
6284                      IsRootClass);
6285   }
6286 
6287   // Add methods in superclass.
6288   // Avoid passing in IsRootClass since root classes won't have super classes.
6289   if (IFace->getSuperClass())
6290     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
6291                    SelIdents, CurContext, Selectors, AllowSameLength, Results,
6292                    /*IsRootClass=*/false);
6293 
6294   // Add methods in our implementation, if any.
6295   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
6296     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
6297                    Selectors, AllowSameLength, Results, InOriginalClass,
6298                    IsRootClass);
6299 }
6300 
6301 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) {
6302   // Try to find the interface where getters might live.
6303   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
6304   if (!Class) {
6305     if (ObjCCategoryDecl *Category =
6306             dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
6307       Class = Category->getClassInterface();
6308 
6309     if (!Class)
6310       return;
6311   }
6312 
6313   // Find all of the potential getters.
6314   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6315                         CodeCompleter->getCodeCompletionTUInfo(),
6316                         CodeCompletionContext::CCC_Other);
6317   Results.EnterNewScope();
6318 
6319   VisitedSelectorSet Selectors;
6320   AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors,
6321                  /*AllowSameLength=*/true, Results);
6322   Results.ExitScope();
6323   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6324                             Results.data(), Results.size());
6325 }
6326 
6327 void Sema::CodeCompleteObjCPropertySetter(Scope *S) {
6328   // Try to find the interface where setters might live.
6329   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
6330   if (!Class) {
6331     if (ObjCCategoryDecl *Category =
6332             dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
6333       Class = Category->getClassInterface();
6334 
6335     if (!Class)
6336       return;
6337   }
6338 
6339   // Find all of the potential getters.
6340   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6341                         CodeCompleter->getCodeCompletionTUInfo(),
6342                         CodeCompletionContext::CCC_Other);
6343   Results.EnterNewScope();
6344 
6345   VisitedSelectorSet Selectors;
6346   AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext, Selectors,
6347                  /*AllowSameLength=*/true, Results);
6348 
6349   Results.ExitScope();
6350   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6351                             Results.data(), Results.size());
6352 }
6353 
6354 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
6355                                        bool IsParameter) {
6356   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6357                         CodeCompleter->getCodeCompletionTUInfo(),
6358                         CodeCompletionContext::CCC_Type);
6359   Results.EnterNewScope();
6360 
6361   // Add context-sensitive, Objective-C parameter-passing keywords.
6362   bool AddedInOut = false;
6363   if ((DS.getObjCDeclQualifier() &
6364        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
6365     Results.AddResult("in");
6366     Results.AddResult("inout");
6367     AddedInOut = true;
6368   }
6369   if ((DS.getObjCDeclQualifier() &
6370        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
6371     Results.AddResult("out");
6372     if (!AddedInOut)
6373       Results.AddResult("inout");
6374   }
6375   if ((DS.getObjCDeclQualifier() &
6376        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
6377         ObjCDeclSpec::DQ_Oneway)) == 0) {
6378     Results.AddResult("bycopy");
6379     Results.AddResult("byref");
6380     Results.AddResult("oneway");
6381   }
6382   if ((DS.getObjCDeclQualifier() & ObjCDeclSpec::DQ_CSNullability) == 0) {
6383     Results.AddResult("nonnull");
6384     Results.AddResult("nullable");
6385     Results.AddResult("null_unspecified");
6386   }
6387 
6388   // If we're completing the return type of an Objective-C method and the
6389   // identifier IBAction refers to a macro, provide a completion item for
6390   // an action, e.g.,
6391   //   IBAction)<#selector#>:(id)sender
6392   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
6393       PP.isMacroDefined("IBAction")) {
6394     CodeCompletionBuilder Builder(Results.getAllocator(),
6395                                   Results.getCodeCompletionTUInfo(),
6396                                   CCP_CodePattern, CXAvailability_Available);
6397     Builder.AddTypedTextChunk("IBAction");
6398     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6399     Builder.AddPlaceholderChunk("selector");
6400     Builder.AddChunk(CodeCompletionString::CK_Colon);
6401     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6402     Builder.AddTextChunk("id");
6403     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6404     Builder.AddTextChunk("sender");
6405     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
6406   }
6407 
6408   // If we're completing the return type, provide 'instancetype'.
6409   if (!IsParameter) {
6410     Results.AddResult(CodeCompletionResult("instancetype"));
6411   }
6412 
6413   // Add various builtin type names and specifiers.
6414   AddOrdinaryNameResults(PCC_Type, S, *this, Results);
6415   Results.ExitScope();
6416 
6417   // Add the various type names
6418   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
6419   CodeCompletionDeclConsumer Consumer(Results, CurContext);
6420   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6421                      CodeCompleter->includeGlobals(),
6422                      CodeCompleter->loadExternal());
6423 
6424   if (CodeCompleter->includeMacros())
6425     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
6426 
6427   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6428                             Results.data(), Results.size());
6429 }
6430 
6431 /// When we have an expression with type "id", we may assume
6432 /// that it has some more-specific class type based on knowledge of
6433 /// common uses of Objective-C. This routine returns that class type,
6434 /// or NULL if no better result could be determined.
6435 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
6436   auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
6437   if (!Msg)
6438     return nullptr;
6439 
6440   Selector Sel = Msg->getSelector();
6441   if (Sel.isNull())
6442     return nullptr;
6443 
6444   IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
6445   if (!Id)
6446     return nullptr;
6447 
6448   ObjCMethodDecl *Method = Msg->getMethodDecl();
6449   if (!Method)
6450     return nullptr;
6451 
6452   // Determine the class that we're sending the message to.
6453   ObjCInterfaceDecl *IFace = nullptr;
6454   switch (Msg->getReceiverKind()) {
6455   case ObjCMessageExpr::Class:
6456     if (const ObjCObjectType *ObjType =
6457             Msg->getClassReceiver()->getAs<ObjCObjectType>())
6458       IFace = ObjType->getInterface();
6459     break;
6460 
6461   case ObjCMessageExpr::Instance: {
6462     QualType T = Msg->getInstanceReceiver()->getType();
6463     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
6464       IFace = Ptr->getInterfaceDecl();
6465     break;
6466   }
6467 
6468   case ObjCMessageExpr::SuperInstance:
6469   case ObjCMessageExpr::SuperClass:
6470     break;
6471   }
6472 
6473   if (!IFace)
6474     return nullptr;
6475 
6476   ObjCInterfaceDecl *Super = IFace->getSuperClass();
6477   if (Method->isInstanceMethod())
6478     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
6479         .Case("retain", IFace)
6480         .Case("strong", IFace)
6481         .Case("autorelease", IFace)
6482         .Case("copy", IFace)
6483         .Case("copyWithZone", IFace)
6484         .Case("mutableCopy", IFace)
6485         .Case("mutableCopyWithZone", IFace)
6486         .Case("awakeFromCoder", IFace)
6487         .Case("replacementObjectFromCoder", IFace)
6488         .Case("class", IFace)
6489         .Case("classForCoder", IFace)
6490         .Case("superclass", Super)
6491         .Default(nullptr);
6492 
6493   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
6494       .Case("new", IFace)
6495       .Case("alloc", IFace)
6496       .Case("allocWithZone", IFace)
6497       .Case("class", IFace)
6498       .Case("superclass", Super)
6499       .Default(nullptr);
6500 }
6501 
6502 // Add a special completion for a message send to "super", which fills in the
6503 // most likely case of forwarding all of our arguments to the superclass
6504 // function.
6505 ///
6506 /// \param S The semantic analysis object.
6507 ///
6508 /// \param NeedSuperKeyword Whether we need to prefix this completion with
6509 /// the "super" keyword. Otherwise, we just need to provide the arguments.
6510 ///
6511 /// \param SelIdents The identifiers in the selector that have already been
6512 /// provided as arguments for a send to "super".
6513 ///
6514 /// \param Results The set of results to augment.
6515 ///
6516 /// \returns the Objective-C method declaration that would be invoked by
6517 /// this "super" completion. If NULL, no completion was added.
6518 static ObjCMethodDecl *
6519 AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,
6520                        ArrayRef<IdentifierInfo *> SelIdents,
6521                        ResultBuilder &Results) {
6522   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
6523   if (!CurMethod)
6524     return nullptr;
6525 
6526   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
6527   if (!Class)
6528     return nullptr;
6529 
6530   // Try to find a superclass method with the same selector.
6531   ObjCMethodDecl *SuperMethod = nullptr;
6532   while ((Class = Class->getSuperClass()) && !SuperMethod) {
6533     // Check in the class
6534     SuperMethod = Class->getMethod(CurMethod->getSelector(),
6535                                    CurMethod->isInstanceMethod());
6536 
6537     // Check in categories or class extensions.
6538     if (!SuperMethod) {
6539       for (const auto *Cat : Class->known_categories()) {
6540         if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(),
6541                                           CurMethod->isInstanceMethod())))
6542           break;
6543       }
6544     }
6545   }
6546 
6547   if (!SuperMethod)
6548     return nullptr;
6549 
6550   // Check whether the superclass method has the same signature.
6551   if (CurMethod->param_size() != SuperMethod->param_size() ||
6552       CurMethod->isVariadic() != SuperMethod->isVariadic())
6553     return nullptr;
6554 
6555   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
6556                                       CurPEnd = CurMethod->param_end(),
6557                                       SuperP = SuperMethod->param_begin();
6558        CurP != CurPEnd; ++CurP, ++SuperP) {
6559     // Make sure the parameter types are compatible.
6560     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
6561                                           (*SuperP)->getType()))
6562       return nullptr;
6563 
6564     // Make sure we have a parameter name to forward!
6565     if (!(*CurP)->getIdentifier())
6566       return nullptr;
6567   }
6568 
6569   // We have a superclass method. Now, form the send-to-super completion.
6570   CodeCompletionBuilder Builder(Results.getAllocator(),
6571                                 Results.getCodeCompletionTUInfo());
6572 
6573   // Give this completion a return type.
6574   AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod,
6575                      Results.getCompletionContext().getBaseType(), Builder);
6576 
6577   // If we need the "super" keyword, add it (plus some spacing).
6578   if (NeedSuperKeyword) {
6579     Builder.AddTypedTextChunk("super");
6580     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6581   }
6582 
6583   Selector Sel = CurMethod->getSelector();
6584   if (Sel.isUnarySelector()) {
6585     if (NeedSuperKeyword)
6586       Builder.AddTextChunk(
6587           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
6588     else
6589       Builder.AddTypedTextChunk(
6590           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
6591   } else {
6592     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
6593     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
6594       if (I > SelIdents.size())
6595         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6596 
6597       if (I < SelIdents.size())
6598         Builder.AddInformativeChunk(
6599             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6600       else if (NeedSuperKeyword || I > SelIdents.size()) {
6601         Builder.AddTextChunk(
6602             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6603         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
6604             (*CurP)->getIdentifier()->getName()));
6605       } else {
6606         Builder.AddTypedTextChunk(
6607             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6608         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
6609             (*CurP)->getIdentifier()->getName()));
6610       }
6611     }
6612   }
6613 
6614   Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod,
6615                                          CCP_SuperCompletion));
6616   return SuperMethod;
6617 }
6618 
6619 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {
6620   typedef CodeCompletionResult Result;
6621   ResultBuilder Results(
6622       *this, CodeCompleter->getAllocator(),
6623       CodeCompleter->getCodeCompletionTUInfo(),
6624       CodeCompletionContext::CCC_ObjCMessageReceiver,
6625       getLangOpts().CPlusPlus11
6626           ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
6627           : &ResultBuilder::IsObjCMessageReceiver);
6628 
6629   CodeCompletionDeclConsumer Consumer(Results, CurContext);
6630   Results.EnterNewScope();
6631   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6632                      CodeCompleter->includeGlobals(),
6633                      CodeCompleter->loadExternal());
6634 
6635   // If we are in an Objective-C method inside a class that has a superclass,
6636   // add "super" as an option.
6637   if (ObjCMethodDecl *Method = getCurMethodDecl())
6638     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
6639       if (Iface->getSuperClass()) {
6640         Results.AddResult(Result("super"));
6641 
6642         AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results);
6643       }
6644 
6645   if (getLangOpts().CPlusPlus11)
6646     addThisCompletion(*this, Results);
6647 
6648   Results.ExitScope();
6649 
6650   if (CodeCompleter->includeMacros())
6651     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
6652   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6653                             Results.data(), Results.size());
6654 }
6655 
6656 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
6657                                         ArrayRef<IdentifierInfo *> SelIdents,
6658                                         bool AtArgumentExpression) {
6659   ObjCInterfaceDecl *CDecl = nullptr;
6660   if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
6661     // Figure out which interface we're in.
6662     CDecl = CurMethod->getClassInterface();
6663     if (!CDecl)
6664       return;
6665 
6666     // Find the superclass of this class.
6667     CDecl = CDecl->getSuperClass();
6668     if (!CDecl)
6669       return;
6670 
6671     if (CurMethod->isInstanceMethod()) {
6672       // We are inside an instance method, which means that the message
6673       // send [super ...] is actually calling an instance method on the
6674       // current object.
6675       return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents,
6676                                              AtArgumentExpression, CDecl);
6677     }
6678 
6679     // Fall through to send to the superclass in CDecl.
6680   } else {
6681     // "super" may be the name of a type or variable. Figure out which
6682     // it is.
6683     IdentifierInfo *Super = getSuperIdentifier();
6684     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, LookupOrdinaryName);
6685     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
6686       // "super" names an interface. Use it.
6687     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
6688       if (const ObjCObjectType *Iface =
6689               Context.getTypeDeclType(TD)->getAs<ObjCObjectType>())
6690         CDecl = Iface->getInterface();
6691     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
6692       // "super" names an unresolved type; we can't be more specific.
6693     } else {
6694       // Assume that "super" names some kind of value and parse that way.
6695       CXXScopeSpec SS;
6696       SourceLocation TemplateKWLoc;
6697       UnqualifiedId id;
6698       id.setIdentifier(Super, SuperLoc);
6699       ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id,
6700                                                /*HasTrailingLParen=*/false,
6701                                                /*IsAddressOfOperand=*/false);
6702       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
6703                                              SelIdents, AtArgumentExpression);
6704     }
6705 
6706     // Fall through
6707   }
6708 
6709   ParsedType Receiver;
6710   if (CDecl)
6711     Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));
6712   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
6713                                       AtArgumentExpression,
6714                                       /*IsSuper=*/true);
6715 }
6716 
6717 /// Given a set of code-completion results for the argument of a message
6718 /// send, determine the preferred type (if any) for that argument expression.
6719 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
6720                                                        unsigned NumSelIdents) {
6721   typedef CodeCompletionResult Result;
6722   ASTContext &Context = Results.getSema().Context;
6723 
6724   QualType PreferredType;
6725   unsigned BestPriority = CCP_Unlikely * 2;
6726   Result *ResultsData = Results.data();
6727   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
6728     Result &R = ResultsData[I];
6729     if (R.Kind == Result::RK_Declaration &&
6730         isa<ObjCMethodDecl>(R.Declaration)) {
6731       if (R.Priority <= BestPriority) {
6732         const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
6733         if (NumSelIdents <= Method->param_size()) {
6734           QualType MyPreferredType =
6735               Method->parameters()[NumSelIdents - 1]->getType();
6736           if (R.Priority < BestPriority || PreferredType.isNull()) {
6737             BestPriority = R.Priority;
6738             PreferredType = MyPreferredType;
6739           } else if (!Context.hasSameUnqualifiedType(PreferredType,
6740                                                      MyPreferredType)) {
6741             PreferredType = QualType();
6742           }
6743         }
6744       }
6745     }
6746   }
6747 
6748   return PreferredType;
6749 }
6750 
6751 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
6752                                        ParsedType Receiver,
6753                                        ArrayRef<IdentifierInfo *> SelIdents,
6754                                        bool AtArgumentExpression, bool IsSuper,
6755                                        ResultBuilder &Results) {
6756   typedef CodeCompletionResult Result;
6757   ObjCInterfaceDecl *CDecl = nullptr;
6758 
6759   // If the given name refers to an interface type, retrieve the
6760   // corresponding declaration.
6761   if (Receiver) {
6762     QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr);
6763     if (!T.isNull())
6764       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
6765         CDecl = Interface->getInterface();
6766   }
6767 
6768   // Add all of the factory methods in this Objective-C class, its protocols,
6769   // superclasses, categories, implementation, etc.
6770   Results.EnterNewScope();
6771 
6772   // If this is a send-to-super, try to add the special "super" send
6773   // completion.
6774   if (IsSuper) {
6775     if (ObjCMethodDecl *SuperMethod =
6776             AddSuperSendCompletion(SemaRef, false, SelIdents, Results))
6777       Results.Ignore(SuperMethod);
6778   }
6779 
6780   // If we're inside an Objective-C method definition, prefer its selector to
6781   // others.
6782   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
6783     Results.setPreferredSelector(CurMethod->getSelector());
6784 
6785   VisitedSelectorSet Selectors;
6786   if (CDecl)
6787     AddObjCMethods(CDecl, false, MK_Any, SelIdents, SemaRef.CurContext,
6788                    Selectors, AtArgumentExpression, Results);
6789   else {
6790     // We're messaging "id" as a type; provide all class/factory methods.
6791 
6792     // If we have an external source, load the entire class method
6793     // pool from the AST file.
6794     if (SemaRef.getExternalSource()) {
6795       for (uint32_t I = 0,
6796                     N = SemaRef.getExternalSource()->GetNumExternalSelectors();
6797            I != N; ++I) {
6798         Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I);
6799         if (Sel.isNull() || SemaRef.MethodPool.count(Sel))
6800           continue;
6801 
6802         SemaRef.ReadMethodPool(Sel);
6803       }
6804     }
6805 
6806     for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(),
6807                                           MEnd = SemaRef.MethodPool.end();
6808          M != MEnd; ++M) {
6809       for (ObjCMethodList *MethList = &M->second.second;
6810            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
6811         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
6812           continue;
6813 
6814         Result R(MethList->getMethod(),
6815                  Results.getBasePriority(MethList->getMethod()), nullptr);
6816         R.StartParameter = SelIdents.size();
6817         R.AllParametersAreInformative = false;
6818         Results.MaybeAddResult(R, SemaRef.CurContext);
6819       }
6820     }
6821   }
6822 
6823   Results.ExitScope();
6824 }
6825 
6826 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
6827                                         ArrayRef<IdentifierInfo *> SelIdents,
6828                                         bool AtArgumentExpression,
6829                                         bool IsSuper) {
6830 
6831   QualType T = this->GetTypeFromParser(Receiver);
6832 
6833   ResultBuilder Results(
6834       *this, CodeCompleter->getAllocator(),
6835       CodeCompleter->getCodeCompletionTUInfo(),
6836       CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, T,
6837                             SelIdents));
6838 
6839   AddClassMessageCompletions(*this, S, Receiver, SelIdents,
6840                              AtArgumentExpression, IsSuper, Results);
6841 
6842   // If we're actually at the argument expression (rather than prior to the
6843   // selector), we're actually performing code completion for an expression.
6844   // Determine whether we have a single, best method. If so, we can
6845   // code-complete the expression using the corresponding parameter type as
6846   // our preferred type, improving completion results.
6847   if (AtArgumentExpression) {
6848     QualType PreferredType =
6849         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
6850     if (PreferredType.isNull())
6851       CodeCompleteOrdinaryName(S, PCC_Expression);
6852     else
6853       CodeCompleteExpression(S, PreferredType);
6854     return;
6855   }
6856 
6857   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6858                             Results.data(), Results.size());
6859 }
6860 
6861 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,
6862                                            ArrayRef<IdentifierInfo *> SelIdents,
6863                                            bool AtArgumentExpression,
6864                                            ObjCInterfaceDecl *Super) {
6865   typedef CodeCompletionResult Result;
6866 
6867   Expr *RecExpr = static_cast<Expr *>(Receiver);
6868 
6869   // If necessary, apply function/array conversion to the receiver.
6870   // C99 6.7.5.3p[7,8].
6871   if (RecExpr) {
6872     ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr);
6873     if (Conv.isInvalid()) // conversion failed. bail.
6874       return;
6875     RecExpr = Conv.get();
6876   }
6877   QualType ReceiverType = RecExpr
6878                               ? RecExpr->getType()
6879                               : Super ? Context.getObjCObjectPointerType(
6880                                             Context.getObjCInterfaceType(Super))
6881                                       : Context.getObjCIdType();
6882 
6883   // If we're messaging an expression with type "id" or "Class", check
6884   // whether we know something special about the receiver that allows
6885   // us to assume a more-specific receiver type.
6886   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) {
6887     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
6888       if (ReceiverType->isObjCClassType())
6889         return CodeCompleteObjCClassMessage(
6890             S, ParsedType::make(Context.getObjCInterfaceType(IFace)), SelIdents,
6891             AtArgumentExpression, Super);
6892 
6893       ReceiverType =
6894           Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace));
6895     }
6896   } else if (RecExpr && getLangOpts().CPlusPlus) {
6897     ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr);
6898     if (Conv.isUsable()) {
6899       RecExpr = Conv.get();
6900       ReceiverType = RecExpr->getType();
6901     }
6902   }
6903 
6904   // Build the set of methods we can see.
6905   ResultBuilder Results(
6906       *this, CodeCompleter->getAllocator(),
6907       CodeCompleter->getCodeCompletionTUInfo(),
6908       CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
6909                             ReceiverType, SelIdents));
6910 
6911   Results.EnterNewScope();
6912 
6913   // If this is a send-to-super, try to add the special "super" send
6914   // completion.
6915   if (Super) {
6916     if (ObjCMethodDecl *SuperMethod =
6917             AddSuperSendCompletion(*this, false, SelIdents, Results))
6918       Results.Ignore(SuperMethod);
6919   }
6920 
6921   // If we're inside an Objective-C method definition, prefer its selector to
6922   // others.
6923   if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
6924     Results.setPreferredSelector(CurMethod->getSelector());
6925 
6926   // Keep track of the selectors we've already added.
6927   VisitedSelectorSet Selectors;
6928 
6929   // Handle messages to Class. This really isn't a message to an instance
6930   // method, so we treat it the same way we would treat a message send to a
6931   // class method.
6932   if (ReceiverType->isObjCClassType() ||
6933       ReceiverType->isObjCQualifiedClassType()) {
6934     if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
6935       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
6936         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, CurContext,
6937                        Selectors, AtArgumentExpression, Results);
6938     }
6939   }
6940   // Handle messages to a qualified ID ("id<foo>").
6941   else if (const ObjCObjectPointerType *QualID =
6942                ReceiverType->getAsObjCQualifiedIdType()) {
6943     // Search protocols for instance methods.
6944     for (auto *I : QualID->quals())
6945       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors,
6946                      AtArgumentExpression, Results);
6947   }
6948   // Handle messages to a pointer to interface type.
6949   else if (const ObjCObjectPointerType *IFacePtr =
6950                ReceiverType->getAsObjCInterfacePointerType()) {
6951     // Search the class, its superclasses, etc., for instance methods.
6952     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
6953                    CurContext, Selectors, AtArgumentExpression, Results);
6954 
6955     // Search protocols for instance methods.
6956     for (auto *I : IFacePtr->quals())
6957       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors,
6958                      AtArgumentExpression, Results);
6959   }
6960   // Handle messages to "id".
6961   else if (ReceiverType->isObjCIdType()) {
6962     // We're messaging "id", so provide all instance methods we know
6963     // about as code-completion results.
6964 
6965     // If we have an external source, load the entire class method
6966     // pool from the AST file.
6967     if (ExternalSource) {
6968       for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
6969            I != N; ++I) {
6970         Selector Sel = ExternalSource->GetExternalSelector(I);
6971         if (Sel.isNull() || MethodPool.count(Sel))
6972           continue;
6973 
6974         ReadMethodPool(Sel);
6975       }
6976     }
6977 
6978     for (GlobalMethodPool::iterator M = MethodPool.begin(),
6979                                     MEnd = MethodPool.end();
6980          M != MEnd; ++M) {
6981       for (ObjCMethodList *MethList = &M->second.first;
6982            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
6983         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
6984           continue;
6985 
6986         if (!Selectors.insert(MethList->getMethod()->getSelector()).second)
6987           continue;
6988 
6989         Result R(MethList->getMethod(),
6990                  Results.getBasePriority(MethList->getMethod()), nullptr);
6991         R.StartParameter = SelIdents.size();
6992         R.AllParametersAreInformative = false;
6993         Results.MaybeAddResult(R, CurContext);
6994       }
6995     }
6996   }
6997   Results.ExitScope();
6998 
6999   // If we're actually at the argument expression (rather than prior to the
7000   // selector), we're actually performing code completion for an expression.
7001   // Determine whether we have a single, best method. If so, we can
7002   // code-complete the expression using the corresponding parameter type as
7003   // our preferred type, improving completion results.
7004   if (AtArgumentExpression) {
7005     QualType PreferredType =
7006         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
7007     if (PreferredType.isNull())
7008       CodeCompleteOrdinaryName(S, PCC_Expression);
7009     else
7010       CodeCompleteExpression(S, PreferredType);
7011     return;
7012   }
7013 
7014   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7015                             Results.data(), Results.size());
7016 }
7017 
7018 void Sema::CodeCompleteObjCForCollection(Scope *S,
7019                                          DeclGroupPtrTy IterationVar) {
7020   CodeCompleteExpressionData Data;
7021   Data.ObjCCollection = true;
7022 
7023   if (IterationVar.getAsOpaquePtr()) {
7024     DeclGroupRef DG = IterationVar.get();
7025     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
7026       if (*I)
7027         Data.IgnoreDecls.push_back(*I);
7028     }
7029   }
7030 
7031   CodeCompleteExpression(S, Data);
7032 }
7033 
7034 void Sema::CodeCompleteObjCSelector(Scope *S,
7035                                     ArrayRef<IdentifierInfo *> SelIdents) {
7036   // If we have an external source, load the entire class method
7037   // pool from the AST file.
7038   if (ExternalSource) {
7039     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N;
7040          ++I) {
7041       Selector Sel = ExternalSource->GetExternalSelector(I);
7042       if (Sel.isNull() || MethodPool.count(Sel))
7043         continue;
7044 
7045       ReadMethodPool(Sel);
7046     }
7047   }
7048 
7049   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7050                         CodeCompleter->getCodeCompletionTUInfo(),
7051                         CodeCompletionContext::CCC_SelectorName);
7052   Results.EnterNewScope();
7053   for (GlobalMethodPool::iterator M = MethodPool.begin(),
7054                                   MEnd = MethodPool.end();
7055        M != MEnd; ++M) {
7056 
7057     Selector Sel = M->first;
7058     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents))
7059       continue;
7060 
7061     CodeCompletionBuilder Builder(Results.getAllocator(),
7062                                   Results.getCodeCompletionTUInfo());
7063     if (Sel.isUnarySelector()) {
7064       Builder.AddTypedTextChunk(
7065           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
7066       Results.AddResult(Builder.TakeString());
7067       continue;
7068     }
7069 
7070     std::string Accumulator;
7071     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
7072       if (I == SelIdents.size()) {
7073         if (!Accumulator.empty()) {
7074           Builder.AddInformativeChunk(
7075               Builder.getAllocator().CopyString(Accumulator));
7076           Accumulator.clear();
7077         }
7078       }
7079 
7080       Accumulator += Sel.getNameForSlot(I);
7081       Accumulator += ':';
7082     }
7083     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator));
7084     Results.AddResult(Builder.TakeString());
7085   }
7086   Results.ExitScope();
7087 
7088   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7089                             Results.data(), Results.size());
7090 }
7091 
7092 /// Add all of the protocol declarations that we find in the given
7093 /// (translation unit) context.
7094 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
7095                                bool OnlyForwardDeclarations,
7096                                ResultBuilder &Results) {
7097   typedef CodeCompletionResult Result;
7098 
7099   for (const auto *D : Ctx->decls()) {
7100     // Record any protocols we find.
7101     if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D))
7102       if (!OnlyForwardDeclarations || !Proto->hasDefinition())
7103         Results.AddResult(
7104             Result(Proto, Results.getBasePriority(Proto), nullptr), CurContext,
7105             nullptr, false);
7106   }
7107 }
7108 
7109 void Sema::CodeCompleteObjCProtocolReferences(
7110     ArrayRef<IdentifierLocPair> Protocols) {
7111   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7112                         CodeCompleter->getCodeCompletionTUInfo(),
7113                         CodeCompletionContext::CCC_ObjCProtocolName);
7114 
7115   if (CodeCompleter->includeGlobals()) {
7116     Results.EnterNewScope();
7117 
7118     // Tell the result set to ignore all of the protocols we have
7119     // already seen.
7120     // FIXME: This doesn't work when caching code-completion results.
7121     for (const IdentifierLocPair &Pair : Protocols)
7122       if (ObjCProtocolDecl *Protocol = LookupProtocol(Pair.first, Pair.second))
7123         Results.Ignore(Protocol);
7124 
7125     // Add all protocols.
7126     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false,
7127                        Results);
7128 
7129     Results.ExitScope();
7130   }
7131 
7132   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7133                             Results.data(), Results.size());
7134 }
7135 
7136 void Sema::CodeCompleteObjCProtocolDecl(Scope *) {
7137   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7138                         CodeCompleter->getCodeCompletionTUInfo(),
7139                         CodeCompletionContext::CCC_ObjCProtocolName);
7140 
7141   if (CodeCompleter->includeGlobals()) {
7142     Results.EnterNewScope();
7143 
7144     // Add all protocols.
7145     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true,
7146                        Results);
7147 
7148     Results.ExitScope();
7149   }
7150 
7151   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7152                             Results.data(), Results.size());
7153 }
7154 
7155 /// Add all of the Objective-C interface declarations that we find in
7156 /// the given (translation unit) context.
7157 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
7158                                 bool OnlyForwardDeclarations,
7159                                 bool OnlyUnimplemented,
7160                                 ResultBuilder &Results) {
7161   typedef CodeCompletionResult Result;
7162 
7163   for (const auto *D : Ctx->decls()) {
7164     // Record any interfaces we find.
7165     if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
7166       if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
7167           (!OnlyUnimplemented || !Class->getImplementation()))
7168         Results.AddResult(
7169             Result(Class, Results.getBasePriority(Class), nullptr), CurContext,
7170             nullptr, false);
7171   }
7172 }
7173 
7174 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
7175   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7176                         CodeCompleter->getCodeCompletionTUInfo(),
7177                         CodeCompletionContext::CCC_ObjCInterfaceName);
7178   Results.EnterNewScope();
7179 
7180   if (CodeCompleter->includeGlobals()) {
7181     // Add all classes.
7182     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
7183                         false, Results);
7184   }
7185 
7186   Results.ExitScope();
7187 
7188   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7189                             Results.data(), Results.size());
7190 }
7191 
7192 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
7193                                       SourceLocation ClassNameLoc) {
7194   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7195                         CodeCompleter->getCodeCompletionTUInfo(),
7196                         CodeCompletionContext::CCC_ObjCInterfaceName);
7197   Results.EnterNewScope();
7198 
7199   // Make sure that we ignore the class we're currently defining.
7200   NamedDecl *CurClass =
7201       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
7202   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
7203     Results.Ignore(CurClass);
7204 
7205   if (CodeCompleter->includeGlobals()) {
7206     // Add all classes.
7207     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
7208                         false, Results);
7209   }
7210 
7211   Results.ExitScope();
7212 
7213   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7214                             Results.data(), Results.size());
7215 }
7216 
7217 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
7218   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7219                         CodeCompleter->getCodeCompletionTUInfo(),
7220                         CodeCompletionContext::CCC_ObjCImplementation);
7221   Results.EnterNewScope();
7222 
7223   if (CodeCompleter->includeGlobals()) {
7224     // Add all unimplemented classes.
7225     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
7226                         true, Results);
7227   }
7228 
7229   Results.ExitScope();
7230 
7231   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7232                             Results.data(), Results.size());
7233 }
7234 
7235 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
7236                                              IdentifierInfo *ClassName,
7237                                              SourceLocation ClassNameLoc) {
7238   typedef CodeCompletionResult Result;
7239 
7240   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7241                         CodeCompleter->getCodeCompletionTUInfo(),
7242                         CodeCompletionContext::CCC_ObjCCategoryName);
7243 
7244   // Ignore any categories we find that have already been implemented by this
7245   // interface.
7246   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
7247   NamedDecl *CurClass =
7248       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
7249   if (ObjCInterfaceDecl *Class =
7250           dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) {
7251     for (const auto *Cat : Class->visible_categories())
7252       CategoryNames.insert(Cat->getIdentifier());
7253   }
7254 
7255   // Add all of the categories we know about.
7256   Results.EnterNewScope();
7257   TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
7258   for (const auto *D : TU->decls())
7259     if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D))
7260       if (CategoryNames.insert(Category->getIdentifier()).second)
7261         Results.AddResult(
7262             Result(Category, Results.getBasePriority(Category), nullptr),
7263             CurContext, nullptr, false);
7264   Results.ExitScope();
7265 
7266   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7267                             Results.data(), Results.size());
7268 }
7269 
7270 void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
7271                                                   IdentifierInfo *ClassName,
7272                                                   SourceLocation ClassNameLoc) {
7273   typedef CodeCompletionResult Result;
7274 
7275   // Find the corresponding interface. If we couldn't find the interface, the
7276   // program itself is ill-formed. However, we'll try to be helpful still by
7277   // providing the list of all of the categories we know about.
7278   NamedDecl *CurClass =
7279       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
7280   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
7281   if (!Class)
7282     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
7283 
7284   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7285                         CodeCompleter->getCodeCompletionTUInfo(),
7286                         CodeCompletionContext::CCC_ObjCCategoryName);
7287 
7288   // Add all of the categories that have have corresponding interface
7289   // declarations in this class and any of its superclasses, except for
7290   // already-implemented categories in the class itself.
7291   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
7292   Results.EnterNewScope();
7293   bool IgnoreImplemented = true;
7294   while (Class) {
7295     for (const auto *Cat : Class->visible_categories()) {
7296       if ((!IgnoreImplemented || !Cat->getImplementation()) &&
7297           CategoryNames.insert(Cat->getIdentifier()).second)
7298         Results.AddResult(Result(Cat, Results.getBasePriority(Cat), nullptr),
7299                           CurContext, nullptr, false);
7300     }
7301 
7302     Class = Class->getSuperClass();
7303     IgnoreImplemented = false;
7304   }
7305   Results.ExitScope();
7306 
7307   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7308                             Results.data(), Results.size());
7309 }
7310 
7311 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) {
7312   CodeCompletionContext CCContext(CodeCompletionContext::CCC_Other);
7313   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7314                         CodeCompleter->getCodeCompletionTUInfo(), CCContext);
7315 
7316   // Figure out where this @synthesize lives.
7317   ObjCContainerDecl *Container =
7318       dyn_cast_or_null<ObjCContainerDecl>(CurContext);
7319   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
7320                      !isa<ObjCCategoryImplDecl>(Container)))
7321     return;
7322 
7323   // Ignore any properties that have already been implemented.
7324   Container = getContainerDef(Container);
7325   for (const auto *D : Container->decls())
7326     if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D))
7327       Results.Ignore(PropertyImpl->getPropertyDecl());
7328 
7329   // Add any properties that we find.
7330   AddedPropertiesSet AddedProperties;
7331   Results.EnterNewScope();
7332   if (ObjCImplementationDecl *ClassImpl =
7333           dyn_cast<ObjCImplementationDecl>(Container))
7334     AddObjCProperties(CCContext, ClassImpl->getClassInterface(), false,
7335                       /*AllowNullaryMethods=*/false, CurContext,
7336                       AddedProperties, Results);
7337   else
7338     AddObjCProperties(CCContext,
7339                       cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
7340                       false, /*AllowNullaryMethods=*/false, CurContext,
7341                       AddedProperties, Results);
7342   Results.ExitScope();
7343 
7344   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7345                             Results.data(), Results.size());
7346 }
7347 
7348 void Sema::CodeCompleteObjCPropertySynthesizeIvar(
7349     Scope *S, IdentifierInfo *PropertyName) {
7350   typedef CodeCompletionResult Result;
7351   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7352                         CodeCompleter->getCodeCompletionTUInfo(),
7353                         CodeCompletionContext::CCC_Other);
7354 
7355   // Figure out where this @synthesize lives.
7356   ObjCContainerDecl *Container =
7357       dyn_cast_or_null<ObjCContainerDecl>(CurContext);
7358   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
7359                      !isa<ObjCCategoryImplDecl>(Container)))
7360     return;
7361 
7362   // Figure out which interface we're looking into.
7363   ObjCInterfaceDecl *Class = nullptr;
7364   if (ObjCImplementationDecl *ClassImpl =
7365           dyn_cast<ObjCImplementationDecl>(Container))
7366     Class = ClassImpl->getClassInterface();
7367   else
7368     Class = cast<ObjCCategoryImplDecl>(Container)
7369                 ->getCategoryDecl()
7370                 ->getClassInterface();
7371 
7372   // Determine the type of the property we're synthesizing.
7373   QualType PropertyType = Context.getObjCIdType();
7374   if (Class) {
7375     if (ObjCPropertyDecl *Property = Class->FindPropertyDeclaration(
7376             PropertyName, ObjCPropertyQueryKind::OBJC_PR_query_instance)) {
7377       PropertyType =
7378           Property->getType().getNonReferenceType().getUnqualifiedType();
7379 
7380       // Give preference to ivars
7381       Results.setPreferredType(PropertyType);
7382     }
7383   }
7384 
7385   // Add all of the instance variables in this class and its superclasses.
7386   Results.EnterNewScope();
7387   bool SawSimilarlyNamedIvar = false;
7388   std::string NameWithPrefix;
7389   NameWithPrefix += '_';
7390   NameWithPrefix += PropertyName->getName();
7391   std::string NameWithSuffix = PropertyName->getName().str();
7392   NameWithSuffix += '_';
7393   for (; Class; Class = Class->getSuperClass()) {
7394     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
7395          Ivar = Ivar->getNextIvar()) {
7396       Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), nullptr),
7397                         CurContext, nullptr, false);
7398 
7399       // Determine whether we've seen an ivar with a name similar to the
7400       // property.
7401       if ((PropertyName == Ivar->getIdentifier() ||
7402            NameWithPrefix == Ivar->getName() ||
7403            NameWithSuffix == Ivar->getName())) {
7404         SawSimilarlyNamedIvar = true;
7405 
7406         // Reduce the priority of this result by one, to give it a slight
7407         // advantage over other results whose names don't match so closely.
7408         if (Results.size() &&
7409             Results.data()[Results.size() - 1].Kind ==
7410                 CodeCompletionResult::RK_Declaration &&
7411             Results.data()[Results.size() - 1].Declaration == Ivar)
7412           Results.data()[Results.size() - 1].Priority--;
7413       }
7414     }
7415   }
7416 
7417   if (!SawSimilarlyNamedIvar) {
7418     // Create ivar result _propName, that the user can use to synthesize
7419     // an ivar of the appropriate type.
7420     unsigned Priority = CCP_MemberDeclaration + 1;
7421     typedef CodeCompletionResult Result;
7422     CodeCompletionAllocator &Allocator = Results.getAllocator();
7423     CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(),
7424                                   Priority, CXAvailability_Available);
7425 
7426     PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
7427     Builder.AddResultTypeChunk(
7428         GetCompletionTypeString(PropertyType, Context, Policy, Allocator));
7429     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
7430     Results.AddResult(
7431         Result(Builder.TakeString(), Priority, CXCursor_ObjCIvarDecl));
7432   }
7433 
7434   Results.ExitScope();
7435 
7436   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7437                             Results.data(), Results.size());
7438 }
7439 
7440 // Mapping from selectors to the methods that implement that selector, along
7441 // with the "in original class" flag.
7442 typedef llvm::DenseMap<Selector,
7443                        llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>>
7444     KnownMethodsMap;
7445 
7446 /// Find all of the methods that reside in the given container
7447 /// (and its superclasses, protocols, etc.) that meet the given
7448 /// criteria. Insert those methods into the map of known methods,
7449 /// indexed by selector so they can be easily found.
7450 static void FindImplementableMethods(ASTContext &Context,
7451                                      ObjCContainerDecl *Container,
7452                                      Optional<bool> WantInstanceMethods,
7453                                      QualType ReturnType,
7454                                      KnownMethodsMap &KnownMethods,
7455                                      bool InOriginalClass = true) {
7456   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
7457     // Make sure we have a definition; that's what we'll walk.
7458     if (!IFace->hasDefinition())
7459       return;
7460 
7461     IFace = IFace->getDefinition();
7462     Container = IFace;
7463 
7464     const ObjCList<ObjCProtocolDecl> &Protocols =
7465         IFace->getReferencedProtocols();
7466     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7467                                               E = Protocols.end();
7468          I != E; ++I)
7469       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
7470                                KnownMethods, InOriginalClass);
7471 
7472     // Add methods from any class extensions and categories.
7473     for (auto *Cat : IFace->visible_categories()) {
7474       FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType,
7475                                KnownMethods, false);
7476     }
7477 
7478     // Visit the superclass.
7479     if (IFace->getSuperClass())
7480       FindImplementableMethods(Context, IFace->getSuperClass(),
7481                                WantInstanceMethods, ReturnType, KnownMethods,
7482                                false);
7483   }
7484 
7485   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
7486     // Recurse into protocols.
7487     const ObjCList<ObjCProtocolDecl> &Protocols =
7488         Category->getReferencedProtocols();
7489     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7490                                               E = Protocols.end();
7491          I != E; ++I)
7492       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
7493                                KnownMethods, InOriginalClass);
7494 
7495     // If this category is the original class, jump to the interface.
7496     if (InOriginalClass && Category->getClassInterface())
7497       FindImplementableMethods(Context, Category->getClassInterface(),
7498                                WantInstanceMethods, ReturnType, KnownMethods,
7499                                false);
7500   }
7501 
7502   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
7503     // Make sure we have a definition; that's what we'll walk.
7504     if (!Protocol->hasDefinition())
7505       return;
7506     Protocol = Protocol->getDefinition();
7507     Container = Protocol;
7508 
7509     // Recurse into protocols.
7510     const ObjCList<ObjCProtocolDecl> &Protocols =
7511         Protocol->getReferencedProtocols();
7512     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7513                                               E = Protocols.end();
7514          I != E; ++I)
7515       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
7516                                KnownMethods, false);
7517   }
7518 
7519   // Add methods in this container. This operation occurs last because
7520   // we want the methods from this container to override any methods
7521   // we've previously seen with the same selector.
7522   for (auto *M : Container->methods()) {
7523     if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) {
7524       if (!ReturnType.isNull() &&
7525           !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType()))
7526         continue;
7527 
7528       KnownMethods[M->getSelector()] =
7529           KnownMethodsMap::mapped_type(M, InOriginalClass);
7530     }
7531   }
7532 }
7533 
7534 /// Add the parenthesized return or parameter type chunk to a code
7535 /// completion string.
7536 static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals,
7537                                     ASTContext &Context,
7538                                     const PrintingPolicy &Policy,
7539                                     CodeCompletionBuilder &Builder) {
7540   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7541   std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals, Type);
7542   if (!Quals.empty())
7543     Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
7544   Builder.AddTextChunk(
7545       GetCompletionTypeString(Type, Context, Policy, Builder.getAllocator()));
7546   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7547 }
7548 
7549 /// Determine whether the given class is or inherits from a class by
7550 /// the given name.
7551 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name) {
7552   if (!Class)
7553     return false;
7554 
7555   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
7556     return true;
7557 
7558   return InheritsFromClassNamed(Class->getSuperClass(), Name);
7559 }
7560 
7561 /// Add code completions for Objective-C Key-Value Coding (KVC) and
7562 /// Key-Value Observing (KVO).
7563 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
7564                                        bool IsInstanceMethod,
7565                                        QualType ReturnType, ASTContext &Context,
7566                                        VisitedSelectorSet &KnownSelectors,
7567                                        ResultBuilder &Results) {
7568   IdentifierInfo *PropName = Property->getIdentifier();
7569   if (!PropName || PropName->getLength() == 0)
7570     return;
7571 
7572   PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
7573 
7574   // Builder that will create each code completion.
7575   typedef CodeCompletionResult Result;
7576   CodeCompletionAllocator &Allocator = Results.getAllocator();
7577   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
7578 
7579   // The selector table.
7580   SelectorTable &Selectors = Context.Selectors;
7581 
7582   // The property name, copied into the code completion allocation region
7583   // on demand.
7584   struct KeyHolder {
7585     CodeCompletionAllocator &Allocator;
7586     StringRef Key;
7587     const char *CopiedKey;
7588 
7589     KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key)
7590         : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {}
7591 
7592     operator const char *() {
7593       if (CopiedKey)
7594         return CopiedKey;
7595 
7596       return CopiedKey = Allocator.CopyString(Key);
7597     }
7598   } Key(Allocator, PropName->getName());
7599 
7600   // The uppercased name of the property name.
7601   std::string UpperKey = PropName->getName();
7602   if (!UpperKey.empty())
7603     UpperKey[0] = toUppercase(UpperKey[0]);
7604 
7605   bool ReturnTypeMatchesProperty =
7606       ReturnType.isNull() ||
7607       Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
7608                                      Property->getType());
7609   bool ReturnTypeMatchesVoid = ReturnType.isNull() || ReturnType->isVoidType();
7610 
7611   // Add the normal accessor -(type)key.
7612   if (IsInstanceMethod &&
7613       KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second &&
7614       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
7615     if (ReturnType.isNull())
7616       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
7617                               Builder);
7618 
7619     Builder.AddTypedTextChunk(Key);
7620     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
7621                              CXCursor_ObjCInstanceMethodDecl));
7622   }
7623 
7624   // If we have an integral or boolean property (or the user has provided
7625   // an integral or boolean return type), add the accessor -(type)isKey.
7626   if (IsInstanceMethod &&
7627       ((!ReturnType.isNull() &&
7628         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
7629        (ReturnType.isNull() && (Property->getType()->isIntegerType() ||
7630                                 Property->getType()->isBooleanType())))) {
7631     std::string SelectorName = (Twine("is") + UpperKey).str();
7632     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7633     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
7634             .second) {
7635       if (ReturnType.isNull()) {
7636         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7637         Builder.AddTextChunk("BOOL");
7638         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7639       }
7640 
7641       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
7642       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
7643                                CXCursor_ObjCInstanceMethodDecl));
7644     }
7645   }
7646 
7647   // Add the normal mutator.
7648   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
7649       !Property->getSetterMethodDecl()) {
7650     std::string SelectorName = (Twine("set") + UpperKey).str();
7651     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7652     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7653       if (ReturnType.isNull()) {
7654         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7655         Builder.AddTextChunk("void");
7656         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7657       }
7658 
7659       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
7660       Builder.AddTypedTextChunk(":");
7661       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
7662                               Builder);
7663       Builder.AddTextChunk(Key);
7664       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
7665                                CXCursor_ObjCInstanceMethodDecl));
7666     }
7667   }
7668 
7669   // Indexed and unordered accessors
7670   unsigned IndexedGetterPriority = CCP_CodePattern;
7671   unsigned IndexedSetterPriority = CCP_CodePattern;
7672   unsigned UnorderedGetterPriority = CCP_CodePattern;
7673   unsigned UnorderedSetterPriority = CCP_CodePattern;
7674   if (const auto *ObjCPointer =
7675           Property->getType()->getAs<ObjCObjectPointerType>()) {
7676     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
7677       // If this interface type is not provably derived from a known
7678       // collection, penalize the corresponding completions.
7679       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
7680         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
7681         if (!InheritsFromClassNamed(IFace, "NSArray"))
7682           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
7683       }
7684 
7685       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
7686         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
7687         if (!InheritsFromClassNamed(IFace, "NSSet"))
7688           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
7689       }
7690     }
7691   } else {
7692     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
7693     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
7694     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
7695     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
7696   }
7697 
7698   // Add -(NSUInteger)countOf<key>
7699   if (IsInstanceMethod &&
7700       (ReturnType.isNull() || ReturnType->isIntegerType())) {
7701     std::string SelectorName = (Twine("countOf") + UpperKey).str();
7702     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7703     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
7704             .second) {
7705       if (ReturnType.isNull()) {
7706         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7707         Builder.AddTextChunk("NSUInteger");
7708         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7709       }
7710 
7711       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
7712       Results.AddResult(
7713           Result(Builder.TakeString(),
7714                  std::min(IndexedGetterPriority, UnorderedGetterPriority),
7715                  CXCursor_ObjCInstanceMethodDecl));
7716     }
7717   }
7718 
7719   // Indexed getters
7720   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
7721   if (IsInstanceMethod &&
7722       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
7723     std::string SelectorName = (Twine("objectIn") + UpperKey + "AtIndex").str();
7724     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7725     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7726       if (ReturnType.isNull()) {
7727         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7728         Builder.AddTextChunk("id");
7729         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7730       }
7731 
7732       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7733       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7734       Builder.AddTextChunk("NSUInteger");
7735       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7736       Builder.AddTextChunk("index");
7737       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
7738                                CXCursor_ObjCInstanceMethodDecl));
7739     }
7740   }
7741 
7742   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
7743   if (IsInstanceMethod &&
7744       (ReturnType.isNull() ||
7745        (ReturnType->isObjCObjectPointerType() &&
7746         ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
7747         ReturnType->castAs<ObjCObjectPointerType>()
7748                 ->getInterfaceDecl()
7749                 ->getName() == "NSArray"))) {
7750     std::string SelectorName = (Twine(Property->getName()) + "AtIndexes").str();
7751     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7752     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7753       if (ReturnType.isNull()) {
7754         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7755         Builder.AddTextChunk("NSArray *");
7756         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7757       }
7758 
7759       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7760       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7761       Builder.AddTextChunk("NSIndexSet *");
7762       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7763       Builder.AddTextChunk("indexes");
7764       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
7765                                CXCursor_ObjCInstanceMethodDecl));
7766     }
7767   }
7768 
7769   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
7770   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7771     std::string SelectorName = (Twine("get") + UpperKey).str();
7772     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
7773                                       &Context.Idents.get("range")};
7774 
7775     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
7776       if (ReturnType.isNull()) {
7777         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7778         Builder.AddTextChunk("void");
7779         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7780       }
7781 
7782       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7783       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7784       Builder.AddPlaceholderChunk("object-type");
7785       Builder.AddTextChunk(" **");
7786       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7787       Builder.AddTextChunk("buffer");
7788       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7789       Builder.AddTypedTextChunk("range:");
7790       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7791       Builder.AddTextChunk("NSRange");
7792       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7793       Builder.AddTextChunk("inRange");
7794       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
7795                                CXCursor_ObjCInstanceMethodDecl));
7796     }
7797   }
7798 
7799   // Mutable indexed accessors
7800 
7801   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
7802   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7803     std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str();
7804     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get("insertObject"),
7805                                       &Context.Idents.get(SelectorName)};
7806 
7807     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
7808       if (ReturnType.isNull()) {
7809         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7810         Builder.AddTextChunk("void");
7811         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7812       }
7813 
7814       Builder.AddTypedTextChunk("insertObject:");
7815       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7816       Builder.AddPlaceholderChunk("object-type");
7817       Builder.AddTextChunk(" *");
7818       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7819       Builder.AddTextChunk("object");
7820       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7821       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7822       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7823       Builder.AddPlaceholderChunk("NSUInteger");
7824       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7825       Builder.AddTextChunk("index");
7826       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7827                                CXCursor_ObjCInstanceMethodDecl));
7828     }
7829   }
7830 
7831   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
7832   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7833     std::string SelectorName = (Twine("insert") + UpperKey).str();
7834     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
7835                                       &Context.Idents.get("atIndexes")};
7836 
7837     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
7838       if (ReturnType.isNull()) {
7839         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7840         Builder.AddTextChunk("void");
7841         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7842       }
7843 
7844       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7845       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7846       Builder.AddTextChunk("NSArray *");
7847       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7848       Builder.AddTextChunk("array");
7849       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7850       Builder.AddTypedTextChunk("atIndexes:");
7851       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7852       Builder.AddPlaceholderChunk("NSIndexSet *");
7853       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7854       Builder.AddTextChunk("indexes");
7855       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7856                                CXCursor_ObjCInstanceMethodDecl));
7857     }
7858   }
7859 
7860   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
7861   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7862     std::string SelectorName =
7863         (Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
7864     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7865     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7866       if (ReturnType.isNull()) {
7867         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7868         Builder.AddTextChunk("void");
7869         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7870       }
7871 
7872       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7873       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7874       Builder.AddTextChunk("NSUInteger");
7875       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7876       Builder.AddTextChunk("index");
7877       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7878                                CXCursor_ObjCInstanceMethodDecl));
7879     }
7880   }
7881 
7882   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
7883   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7884     std::string SelectorName = (Twine("remove") + UpperKey + "AtIndexes").str();
7885     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7886     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7887       if (ReturnType.isNull()) {
7888         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7889         Builder.AddTextChunk("void");
7890         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7891       }
7892 
7893       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7894       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7895       Builder.AddTextChunk("NSIndexSet *");
7896       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7897       Builder.AddTextChunk("indexes");
7898       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7899                                CXCursor_ObjCInstanceMethodDecl));
7900     }
7901   }
7902 
7903   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
7904   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7905     std::string SelectorName =
7906         (Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
7907     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
7908                                       &Context.Idents.get("withObject")};
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(SelectorName + ":"));
7918       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7919       Builder.AddPlaceholderChunk("NSUInteger");
7920       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7921       Builder.AddTextChunk("index");
7922       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7923       Builder.AddTypedTextChunk("withObject:");
7924       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7925       Builder.AddTextChunk("id");
7926       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7927       Builder.AddTextChunk("object");
7928       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7929                                CXCursor_ObjCInstanceMethodDecl));
7930     }
7931   }
7932 
7933   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
7934   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7935     std::string SelectorName1 =
7936         (Twine("replace") + UpperKey + "AtIndexes").str();
7937     std::string SelectorName2 = (Twine("with") + UpperKey).str();
7938     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1),
7939                                       &Context.Idents.get(SelectorName2)};
7940 
7941     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
7942       if (ReturnType.isNull()) {
7943         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7944         Builder.AddTextChunk("void");
7945         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7946       }
7947 
7948       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
7949       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7950       Builder.AddPlaceholderChunk("NSIndexSet *");
7951       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7952       Builder.AddTextChunk("indexes");
7953       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7954       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
7955       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7956       Builder.AddTextChunk("NSArray *");
7957       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7958       Builder.AddTextChunk("array");
7959       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7960                                CXCursor_ObjCInstanceMethodDecl));
7961     }
7962   }
7963 
7964   // Unordered getters
7965   // - (NSEnumerator *)enumeratorOfKey
7966   if (IsInstanceMethod &&
7967       (ReturnType.isNull() ||
7968        (ReturnType->isObjCObjectPointerType() &&
7969         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
7970         ReturnType->getAs<ObjCObjectPointerType>()
7971                 ->getInterfaceDecl()
7972                 ->getName() == "NSEnumerator"))) {
7973     std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str();
7974     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7975     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
7976             .second) {
7977       if (ReturnType.isNull()) {
7978         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7979         Builder.AddTextChunk("NSEnumerator *");
7980         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7981       }
7982 
7983       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
7984       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
7985                                CXCursor_ObjCInstanceMethodDecl));
7986     }
7987   }
7988 
7989   // - (type *)memberOfKey:(type *)object
7990   if (IsInstanceMethod &&
7991       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
7992     std::string SelectorName = (Twine("memberOf") + UpperKey).str();
7993     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7994     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7995       if (ReturnType.isNull()) {
7996         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7997         Builder.AddPlaceholderChunk("object-type");
7998         Builder.AddTextChunk(" *");
7999         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8000       }
8001 
8002       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8003       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8004       if (ReturnType.isNull()) {
8005         Builder.AddPlaceholderChunk("object-type");
8006         Builder.AddTextChunk(" *");
8007       } else {
8008         Builder.AddTextChunk(GetCompletionTypeString(
8009             ReturnType, Context, Policy, Builder.getAllocator()));
8010       }
8011       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8012       Builder.AddTextChunk("object");
8013       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
8014                                CXCursor_ObjCInstanceMethodDecl));
8015     }
8016   }
8017 
8018   // Mutable unordered accessors
8019   // - (void)addKeyObject:(type *)object
8020   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8021     std::string SelectorName =
8022         (Twine("add") + UpperKey + Twine("Object")).str();
8023     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8024     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8025       if (ReturnType.isNull()) {
8026         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8027         Builder.AddTextChunk("void");
8028         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8029       }
8030 
8031       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8032       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8033       Builder.AddPlaceholderChunk("object-type");
8034       Builder.AddTextChunk(" *");
8035       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8036       Builder.AddTextChunk("object");
8037       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8038                                CXCursor_ObjCInstanceMethodDecl));
8039     }
8040   }
8041 
8042   // - (void)addKey:(NSSet *)objects
8043   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8044     std::string SelectorName = (Twine("add") + UpperKey).str();
8045     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8046     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8047       if (ReturnType.isNull()) {
8048         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8049         Builder.AddTextChunk("void");
8050         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8051       }
8052 
8053       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8054       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8055       Builder.AddTextChunk("NSSet *");
8056       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8057       Builder.AddTextChunk("objects");
8058       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8059                                CXCursor_ObjCInstanceMethodDecl));
8060     }
8061   }
8062 
8063   // - (void)removeKeyObject:(type *)object
8064   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8065     std::string SelectorName =
8066         (Twine("remove") + UpperKey + Twine("Object")).str();
8067     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8068     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8069       if (ReturnType.isNull()) {
8070         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8071         Builder.AddTextChunk("void");
8072         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8073       }
8074 
8075       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8076       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8077       Builder.AddPlaceholderChunk("object-type");
8078       Builder.AddTextChunk(" *");
8079       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8080       Builder.AddTextChunk("object");
8081       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8082                                CXCursor_ObjCInstanceMethodDecl));
8083     }
8084   }
8085 
8086   // - (void)removeKey:(NSSet *)objects
8087   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8088     std::string SelectorName = (Twine("remove") + UpperKey).str();
8089     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8090     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8091       if (ReturnType.isNull()) {
8092         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8093         Builder.AddTextChunk("void");
8094         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8095       }
8096 
8097       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8098       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8099       Builder.AddTextChunk("NSSet *");
8100       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8101       Builder.AddTextChunk("objects");
8102       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8103                                CXCursor_ObjCInstanceMethodDecl));
8104     }
8105   }
8106 
8107   // - (void)intersectKey:(NSSet *)objects
8108   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8109     std::string SelectorName = (Twine("intersect") + UpperKey).str();
8110     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8111     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8112       if (ReturnType.isNull()) {
8113         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8114         Builder.AddTextChunk("void");
8115         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8116       }
8117 
8118       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8119       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8120       Builder.AddTextChunk("NSSet *");
8121       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8122       Builder.AddTextChunk("objects");
8123       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8124                                CXCursor_ObjCInstanceMethodDecl));
8125     }
8126   }
8127 
8128   // Key-Value Observing
8129   // + (NSSet *)keyPathsForValuesAffectingKey
8130   if (!IsInstanceMethod &&
8131       (ReturnType.isNull() ||
8132        (ReturnType->isObjCObjectPointerType() &&
8133         ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
8134         ReturnType->castAs<ObjCObjectPointerType>()
8135                 ->getInterfaceDecl()
8136                 ->getName() == "NSSet"))) {
8137     std::string SelectorName =
8138         (Twine("keyPathsForValuesAffecting") + UpperKey).str();
8139     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8140     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
8141             .second) {
8142       if (ReturnType.isNull()) {
8143         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8144         Builder.AddTextChunk("NSSet<NSString *> *");
8145         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8146       }
8147 
8148       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
8149       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
8150                                CXCursor_ObjCClassMethodDecl));
8151     }
8152   }
8153 
8154   // + (BOOL)automaticallyNotifiesObserversForKey
8155   if (!IsInstanceMethod &&
8156       (ReturnType.isNull() || ReturnType->isIntegerType() ||
8157        ReturnType->isBooleanType())) {
8158     std::string SelectorName =
8159         (Twine("automaticallyNotifiesObserversOf") + UpperKey).str();
8160     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8161     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
8162             .second) {
8163       if (ReturnType.isNull()) {
8164         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8165         Builder.AddTextChunk("BOOL");
8166         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8167       }
8168 
8169       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
8170       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
8171                                CXCursor_ObjCClassMethodDecl));
8172     }
8173   }
8174 }
8175 
8176 void Sema::CodeCompleteObjCMethodDecl(Scope *S, Optional<bool> IsInstanceMethod,
8177                                       ParsedType ReturnTy) {
8178   // Determine the return type of the method we're declaring, if
8179   // provided.
8180   QualType ReturnType = GetTypeFromParser(ReturnTy);
8181   Decl *IDecl = nullptr;
8182   if (CurContext->isObjCContainer()) {
8183     ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext);
8184     IDecl = OCD;
8185   }
8186   // Determine where we should start searching for methods.
8187   ObjCContainerDecl *SearchDecl = nullptr;
8188   bool IsInImplementation = false;
8189   if (Decl *D = IDecl) {
8190     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
8191       SearchDecl = Impl->getClassInterface();
8192       IsInImplementation = true;
8193     } else if (ObjCCategoryImplDecl *CatImpl =
8194                    dyn_cast<ObjCCategoryImplDecl>(D)) {
8195       SearchDecl = CatImpl->getCategoryDecl();
8196       IsInImplementation = true;
8197     } else
8198       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
8199   }
8200 
8201   if (!SearchDecl && S) {
8202     if (DeclContext *DC = S->getEntity())
8203       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
8204   }
8205 
8206   if (!SearchDecl) {
8207     HandleCodeCompleteResults(this, CodeCompleter,
8208                               CodeCompletionContext::CCC_Other, nullptr, 0);
8209     return;
8210   }
8211 
8212   // Find all of the methods that we could declare/implement here.
8213   KnownMethodsMap KnownMethods;
8214   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, ReturnType,
8215                            KnownMethods);
8216 
8217   // Add declarations or definitions for each of the known methods.
8218   typedef CodeCompletionResult Result;
8219   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8220                         CodeCompleter->getCodeCompletionTUInfo(),
8221                         CodeCompletionContext::CCC_Other);
8222   Results.EnterNewScope();
8223   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
8224   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
8225                                  MEnd = KnownMethods.end();
8226        M != MEnd; ++M) {
8227     ObjCMethodDecl *Method = M->second.getPointer();
8228     CodeCompletionBuilder Builder(Results.getAllocator(),
8229                                   Results.getCodeCompletionTUInfo());
8230 
8231     // Add the '-'/'+' prefix if it wasn't provided yet.
8232     if (!IsInstanceMethod) {
8233       Builder.AddTextChunk(Method->isInstanceMethod() ? "-" : "+");
8234       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8235     }
8236 
8237     // If the result type was not already provided, add it to the
8238     // pattern as (type).
8239     if (ReturnType.isNull()) {
8240       QualType ResTy = Method->getSendResultType().stripObjCKindOfType(Context);
8241       AttributedType::stripOuterNullability(ResTy);
8242       AddObjCPassingTypeChunk(ResTy, Method->getObjCDeclQualifier(), Context,
8243                               Policy, Builder);
8244     }
8245 
8246     Selector Sel = Method->getSelector();
8247 
8248     // Add the first part of the selector to the pattern.
8249     Builder.AddTypedTextChunk(
8250         Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
8251 
8252     // Add parameters to the pattern.
8253     unsigned I = 0;
8254     for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
8255                                         PEnd = Method->param_end();
8256          P != PEnd; (void)++P, ++I) {
8257       // Add the part of the selector name.
8258       if (I == 0)
8259         Builder.AddTypedTextChunk(":");
8260       else if (I < Sel.getNumArgs()) {
8261         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8262         Builder.AddTypedTextChunk(
8263             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
8264       } else
8265         break;
8266 
8267       // Add the parameter type.
8268       QualType ParamType;
8269       if ((*P)->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability)
8270         ParamType = (*P)->getType();
8271       else
8272         ParamType = (*P)->getOriginalType();
8273       ParamType = ParamType.substObjCTypeArgs(
8274           Context, {}, ObjCSubstitutionContext::Parameter);
8275       AttributedType::stripOuterNullability(ParamType);
8276       AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(), Context,
8277                               Policy, Builder);
8278 
8279       if (IdentifierInfo *Id = (*P)->getIdentifier())
8280         Builder.AddTextChunk(Builder.getAllocator().CopyString(Id->getName()));
8281     }
8282 
8283     if (Method->isVariadic()) {
8284       if (Method->param_size() > 0)
8285         Builder.AddChunk(CodeCompletionString::CK_Comma);
8286       Builder.AddTextChunk("...");
8287     }
8288 
8289     if (IsInImplementation && Results.includeCodePatterns()) {
8290       // We will be defining the method here, so add a compound statement.
8291       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8292       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
8293       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
8294       if (!Method->getReturnType()->isVoidType()) {
8295         // If the result type is not void, add a return clause.
8296         Builder.AddTextChunk("return");
8297         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8298         Builder.AddPlaceholderChunk("expression");
8299         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
8300       } else
8301         Builder.AddPlaceholderChunk("statements");
8302 
8303       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
8304       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
8305     }
8306 
8307     unsigned Priority = CCP_CodePattern;
8308     auto R = Result(Builder.TakeString(), Method, Priority);
8309     if (!M->second.getInt())
8310       setInBaseClass(R);
8311     Results.AddResult(std::move(R));
8312   }
8313 
8314   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
8315   // the properties in this class and its categories.
8316   if (Context.getLangOpts().ObjC) {
8317     SmallVector<ObjCContainerDecl *, 4> Containers;
8318     Containers.push_back(SearchDecl);
8319 
8320     VisitedSelectorSet KnownSelectors;
8321     for (KnownMethodsMap::iterator M = KnownMethods.begin(),
8322                                    MEnd = KnownMethods.end();
8323          M != MEnd; ++M)
8324       KnownSelectors.insert(M->first);
8325 
8326     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
8327     if (!IFace)
8328       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
8329         IFace = Category->getClassInterface();
8330 
8331     if (IFace)
8332       for (auto *Cat : IFace->visible_categories())
8333         Containers.push_back(Cat);
8334 
8335     if (IsInstanceMethod) {
8336       for (unsigned I = 0, N = Containers.size(); I != N; ++I)
8337         for (auto *P : Containers[I]->instance_properties())
8338           AddObjCKeyValueCompletions(P, *IsInstanceMethod, ReturnType, Context,
8339                                      KnownSelectors, Results);
8340     }
8341   }
8342 
8343   Results.ExitScope();
8344 
8345   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8346                             Results.data(), Results.size());
8347 }
8348 
8349 void Sema::CodeCompleteObjCMethodDeclSelector(
8350     Scope *S, bool IsInstanceMethod, bool AtParameterName, ParsedType ReturnTy,
8351     ArrayRef<IdentifierInfo *> SelIdents) {
8352   // If we have an external source, load the entire class method
8353   // pool from the AST file.
8354   if (ExternalSource) {
8355     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N;
8356          ++I) {
8357       Selector Sel = ExternalSource->GetExternalSelector(I);
8358       if (Sel.isNull() || MethodPool.count(Sel))
8359         continue;
8360 
8361       ReadMethodPool(Sel);
8362     }
8363   }
8364 
8365   // Build the set of methods we can see.
8366   typedef CodeCompletionResult Result;
8367   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8368                         CodeCompleter->getCodeCompletionTUInfo(),
8369                         CodeCompletionContext::CCC_Other);
8370 
8371   if (ReturnTy)
8372     Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType());
8373 
8374   Results.EnterNewScope();
8375   for (GlobalMethodPool::iterator M = MethodPool.begin(),
8376                                   MEnd = MethodPool.end();
8377        M != MEnd; ++M) {
8378     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first
8379                                                      : &M->second.second;
8380          MethList && MethList->getMethod(); MethList = MethList->getNext()) {
8381       if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
8382         continue;
8383 
8384       if (AtParameterName) {
8385         // Suggest parameter names we've seen before.
8386         unsigned NumSelIdents = SelIdents.size();
8387         if (NumSelIdents &&
8388             NumSelIdents <= MethList->getMethod()->param_size()) {
8389           ParmVarDecl *Param =
8390               MethList->getMethod()->parameters()[NumSelIdents - 1];
8391           if (Param->getIdentifier()) {
8392             CodeCompletionBuilder Builder(Results.getAllocator(),
8393                                           Results.getCodeCompletionTUInfo());
8394             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
8395                 Param->getIdentifier()->getName()));
8396             Results.AddResult(Builder.TakeString());
8397           }
8398         }
8399 
8400         continue;
8401       }
8402 
8403       Result R(MethList->getMethod(),
8404                Results.getBasePriority(MethList->getMethod()), nullptr);
8405       R.StartParameter = SelIdents.size();
8406       R.AllParametersAreInformative = false;
8407       R.DeclaringEntity = true;
8408       Results.MaybeAddResult(R, CurContext);
8409     }
8410   }
8411 
8412   Results.ExitScope();
8413 
8414   if (!AtParameterName && !SelIdents.empty() &&
8415       SelIdents.front()->getName().startswith("init")) {
8416     for (const auto &M : PP.macros()) {
8417       if (M.first->getName() != "NS_DESIGNATED_INITIALIZER")
8418         continue;
8419       Results.EnterNewScope();
8420       CodeCompletionBuilder Builder(Results.getAllocator(),
8421                                     Results.getCodeCompletionTUInfo());
8422       Builder.AddTypedTextChunk(
8423           Builder.getAllocator().CopyString(M.first->getName()));
8424       Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_Macro,
8425                                              CXCursor_MacroDefinition));
8426       Results.ExitScope();
8427     }
8428   }
8429 
8430   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8431                             Results.data(), Results.size());
8432 }
8433 
8434 void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
8435   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8436                         CodeCompleter->getCodeCompletionTUInfo(),
8437                         CodeCompletionContext::CCC_PreprocessorDirective);
8438   Results.EnterNewScope();
8439 
8440   // #if <condition>
8441   CodeCompletionBuilder Builder(Results.getAllocator(),
8442                                 Results.getCodeCompletionTUInfo());
8443   Builder.AddTypedTextChunk("if");
8444   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8445   Builder.AddPlaceholderChunk("condition");
8446   Results.AddResult(Builder.TakeString());
8447 
8448   // #ifdef <macro>
8449   Builder.AddTypedTextChunk("ifdef");
8450   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8451   Builder.AddPlaceholderChunk("macro");
8452   Results.AddResult(Builder.TakeString());
8453 
8454   // #ifndef <macro>
8455   Builder.AddTypedTextChunk("ifndef");
8456   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8457   Builder.AddPlaceholderChunk("macro");
8458   Results.AddResult(Builder.TakeString());
8459 
8460   if (InConditional) {
8461     // #elif <condition>
8462     Builder.AddTypedTextChunk("elif");
8463     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8464     Builder.AddPlaceholderChunk("condition");
8465     Results.AddResult(Builder.TakeString());
8466 
8467     // #else
8468     Builder.AddTypedTextChunk("else");
8469     Results.AddResult(Builder.TakeString());
8470 
8471     // #endif
8472     Builder.AddTypedTextChunk("endif");
8473     Results.AddResult(Builder.TakeString());
8474   }
8475 
8476   // #include "header"
8477   Builder.AddTypedTextChunk("include");
8478   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8479   Builder.AddTextChunk("\"");
8480   Builder.AddPlaceholderChunk("header");
8481   Builder.AddTextChunk("\"");
8482   Results.AddResult(Builder.TakeString());
8483 
8484   // #include <header>
8485   Builder.AddTypedTextChunk("include");
8486   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8487   Builder.AddTextChunk("<");
8488   Builder.AddPlaceholderChunk("header");
8489   Builder.AddTextChunk(">");
8490   Results.AddResult(Builder.TakeString());
8491 
8492   // #define <macro>
8493   Builder.AddTypedTextChunk("define");
8494   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8495   Builder.AddPlaceholderChunk("macro");
8496   Results.AddResult(Builder.TakeString());
8497 
8498   // #define <macro>(<args>)
8499   Builder.AddTypedTextChunk("define");
8500   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8501   Builder.AddPlaceholderChunk("macro");
8502   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8503   Builder.AddPlaceholderChunk("args");
8504   Builder.AddChunk(CodeCompletionString::CK_RightParen);
8505   Results.AddResult(Builder.TakeString());
8506 
8507   // #undef <macro>
8508   Builder.AddTypedTextChunk("undef");
8509   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8510   Builder.AddPlaceholderChunk("macro");
8511   Results.AddResult(Builder.TakeString());
8512 
8513   // #line <number>
8514   Builder.AddTypedTextChunk("line");
8515   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8516   Builder.AddPlaceholderChunk("number");
8517   Results.AddResult(Builder.TakeString());
8518 
8519   // #line <number> "filename"
8520   Builder.AddTypedTextChunk("line");
8521   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8522   Builder.AddPlaceholderChunk("number");
8523   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8524   Builder.AddTextChunk("\"");
8525   Builder.AddPlaceholderChunk("filename");
8526   Builder.AddTextChunk("\"");
8527   Results.AddResult(Builder.TakeString());
8528 
8529   // #error <message>
8530   Builder.AddTypedTextChunk("error");
8531   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8532   Builder.AddPlaceholderChunk("message");
8533   Results.AddResult(Builder.TakeString());
8534 
8535   // #pragma <arguments>
8536   Builder.AddTypedTextChunk("pragma");
8537   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8538   Builder.AddPlaceholderChunk("arguments");
8539   Results.AddResult(Builder.TakeString());
8540 
8541   if (getLangOpts().ObjC) {
8542     // #import "header"
8543     Builder.AddTypedTextChunk("import");
8544     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8545     Builder.AddTextChunk("\"");
8546     Builder.AddPlaceholderChunk("header");
8547     Builder.AddTextChunk("\"");
8548     Results.AddResult(Builder.TakeString());
8549 
8550     // #import <header>
8551     Builder.AddTypedTextChunk("import");
8552     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8553     Builder.AddTextChunk("<");
8554     Builder.AddPlaceholderChunk("header");
8555     Builder.AddTextChunk(">");
8556     Results.AddResult(Builder.TakeString());
8557   }
8558 
8559   // #include_next "header"
8560   Builder.AddTypedTextChunk("include_next");
8561   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8562   Builder.AddTextChunk("\"");
8563   Builder.AddPlaceholderChunk("header");
8564   Builder.AddTextChunk("\"");
8565   Results.AddResult(Builder.TakeString());
8566 
8567   // #include_next <header>
8568   Builder.AddTypedTextChunk("include_next");
8569   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8570   Builder.AddTextChunk("<");
8571   Builder.AddPlaceholderChunk("header");
8572   Builder.AddTextChunk(">");
8573   Results.AddResult(Builder.TakeString());
8574 
8575   // #warning <message>
8576   Builder.AddTypedTextChunk("warning");
8577   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8578   Builder.AddPlaceholderChunk("message");
8579   Results.AddResult(Builder.TakeString());
8580 
8581   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
8582   // completions for them. And __include_macros is a Clang-internal extension
8583   // that we don't want to encourage anyone to use.
8584 
8585   // FIXME: we don't support #assert or #unassert, so don't suggest them.
8586   Results.ExitScope();
8587 
8588   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8589                             Results.data(), Results.size());
8590 }
8591 
8592 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
8593   CodeCompleteOrdinaryName(S, S->getFnParent() ? Sema::PCC_RecoveryInFunction
8594                                                : Sema::PCC_Namespace);
8595 }
8596 
8597 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
8598   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8599                         CodeCompleter->getCodeCompletionTUInfo(),
8600                         IsDefinition ? CodeCompletionContext::CCC_MacroName
8601                                      : CodeCompletionContext::CCC_MacroNameUse);
8602   if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
8603     // Add just the names of macros, not their arguments.
8604     CodeCompletionBuilder Builder(Results.getAllocator(),
8605                                   Results.getCodeCompletionTUInfo());
8606     Results.EnterNewScope();
8607     for (Preprocessor::macro_iterator M = PP.macro_begin(),
8608                                       MEnd = PP.macro_end();
8609          M != MEnd; ++M) {
8610       Builder.AddTypedTextChunk(
8611           Builder.getAllocator().CopyString(M->first->getName()));
8612       Results.AddResult(CodeCompletionResult(
8613           Builder.TakeString(), CCP_CodePattern, CXCursor_MacroDefinition));
8614     }
8615     Results.ExitScope();
8616   } else if (IsDefinition) {
8617     // FIXME: Can we detect when the user just wrote an include guard above?
8618   }
8619 
8620   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8621                             Results.data(), Results.size());
8622 }
8623 
8624 void Sema::CodeCompletePreprocessorExpression() {
8625   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8626                         CodeCompleter->getCodeCompletionTUInfo(),
8627                         CodeCompletionContext::CCC_PreprocessorExpression);
8628 
8629   if (!CodeCompleter || CodeCompleter->includeMacros())
8630     AddMacroResults(PP, Results,
8631                     !CodeCompleter || CodeCompleter->loadExternal(), true);
8632 
8633   // defined (<macro>)
8634   Results.EnterNewScope();
8635   CodeCompletionBuilder Builder(Results.getAllocator(),
8636                                 Results.getCodeCompletionTUInfo());
8637   Builder.AddTypedTextChunk("defined");
8638   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8639   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8640   Builder.AddPlaceholderChunk("macro");
8641   Builder.AddChunk(CodeCompletionString::CK_RightParen);
8642   Results.AddResult(Builder.TakeString());
8643   Results.ExitScope();
8644 
8645   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8646                             Results.data(), Results.size());
8647 }
8648 
8649 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
8650                                                  IdentifierInfo *Macro,
8651                                                  MacroInfo *MacroInfo,
8652                                                  unsigned Argument) {
8653   // FIXME: In the future, we could provide "overload" results, much like we
8654   // do for function calls.
8655 
8656   // Now just ignore this. There will be another code-completion callback
8657   // for the expanded tokens.
8658 }
8659 
8660 // This handles completion inside an #include filename, e.g. #include <foo/ba
8661 // We look for the directory "foo" under each directory on the include path,
8662 // list its files, and reassemble the appropriate #include.
8663 void Sema::CodeCompleteIncludedFile(llvm::StringRef Dir, bool Angled) {
8664   // RelDir should use /, but unescaped \ is possible on windows!
8665   // Our completions will normalize to / for simplicity, this case is rare.
8666   std::string RelDir = llvm::sys::path::convert_to_slash(Dir);
8667   // We need the native slashes for the actual file system interactions.
8668   SmallString<128> NativeRelDir = StringRef(RelDir);
8669   llvm::sys::path::native(NativeRelDir);
8670   llvm::vfs::FileSystem &FS =
8671       getSourceManager().getFileManager().getVirtualFileSystem();
8672 
8673   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8674                         CodeCompleter->getCodeCompletionTUInfo(),
8675                         CodeCompletionContext::CCC_IncludedFile);
8676   llvm::DenseSet<StringRef> SeenResults; // To deduplicate results.
8677 
8678   // Helper: adds one file or directory completion result.
8679   auto AddCompletion = [&](StringRef Filename, bool IsDirectory) {
8680     SmallString<64> TypedChunk = Filename;
8681     // Directory completion is up to the slash, e.g. <sys/
8682     TypedChunk.push_back(IsDirectory ? '/' : Angled ? '>' : '"');
8683     auto R = SeenResults.insert(TypedChunk);
8684     if (R.second) { // New completion
8685       const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk);
8686       *R.first = InternedTyped; // Avoid dangling StringRef.
8687       CodeCompletionBuilder Builder(CodeCompleter->getAllocator(),
8688                                     CodeCompleter->getCodeCompletionTUInfo());
8689       Builder.AddTypedTextChunk(InternedTyped);
8690       // The result is a "Pattern", which is pretty opaque.
8691       // We may want to include the real filename to allow smart ranking.
8692       Results.AddResult(CodeCompletionResult(Builder.TakeString()));
8693     }
8694   };
8695 
8696   // Helper: scans IncludeDir for nice files, and adds results for each.
8697   auto AddFilesFromIncludeDir = [&](StringRef IncludeDir,
8698                                     bool IsSystem,
8699                                     DirectoryLookup::LookupType_t LookupType) {
8700     llvm::SmallString<128> Dir = IncludeDir;
8701     if (!NativeRelDir.empty()) {
8702       if (LookupType == DirectoryLookup::LT_Framework) {
8703         // For a framework dir, #include <Foo/Bar/> actually maps to
8704         // a path of Foo.framework/Headers/Bar/.
8705         auto Begin = llvm::sys::path::begin(NativeRelDir);
8706         auto End = llvm::sys::path::end(NativeRelDir);
8707 
8708         llvm::sys::path::append(Dir, *Begin + ".framework", "Headers");
8709         llvm::sys::path::append(Dir, ++Begin, End);
8710       } else {
8711         llvm::sys::path::append(Dir, NativeRelDir);
8712       }
8713     }
8714 
8715     std::error_code EC;
8716     unsigned Count = 0;
8717     for (auto It = FS.dir_begin(Dir, EC);
8718          !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) {
8719       if (++Count == 2500) // If we happen to hit a huge directory,
8720         break;             // bail out early so we're not too slow.
8721       StringRef Filename = llvm::sys::path::filename(It->path());
8722       switch (It->type()) {
8723       case llvm::sys::fs::file_type::directory_file:
8724         // All entries in a framework directory must have a ".framework" suffix,
8725         // but the suffix does not appear in the source code's include/import.
8726         if (LookupType == DirectoryLookup::LT_Framework &&
8727             NativeRelDir.empty() && !Filename.consume_back(".framework"))
8728           break;
8729 
8730         AddCompletion(Filename, /*IsDirectory=*/true);
8731         break;
8732       case llvm::sys::fs::file_type::regular_file:
8733         // Only files that really look like headers. (Except in system dirs).
8734         if (!IsSystem) {
8735           // Header extensions from Types.def, which we can't depend on here.
8736           if (!(Filename.endswith_lower(".h") ||
8737                 Filename.endswith_lower(".hh") ||
8738                 Filename.endswith_lower(".hpp") ||
8739                 Filename.endswith_lower(".inc")))
8740             break;
8741         }
8742         AddCompletion(Filename, /*IsDirectory=*/false);
8743         break;
8744       default:
8745         break;
8746       }
8747     }
8748   };
8749 
8750   // Helper: adds results relative to IncludeDir, if possible.
8751   auto AddFilesFromDirLookup = [&](const DirectoryLookup &IncludeDir,
8752                                    bool IsSystem) {
8753     switch (IncludeDir.getLookupType()) {
8754     case DirectoryLookup::LT_HeaderMap:
8755       // header maps are not (currently) enumerable.
8756       break;
8757     case DirectoryLookup::LT_NormalDir:
8758       AddFilesFromIncludeDir(IncludeDir.getDir()->getName(), IsSystem,
8759                              DirectoryLookup::LT_NormalDir);
8760       break;
8761     case DirectoryLookup::LT_Framework:
8762       AddFilesFromIncludeDir(IncludeDir.getFrameworkDir()->getName(), IsSystem,
8763                              DirectoryLookup::LT_Framework);
8764       break;
8765     }
8766   };
8767 
8768   // Finally with all our helpers, we can scan the include path.
8769   // Do this in standard order so deduplication keeps the right file.
8770   // (In case we decide to add more details to the results later).
8771   const auto &S = PP.getHeaderSearchInfo();
8772   using llvm::make_range;
8773   if (!Angled) {
8774     // The current directory is on the include path for "quoted" includes.
8775     auto *CurFile = PP.getCurrentFileLexer()->getFileEntry();
8776     if (CurFile && CurFile->getDir())
8777       AddFilesFromIncludeDir(CurFile->getDir()->getName(), false,
8778                              DirectoryLookup::LT_NormalDir);
8779     for (const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end()))
8780       AddFilesFromDirLookup(D, false);
8781   }
8782   for (const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end()))
8783     AddFilesFromDirLookup(D, false);
8784   for (const auto &D : make_range(S.system_dir_begin(), S.system_dir_end()))
8785     AddFilesFromDirLookup(D, true);
8786 
8787   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8788                             Results.data(), Results.size());
8789 }
8790 
8791 void Sema::CodeCompleteNaturalLanguage() {
8792   HandleCodeCompleteResults(this, CodeCompleter,
8793                             CodeCompletionContext::CCC_NaturalLanguage, nullptr,
8794                             0);
8795 }
8796 
8797 void Sema::CodeCompleteAvailabilityPlatformName() {
8798   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8799                         CodeCompleter->getCodeCompletionTUInfo(),
8800                         CodeCompletionContext::CCC_Other);
8801   Results.EnterNewScope();
8802   static const char *Platforms[] = {"macOS", "iOS", "watchOS", "tvOS"};
8803   for (const char *Platform : llvm::makeArrayRef(Platforms)) {
8804     Results.AddResult(CodeCompletionResult(Platform));
8805     Results.AddResult(CodeCompletionResult(Results.getAllocator().CopyString(
8806         Twine(Platform) + "ApplicationExtension")));
8807   }
8808   Results.ExitScope();
8809   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8810                             Results.data(), Results.size());
8811 }
8812 
8813 void Sema::GatherGlobalCodeCompletions(
8814     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
8815     SmallVectorImpl<CodeCompletionResult> &Results) {
8816   ResultBuilder Builder(*this, Allocator, CCTUInfo,
8817                         CodeCompletionContext::CCC_Recovery);
8818   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
8819     CodeCompletionDeclConsumer Consumer(Builder,
8820                                         Context.getTranslationUnitDecl());
8821     LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName,
8822                        Consumer,
8823                        !CodeCompleter || CodeCompleter->loadExternal());
8824   }
8825 
8826   if (!CodeCompleter || CodeCompleter->includeMacros())
8827     AddMacroResults(PP, Builder,
8828                     !CodeCompleter || CodeCompleter->loadExternal(), true);
8829 
8830   Results.clear();
8831   Results.insert(Results.end(), Builder.data(),
8832                  Builder.data() + Builder.size());
8833 }
8834