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