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.
5199       AddedPropertiesSet AddedProperties;
5200 
5201       if (const ObjCObjectPointerType *ObjCPtr =
5202               BaseType->getAsObjCInterfacePointerType()) {
5203         // Add property results based on our interface.
5204         assert(ObjCPtr && "Non-NULL pointer guaranteed above!");
5205         AddObjCProperties(CCContext, ObjCPtr->getInterfaceDecl(), true,
5206                           /*AllowNullaryMethods=*/true, CurContext,
5207                           AddedProperties, Results, IsBaseExprStatement);
5208       }
5209 
5210       // Add properties from the protocols in a qualified interface.
5211       for (auto *I : BaseType->castAs<ObjCObjectPointerType>()->quals())
5212         AddObjCProperties(CCContext, I, true, /*AllowNullaryMethods=*/true,
5213                           CurContext, AddedProperties, Results,
5214                           IsBaseExprStatement, /*IsClassProperty*/ false,
5215                           /*InOriginalClass*/ false);
5216     } else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
5217                (!IsArrow && BaseType->isObjCObjectType())) {
5218       // Objective-C instance variable access.
5219       ObjCInterfaceDecl *Class = nullptr;
5220       if (const ObjCObjectPointerType *ObjCPtr =
5221               BaseType->getAs<ObjCObjectPointerType>())
5222         Class = ObjCPtr->getInterfaceDecl();
5223       else
5224         Class = BaseType->castAs<ObjCObjectType>()->getInterface();
5225 
5226       // Add all ivars from this class and its superclasses.
5227       if (Class) {
5228         CodeCompletionDeclConsumer Consumer(Results, Class, BaseType);
5229         Results.setFilter(&ResultBuilder::IsObjCIvar);
5230         LookupVisibleDecls(
5231             Class, LookupMemberName, Consumer, CodeCompleter->includeGlobals(),
5232             /*IncludeDependentBases=*/false, CodeCompleter->loadExternal());
5233       }
5234     }
5235 
5236     // FIXME: How do we cope with isa?
5237     return true;
5238   };
5239 
5240   Results.EnterNewScope();
5241 
5242   bool CompletionSucceded = DoCompletion(Base, IsArrow, None);
5243   if (CodeCompleter->includeFixIts()) {
5244     const CharSourceRange OpRange =
5245         CharSourceRange::getTokenRange(OpLoc, OpLoc);
5246     CompletionSucceded |= DoCompletion(
5247         OtherOpBase, !IsArrow,
5248         FixItHint::CreateReplacement(OpRange, IsArrow ? "." : "->"));
5249   }
5250 
5251   Results.ExitScope();
5252 
5253   if (!CompletionSucceded)
5254     return;
5255 
5256   // Hand off the results found for code completion.
5257   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5258                             Results.data(), Results.size());
5259 }
5260 
5261 void Sema::CodeCompleteObjCClassPropertyRefExpr(Scope *S,
5262                                                 IdentifierInfo &ClassName,
5263                                                 SourceLocation ClassNameLoc,
5264                                                 bool IsBaseExprStatement) {
5265   IdentifierInfo *ClassNamePtr = &ClassName;
5266   ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(ClassNamePtr, ClassNameLoc);
5267   if (!IFace)
5268     return;
5269   CodeCompletionContext CCContext(
5270       CodeCompletionContext::CCC_ObjCPropertyAccess);
5271   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5272                         CodeCompleter->getCodeCompletionTUInfo(), CCContext,
5273                         &ResultBuilder::IsMember);
5274   Results.EnterNewScope();
5275   AddedPropertiesSet AddedProperties;
5276   AddObjCProperties(CCContext, IFace, true,
5277                     /*AllowNullaryMethods=*/true, CurContext, AddedProperties,
5278                     Results, IsBaseExprStatement,
5279                     /*IsClassProperty=*/true);
5280   Results.ExitScope();
5281   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5282                             Results.data(), Results.size());
5283 }
5284 
5285 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) {
5286   if (!CodeCompleter)
5287     return;
5288 
5289   ResultBuilder::LookupFilter Filter = nullptr;
5290   enum CodeCompletionContext::Kind ContextKind =
5291       CodeCompletionContext::CCC_Other;
5292   switch ((DeclSpec::TST)TagSpec) {
5293   case DeclSpec::TST_enum:
5294     Filter = &ResultBuilder::IsEnum;
5295     ContextKind = CodeCompletionContext::CCC_EnumTag;
5296     break;
5297 
5298   case DeclSpec::TST_union:
5299     Filter = &ResultBuilder::IsUnion;
5300     ContextKind = CodeCompletionContext::CCC_UnionTag;
5301     break;
5302 
5303   case DeclSpec::TST_struct:
5304   case DeclSpec::TST_class:
5305   case DeclSpec::TST_interface:
5306     Filter = &ResultBuilder::IsClassOrStruct;
5307     ContextKind = CodeCompletionContext::CCC_ClassOrStructTag;
5308     break;
5309 
5310   default:
5311     llvm_unreachable("Unknown type specifier kind in CodeCompleteTag");
5312   }
5313 
5314   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5315                         CodeCompleter->getCodeCompletionTUInfo(), ContextKind);
5316   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5317 
5318   // First pass: look for tags.
5319   Results.setFilter(Filter);
5320   LookupVisibleDecls(S, LookupTagName, Consumer,
5321                      CodeCompleter->includeGlobals(),
5322                      CodeCompleter->loadExternal());
5323 
5324   if (CodeCompleter->includeGlobals()) {
5325     // Second pass: look for nested name specifiers.
5326     Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
5327     LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer,
5328                        CodeCompleter->includeGlobals(),
5329                        CodeCompleter->loadExternal());
5330   }
5331 
5332   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5333                             Results.data(), Results.size());
5334 }
5335 
5336 static void AddTypeQualifierResults(DeclSpec &DS, ResultBuilder &Results,
5337                                     const LangOptions &LangOpts) {
5338   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const))
5339     Results.AddResult("const");
5340   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile))
5341     Results.AddResult("volatile");
5342   if (LangOpts.C99 && !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict))
5343     Results.AddResult("restrict");
5344   if (LangOpts.C11 && !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic))
5345     Results.AddResult("_Atomic");
5346   if (LangOpts.MSVCCompat && !(DS.getTypeQualifiers() & DeclSpec::TQ_unaligned))
5347     Results.AddResult("__unaligned");
5348 }
5349 
5350 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) {
5351   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5352                         CodeCompleter->getCodeCompletionTUInfo(),
5353                         CodeCompletionContext::CCC_TypeQualifiers);
5354   Results.EnterNewScope();
5355   AddTypeQualifierResults(DS, Results, LangOpts);
5356   Results.ExitScope();
5357   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5358                             Results.data(), Results.size());
5359 }
5360 
5361 void Sema::CodeCompleteFunctionQualifiers(DeclSpec &DS, Declarator &D,
5362                                           const VirtSpecifiers *VS) {
5363   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5364                         CodeCompleter->getCodeCompletionTUInfo(),
5365                         CodeCompletionContext::CCC_TypeQualifiers);
5366   Results.EnterNewScope();
5367   AddTypeQualifierResults(DS, Results, LangOpts);
5368   if (LangOpts.CPlusPlus11) {
5369     Results.AddResult("noexcept");
5370     if (D.getContext() == DeclaratorContext::MemberContext &&
5371         !D.isCtorOrDtor() && !D.isStaticMember()) {
5372       if (!VS || !VS->isFinalSpecified())
5373         Results.AddResult("final");
5374       if (!VS || !VS->isOverrideSpecified())
5375         Results.AddResult("override");
5376     }
5377   }
5378   Results.ExitScope();
5379   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5380                             Results.data(), Results.size());
5381 }
5382 
5383 void Sema::CodeCompleteBracketDeclarator(Scope *S) {
5384   CodeCompleteExpression(S, QualType(getASTContext().getSizeType()));
5385 }
5386 
5387 void Sema::CodeCompleteCase(Scope *S) {
5388   if (getCurFunction()->SwitchStack.empty() || !CodeCompleter)
5389     return;
5390 
5391   SwitchStmt *Switch = getCurFunction()->SwitchStack.back().getPointer();
5392   // Condition expression might be invalid, do not continue in this case.
5393   if (!Switch->getCond())
5394     return;
5395   QualType type = Switch->getCond()->IgnoreImplicit()->getType();
5396   if (!type->isEnumeralType()) {
5397     CodeCompleteExpressionData Data(type);
5398     Data.IntegralConstantExpression = true;
5399     CodeCompleteExpression(S, Data);
5400     return;
5401   }
5402 
5403   // Code-complete the cases of a switch statement over an enumeration type
5404   // by providing the list of
5405   EnumDecl *Enum = type->castAs<EnumType>()->getDecl();
5406   if (EnumDecl *Def = Enum->getDefinition())
5407     Enum = Def;
5408 
5409   // Determine which enumerators we have already seen in the switch statement.
5410   // FIXME: Ideally, we would also be able to look *past* the code-completion
5411   // token, in case we are code-completing in the middle of the switch and not
5412   // at the end. However, we aren't able to do so at the moment.
5413   CoveredEnumerators Enumerators;
5414   for (SwitchCase *SC = Switch->getSwitchCaseList(); SC;
5415        SC = SC->getNextSwitchCase()) {
5416     CaseStmt *Case = dyn_cast<CaseStmt>(SC);
5417     if (!Case)
5418       continue;
5419 
5420     Expr *CaseVal = Case->getLHS()->IgnoreParenCasts();
5421     if (auto *DRE = dyn_cast<DeclRefExpr>(CaseVal))
5422       if (auto *Enumerator =
5423               dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
5424         // We look into the AST of the case statement to determine which
5425         // enumerator was named. Alternatively, we could compute the value of
5426         // the integral constant expression, then compare it against the
5427         // values of each enumerator. However, value-based approach would not
5428         // work as well with C++ templates where enumerators declared within a
5429         // template are type- and value-dependent.
5430         Enumerators.Seen.insert(Enumerator);
5431 
5432         // If this is a qualified-id, keep track of the nested-name-specifier
5433         // so that we can reproduce it as part of code completion, e.g.,
5434         //
5435         //   switch (TagD.getKind()) {
5436         //     case TagDecl::TK_enum:
5437         //       break;
5438         //     case XXX
5439         //
5440         // At the XXX, our completions are TagDecl::TK_union,
5441         // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union,
5442         // TK_struct, and TK_class.
5443         Enumerators.SuggestedQualifier = DRE->getQualifier();
5444       }
5445   }
5446 
5447   // Add any enumerators that have not yet been mentioned.
5448   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5449                         CodeCompleter->getCodeCompletionTUInfo(),
5450                         CodeCompletionContext::CCC_Expression);
5451   AddEnumerators(Results, Context, Enum, CurContext, Enumerators);
5452 
5453   if (CodeCompleter->includeMacros()) {
5454     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
5455   }
5456   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5457                             Results.data(), Results.size());
5458 }
5459 
5460 static bool anyNullArguments(ArrayRef<Expr *> Args) {
5461   if (Args.size() && !Args.data())
5462     return true;
5463 
5464   for (unsigned I = 0; I != Args.size(); ++I)
5465     if (!Args[I])
5466       return true;
5467 
5468   return false;
5469 }
5470 
5471 typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate;
5472 
5473 static void mergeCandidatesWithResults(
5474     Sema &SemaRef, SmallVectorImpl<ResultCandidate> &Results,
5475     OverloadCandidateSet &CandidateSet, SourceLocation Loc) {
5476   // Sort the overload candidate set by placing the best overloads first.
5477   llvm::stable_sort(CandidateSet, [&](const OverloadCandidate &X,
5478                                       const OverloadCandidate &Y) {
5479     return isBetterOverloadCandidate(SemaRef, X, Y, Loc,
5480                                      CandidateSet.getKind());
5481   });
5482 
5483   // Add the remaining viable overload candidates as code-completion results.
5484   for (OverloadCandidate &Candidate : CandidateSet) {
5485     if (Candidate.Function && Candidate.Function->isDeleted())
5486       continue;
5487     if (Candidate.Viable)
5488       Results.push_back(ResultCandidate(Candidate.Function));
5489   }
5490 }
5491 
5492 /// Get the type of the Nth parameter from a given set of overload
5493 /// candidates.
5494 static QualType getParamType(Sema &SemaRef,
5495                              ArrayRef<ResultCandidate> Candidates, unsigned N) {
5496 
5497   // Given the overloads 'Candidates' for a function call matching all arguments
5498   // up to N, return the type of the Nth parameter if it is the same for all
5499   // overload candidates.
5500   QualType ParamType;
5501   for (auto &Candidate : Candidates) {
5502     if (const auto *FType = Candidate.getFunctionType())
5503       if (const auto *Proto = dyn_cast<FunctionProtoType>(FType))
5504         if (N < Proto->getNumParams()) {
5505           if (ParamType.isNull())
5506             ParamType = Proto->getParamType(N);
5507           else if (!SemaRef.Context.hasSameUnqualifiedType(
5508                        ParamType.getNonReferenceType(),
5509                        Proto->getParamType(N).getNonReferenceType()))
5510             // Otherwise return a default-constructed QualType.
5511             return QualType();
5512         }
5513   }
5514 
5515   return ParamType;
5516 }
5517 
5518 static QualType
5519 ProduceSignatureHelp(Sema &SemaRef, Scope *S,
5520                      MutableArrayRef<ResultCandidate> Candidates,
5521                      unsigned CurrentArg, SourceLocation OpenParLoc) {
5522   if (Candidates.empty())
5523     return QualType();
5524   SemaRef.CodeCompleter->ProcessOverloadCandidates(
5525       SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc);
5526   return getParamType(SemaRef, Candidates, CurrentArg);
5527 }
5528 
5529 QualType Sema::ProduceCallSignatureHelp(Scope *S, Expr *Fn,
5530                                         ArrayRef<Expr *> Args,
5531                                         SourceLocation OpenParLoc) {
5532   if (!CodeCompleter)
5533     return QualType();
5534 
5535   // FIXME: Provide support for variadic template functions.
5536   // Ignore type-dependent call expressions entirely.
5537   if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) ||
5538       Expr::hasAnyTypeDependentArguments(Args)) {
5539     return QualType();
5540   }
5541 
5542   // Build an overload candidate set based on the functions we find.
5543   SourceLocation Loc = Fn->getExprLoc();
5544   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
5545 
5546   SmallVector<ResultCandidate, 8> Results;
5547 
5548   Expr *NakedFn = Fn->IgnoreParenCasts();
5549   if (auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn))
5550     AddOverloadedCallCandidates(ULE, Args, CandidateSet,
5551                                 /*PartialOverloading=*/true);
5552   else if (auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) {
5553     TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr;
5554     if (UME->hasExplicitTemplateArgs()) {
5555       UME->copyTemplateArgumentsInto(TemplateArgsBuffer);
5556       TemplateArgs = &TemplateArgsBuffer;
5557     }
5558 
5559     // Add the base as first argument (use a nullptr if the base is implicit).
5560     SmallVector<Expr *, 12> ArgExprs(
5561         1, UME->isImplicitAccess() ? nullptr : UME->getBase());
5562     ArgExprs.append(Args.begin(), Args.end());
5563     UnresolvedSet<8> Decls;
5564     Decls.append(UME->decls_begin(), UME->decls_end());
5565     const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase();
5566     AddFunctionCandidates(Decls, ArgExprs, CandidateSet, TemplateArgs,
5567                           /*SuppressUserConversions=*/false,
5568                           /*PartialOverloading=*/true, FirstArgumentIsBase);
5569   } else {
5570     FunctionDecl *FD = nullptr;
5571     if (auto *MCE = dyn_cast<MemberExpr>(NakedFn))
5572       FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl());
5573     else if (auto *DRE = dyn_cast<DeclRefExpr>(NakedFn))
5574       FD = dyn_cast<FunctionDecl>(DRE->getDecl());
5575     if (FD) { // We check whether it's a resolved function declaration.
5576       if (!getLangOpts().CPlusPlus ||
5577           !FD->getType()->getAs<FunctionProtoType>())
5578         Results.push_back(ResultCandidate(FD));
5579       else
5580         AddOverloadCandidate(FD, DeclAccessPair::make(FD, FD->getAccess()),
5581                              Args, CandidateSet,
5582                              /*SuppressUserConversions=*/false,
5583                              /*PartialOverloading=*/true);
5584 
5585     } else if (auto DC = NakedFn->getType()->getAsCXXRecordDecl()) {
5586       // If expression's type is CXXRecordDecl, it may overload the function
5587       // call operator, so we check if it does and add them as candidates.
5588       // A complete type is needed to lookup for member function call operators.
5589       if (isCompleteType(Loc, NakedFn->getType())) {
5590         DeclarationName OpName =
5591             Context.DeclarationNames.getCXXOperatorName(OO_Call);
5592         LookupResult R(*this, OpName, Loc, LookupOrdinaryName);
5593         LookupQualifiedName(R, DC);
5594         R.suppressDiagnostics();
5595         SmallVector<Expr *, 12> ArgExprs(1, NakedFn);
5596         ArgExprs.append(Args.begin(), Args.end());
5597         AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs, CandidateSet,
5598                               /*ExplicitArgs=*/nullptr,
5599                               /*SuppressUserConversions=*/false,
5600                               /*PartialOverloading=*/true);
5601       }
5602     } else {
5603       // Lastly we check whether expression's type is function pointer or
5604       // function.
5605       QualType T = NakedFn->getType();
5606       if (!T->getPointeeType().isNull())
5607         T = T->getPointeeType();
5608 
5609       if (auto FP = T->getAs<FunctionProtoType>()) {
5610         if (!TooManyArguments(FP->getNumParams(), Args.size(),
5611                               /*PartialOverloading=*/true) ||
5612             FP->isVariadic())
5613           Results.push_back(ResultCandidate(FP));
5614       } else if (auto FT = T->getAs<FunctionType>())
5615         // No prototype and declaration, it may be a K & R style function.
5616         Results.push_back(ResultCandidate(FT));
5617     }
5618   }
5619   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc);
5620   QualType ParamType =
5621       ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc);
5622   return !CandidateSet.empty() ? ParamType : QualType();
5623 }
5624 
5625 QualType Sema::ProduceConstructorSignatureHelp(Scope *S, QualType Type,
5626                                                SourceLocation Loc,
5627                                                ArrayRef<Expr *> Args,
5628                                                SourceLocation OpenParLoc) {
5629   if (!CodeCompleter)
5630     return QualType();
5631 
5632   // A complete type is needed to lookup for constructors.
5633   CXXRecordDecl *RD =
5634       isCompleteType(Loc, Type) ? Type->getAsCXXRecordDecl() : nullptr;
5635   if (!RD)
5636     return Type;
5637 
5638   // FIXME: Provide support for member initializers.
5639   // FIXME: Provide support for variadic template constructors.
5640 
5641   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
5642 
5643   for (NamedDecl *C : LookupConstructors(RD)) {
5644     if (auto *FD = dyn_cast<FunctionDecl>(C)) {
5645       AddOverloadCandidate(FD, DeclAccessPair::make(FD, C->getAccess()), Args,
5646                            CandidateSet,
5647                            /*SuppressUserConversions=*/false,
5648                            /*PartialOverloading=*/true,
5649                            /*AllowExplicit*/ true);
5650     } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(C)) {
5651       AddTemplateOverloadCandidate(
5652           FTD, DeclAccessPair::make(FTD, C->getAccess()),
5653           /*ExplicitTemplateArgs=*/nullptr, Args, CandidateSet,
5654           /*SuppressUserConversions=*/false,
5655           /*PartialOverloading=*/true);
5656     }
5657   }
5658 
5659   SmallVector<ResultCandidate, 8> Results;
5660   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc);
5661   return ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc);
5662 }
5663 
5664 QualType Sema::ProduceCtorInitMemberSignatureHelp(
5665     Scope *S, Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy,
5666     ArrayRef<Expr *> ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc) {
5667   if (!CodeCompleter)
5668     return QualType();
5669 
5670   CXXConstructorDecl *Constructor =
5671       dyn_cast<CXXConstructorDecl>(ConstructorDecl);
5672   if (!Constructor)
5673     return QualType();
5674   // FIXME: Add support for Base class constructors as well.
5675   if (ValueDecl *MemberDecl = tryLookupCtorInitMemberDecl(
5676           Constructor->getParent(), SS, TemplateTypeTy, II))
5677     return ProduceConstructorSignatureHelp(getCurScope(), MemberDecl->getType(),
5678                                            MemberDecl->getLocation(), ArgExprs,
5679                                            OpenParLoc);
5680   return QualType();
5681 }
5682 
5683 void Sema::CodeCompleteDesignator(const QualType BaseType,
5684                                   llvm::ArrayRef<Expr *> InitExprs,
5685                                   const Designation &D) {
5686   if (BaseType.isNull())
5687     return;
5688   // FIXME: Handle nested designations, e.g. : .x.^
5689   if (!D.empty())
5690     return;
5691 
5692   const auto *RD = getAsRecordDecl(BaseType);
5693   if (!RD)
5694     return;
5695   if (const auto *CTSD = llvm::dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
5696     // Template might not be instantiated yet, fall back to primary template in
5697     // such cases.
5698     if (CTSD->getTemplateSpecializationKind() == TSK_Undeclared)
5699       RD = CTSD->getSpecializedTemplate()->getTemplatedDecl();
5700   }
5701   if (RD->fields().empty())
5702     return;
5703 
5704   CodeCompletionContext CCC(CodeCompletionContext::CCC_DotMemberAccess,
5705                             BaseType);
5706   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5707                         CodeCompleter->getCodeCompletionTUInfo(), CCC);
5708 
5709   Results.EnterNewScope();
5710   for (const auto *FD : RD->fields()) {
5711     // FIXME: Make use of previous designators to mark any fields before those
5712     // inaccessible, and also compute the next initializer priority.
5713     ResultBuilder::Result Result(FD, Results.getBasePriority(FD));
5714     Results.AddResult(Result, CurContext, /*Hiding=*/nullptr);
5715   }
5716   Results.ExitScope();
5717   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5718                             Results.data(), Results.size());
5719 }
5720 
5721 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) {
5722   ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
5723   if (!VD) {
5724     CodeCompleteOrdinaryName(S, PCC_Expression);
5725     return;
5726   }
5727 
5728   CodeCompleteExpressionData Data;
5729   Data.PreferredType = VD->getType();
5730   // Ignore VD to avoid completing the variable itself, e.g. in 'int foo = ^'.
5731   Data.IgnoreDecls.push_back(VD);
5732 
5733   CodeCompleteExpression(S, Data);
5734 }
5735 
5736 void Sema::CodeCompleteAfterIf(Scope *S) {
5737   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5738                         CodeCompleter->getCodeCompletionTUInfo(),
5739                         mapCodeCompletionContext(*this, PCC_Statement));
5740   Results.setFilter(&ResultBuilder::IsOrdinaryName);
5741   Results.EnterNewScope();
5742 
5743   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5744   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5745                      CodeCompleter->includeGlobals(),
5746                      CodeCompleter->loadExternal());
5747 
5748   AddOrdinaryNameResults(PCC_Statement, S, *this, Results);
5749 
5750   // "else" block
5751   CodeCompletionBuilder Builder(Results.getAllocator(),
5752                                 Results.getCodeCompletionTUInfo());
5753   Builder.AddTypedTextChunk("else");
5754   if (Results.includeCodePatterns()) {
5755     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5756     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5757     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5758     Builder.AddPlaceholderChunk("statements");
5759     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5760     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5761   }
5762   Results.AddResult(Builder.TakeString());
5763 
5764   // "else if" block
5765   Builder.AddTypedTextChunk("else if");
5766   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5767   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5768   if (getLangOpts().CPlusPlus)
5769     Builder.AddPlaceholderChunk("condition");
5770   else
5771     Builder.AddPlaceholderChunk("expression");
5772   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5773   if (Results.includeCodePatterns()) {
5774     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5775     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5776     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5777     Builder.AddPlaceholderChunk("statements");
5778     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5779     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5780   }
5781   Results.AddResult(Builder.TakeString());
5782 
5783   Results.ExitScope();
5784 
5785   if (S->getFnParent())
5786     AddPrettyFunctionResults(getLangOpts(), Results);
5787 
5788   if (CodeCompleter->includeMacros())
5789     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
5790 
5791   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5792                             Results.data(), Results.size());
5793 }
5794 
5795 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
5796                                    bool EnteringContext,
5797                                    bool IsUsingDeclaration, QualType BaseType,
5798                                    QualType PreferredType) {
5799   if (SS.isEmpty() || !CodeCompleter)
5800     return;
5801 
5802   CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol, PreferredType);
5803   CC.setIsUsingDeclaration(IsUsingDeclaration);
5804   CC.setCXXScopeSpecifier(SS);
5805 
5806   // We want to keep the scope specifier even if it's invalid (e.g. the scope
5807   // "a::b::" is not corresponding to any context/namespace in the AST), since
5808   // it can be useful for global code completion which have information about
5809   // contexts/symbols that are not in the AST.
5810   if (SS.isInvalid()) {
5811     // As SS is invalid, we try to collect accessible contexts from the current
5812     // scope with a dummy lookup so that the completion consumer can try to
5813     // guess what the specified scope is.
5814     ResultBuilder DummyResults(*this, CodeCompleter->getAllocator(),
5815                                CodeCompleter->getCodeCompletionTUInfo(), CC);
5816     if (!PreferredType.isNull())
5817       DummyResults.setPreferredType(PreferredType);
5818     if (S->getEntity()) {
5819       CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(),
5820                                           BaseType);
5821       LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5822                          /*IncludeGlobalScope=*/false,
5823                          /*LoadExternal=*/false);
5824     }
5825     HandleCodeCompleteResults(this, CodeCompleter,
5826                               DummyResults.getCompletionContext(), nullptr, 0);
5827     return;
5828   }
5829   // Always pretend to enter a context to ensure that a dependent type
5830   // resolves to a dependent record.
5831   DeclContext *Ctx = computeDeclContext(SS, /*EnteringContext=*/true);
5832 
5833   // Try to instantiate any non-dependent declaration contexts before
5834   // we look in them. Bail out if we fail.
5835   NestedNameSpecifier *NNS = SS.getScopeRep();
5836   if (NNS != nullptr && SS.isValid() && !NNS->isDependent()) {
5837     if (Ctx == nullptr || RequireCompleteDeclContext(SS, Ctx))
5838       return;
5839   }
5840 
5841   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5842                         CodeCompleter->getCodeCompletionTUInfo(), CC);
5843   if (!PreferredType.isNull())
5844     Results.setPreferredType(PreferredType);
5845   Results.EnterNewScope();
5846 
5847   // The "template" keyword can follow "::" in the grammar, but only
5848   // put it into the grammar if the nested-name-specifier is dependent.
5849   // FIXME: results is always empty, this appears to be dead.
5850   if (!Results.empty() && NNS->isDependent())
5851     Results.AddResult("template");
5852 
5853   // If the scope is a concept-constrained type parameter, infer nested
5854   // members based on the constraints.
5855   if (const auto *TTPT =
5856           dyn_cast_or_null<TemplateTypeParmType>(NNS->getAsType())) {
5857     for (const auto &R : ConceptInfo(*TTPT, S).members()) {
5858       if (R.Operator != ConceptInfo::Member::Colons)
5859         continue;
5860       Results.AddResult(CodeCompletionResult(
5861           R.render(*this, CodeCompleter->getAllocator(),
5862                    CodeCompleter->getCodeCompletionTUInfo())));
5863     }
5864   }
5865 
5866   // Add calls to overridden virtual functions, if there are any.
5867   //
5868   // FIXME: This isn't wonderful, because we don't know whether we're actually
5869   // in a context that permits expressions. This is a general issue with
5870   // qualified-id completions.
5871   if (Ctx && !EnteringContext)
5872     MaybeAddOverrideCalls(*this, Ctx, Results);
5873   Results.ExitScope();
5874 
5875   if (Ctx &&
5876       (CodeCompleter->includeNamespaceLevelDecls() || !Ctx->isFileContext())) {
5877     CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType);
5878     LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer,
5879                        /*IncludeGlobalScope=*/true,
5880                        /*IncludeDependentBases=*/true,
5881                        CodeCompleter->loadExternal());
5882   }
5883 
5884   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5885                             Results.data(), Results.size());
5886 }
5887 
5888 void Sema::CodeCompleteUsing(Scope *S) {
5889   if (!CodeCompleter)
5890     return;
5891 
5892   // This can be both a using alias or using declaration, in the former we
5893   // expect a new name and a symbol in the latter case.
5894   CodeCompletionContext Context(CodeCompletionContext::CCC_SymbolOrNewName);
5895   Context.setIsUsingDeclaration(true);
5896 
5897   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5898                         CodeCompleter->getCodeCompletionTUInfo(), Context,
5899                         &ResultBuilder::IsNestedNameSpecifier);
5900   Results.EnterNewScope();
5901 
5902   // If we aren't in class scope, we could see the "namespace" keyword.
5903   if (!S->isClassScope())
5904     Results.AddResult(CodeCompletionResult("namespace"));
5905 
5906   // After "using", we can see anything that would start a
5907   // nested-name-specifier.
5908   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5909   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5910                      CodeCompleter->includeGlobals(),
5911                      CodeCompleter->loadExternal());
5912   Results.ExitScope();
5913 
5914   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5915                             Results.data(), Results.size());
5916 }
5917 
5918 void Sema::CodeCompleteUsingDirective(Scope *S) {
5919   if (!CodeCompleter)
5920     return;
5921 
5922   // After "using namespace", we expect to see a namespace name or namespace
5923   // alias.
5924   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5925                         CodeCompleter->getCodeCompletionTUInfo(),
5926                         CodeCompletionContext::CCC_Namespace,
5927                         &ResultBuilder::IsNamespaceOrAlias);
5928   Results.EnterNewScope();
5929   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5930   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5931                      CodeCompleter->includeGlobals(),
5932                      CodeCompleter->loadExternal());
5933   Results.ExitScope();
5934   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5935                             Results.data(), Results.size());
5936 }
5937 
5938 void Sema::CodeCompleteNamespaceDecl(Scope *S) {
5939   if (!CodeCompleter)
5940     return;
5941 
5942   DeclContext *Ctx = S->getEntity();
5943   if (!S->getParent())
5944     Ctx = Context.getTranslationUnitDecl();
5945 
5946   bool SuppressedGlobalResults =
5947       Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
5948 
5949   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5950                         CodeCompleter->getCodeCompletionTUInfo(),
5951                         SuppressedGlobalResults
5952                             ? CodeCompletionContext::CCC_Namespace
5953                             : CodeCompletionContext::CCC_Other,
5954                         &ResultBuilder::IsNamespace);
5955 
5956   if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
5957     // We only want to see those namespaces that have already been defined
5958     // within this scope, because its likely that the user is creating an
5959     // extended namespace declaration. Keep track of the most recent
5960     // definition of each namespace.
5961     std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
5962     for (DeclContext::specific_decl_iterator<NamespaceDecl>
5963              NS(Ctx->decls_begin()),
5964          NSEnd(Ctx->decls_end());
5965          NS != NSEnd; ++NS)
5966       OrigToLatest[NS->getOriginalNamespace()] = *NS;
5967 
5968     // Add the most recent definition (or extended definition) of each
5969     // namespace to the list of results.
5970     Results.EnterNewScope();
5971     for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
5972              NS = OrigToLatest.begin(),
5973              NSEnd = OrigToLatest.end();
5974          NS != NSEnd; ++NS)
5975       Results.AddResult(
5976           CodeCompletionResult(NS->second, Results.getBasePriority(NS->second),
5977                                nullptr),
5978           CurContext, nullptr, false);
5979     Results.ExitScope();
5980   }
5981 
5982   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5983                             Results.data(), Results.size());
5984 }
5985 
5986 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S) {
5987   if (!CodeCompleter)
5988     return;
5989 
5990   // After "namespace", we expect to see a namespace or alias.
5991   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5992                         CodeCompleter->getCodeCompletionTUInfo(),
5993                         CodeCompletionContext::CCC_Namespace,
5994                         &ResultBuilder::IsNamespaceOrAlias);
5995   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5996   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5997                      CodeCompleter->includeGlobals(),
5998                      CodeCompleter->loadExternal());
5999   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6000                             Results.data(), Results.size());
6001 }
6002 
6003 void Sema::CodeCompleteOperatorName(Scope *S) {
6004   if (!CodeCompleter)
6005     return;
6006 
6007   typedef CodeCompletionResult Result;
6008   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6009                         CodeCompleter->getCodeCompletionTUInfo(),
6010                         CodeCompletionContext::CCC_Type,
6011                         &ResultBuilder::IsType);
6012   Results.EnterNewScope();
6013 
6014   // Add the names of overloadable operators. Note that OO_Conditional is not
6015   // actually overloadable.
6016 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
6017   if (OO_##Name != OO_Conditional)                                             \
6018     Results.AddResult(Result(Spelling));
6019 #include "clang/Basic/OperatorKinds.def"
6020 
6021   // Add any type names visible from the current scope
6022   Results.allowNestedNameSpecifiers();
6023   CodeCompletionDeclConsumer Consumer(Results, CurContext);
6024   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6025                      CodeCompleter->includeGlobals(),
6026                      CodeCompleter->loadExternal());
6027 
6028   // Add any type specifiers
6029   AddTypeSpecifierResults(getLangOpts(), Results);
6030   Results.ExitScope();
6031 
6032   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6033                             Results.data(), Results.size());
6034 }
6035 
6036 void Sema::CodeCompleteConstructorInitializer(
6037     Decl *ConstructorD, ArrayRef<CXXCtorInitializer *> Initializers) {
6038   if (!ConstructorD)
6039     return;
6040 
6041   AdjustDeclIfTemplate(ConstructorD);
6042 
6043   auto *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD);
6044   if (!Constructor)
6045     return;
6046 
6047   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6048                         CodeCompleter->getCodeCompletionTUInfo(),
6049                         CodeCompletionContext::CCC_Symbol);
6050   Results.EnterNewScope();
6051 
6052   // Fill in any already-initialized fields or base classes.
6053   llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
6054   llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
6055   for (unsigned I = 0, E = Initializers.size(); I != E; ++I) {
6056     if (Initializers[I]->isBaseInitializer())
6057       InitializedBases.insert(Context.getCanonicalType(
6058           QualType(Initializers[I]->getBaseClass(), 0)));
6059     else
6060       InitializedFields.insert(
6061           cast<FieldDecl>(Initializers[I]->getAnyMember()));
6062   }
6063 
6064   // Add completions for base classes.
6065   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
6066   bool SawLastInitializer = Initializers.empty();
6067   CXXRecordDecl *ClassDecl = Constructor->getParent();
6068 
6069   auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) {
6070     CodeCompletionBuilder Builder(Results.getAllocator(),
6071                                   Results.getCodeCompletionTUInfo());
6072     Builder.AddTypedTextChunk(Name);
6073     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6074     if (const auto *Function = dyn_cast<FunctionDecl>(ND))
6075       AddFunctionParameterChunks(PP, Policy, Function, Builder);
6076     else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND))
6077       AddFunctionParameterChunks(PP, Policy, FunTemplDecl->getTemplatedDecl(),
6078                                  Builder);
6079     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6080     return Builder.TakeString();
6081   };
6082   auto AddDefaultCtorInit = [&](const char *Name, const char *Type,
6083                                 const NamedDecl *ND) {
6084     CodeCompletionBuilder Builder(Results.getAllocator(),
6085                                   Results.getCodeCompletionTUInfo());
6086     Builder.AddTypedTextChunk(Name);
6087     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6088     Builder.AddPlaceholderChunk(Type);
6089     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6090     if (ND) {
6091       auto CCR = CodeCompletionResult(
6092           Builder.TakeString(), ND,
6093           SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration);
6094       if (isa<FieldDecl>(ND))
6095         CCR.CursorKind = CXCursor_MemberRef;
6096       return Results.AddResult(CCR);
6097     }
6098     return Results.AddResult(CodeCompletionResult(
6099         Builder.TakeString(),
6100         SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration));
6101   };
6102   auto AddCtorsWithName = [&](const CXXRecordDecl *RD, unsigned int Priority,
6103                               const char *Name, const FieldDecl *FD) {
6104     if (!RD)
6105       return AddDefaultCtorInit(Name,
6106                                 FD ? Results.getAllocator().CopyString(
6107                                          FD->getType().getAsString(Policy))
6108                                    : Name,
6109                                 FD);
6110     auto Ctors = getConstructors(Context, RD);
6111     if (Ctors.begin() == Ctors.end())
6112       return AddDefaultCtorInit(Name, Name, RD);
6113     for (const NamedDecl *Ctor : Ctors) {
6114       auto CCR = CodeCompletionResult(GenerateCCS(Ctor, Name), RD, Priority);
6115       CCR.CursorKind = getCursorKindForDecl(Ctor);
6116       Results.AddResult(CCR);
6117     }
6118   };
6119   auto AddBase = [&](const CXXBaseSpecifier &Base) {
6120     const char *BaseName =
6121         Results.getAllocator().CopyString(Base.getType().getAsString(Policy));
6122     const auto *RD = Base.getType()->getAsCXXRecordDecl();
6123     AddCtorsWithName(
6124         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
6125         BaseName, nullptr);
6126   };
6127   auto AddField = [&](const FieldDecl *FD) {
6128     const char *FieldName =
6129         Results.getAllocator().CopyString(FD->getIdentifier()->getName());
6130     const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl();
6131     AddCtorsWithName(
6132         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
6133         FieldName, FD);
6134   };
6135 
6136   for (const auto &Base : ClassDecl->bases()) {
6137     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
6138              .second) {
6139       SawLastInitializer =
6140           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
6141           Context.hasSameUnqualifiedType(
6142               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
6143       continue;
6144     }
6145 
6146     AddBase(Base);
6147     SawLastInitializer = false;
6148   }
6149 
6150   // Add completions for virtual base classes.
6151   for (const auto &Base : ClassDecl->vbases()) {
6152     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
6153              .second) {
6154       SawLastInitializer =
6155           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
6156           Context.hasSameUnqualifiedType(
6157               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
6158       continue;
6159     }
6160 
6161     AddBase(Base);
6162     SawLastInitializer = false;
6163   }
6164 
6165   // Add completions for members.
6166   for (auto *Field : ClassDecl->fields()) {
6167     if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))
6168              .second) {
6169       SawLastInitializer = !Initializers.empty() &&
6170                            Initializers.back()->isAnyMemberInitializer() &&
6171                            Initializers.back()->getAnyMember() == Field;
6172       continue;
6173     }
6174 
6175     if (!Field->getDeclName())
6176       continue;
6177 
6178     AddField(Field);
6179     SawLastInitializer = false;
6180   }
6181   Results.ExitScope();
6182 
6183   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6184                             Results.data(), Results.size());
6185 }
6186 
6187 /// Determine whether this scope denotes a namespace.
6188 static bool isNamespaceScope(Scope *S) {
6189   DeclContext *DC = S->getEntity();
6190   if (!DC)
6191     return false;
6192 
6193   return DC->isFileContext();
6194 }
6195 
6196 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro,
6197                                         bool AfterAmpersand) {
6198   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6199                         CodeCompleter->getCodeCompletionTUInfo(),
6200                         CodeCompletionContext::CCC_Other);
6201   Results.EnterNewScope();
6202 
6203   // Note what has already been captured.
6204   llvm::SmallPtrSet<IdentifierInfo *, 4> Known;
6205   bool IncludedThis = false;
6206   for (const auto &C : Intro.Captures) {
6207     if (C.Kind == LCK_This) {
6208       IncludedThis = true;
6209       continue;
6210     }
6211 
6212     Known.insert(C.Id);
6213   }
6214 
6215   // Look for other capturable variables.
6216   for (; S && !isNamespaceScope(S); S = S->getParent()) {
6217     for (const auto *D : S->decls()) {
6218       const auto *Var = dyn_cast<VarDecl>(D);
6219       if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>())
6220         continue;
6221 
6222       if (Known.insert(Var->getIdentifier()).second)
6223         Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration),
6224                           CurContext, nullptr, false);
6225     }
6226   }
6227 
6228   // Add 'this', if it would be valid.
6229   if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy)
6230     addThisCompletion(*this, Results);
6231 
6232   Results.ExitScope();
6233 
6234   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6235                             Results.data(), Results.size());
6236 }
6237 
6238 /// Macro that optionally prepends an "@" to the string literal passed in via
6239 /// Keyword, depending on whether NeedAt is true or false.
6240 #define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword)
6241 
6242 static void AddObjCImplementationResults(const LangOptions &LangOpts,
6243                                          ResultBuilder &Results, bool NeedAt) {
6244   typedef CodeCompletionResult Result;
6245   // Since we have an implementation, we can end it.
6246   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
6247 
6248   CodeCompletionBuilder Builder(Results.getAllocator(),
6249                                 Results.getCodeCompletionTUInfo());
6250   if (LangOpts.ObjC) {
6251     // @dynamic
6252     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "dynamic"));
6253     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6254     Builder.AddPlaceholderChunk("property");
6255     Results.AddResult(Result(Builder.TakeString()));
6256 
6257     // @synthesize
6258     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synthesize"));
6259     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6260     Builder.AddPlaceholderChunk("property");
6261     Results.AddResult(Result(Builder.TakeString()));
6262   }
6263 }
6264 
6265 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
6266                                     ResultBuilder &Results, bool NeedAt) {
6267   typedef CodeCompletionResult Result;
6268 
6269   // Since we have an interface or protocol, we can end it.
6270   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
6271 
6272   if (LangOpts.ObjC) {
6273     // @property
6274     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "property")));
6275 
6276     // @required
6277     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "required")));
6278 
6279     // @optional
6280     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "optional")));
6281   }
6282 }
6283 
6284 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
6285   typedef CodeCompletionResult Result;
6286   CodeCompletionBuilder Builder(Results.getAllocator(),
6287                                 Results.getCodeCompletionTUInfo());
6288 
6289   // @class name ;
6290   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "class"));
6291   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6292   Builder.AddPlaceholderChunk("name");
6293   Results.AddResult(Result(Builder.TakeString()));
6294 
6295   if (Results.includeCodePatterns()) {
6296     // @interface name
6297     // FIXME: Could introduce the whole pattern, including superclasses and
6298     // such.
6299     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "interface"));
6300     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6301     Builder.AddPlaceholderChunk("class");
6302     Results.AddResult(Result(Builder.TakeString()));
6303 
6304     // @protocol name
6305     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
6306     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6307     Builder.AddPlaceholderChunk("protocol");
6308     Results.AddResult(Result(Builder.TakeString()));
6309 
6310     // @implementation name
6311     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "implementation"));
6312     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6313     Builder.AddPlaceholderChunk("class");
6314     Results.AddResult(Result(Builder.TakeString()));
6315   }
6316 
6317   // @compatibility_alias name
6318   Builder.AddTypedTextChunk(
6319       OBJC_AT_KEYWORD_NAME(NeedAt, "compatibility_alias"));
6320   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6321   Builder.AddPlaceholderChunk("alias");
6322   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6323   Builder.AddPlaceholderChunk("class");
6324   Results.AddResult(Result(Builder.TakeString()));
6325 
6326   if (Results.getSema().getLangOpts().Modules) {
6327     // @import name
6328     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import"));
6329     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6330     Builder.AddPlaceholderChunk("module");
6331     Results.AddResult(Result(Builder.TakeString()));
6332   }
6333 }
6334 
6335 void Sema::CodeCompleteObjCAtDirective(Scope *S) {
6336   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6337                         CodeCompleter->getCodeCompletionTUInfo(),
6338                         CodeCompletionContext::CCC_Other);
6339   Results.EnterNewScope();
6340   if (isa<ObjCImplDecl>(CurContext))
6341     AddObjCImplementationResults(getLangOpts(), Results, false);
6342   else if (CurContext->isObjCContainer())
6343     AddObjCInterfaceResults(getLangOpts(), Results, false);
6344   else
6345     AddObjCTopLevelResults(Results, false);
6346   Results.ExitScope();
6347   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6348                             Results.data(), Results.size());
6349 }
6350 
6351 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
6352   typedef CodeCompletionResult Result;
6353   CodeCompletionBuilder Builder(Results.getAllocator(),
6354                                 Results.getCodeCompletionTUInfo());
6355 
6356   // @encode ( type-name )
6357   const char *EncodeType = "char[]";
6358   if (Results.getSema().getLangOpts().CPlusPlus ||
6359       Results.getSema().getLangOpts().ConstStrings)
6360     EncodeType = "const char[]";
6361   Builder.AddResultTypeChunk(EncodeType);
6362   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "encode"));
6363   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6364   Builder.AddPlaceholderChunk("type-name");
6365   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6366   Results.AddResult(Result(Builder.TakeString()));
6367 
6368   // @protocol ( protocol-name )
6369   Builder.AddResultTypeChunk("Protocol *");
6370   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
6371   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6372   Builder.AddPlaceholderChunk("protocol-name");
6373   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6374   Results.AddResult(Result(Builder.TakeString()));
6375 
6376   // @selector ( selector )
6377   Builder.AddResultTypeChunk("SEL");
6378   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "selector"));
6379   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6380   Builder.AddPlaceholderChunk("selector");
6381   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6382   Results.AddResult(Result(Builder.TakeString()));
6383 
6384   // @"string"
6385   Builder.AddResultTypeChunk("NSString *");
6386   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "\""));
6387   Builder.AddPlaceholderChunk("string");
6388   Builder.AddTextChunk("\"");
6389   Results.AddResult(Result(Builder.TakeString()));
6390 
6391   // @[objects, ...]
6392   Builder.AddResultTypeChunk("NSArray *");
6393   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "["));
6394   Builder.AddPlaceholderChunk("objects, ...");
6395   Builder.AddChunk(CodeCompletionString::CK_RightBracket);
6396   Results.AddResult(Result(Builder.TakeString()));
6397 
6398   // @{key : object, ...}
6399   Builder.AddResultTypeChunk("NSDictionary *");
6400   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "{"));
6401   Builder.AddPlaceholderChunk("key");
6402   Builder.AddChunk(CodeCompletionString::CK_Colon);
6403   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6404   Builder.AddPlaceholderChunk("object, ...");
6405   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6406   Results.AddResult(Result(Builder.TakeString()));
6407 
6408   // @(expression)
6409   Builder.AddResultTypeChunk("id");
6410   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "("));
6411   Builder.AddPlaceholderChunk("expression");
6412   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6413   Results.AddResult(Result(Builder.TakeString()));
6414 }
6415 
6416 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
6417   typedef CodeCompletionResult Result;
6418   CodeCompletionBuilder Builder(Results.getAllocator(),
6419                                 Results.getCodeCompletionTUInfo());
6420 
6421   if (Results.includeCodePatterns()) {
6422     // @try { statements } @catch ( declaration ) { statements } @finally
6423     //   { statements }
6424     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "try"));
6425     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6426     Builder.AddPlaceholderChunk("statements");
6427     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6428     Builder.AddTextChunk("@catch");
6429     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6430     Builder.AddPlaceholderChunk("parameter");
6431     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6432     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6433     Builder.AddPlaceholderChunk("statements");
6434     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6435     Builder.AddTextChunk("@finally");
6436     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6437     Builder.AddPlaceholderChunk("statements");
6438     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6439     Results.AddResult(Result(Builder.TakeString()));
6440   }
6441 
6442   // @throw
6443   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "throw"));
6444   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6445   Builder.AddPlaceholderChunk("expression");
6446   Results.AddResult(Result(Builder.TakeString()));
6447 
6448   if (Results.includeCodePatterns()) {
6449     // @synchronized ( expression ) { statements }
6450     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synchronized"));
6451     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6452     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6453     Builder.AddPlaceholderChunk("expression");
6454     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6455     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6456     Builder.AddPlaceholderChunk("statements");
6457     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6458     Results.AddResult(Result(Builder.TakeString()));
6459   }
6460 }
6461 
6462 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
6463                                      ResultBuilder &Results, bool NeedAt) {
6464   typedef CodeCompletionResult Result;
6465   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "private")));
6466   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "protected")));
6467   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "public")));
6468   if (LangOpts.ObjC)
6469     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "package")));
6470 }
6471 
6472 void Sema::CodeCompleteObjCAtVisibility(Scope *S) {
6473   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6474                         CodeCompleter->getCodeCompletionTUInfo(),
6475                         CodeCompletionContext::CCC_Other);
6476   Results.EnterNewScope();
6477   AddObjCVisibilityResults(getLangOpts(), Results, false);
6478   Results.ExitScope();
6479   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6480                             Results.data(), Results.size());
6481 }
6482 
6483 void Sema::CodeCompleteObjCAtStatement(Scope *S) {
6484   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6485                         CodeCompleter->getCodeCompletionTUInfo(),
6486                         CodeCompletionContext::CCC_Other);
6487   Results.EnterNewScope();
6488   AddObjCStatementResults(Results, false);
6489   AddObjCExpressionResults(Results, false);
6490   Results.ExitScope();
6491   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6492                             Results.data(), Results.size());
6493 }
6494 
6495 void Sema::CodeCompleteObjCAtExpression(Scope *S) {
6496   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6497                         CodeCompleter->getCodeCompletionTUInfo(),
6498                         CodeCompletionContext::CCC_Other);
6499   Results.EnterNewScope();
6500   AddObjCExpressionResults(Results, false);
6501   Results.ExitScope();
6502   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6503                             Results.data(), Results.size());
6504 }
6505 
6506 /// Determine whether the addition of the given flag to an Objective-C
6507 /// property's attributes will cause a conflict.
6508 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
6509   // Check if we've already added this flag.
6510   if (Attributes & NewFlag)
6511     return true;
6512 
6513   Attributes |= NewFlag;
6514 
6515   // Check for collisions with "readonly".
6516   if ((Attributes & ObjCPropertyAttribute::kind_readonly) &&
6517       (Attributes & ObjCPropertyAttribute::kind_readwrite))
6518     return true;
6519 
6520   // Check for more than one of { assign, copy, retain, strong, weak }.
6521   unsigned AssignCopyRetMask =
6522       Attributes &
6523       (ObjCPropertyAttribute::kind_assign |
6524        ObjCPropertyAttribute::kind_unsafe_unretained |
6525        ObjCPropertyAttribute::kind_copy | ObjCPropertyAttribute::kind_retain |
6526        ObjCPropertyAttribute::kind_strong | ObjCPropertyAttribute::kind_weak);
6527   if (AssignCopyRetMask &&
6528       AssignCopyRetMask != ObjCPropertyAttribute::kind_assign &&
6529       AssignCopyRetMask != ObjCPropertyAttribute::kind_unsafe_unretained &&
6530       AssignCopyRetMask != ObjCPropertyAttribute::kind_copy &&
6531       AssignCopyRetMask != ObjCPropertyAttribute::kind_retain &&
6532       AssignCopyRetMask != ObjCPropertyAttribute::kind_strong &&
6533       AssignCopyRetMask != ObjCPropertyAttribute::kind_weak)
6534     return true;
6535 
6536   return false;
6537 }
6538 
6539 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
6540   if (!CodeCompleter)
6541     return;
6542 
6543   unsigned Attributes = ODS.getPropertyAttributes();
6544 
6545   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6546                         CodeCompleter->getCodeCompletionTUInfo(),
6547                         CodeCompletionContext::CCC_Other);
6548   Results.EnterNewScope();
6549   if (!ObjCPropertyFlagConflicts(Attributes,
6550                                  ObjCPropertyAttribute::kind_readonly))
6551     Results.AddResult(CodeCompletionResult("readonly"));
6552   if (!ObjCPropertyFlagConflicts(Attributes,
6553                                  ObjCPropertyAttribute::kind_assign))
6554     Results.AddResult(CodeCompletionResult("assign"));
6555   if (!ObjCPropertyFlagConflicts(Attributes,
6556                                  ObjCPropertyAttribute::kind_unsafe_unretained))
6557     Results.AddResult(CodeCompletionResult("unsafe_unretained"));
6558   if (!ObjCPropertyFlagConflicts(Attributes,
6559                                  ObjCPropertyAttribute::kind_readwrite))
6560     Results.AddResult(CodeCompletionResult("readwrite"));
6561   if (!ObjCPropertyFlagConflicts(Attributes,
6562                                  ObjCPropertyAttribute::kind_retain))
6563     Results.AddResult(CodeCompletionResult("retain"));
6564   if (!ObjCPropertyFlagConflicts(Attributes,
6565                                  ObjCPropertyAttribute::kind_strong))
6566     Results.AddResult(CodeCompletionResult("strong"));
6567   if (!ObjCPropertyFlagConflicts(Attributes, ObjCPropertyAttribute::kind_copy))
6568     Results.AddResult(CodeCompletionResult("copy"));
6569   if (!ObjCPropertyFlagConflicts(Attributes,
6570                                  ObjCPropertyAttribute::kind_nonatomic))
6571     Results.AddResult(CodeCompletionResult("nonatomic"));
6572   if (!ObjCPropertyFlagConflicts(Attributes,
6573                                  ObjCPropertyAttribute::kind_atomic))
6574     Results.AddResult(CodeCompletionResult("atomic"));
6575 
6576   // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC.
6577   if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC)
6578     if (!ObjCPropertyFlagConflicts(Attributes,
6579                                    ObjCPropertyAttribute::kind_weak))
6580       Results.AddResult(CodeCompletionResult("weak"));
6581 
6582   if (!ObjCPropertyFlagConflicts(Attributes,
6583                                  ObjCPropertyAttribute::kind_setter)) {
6584     CodeCompletionBuilder Setter(Results.getAllocator(),
6585                                  Results.getCodeCompletionTUInfo());
6586     Setter.AddTypedTextChunk("setter");
6587     Setter.AddTextChunk("=");
6588     Setter.AddPlaceholderChunk("method");
6589     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
6590   }
6591   if (!ObjCPropertyFlagConflicts(Attributes,
6592                                  ObjCPropertyAttribute::kind_getter)) {
6593     CodeCompletionBuilder Getter(Results.getAllocator(),
6594                                  Results.getCodeCompletionTUInfo());
6595     Getter.AddTypedTextChunk("getter");
6596     Getter.AddTextChunk("=");
6597     Getter.AddPlaceholderChunk("method");
6598     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
6599   }
6600   if (!ObjCPropertyFlagConflicts(Attributes,
6601                                  ObjCPropertyAttribute::kind_nullability)) {
6602     Results.AddResult(CodeCompletionResult("nonnull"));
6603     Results.AddResult(CodeCompletionResult("nullable"));
6604     Results.AddResult(CodeCompletionResult("null_unspecified"));
6605     Results.AddResult(CodeCompletionResult("null_resettable"));
6606   }
6607   Results.ExitScope();
6608   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6609                             Results.data(), Results.size());
6610 }
6611 
6612 /// Describes the kind of Objective-C method that we want to find
6613 /// via code completion.
6614 enum ObjCMethodKind {
6615   MK_Any, ///< Any kind of method, provided it means other specified criteria.
6616   MK_ZeroArgSelector, ///< Zero-argument (unary) selector.
6617   MK_OneArgSelector   ///< One-argument selector.
6618 };
6619 
6620 static bool isAcceptableObjCSelector(Selector Sel, ObjCMethodKind WantKind,
6621                                      ArrayRef<IdentifierInfo *> SelIdents,
6622                                      bool AllowSameLength = true) {
6623   unsigned NumSelIdents = SelIdents.size();
6624   if (NumSelIdents > Sel.getNumArgs())
6625     return false;
6626 
6627   switch (WantKind) {
6628   case MK_Any:
6629     break;
6630   case MK_ZeroArgSelector:
6631     return Sel.isUnarySelector();
6632   case MK_OneArgSelector:
6633     return Sel.getNumArgs() == 1;
6634   }
6635 
6636   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
6637     return false;
6638 
6639   for (unsigned I = 0; I != NumSelIdents; ++I)
6640     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
6641       return false;
6642 
6643   return true;
6644 }
6645 
6646 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
6647                                    ObjCMethodKind WantKind,
6648                                    ArrayRef<IdentifierInfo *> SelIdents,
6649                                    bool AllowSameLength = true) {
6650   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
6651                                   AllowSameLength);
6652 }
6653 
6654 /// A set of selectors, which is used to avoid introducing multiple
6655 /// completions with the same selector into the result set.
6656 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
6657 
6658 /// Add all of the Objective-C methods in the given Objective-C
6659 /// container to the set of results.
6660 ///
6661 /// The container will be a class, protocol, category, or implementation of
6662 /// any of the above. This mether will recurse to include methods from
6663 /// the superclasses of classes along with their categories, protocols, and
6664 /// implementations.
6665 ///
6666 /// \param Container the container in which we'll look to find methods.
6667 ///
6668 /// \param WantInstanceMethods Whether to add instance methods (only); if
6669 /// false, this routine will add factory methods (only).
6670 ///
6671 /// \param CurContext the context in which we're performing the lookup that
6672 /// finds methods.
6673 ///
6674 /// \param AllowSameLength Whether we allow a method to be added to the list
6675 /// when it has the same number of parameters as we have selector identifiers.
6676 ///
6677 /// \param Results the structure into which we'll add results.
6678 static void AddObjCMethods(ObjCContainerDecl *Container,
6679                            bool WantInstanceMethods, ObjCMethodKind WantKind,
6680                            ArrayRef<IdentifierInfo *> SelIdents,
6681                            DeclContext *CurContext,
6682                            VisitedSelectorSet &Selectors, bool AllowSameLength,
6683                            ResultBuilder &Results, bool InOriginalClass = true,
6684                            bool IsRootClass = false) {
6685   typedef CodeCompletionResult Result;
6686   Container = getContainerDef(Container);
6687   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
6688   IsRootClass = IsRootClass || (IFace && !IFace->getSuperClass());
6689   for (ObjCMethodDecl *M : Container->methods()) {
6690     // The instance methods on the root class can be messaged via the
6691     // metaclass.
6692     if (M->isInstanceMethod() == WantInstanceMethods ||
6693         (IsRootClass && !WantInstanceMethods)) {
6694       // Check whether the selector identifiers we've been given are a
6695       // subset of the identifiers for this particular method.
6696       if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength))
6697         continue;
6698 
6699       if (!Selectors.insert(M->getSelector()).second)
6700         continue;
6701 
6702       Result R = Result(M, Results.getBasePriority(M), nullptr);
6703       R.StartParameter = SelIdents.size();
6704       R.AllParametersAreInformative = (WantKind != MK_Any);
6705       if (!InOriginalClass)
6706         setInBaseClass(R);
6707       Results.MaybeAddResult(R, CurContext);
6708     }
6709   }
6710 
6711   // Visit the protocols of protocols.
6712   if (const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
6713     if (Protocol->hasDefinition()) {
6714       const ObjCList<ObjCProtocolDecl> &Protocols =
6715           Protocol->getReferencedProtocols();
6716       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
6717                                                 E = Protocols.end();
6718            I != E; ++I)
6719         AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
6720                        Selectors, AllowSameLength, Results, false, IsRootClass);
6721     }
6722   }
6723 
6724   if (!IFace || !IFace->hasDefinition())
6725     return;
6726 
6727   // Add methods in protocols.
6728   for (ObjCProtocolDecl *I : IFace->protocols())
6729     AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext,
6730                    Selectors, AllowSameLength, Results, false, IsRootClass);
6731 
6732   // Add methods in categories.
6733   for (ObjCCategoryDecl *CatDecl : IFace->known_categories()) {
6734     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
6735                    CurContext, Selectors, AllowSameLength, Results,
6736                    InOriginalClass, IsRootClass);
6737 
6738     // Add a categories protocol methods.
6739     const ObjCList<ObjCProtocolDecl> &Protocols =
6740         CatDecl->getReferencedProtocols();
6741     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
6742                                               E = Protocols.end();
6743          I != E; ++I)
6744       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
6745                      Selectors, AllowSameLength, Results, false, IsRootClass);
6746 
6747     // Add methods in category implementations.
6748     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
6749       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
6750                      Selectors, AllowSameLength, Results, InOriginalClass,
6751                      IsRootClass);
6752   }
6753 
6754   // Add methods in superclass.
6755   // Avoid passing in IsRootClass since root classes won't have super classes.
6756   if (IFace->getSuperClass())
6757     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
6758                    SelIdents, CurContext, Selectors, AllowSameLength, Results,
6759                    /*IsRootClass=*/false);
6760 
6761   // Add methods in our implementation, if any.
6762   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
6763     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
6764                    Selectors, AllowSameLength, Results, InOriginalClass,
6765                    IsRootClass);
6766 }
6767 
6768 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) {
6769   // Try to find the interface where getters might live.
6770   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
6771   if (!Class) {
6772     if (ObjCCategoryDecl *Category =
6773             dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
6774       Class = Category->getClassInterface();
6775 
6776     if (!Class)
6777       return;
6778   }
6779 
6780   // Find all of the potential getters.
6781   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6782                         CodeCompleter->getCodeCompletionTUInfo(),
6783                         CodeCompletionContext::CCC_Other);
6784   Results.EnterNewScope();
6785 
6786   VisitedSelectorSet Selectors;
6787   AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors,
6788                  /*AllowSameLength=*/true, Results);
6789   Results.ExitScope();
6790   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6791                             Results.data(), Results.size());
6792 }
6793 
6794 void Sema::CodeCompleteObjCPropertySetter(Scope *S) {
6795   // Try to find the interface where setters might live.
6796   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
6797   if (!Class) {
6798     if (ObjCCategoryDecl *Category =
6799             dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
6800       Class = Category->getClassInterface();
6801 
6802     if (!Class)
6803       return;
6804   }
6805 
6806   // Find all of the potential getters.
6807   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6808                         CodeCompleter->getCodeCompletionTUInfo(),
6809                         CodeCompletionContext::CCC_Other);
6810   Results.EnterNewScope();
6811 
6812   VisitedSelectorSet Selectors;
6813   AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext, Selectors,
6814                  /*AllowSameLength=*/true, Results);
6815 
6816   Results.ExitScope();
6817   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6818                             Results.data(), Results.size());
6819 }
6820 
6821 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
6822                                        bool IsParameter) {
6823   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6824                         CodeCompleter->getCodeCompletionTUInfo(),
6825                         CodeCompletionContext::CCC_Type);
6826   Results.EnterNewScope();
6827 
6828   // Add context-sensitive, Objective-C parameter-passing keywords.
6829   bool AddedInOut = false;
6830   if ((DS.getObjCDeclQualifier() &
6831        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
6832     Results.AddResult("in");
6833     Results.AddResult("inout");
6834     AddedInOut = true;
6835   }
6836   if ((DS.getObjCDeclQualifier() &
6837        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
6838     Results.AddResult("out");
6839     if (!AddedInOut)
6840       Results.AddResult("inout");
6841   }
6842   if ((DS.getObjCDeclQualifier() &
6843        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
6844         ObjCDeclSpec::DQ_Oneway)) == 0) {
6845     Results.AddResult("bycopy");
6846     Results.AddResult("byref");
6847     Results.AddResult("oneway");
6848   }
6849   if ((DS.getObjCDeclQualifier() & ObjCDeclSpec::DQ_CSNullability) == 0) {
6850     Results.AddResult("nonnull");
6851     Results.AddResult("nullable");
6852     Results.AddResult("null_unspecified");
6853   }
6854 
6855   // If we're completing the return type of an Objective-C method and the
6856   // identifier IBAction refers to a macro, provide a completion item for
6857   // an action, e.g.,
6858   //   IBAction)<#selector#>:(id)sender
6859   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
6860       PP.isMacroDefined("IBAction")) {
6861     CodeCompletionBuilder Builder(Results.getAllocator(),
6862                                   Results.getCodeCompletionTUInfo(),
6863                                   CCP_CodePattern, CXAvailability_Available);
6864     Builder.AddTypedTextChunk("IBAction");
6865     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6866     Builder.AddPlaceholderChunk("selector");
6867     Builder.AddChunk(CodeCompletionString::CK_Colon);
6868     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6869     Builder.AddTextChunk("id");
6870     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6871     Builder.AddTextChunk("sender");
6872     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
6873   }
6874 
6875   // If we're completing the return type, provide 'instancetype'.
6876   if (!IsParameter) {
6877     Results.AddResult(CodeCompletionResult("instancetype"));
6878   }
6879 
6880   // Add various builtin type names and specifiers.
6881   AddOrdinaryNameResults(PCC_Type, S, *this, Results);
6882   Results.ExitScope();
6883 
6884   // Add the various type names
6885   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
6886   CodeCompletionDeclConsumer Consumer(Results, CurContext);
6887   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6888                      CodeCompleter->includeGlobals(),
6889                      CodeCompleter->loadExternal());
6890 
6891   if (CodeCompleter->includeMacros())
6892     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
6893 
6894   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6895                             Results.data(), Results.size());
6896 }
6897 
6898 /// When we have an expression with type "id", we may assume
6899 /// that it has some more-specific class type based on knowledge of
6900 /// common uses of Objective-C. This routine returns that class type,
6901 /// or NULL if no better result could be determined.
6902 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
6903   auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
6904   if (!Msg)
6905     return nullptr;
6906 
6907   Selector Sel = Msg->getSelector();
6908   if (Sel.isNull())
6909     return nullptr;
6910 
6911   IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
6912   if (!Id)
6913     return nullptr;
6914 
6915   ObjCMethodDecl *Method = Msg->getMethodDecl();
6916   if (!Method)
6917     return nullptr;
6918 
6919   // Determine the class that we're sending the message to.
6920   ObjCInterfaceDecl *IFace = nullptr;
6921   switch (Msg->getReceiverKind()) {
6922   case ObjCMessageExpr::Class:
6923     if (const ObjCObjectType *ObjType =
6924             Msg->getClassReceiver()->getAs<ObjCObjectType>())
6925       IFace = ObjType->getInterface();
6926     break;
6927 
6928   case ObjCMessageExpr::Instance: {
6929     QualType T = Msg->getInstanceReceiver()->getType();
6930     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
6931       IFace = Ptr->getInterfaceDecl();
6932     break;
6933   }
6934 
6935   case ObjCMessageExpr::SuperInstance:
6936   case ObjCMessageExpr::SuperClass:
6937     break;
6938   }
6939 
6940   if (!IFace)
6941     return nullptr;
6942 
6943   ObjCInterfaceDecl *Super = IFace->getSuperClass();
6944   if (Method->isInstanceMethod())
6945     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
6946         .Case("retain", IFace)
6947         .Case("strong", IFace)
6948         .Case("autorelease", IFace)
6949         .Case("copy", IFace)
6950         .Case("copyWithZone", IFace)
6951         .Case("mutableCopy", IFace)
6952         .Case("mutableCopyWithZone", IFace)
6953         .Case("awakeFromCoder", IFace)
6954         .Case("replacementObjectFromCoder", IFace)
6955         .Case("class", IFace)
6956         .Case("classForCoder", IFace)
6957         .Case("superclass", Super)
6958         .Default(nullptr);
6959 
6960   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
6961       .Case("new", IFace)
6962       .Case("alloc", IFace)
6963       .Case("allocWithZone", IFace)
6964       .Case("class", IFace)
6965       .Case("superclass", Super)
6966       .Default(nullptr);
6967 }
6968 
6969 // Add a special completion for a message send to "super", which fills in the
6970 // most likely case of forwarding all of our arguments to the superclass
6971 // function.
6972 ///
6973 /// \param S The semantic analysis object.
6974 ///
6975 /// \param NeedSuperKeyword Whether we need to prefix this completion with
6976 /// the "super" keyword. Otherwise, we just need to provide the arguments.
6977 ///
6978 /// \param SelIdents The identifiers in the selector that have already been
6979 /// provided as arguments for a send to "super".
6980 ///
6981 /// \param Results The set of results to augment.
6982 ///
6983 /// \returns the Objective-C method declaration that would be invoked by
6984 /// this "super" completion. If NULL, no completion was added.
6985 static ObjCMethodDecl *
6986 AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,
6987                        ArrayRef<IdentifierInfo *> SelIdents,
6988                        ResultBuilder &Results) {
6989   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
6990   if (!CurMethod)
6991     return nullptr;
6992 
6993   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
6994   if (!Class)
6995     return nullptr;
6996 
6997   // Try to find a superclass method with the same selector.
6998   ObjCMethodDecl *SuperMethod = nullptr;
6999   while ((Class = Class->getSuperClass()) && !SuperMethod) {
7000     // Check in the class
7001     SuperMethod = Class->getMethod(CurMethod->getSelector(),
7002                                    CurMethod->isInstanceMethod());
7003 
7004     // Check in categories or class extensions.
7005     if (!SuperMethod) {
7006       for (const auto *Cat : Class->known_categories()) {
7007         if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(),
7008                                           CurMethod->isInstanceMethod())))
7009           break;
7010       }
7011     }
7012   }
7013 
7014   if (!SuperMethod)
7015     return nullptr;
7016 
7017   // Check whether the superclass method has the same signature.
7018   if (CurMethod->param_size() != SuperMethod->param_size() ||
7019       CurMethod->isVariadic() != SuperMethod->isVariadic())
7020     return nullptr;
7021 
7022   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
7023                                       CurPEnd = CurMethod->param_end(),
7024                                       SuperP = SuperMethod->param_begin();
7025        CurP != CurPEnd; ++CurP, ++SuperP) {
7026     // Make sure the parameter types are compatible.
7027     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
7028                                           (*SuperP)->getType()))
7029       return nullptr;
7030 
7031     // Make sure we have a parameter name to forward!
7032     if (!(*CurP)->getIdentifier())
7033       return nullptr;
7034   }
7035 
7036   // We have a superclass method. Now, form the send-to-super completion.
7037   CodeCompletionBuilder Builder(Results.getAllocator(),
7038                                 Results.getCodeCompletionTUInfo());
7039 
7040   // Give this completion a return type.
7041   AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod,
7042                      Results.getCompletionContext().getBaseType(), Builder);
7043 
7044   // If we need the "super" keyword, add it (plus some spacing).
7045   if (NeedSuperKeyword) {
7046     Builder.AddTypedTextChunk("super");
7047     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7048   }
7049 
7050   Selector Sel = CurMethod->getSelector();
7051   if (Sel.isUnarySelector()) {
7052     if (NeedSuperKeyword)
7053       Builder.AddTextChunk(
7054           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
7055     else
7056       Builder.AddTypedTextChunk(
7057           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
7058   } else {
7059     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
7060     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
7061       if (I > SelIdents.size())
7062         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7063 
7064       if (I < SelIdents.size())
7065         Builder.AddInformativeChunk(
7066             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
7067       else if (NeedSuperKeyword || I > SelIdents.size()) {
7068         Builder.AddTextChunk(
7069             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
7070         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
7071             (*CurP)->getIdentifier()->getName()));
7072       } else {
7073         Builder.AddTypedTextChunk(
7074             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
7075         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
7076             (*CurP)->getIdentifier()->getName()));
7077       }
7078     }
7079   }
7080 
7081   Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod,
7082                                          CCP_SuperCompletion));
7083   return SuperMethod;
7084 }
7085 
7086 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {
7087   typedef CodeCompletionResult Result;
7088   ResultBuilder Results(
7089       *this, CodeCompleter->getAllocator(),
7090       CodeCompleter->getCodeCompletionTUInfo(),
7091       CodeCompletionContext::CCC_ObjCMessageReceiver,
7092       getLangOpts().CPlusPlus11
7093           ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
7094           : &ResultBuilder::IsObjCMessageReceiver);
7095 
7096   CodeCompletionDeclConsumer Consumer(Results, CurContext);
7097   Results.EnterNewScope();
7098   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
7099                      CodeCompleter->includeGlobals(),
7100                      CodeCompleter->loadExternal());
7101 
7102   // If we are in an Objective-C method inside a class that has a superclass,
7103   // add "super" as an option.
7104   if (ObjCMethodDecl *Method = getCurMethodDecl())
7105     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
7106       if (Iface->getSuperClass()) {
7107         Results.AddResult(Result("super"));
7108 
7109         AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results);
7110       }
7111 
7112   if (getLangOpts().CPlusPlus11)
7113     addThisCompletion(*this, Results);
7114 
7115   Results.ExitScope();
7116 
7117   if (CodeCompleter->includeMacros())
7118     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
7119   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7120                             Results.data(), Results.size());
7121 }
7122 
7123 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
7124                                         ArrayRef<IdentifierInfo *> SelIdents,
7125                                         bool AtArgumentExpression) {
7126   ObjCInterfaceDecl *CDecl = nullptr;
7127   if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
7128     // Figure out which interface we're in.
7129     CDecl = CurMethod->getClassInterface();
7130     if (!CDecl)
7131       return;
7132 
7133     // Find the superclass of this class.
7134     CDecl = CDecl->getSuperClass();
7135     if (!CDecl)
7136       return;
7137 
7138     if (CurMethod->isInstanceMethod()) {
7139       // We are inside an instance method, which means that the message
7140       // send [super ...] is actually calling an instance method on the
7141       // current object.
7142       return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents,
7143                                              AtArgumentExpression, CDecl);
7144     }
7145 
7146     // Fall through to send to the superclass in CDecl.
7147   } else {
7148     // "super" may be the name of a type or variable. Figure out which
7149     // it is.
7150     IdentifierInfo *Super = getSuperIdentifier();
7151     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, LookupOrdinaryName);
7152     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
7153       // "super" names an interface. Use it.
7154     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
7155       if (const ObjCObjectType *Iface =
7156               Context.getTypeDeclType(TD)->getAs<ObjCObjectType>())
7157         CDecl = Iface->getInterface();
7158     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
7159       // "super" names an unresolved type; we can't be more specific.
7160     } else {
7161       // Assume that "super" names some kind of value and parse that way.
7162       CXXScopeSpec SS;
7163       SourceLocation TemplateKWLoc;
7164       UnqualifiedId id;
7165       id.setIdentifier(Super, SuperLoc);
7166       ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id,
7167                                                /*HasTrailingLParen=*/false,
7168                                                /*IsAddressOfOperand=*/false);
7169       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
7170                                              SelIdents, AtArgumentExpression);
7171     }
7172 
7173     // Fall through
7174   }
7175 
7176   ParsedType Receiver;
7177   if (CDecl)
7178     Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));
7179   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
7180                                       AtArgumentExpression,
7181                                       /*IsSuper=*/true);
7182 }
7183 
7184 /// Given a set of code-completion results for the argument of a message
7185 /// send, determine the preferred type (if any) for that argument expression.
7186 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
7187                                                        unsigned NumSelIdents) {
7188   typedef CodeCompletionResult Result;
7189   ASTContext &Context = Results.getSema().Context;
7190 
7191   QualType PreferredType;
7192   unsigned BestPriority = CCP_Unlikely * 2;
7193   Result *ResultsData = Results.data();
7194   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
7195     Result &R = ResultsData[I];
7196     if (R.Kind == Result::RK_Declaration &&
7197         isa<ObjCMethodDecl>(R.Declaration)) {
7198       if (R.Priority <= BestPriority) {
7199         const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
7200         if (NumSelIdents <= Method->param_size()) {
7201           QualType MyPreferredType =
7202               Method->parameters()[NumSelIdents - 1]->getType();
7203           if (R.Priority < BestPriority || PreferredType.isNull()) {
7204             BestPriority = R.Priority;
7205             PreferredType = MyPreferredType;
7206           } else if (!Context.hasSameUnqualifiedType(PreferredType,
7207                                                      MyPreferredType)) {
7208             PreferredType = QualType();
7209           }
7210         }
7211       }
7212     }
7213   }
7214 
7215   return PreferredType;
7216 }
7217 
7218 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
7219                                        ParsedType Receiver,
7220                                        ArrayRef<IdentifierInfo *> SelIdents,
7221                                        bool AtArgumentExpression, bool IsSuper,
7222                                        ResultBuilder &Results) {
7223   typedef CodeCompletionResult Result;
7224   ObjCInterfaceDecl *CDecl = nullptr;
7225 
7226   // If the given name refers to an interface type, retrieve the
7227   // corresponding declaration.
7228   if (Receiver) {
7229     QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr);
7230     if (!T.isNull())
7231       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
7232         CDecl = Interface->getInterface();
7233   }
7234 
7235   // Add all of the factory methods in this Objective-C class, its protocols,
7236   // superclasses, categories, implementation, etc.
7237   Results.EnterNewScope();
7238 
7239   // If this is a send-to-super, try to add the special "super" send
7240   // completion.
7241   if (IsSuper) {
7242     if (ObjCMethodDecl *SuperMethod =
7243             AddSuperSendCompletion(SemaRef, false, SelIdents, Results))
7244       Results.Ignore(SuperMethod);
7245   }
7246 
7247   // If we're inside an Objective-C method definition, prefer its selector to
7248   // others.
7249   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
7250     Results.setPreferredSelector(CurMethod->getSelector());
7251 
7252   VisitedSelectorSet Selectors;
7253   if (CDecl)
7254     AddObjCMethods(CDecl, false, MK_Any, SelIdents, SemaRef.CurContext,
7255                    Selectors, AtArgumentExpression, Results);
7256   else {
7257     // We're messaging "id" as a type; provide all class/factory methods.
7258 
7259     // If we have an external source, load the entire class method
7260     // pool from the AST file.
7261     if (SemaRef.getExternalSource()) {
7262       for (uint32_t I = 0,
7263                     N = SemaRef.getExternalSource()->GetNumExternalSelectors();
7264            I != N; ++I) {
7265         Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I);
7266         if (Sel.isNull() || SemaRef.MethodPool.count(Sel))
7267           continue;
7268 
7269         SemaRef.ReadMethodPool(Sel);
7270       }
7271     }
7272 
7273     for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(),
7274                                           MEnd = SemaRef.MethodPool.end();
7275          M != MEnd; ++M) {
7276       for (ObjCMethodList *MethList = &M->second.second;
7277            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
7278         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
7279           continue;
7280 
7281         Result R(MethList->getMethod(),
7282                  Results.getBasePriority(MethList->getMethod()), nullptr);
7283         R.StartParameter = SelIdents.size();
7284         R.AllParametersAreInformative = false;
7285         Results.MaybeAddResult(R, SemaRef.CurContext);
7286       }
7287     }
7288   }
7289 
7290   Results.ExitScope();
7291 }
7292 
7293 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
7294                                         ArrayRef<IdentifierInfo *> SelIdents,
7295                                         bool AtArgumentExpression,
7296                                         bool IsSuper) {
7297 
7298   QualType T = this->GetTypeFromParser(Receiver);
7299 
7300   ResultBuilder Results(
7301       *this, CodeCompleter->getAllocator(),
7302       CodeCompleter->getCodeCompletionTUInfo(),
7303       CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, T,
7304                             SelIdents));
7305 
7306   AddClassMessageCompletions(*this, S, Receiver, SelIdents,
7307                              AtArgumentExpression, IsSuper, Results);
7308 
7309   // If we're actually at the argument expression (rather than prior to the
7310   // selector), we're actually performing code completion for an expression.
7311   // Determine whether we have a single, best method. If so, we can
7312   // code-complete the expression using the corresponding parameter type as
7313   // our preferred type, improving completion results.
7314   if (AtArgumentExpression) {
7315     QualType PreferredType =
7316         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
7317     if (PreferredType.isNull())
7318       CodeCompleteOrdinaryName(S, PCC_Expression);
7319     else
7320       CodeCompleteExpression(S, PreferredType);
7321     return;
7322   }
7323 
7324   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7325                             Results.data(), Results.size());
7326 }
7327 
7328 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,
7329                                            ArrayRef<IdentifierInfo *> SelIdents,
7330                                            bool AtArgumentExpression,
7331                                            ObjCInterfaceDecl *Super) {
7332   typedef CodeCompletionResult Result;
7333 
7334   Expr *RecExpr = static_cast<Expr *>(Receiver);
7335 
7336   // If necessary, apply function/array conversion to the receiver.
7337   // C99 6.7.5.3p[7,8].
7338   if (RecExpr) {
7339     ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr);
7340     if (Conv.isInvalid()) // conversion failed. bail.
7341       return;
7342     RecExpr = Conv.get();
7343   }
7344   QualType ReceiverType = RecExpr
7345                               ? RecExpr->getType()
7346                               : Super ? Context.getObjCObjectPointerType(
7347                                             Context.getObjCInterfaceType(Super))
7348                                       : Context.getObjCIdType();
7349 
7350   // If we're messaging an expression with type "id" or "Class", check
7351   // whether we know something special about the receiver that allows
7352   // us to assume a more-specific receiver type.
7353   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) {
7354     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
7355       if (ReceiverType->isObjCClassType())
7356         return CodeCompleteObjCClassMessage(
7357             S, ParsedType::make(Context.getObjCInterfaceType(IFace)), SelIdents,
7358             AtArgumentExpression, Super);
7359 
7360       ReceiverType =
7361           Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace));
7362     }
7363   } else if (RecExpr && getLangOpts().CPlusPlus) {
7364     ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr);
7365     if (Conv.isUsable()) {
7366       RecExpr = Conv.get();
7367       ReceiverType = RecExpr->getType();
7368     }
7369   }
7370 
7371   // Build the set of methods we can see.
7372   ResultBuilder Results(
7373       *this, CodeCompleter->getAllocator(),
7374       CodeCompleter->getCodeCompletionTUInfo(),
7375       CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
7376                             ReceiverType, SelIdents));
7377 
7378   Results.EnterNewScope();
7379 
7380   // If this is a send-to-super, try to add the special "super" send
7381   // completion.
7382   if (Super) {
7383     if (ObjCMethodDecl *SuperMethod =
7384             AddSuperSendCompletion(*this, false, SelIdents, Results))
7385       Results.Ignore(SuperMethod);
7386   }
7387 
7388   // If we're inside an Objective-C method definition, prefer its selector to
7389   // others.
7390   if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
7391     Results.setPreferredSelector(CurMethod->getSelector());
7392 
7393   // Keep track of the selectors we've already added.
7394   VisitedSelectorSet Selectors;
7395 
7396   // Handle messages to Class. This really isn't a message to an instance
7397   // method, so we treat it the same way we would treat a message send to a
7398   // class method.
7399   if (ReceiverType->isObjCClassType() ||
7400       ReceiverType->isObjCQualifiedClassType()) {
7401     if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
7402       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
7403         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, CurContext,
7404                        Selectors, AtArgumentExpression, Results);
7405     }
7406   }
7407   // Handle messages to a qualified ID ("id<foo>").
7408   else if (const ObjCObjectPointerType *QualID =
7409                ReceiverType->getAsObjCQualifiedIdType()) {
7410     // Search protocols for instance methods.
7411     for (auto *I : QualID->quals())
7412       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors,
7413                      AtArgumentExpression, Results);
7414   }
7415   // Handle messages to a pointer to interface type.
7416   else if (const ObjCObjectPointerType *IFacePtr =
7417                ReceiverType->getAsObjCInterfacePointerType()) {
7418     // Search the class, its superclasses, etc., for instance methods.
7419     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
7420                    CurContext, Selectors, AtArgumentExpression, Results);
7421 
7422     // Search protocols for instance methods.
7423     for (auto *I : IFacePtr->quals())
7424       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors,
7425                      AtArgumentExpression, Results);
7426   }
7427   // Handle messages to "id".
7428   else if (ReceiverType->isObjCIdType()) {
7429     // We're messaging "id", so provide all instance methods we know
7430     // about as code-completion results.
7431 
7432     // If we have an external source, load the entire class method
7433     // pool from the AST file.
7434     if (ExternalSource) {
7435       for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
7436            I != N; ++I) {
7437         Selector Sel = ExternalSource->GetExternalSelector(I);
7438         if (Sel.isNull() || MethodPool.count(Sel))
7439           continue;
7440 
7441         ReadMethodPool(Sel);
7442       }
7443     }
7444 
7445     for (GlobalMethodPool::iterator M = MethodPool.begin(),
7446                                     MEnd = MethodPool.end();
7447          M != MEnd; ++M) {
7448       for (ObjCMethodList *MethList = &M->second.first;
7449            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
7450         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
7451           continue;
7452 
7453         if (!Selectors.insert(MethList->getMethod()->getSelector()).second)
7454           continue;
7455 
7456         Result R(MethList->getMethod(),
7457                  Results.getBasePriority(MethList->getMethod()), nullptr);
7458         R.StartParameter = SelIdents.size();
7459         R.AllParametersAreInformative = false;
7460         Results.MaybeAddResult(R, CurContext);
7461       }
7462     }
7463   }
7464   Results.ExitScope();
7465 
7466   // If we're actually at the argument expression (rather than prior to the
7467   // selector), we're actually performing code completion for an expression.
7468   // Determine whether we have a single, best method. If so, we can
7469   // code-complete the expression using the corresponding parameter type as
7470   // our preferred type, improving completion results.
7471   if (AtArgumentExpression) {
7472     QualType PreferredType =
7473         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
7474     if (PreferredType.isNull())
7475       CodeCompleteOrdinaryName(S, PCC_Expression);
7476     else
7477       CodeCompleteExpression(S, PreferredType);
7478     return;
7479   }
7480 
7481   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7482                             Results.data(), Results.size());
7483 }
7484 
7485 void Sema::CodeCompleteObjCForCollection(Scope *S,
7486                                          DeclGroupPtrTy IterationVar) {
7487   CodeCompleteExpressionData Data;
7488   Data.ObjCCollection = true;
7489 
7490   if (IterationVar.getAsOpaquePtr()) {
7491     DeclGroupRef DG = IterationVar.get();
7492     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
7493       if (*I)
7494         Data.IgnoreDecls.push_back(*I);
7495     }
7496   }
7497 
7498   CodeCompleteExpression(S, Data);
7499 }
7500 
7501 void Sema::CodeCompleteObjCSelector(Scope *S,
7502                                     ArrayRef<IdentifierInfo *> SelIdents) {
7503   // If we have an external source, load the entire class method
7504   // pool from the AST file.
7505   if (ExternalSource) {
7506     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N;
7507          ++I) {
7508       Selector Sel = ExternalSource->GetExternalSelector(I);
7509       if (Sel.isNull() || MethodPool.count(Sel))
7510         continue;
7511 
7512       ReadMethodPool(Sel);
7513     }
7514   }
7515 
7516   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7517                         CodeCompleter->getCodeCompletionTUInfo(),
7518                         CodeCompletionContext::CCC_SelectorName);
7519   Results.EnterNewScope();
7520   for (GlobalMethodPool::iterator M = MethodPool.begin(),
7521                                   MEnd = MethodPool.end();
7522        M != MEnd; ++M) {
7523 
7524     Selector Sel = M->first;
7525     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents))
7526       continue;
7527 
7528     CodeCompletionBuilder Builder(Results.getAllocator(),
7529                                   Results.getCodeCompletionTUInfo());
7530     if (Sel.isUnarySelector()) {
7531       Builder.AddTypedTextChunk(
7532           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
7533       Results.AddResult(Builder.TakeString());
7534       continue;
7535     }
7536 
7537     std::string Accumulator;
7538     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
7539       if (I == SelIdents.size()) {
7540         if (!Accumulator.empty()) {
7541           Builder.AddInformativeChunk(
7542               Builder.getAllocator().CopyString(Accumulator));
7543           Accumulator.clear();
7544         }
7545       }
7546 
7547       Accumulator += Sel.getNameForSlot(I);
7548       Accumulator += ':';
7549     }
7550     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator));
7551     Results.AddResult(Builder.TakeString());
7552   }
7553   Results.ExitScope();
7554 
7555   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7556                             Results.data(), Results.size());
7557 }
7558 
7559 /// Add all of the protocol declarations that we find in the given
7560 /// (translation unit) context.
7561 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
7562                                bool OnlyForwardDeclarations,
7563                                ResultBuilder &Results) {
7564   typedef CodeCompletionResult Result;
7565 
7566   for (const auto *D : Ctx->decls()) {
7567     // Record any protocols we find.
7568     if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D))
7569       if (!OnlyForwardDeclarations || !Proto->hasDefinition())
7570         Results.AddResult(
7571             Result(Proto, Results.getBasePriority(Proto), nullptr), CurContext,
7572             nullptr, false);
7573   }
7574 }
7575 
7576 void Sema::CodeCompleteObjCProtocolReferences(
7577     ArrayRef<IdentifierLocPair> Protocols) {
7578   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7579                         CodeCompleter->getCodeCompletionTUInfo(),
7580                         CodeCompletionContext::CCC_ObjCProtocolName);
7581 
7582   if (CodeCompleter->includeGlobals()) {
7583     Results.EnterNewScope();
7584 
7585     // Tell the result set to ignore all of the protocols we have
7586     // already seen.
7587     // FIXME: This doesn't work when caching code-completion results.
7588     for (const IdentifierLocPair &Pair : Protocols)
7589       if (ObjCProtocolDecl *Protocol = LookupProtocol(Pair.first, Pair.second))
7590         Results.Ignore(Protocol);
7591 
7592     // Add all protocols.
7593     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false,
7594                        Results);
7595 
7596     Results.ExitScope();
7597   }
7598 
7599   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7600                             Results.data(), Results.size());
7601 }
7602 
7603 void Sema::CodeCompleteObjCProtocolDecl(Scope *) {
7604   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7605                         CodeCompleter->getCodeCompletionTUInfo(),
7606                         CodeCompletionContext::CCC_ObjCProtocolName);
7607 
7608   if (CodeCompleter->includeGlobals()) {
7609     Results.EnterNewScope();
7610 
7611     // Add all protocols.
7612     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true,
7613                        Results);
7614 
7615     Results.ExitScope();
7616   }
7617 
7618   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7619                             Results.data(), Results.size());
7620 }
7621 
7622 /// Add all of the Objective-C interface declarations that we find in
7623 /// the given (translation unit) context.
7624 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
7625                                 bool OnlyForwardDeclarations,
7626                                 bool OnlyUnimplemented,
7627                                 ResultBuilder &Results) {
7628   typedef CodeCompletionResult Result;
7629 
7630   for (const auto *D : Ctx->decls()) {
7631     // Record any interfaces we find.
7632     if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
7633       if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
7634           (!OnlyUnimplemented || !Class->getImplementation()))
7635         Results.AddResult(
7636             Result(Class, Results.getBasePriority(Class), nullptr), CurContext,
7637             nullptr, false);
7638   }
7639 }
7640 
7641 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
7642   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7643                         CodeCompleter->getCodeCompletionTUInfo(),
7644                         CodeCompletionContext::CCC_ObjCInterfaceName);
7645   Results.EnterNewScope();
7646 
7647   if (CodeCompleter->includeGlobals()) {
7648     // Add all classes.
7649     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
7650                         false, Results);
7651   }
7652 
7653   Results.ExitScope();
7654 
7655   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7656                             Results.data(), Results.size());
7657 }
7658 
7659 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
7660                                       SourceLocation ClassNameLoc) {
7661   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7662                         CodeCompleter->getCodeCompletionTUInfo(),
7663                         CodeCompletionContext::CCC_ObjCInterfaceName);
7664   Results.EnterNewScope();
7665 
7666   // Make sure that we ignore the class we're currently defining.
7667   NamedDecl *CurClass =
7668       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
7669   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
7670     Results.Ignore(CurClass);
7671 
7672   if (CodeCompleter->includeGlobals()) {
7673     // Add all classes.
7674     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
7675                         false, Results);
7676   }
7677 
7678   Results.ExitScope();
7679 
7680   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7681                             Results.data(), Results.size());
7682 }
7683 
7684 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
7685   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7686                         CodeCompleter->getCodeCompletionTUInfo(),
7687                         CodeCompletionContext::CCC_ObjCImplementation);
7688   Results.EnterNewScope();
7689 
7690   if (CodeCompleter->includeGlobals()) {
7691     // Add all unimplemented classes.
7692     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
7693                         true, Results);
7694   }
7695 
7696   Results.ExitScope();
7697 
7698   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7699                             Results.data(), Results.size());
7700 }
7701 
7702 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
7703                                              IdentifierInfo *ClassName,
7704                                              SourceLocation ClassNameLoc) {
7705   typedef CodeCompletionResult Result;
7706 
7707   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7708                         CodeCompleter->getCodeCompletionTUInfo(),
7709                         CodeCompletionContext::CCC_ObjCCategoryName);
7710 
7711   // Ignore any categories we find that have already been implemented by this
7712   // interface.
7713   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
7714   NamedDecl *CurClass =
7715       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
7716   if (ObjCInterfaceDecl *Class =
7717           dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) {
7718     for (const auto *Cat : Class->visible_categories())
7719       CategoryNames.insert(Cat->getIdentifier());
7720   }
7721 
7722   // Add all of the categories we know about.
7723   Results.EnterNewScope();
7724   TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
7725   for (const auto *D : TU->decls())
7726     if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D))
7727       if (CategoryNames.insert(Category->getIdentifier()).second)
7728         Results.AddResult(
7729             Result(Category, Results.getBasePriority(Category), nullptr),
7730             CurContext, nullptr, false);
7731   Results.ExitScope();
7732 
7733   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7734                             Results.data(), Results.size());
7735 }
7736 
7737 void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
7738                                                   IdentifierInfo *ClassName,
7739                                                   SourceLocation ClassNameLoc) {
7740   typedef CodeCompletionResult Result;
7741 
7742   // Find the corresponding interface. If we couldn't find the interface, the
7743   // program itself is ill-formed. However, we'll try to be helpful still by
7744   // providing the list of all of the categories we know about.
7745   NamedDecl *CurClass =
7746       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
7747   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
7748   if (!Class)
7749     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
7750 
7751   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7752                         CodeCompleter->getCodeCompletionTUInfo(),
7753                         CodeCompletionContext::CCC_ObjCCategoryName);
7754 
7755   // Add all of the categories that have have corresponding interface
7756   // declarations in this class and any of its superclasses, except for
7757   // already-implemented categories in the class itself.
7758   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
7759   Results.EnterNewScope();
7760   bool IgnoreImplemented = true;
7761   while (Class) {
7762     for (const auto *Cat : Class->visible_categories()) {
7763       if ((!IgnoreImplemented || !Cat->getImplementation()) &&
7764           CategoryNames.insert(Cat->getIdentifier()).second)
7765         Results.AddResult(Result(Cat, Results.getBasePriority(Cat), nullptr),
7766                           CurContext, nullptr, false);
7767     }
7768 
7769     Class = Class->getSuperClass();
7770     IgnoreImplemented = false;
7771   }
7772   Results.ExitScope();
7773 
7774   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7775                             Results.data(), Results.size());
7776 }
7777 
7778 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) {
7779   CodeCompletionContext CCContext(CodeCompletionContext::CCC_Other);
7780   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7781                         CodeCompleter->getCodeCompletionTUInfo(), CCContext);
7782 
7783   // Figure out where this @synthesize lives.
7784   ObjCContainerDecl *Container =
7785       dyn_cast_or_null<ObjCContainerDecl>(CurContext);
7786   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
7787                      !isa<ObjCCategoryImplDecl>(Container)))
7788     return;
7789 
7790   // Ignore any properties that have already been implemented.
7791   Container = getContainerDef(Container);
7792   for (const auto *D : Container->decls())
7793     if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D))
7794       Results.Ignore(PropertyImpl->getPropertyDecl());
7795 
7796   // Add any properties that we find.
7797   AddedPropertiesSet AddedProperties;
7798   Results.EnterNewScope();
7799   if (ObjCImplementationDecl *ClassImpl =
7800           dyn_cast<ObjCImplementationDecl>(Container))
7801     AddObjCProperties(CCContext, ClassImpl->getClassInterface(), false,
7802                       /*AllowNullaryMethods=*/false, CurContext,
7803                       AddedProperties, Results);
7804   else
7805     AddObjCProperties(CCContext,
7806                       cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
7807                       false, /*AllowNullaryMethods=*/false, CurContext,
7808                       AddedProperties, Results);
7809   Results.ExitScope();
7810 
7811   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7812                             Results.data(), Results.size());
7813 }
7814 
7815 void Sema::CodeCompleteObjCPropertySynthesizeIvar(
7816     Scope *S, IdentifierInfo *PropertyName) {
7817   typedef CodeCompletionResult Result;
7818   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7819                         CodeCompleter->getCodeCompletionTUInfo(),
7820                         CodeCompletionContext::CCC_Other);
7821 
7822   // Figure out where this @synthesize lives.
7823   ObjCContainerDecl *Container =
7824       dyn_cast_or_null<ObjCContainerDecl>(CurContext);
7825   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
7826                      !isa<ObjCCategoryImplDecl>(Container)))
7827     return;
7828 
7829   // Figure out which interface we're looking into.
7830   ObjCInterfaceDecl *Class = nullptr;
7831   if (ObjCImplementationDecl *ClassImpl =
7832           dyn_cast<ObjCImplementationDecl>(Container))
7833     Class = ClassImpl->getClassInterface();
7834   else
7835     Class = cast<ObjCCategoryImplDecl>(Container)
7836                 ->getCategoryDecl()
7837                 ->getClassInterface();
7838 
7839   // Determine the type of the property we're synthesizing.
7840   QualType PropertyType = Context.getObjCIdType();
7841   if (Class) {
7842     if (ObjCPropertyDecl *Property = Class->FindPropertyDeclaration(
7843             PropertyName, ObjCPropertyQueryKind::OBJC_PR_query_instance)) {
7844       PropertyType =
7845           Property->getType().getNonReferenceType().getUnqualifiedType();
7846 
7847       // Give preference to ivars
7848       Results.setPreferredType(PropertyType);
7849     }
7850   }
7851 
7852   // Add all of the instance variables in this class and its superclasses.
7853   Results.EnterNewScope();
7854   bool SawSimilarlyNamedIvar = false;
7855   std::string NameWithPrefix;
7856   NameWithPrefix += '_';
7857   NameWithPrefix += PropertyName->getName();
7858   std::string NameWithSuffix = PropertyName->getName().str();
7859   NameWithSuffix += '_';
7860   for (; Class; Class = Class->getSuperClass()) {
7861     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
7862          Ivar = Ivar->getNextIvar()) {
7863       Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), nullptr),
7864                         CurContext, nullptr, false);
7865 
7866       // Determine whether we've seen an ivar with a name similar to the
7867       // property.
7868       if ((PropertyName == Ivar->getIdentifier() ||
7869            NameWithPrefix == Ivar->getName() ||
7870            NameWithSuffix == Ivar->getName())) {
7871         SawSimilarlyNamedIvar = true;
7872 
7873         // Reduce the priority of this result by one, to give it a slight
7874         // advantage over other results whose names don't match so closely.
7875         if (Results.size() &&
7876             Results.data()[Results.size() - 1].Kind ==
7877                 CodeCompletionResult::RK_Declaration &&
7878             Results.data()[Results.size() - 1].Declaration == Ivar)
7879           Results.data()[Results.size() - 1].Priority--;
7880       }
7881     }
7882   }
7883 
7884   if (!SawSimilarlyNamedIvar) {
7885     // Create ivar result _propName, that the user can use to synthesize
7886     // an ivar of the appropriate type.
7887     unsigned Priority = CCP_MemberDeclaration + 1;
7888     typedef CodeCompletionResult Result;
7889     CodeCompletionAllocator &Allocator = Results.getAllocator();
7890     CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(),
7891                                   Priority, CXAvailability_Available);
7892 
7893     PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
7894     Builder.AddResultTypeChunk(
7895         GetCompletionTypeString(PropertyType, Context, Policy, Allocator));
7896     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
7897     Results.AddResult(
7898         Result(Builder.TakeString(), Priority, CXCursor_ObjCIvarDecl));
7899   }
7900 
7901   Results.ExitScope();
7902 
7903   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7904                             Results.data(), Results.size());
7905 }
7906 
7907 // Mapping from selectors to the methods that implement that selector, along
7908 // with the "in original class" flag.
7909 typedef llvm::DenseMap<Selector,
7910                        llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>>
7911     KnownMethodsMap;
7912 
7913 /// Find all of the methods that reside in the given container
7914 /// (and its superclasses, protocols, etc.) that meet the given
7915 /// criteria. Insert those methods into the map of known methods,
7916 /// indexed by selector so they can be easily found.
7917 static void FindImplementableMethods(ASTContext &Context,
7918                                      ObjCContainerDecl *Container,
7919                                      Optional<bool> WantInstanceMethods,
7920                                      QualType ReturnType,
7921                                      KnownMethodsMap &KnownMethods,
7922                                      bool InOriginalClass = true) {
7923   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
7924     // Make sure we have a definition; that's what we'll walk.
7925     if (!IFace->hasDefinition())
7926       return;
7927 
7928     IFace = IFace->getDefinition();
7929     Container = IFace;
7930 
7931     const ObjCList<ObjCProtocolDecl> &Protocols =
7932         IFace->getReferencedProtocols();
7933     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7934                                               E = Protocols.end();
7935          I != E; ++I)
7936       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
7937                                KnownMethods, InOriginalClass);
7938 
7939     // Add methods from any class extensions and categories.
7940     for (auto *Cat : IFace->visible_categories()) {
7941       FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType,
7942                                KnownMethods, false);
7943     }
7944 
7945     // Visit the superclass.
7946     if (IFace->getSuperClass())
7947       FindImplementableMethods(Context, IFace->getSuperClass(),
7948                                WantInstanceMethods, ReturnType, KnownMethods,
7949                                false);
7950   }
7951 
7952   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
7953     // Recurse into protocols.
7954     const ObjCList<ObjCProtocolDecl> &Protocols =
7955         Category->getReferencedProtocols();
7956     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7957                                               E = Protocols.end();
7958          I != E; ++I)
7959       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
7960                                KnownMethods, InOriginalClass);
7961 
7962     // If this category is the original class, jump to the interface.
7963     if (InOriginalClass && Category->getClassInterface())
7964       FindImplementableMethods(Context, Category->getClassInterface(),
7965                                WantInstanceMethods, ReturnType, KnownMethods,
7966                                false);
7967   }
7968 
7969   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
7970     // Make sure we have a definition; that's what we'll walk.
7971     if (!Protocol->hasDefinition())
7972       return;
7973     Protocol = Protocol->getDefinition();
7974     Container = Protocol;
7975 
7976     // Recurse into protocols.
7977     const ObjCList<ObjCProtocolDecl> &Protocols =
7978         Protocol->getReferencedProtocols();
7979     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7980                                               E = Protocols.end();
7981          I != E; ++I)
7982       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
7983                                KnownMethods, false);
7984   }
7985 
7986   // Add methods in this container. This operation occurs last because
7987   // we want the methods from this container to override any methods
7988   // we've previously seen with the same selector.
7989   for (auto *M : Container->methods()) {
7990     if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) {
7991       if (!ReturnType.isNull() &&
7992           !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType()))
7993         continue;
7994 
7995       KnownMethods[M->getSelector()] =
7996           KnownMethodsMap::mapped_type(M, InOriginalClass);
7997     }
7998   }
7999 }
8000 
8001 /// Add the parenthesized return or parameter type chunk to a code
8002 /// completion string.
8003 static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals,
8004                                     ASTContext &Context,
8005                                     const PrintingPolicy &Policy,
8006                                     CodeCompletionBuilder &Builder) {
8007   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8008   std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals, Type);
8009   if (!Quals.empty())
8010     Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
8011   Builder.AddTextChunk(
8012       GetCompletionTypeString(Type, Context, Policy, Builder.getAllocator()));
8013   Builder.AddChunk(CodeCompletionString::CK_RightParen);
8014 }
8015 
8016 /// Determine whether the given class is or inherits from a class by
8017 /// the given name.
8018 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name) {
8019   if (!Class)
8020     return false;
8021 
8022   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
8023     return true;
8024 
8025   return InheritsFromClassNamed(Class->getSuperClass(), Name);
8026 }
8027 
8028 /// Add code completions for Objective-C Key-Value Coding (KVC) and
8029 /// Key-Value Observing (KVO).
8030 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
8031                                        bool IsInstanceMethod,
8032                                        QualType ReturnType, ASTContext &Context,
8033                                        VisitedSelectorSet &KnownSelectors,
8034                                        ResultBuilder &Results) {
8035   IdentifierInfo *PropName = Property->getIdentifier();
8036   if (!PropName || PropName->getLength() == 0)
8037     return;
8038 
8039   PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
8040 
8041   // Builder that will create each code completion.
8042   typedef CodeCompletionResult Result;
8043   CodeCompletionAllocator &Allocator = Results.getAllocator();
8044   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
8045 
8046   // The selector table.
8047   SelectorTable &Selectors = Context.Selectors;
8048 
8049   // The property name, copied into the code completion allocation region
8050   // on demand.
8051   struct KeyHolder {
8052     CodeCompletionAllocator &Allocator;
8053     StringRef Key;
8054     const char *CopiedKey;
8055 
8056     KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key)
8057         : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {}
8058 
8059     operator const char *() {
8060       if (CopiedKey)
8061         return CopiedKey;
8062 
8063       return CopiedKey = Allocator.CopyString(Key);
8064     }
8065   } Key(Allocator, PropName->getName());
8066 
8067   // The uppercased name of the property name.
8068   std::string UpperKey = std::string(PropName->getName());
8069   if (!UpperKey.empty())
8070     UpperKey[0] = toUppercase(UpperKey[0]);
8071 
8072   bool ReturnTypeMatchesProperty =
8073       ReturnType.isNull() ||
8074       Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
8075                                      Property->getType());
8076   bool ReturnTypeMatchesVoid = ReturnType.isNull() || ReturnType->isVoidType();
8077 
8078   // Add the normal accessor -(type)key.
8079   if (IsInstanceMethod &&
8080       KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second &&
8081       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
8082     if (ReturnType.isNull())
8083       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
8084                               Builder);
8085 
8086     Builder.AddTypedTextChunk(Key);
8087     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
8088                              CXCursor_ObjCInstanceMethodDecl));
8089   }
8090 
8091   // If we have an integral or boolean property (or the user has provided
8092   // an integral or boolean return type), add the accessor -(type)isKey.
8093   if (IsInstanceMethod &&
8094       ((!ReturnType.isNull() &&
8095         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
8096        (ReturnType.isNull() && (Property->getType()->isIntegerType() ||
8097                                 Property->getType()->isBooleanType())))) {
8098     std::string SelectorName = (Twine("is") + UpperKey).str();
8099     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8100     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
8101             .second) {
8102       if (ReturnType.isNull()) {
8103         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8104         Builder.AddTextChunk("BOOL");
8105         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8106       }
8107 
8108       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
8109       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
8110                                CXCursor_ObjCInstanceMethodDecl));
8111     }
8112   }
8113 
8114   // Add the normal mutator.
8115   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
8116       !Property->getSetterMethodDecl()) {
8117     std::string SelectorName = (Twine("set") + UpperKey).str();
8118     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8119     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8120       if (ReturnType.isNull()) {
8121         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8122         Builder.AddTextChunk("void");
8123         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8124       }
8125 
8126       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
8127       Builder.AddTypedTextChunk(":");
8128       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
8129                               Builder);
8130       Builder.AddTextChunk(Key);
8131       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
8132                                CXCursor_ObjCInstanceMethodDecl));
8133     }
8134   }
8135 
8136   // Indexed and unordered accessors
8137   unsigned IndexedGetterPriority = CCP_CodePattern;
8138   unsigned IndexedSetterPriority = CCP_CodePattern;
8139   unsigned UnorderedGetterPriority = CCP_CodePattern;
8140   unsigned UnorderedSetterPriority = CCP_CodePattern;
8141   if (const auto *ObjCPointer =
8142           Property->getType()->getAs<ObjCObjectPointerType>()) {
8143     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
8144       // If this interface type is not provably derived from a known
8145       // collection, penalize the corresponding completions.
8146       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
8147         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
8148         if (!InheritsFromClassNamed(IFace, "NSArray"))
8149           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
8150       }
8151 
8152       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
8153         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
8154         if (!InheritsFromClassNamed(IFace, "NSSet"))
8155           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
8156       }
8157     }
8158   } else {
8159     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
8160     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
8161     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
8162     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
8163   }
8164 
8165   // Add -(NSUInteger)countOf<key>
8166   if (IsInstanceMethod &&
8167       (ReturnType.isNull() || ReturnType->isIntegerType())) {
8168     std::string SelectorName = (Twine("countOf") + UpperKey).str();
8169     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8170     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
8171             .second) {
8172       if (ReturnType.isNull()) {
8173         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8174         Builder.AddTextChunk("NSUInteger");
8175         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8176       }
8177 
8178       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
8179       Results.AddResult(
8180           Result(Builder.TakeString(),
8181                  std::min(IndexedGetterPriority, UnorderedGetterPriority),
8182                  CXCursor_ObjCInstanceMethodDecl));
8183     }
8184   }
8185 
8186   // Indexed getters
8187   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
8188   if (IsInstanceMethod &&
8189       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
8190     std::string SelectorName = (Twine("objectIn") + UpperKey + "AtIndex").str();
8191     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8192     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8193       if (ReturnType.isNull()) {
8194         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8195         Builder.AddTextChunk("id");
8196         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8197       }
8198 
8199       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8200       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8201       Builder.AddTextChunk("NSUInteger");
8202       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8203       Builder.AddTextChunk("index");
8204       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
8205                                CXCursor_ObjCInstanceMethodDecl));
8206     }
8207   }
8208 
8209   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
8210   if (IsInstanceMethod &&
8211       (ReturnType.isNull() ||
8212        (ReturnType->isObjCObjectPointerType() &&
8213         ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
8214         ReturnType->castAs<ObjCObjectPointerType>()
8215                 ->getInterfaceDecl()
8216                 ->getName() == "NSArray"))) {
8217     std::string SelectorName = (Twine(Property->getName()) + "AtIndexes").str();
8218     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8219     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8220       if (ReturnType.isNull()) {
8221         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8222         Builder.AddTextChunk("NSArray *");
8223         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8224       }
8225 
8226       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8227       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8228       Builder.AddTextChunk("NSIndexSet *");
8229       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8230       Builder.AddTextChunk("indexes");
8231       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
8232                                CXCursor_ObjCInstanceMethodDecl));
8233     }
8234   }
8235 
8236   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
8237   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8238     std::string SelectorName = (Twine("get") + UpperKey).str();
8239     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
8240                                       &Context.Idents.get("range")};
8241 
8242     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
8243       if (ReturnType.isNull()) {
8244         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8245         Builder.AddTextChunk("void");
8246         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8247       }
8248 
8249       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8250       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8251       Builder.AddPlaceholderChunk("object-type");
8252       Builder.AddTextChunk(" **");
8253       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8254       Builder.AddTextChunk("buffer");
8255       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8256       Builder.AddTypedTextChunk("range:");
8257       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8258       Builder.AddTextChunk("NSRange");
8259       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8260       Builder.AddTextChunk("inRange");
8261       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
8262                                CXCursor_ObjCInstanceMethodDecl));
8263     }
8264   }
8265 
8266   // Mutable indexed accessors
8267 
8268   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
8269   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8270     std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str();
8271     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get("insertObject"),
8272                                       &Context.Idents.get(SelectorName)};
8273 
8274     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
8275       if (ReturnType.isNull()) {
8276         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8277         Builder.AddTextChunk("void");
8278         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8279       }
8280 
8281       Builder.AddTypedTextChunk("insertObject:");
8282       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8283       Builder.AddPlaceholderChunk("object-type");
8284       Builder.AddTextChunk(" *");
8285       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8286       Builder.AddTextChunk("object");
8287       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8288       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8289       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8290       Builder.AddPlaceholderChunk("NSUInteger");
8291       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8292       Builder.AddTextChunk("index");
8293       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8294                                CXCursor_ObjCInstanceMethodDecl));
8295     }
8296   }
8297 
8298   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
8299   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8300     std::string SelectorName = (Twine("insert") + UpperKey).str();
8301     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
8302                                       &Context.Idents.get("atIndexes")};
8303 
8304     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
8305       if (ReturnType.isNull()) {
8306         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8307         Builder.AddTextChunk("void");
8308         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8309       }
8310 
8311       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8312       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8313       Builder.AddTextChunk("NSArray *");
8314       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8315       Builder.AddTextChunk("array");
8316       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8317       Builder.AddTypedTextChunk("atIndexes:");
8318       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8319       Builder.AddPlaceholderChunk("NSIndexSet *");
8320       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8321       Builder.AddTextChunk("indexes");
8322       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8323                                CXCursor_ObjCInstanceMethodDecl));
8324     }
8325   }
8326 
8327   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
8328   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8329     std::string SelectorName =
8330         (Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
8331     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8332     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8333       if (ReturnType.isNull()) {
8334         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8335         Builder.AddTextChunk("void");
8336         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8337       }
8338 
8339       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8340       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8341       Builder.AddTextChunk("NSUInteger");
8342       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8343       Builder.AddTextChunk("index");
8344       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8345                                CXCursor_ObjCInstanceMethodDecl));
8346     }
8347   }
8348 
8349   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
8350   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8351     std::string SelectorName = (Twine("remove") + UpperKey + "AtIndexes").str();
8352     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8353     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8354       if (ReturnType.isNull()) {
8355         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8356         Builder.AddTextChunk("void");
8357         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8358       }
8359 
8360       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8361       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8362       Builder.AddTextChunk("NSIndexSet *");
8363       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8364       Builder.AddTextChunk("indexes");
8365       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8366                                CXCursor_ObjCInstanceMethodDecl));
8367     }
8368   }
8369 
8370   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
8371   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8372     std::string SelectorName =
8373         (Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
8374     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
8375                                       &Context.Idents.get("withObject")};
8376 
8377     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
8378       if (ReturnType.isNull()) {
8379         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8380         Builder.AddTextChunk("void");
8381         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8382       }
8383 
8384       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8385       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8386       Builder.AddPlaceholderChunk("NSUInteger");
8387       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8388       Builder.AddTextChunk("index");
8389       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8390       Builder.AddTypedTextChunk("withObject:");
8391       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8392       Builder.AddTextChunk("id");
8393       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8394       Builder.AddTextChunk("object");
8395       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8396                                CXCursor_ObjCInstanceMethodDecl));
8397     }
8398   }
8399 
8400   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
8401   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8402     std::string SelectorName1 =
8403         (Twine("replace") + UpperKey + "AtIndexes").str();
8404     std::string SelectorName2 = (Twine("with") + UpperKey).str();
8405     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1),
8406                                       &Context.Idents.get(SelectorName2)};
8407 
8408     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
8409       if (ReturnType.isNull()) {
8410         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8411         Builder.AddTextChunk("void");
8412         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8413       }
8414 
8415       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
8416       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8417       Builder.AddPlaceholderChunk("NSIndexSet *");
8418       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8419       Builder.AddTextChunk("indexes");
8420       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8421       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
8422       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8423       Builder.AddTextChunk("NSArray *");
8424       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8425       Builder.AddTextChunk("array");
8426       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8427                                CXCursor_ObjCInstanceMethodDecl));
8428     }
8429   }
8430 
8431   // Unordered getters
8432   // - (NSEnumerator *)enumeratorOfKey
8433   if (IsInstanceMethod &&
8434       (ReturnType.isNull() ||
8435        (ReturnType->isObjCObjectPointerType() &&
8436         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
8437         ReturnType->getAs<ObjCObjectPointerType>()
8438                 ->getInterfaceDecl()
8439                 ->getName() == "NSEnumerator"))) {
8440     std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str();
8441     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8442     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
8443             .second) {
8444       if (ReturnType.isNull()) {
8445         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8446         Builder.AddTextChunk("NSEnumerator *");
8447         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8448       }
8449 
8450       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
8451       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
8452                                CXCursor_ObjCInstanceMethodDecl));
8453     }
8454   }
8455 
8456   // - (type *)memberOfKey:(type *)object
8457   if (IsInstanceMethod &&
8458       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
8459     std::string SelectorName = (Twine("memberOf") + UpperKey).str();
8460     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8461     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8462       if (ReturnType.isNull()) {
8463         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8464         Builder.AddPlaceholderChunk("object-type");
8465         Builder.AddTextChunk(" *");
8466         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8467       }
8468 
8469       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8470       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8471       if (ReturnType.isNull()) {
8472         Builder.AddPlaceholderChunk("object-type");
8473         Builder.AddTextChunk(" *");
8474       } else {
8475         Builder.AddTextChunk(GetCompletionTypeString(
8476             ReturnType, Context, Policy, Builder.getAllocator()));
8477       }
8478       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8479       Builder.AddTextChunk("object");
8480       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
8481                                CXCursor_ObjCInstanceMethodDecl));
8482     }
8483   }
8484 
8485   // Mutable unordered accessors
8486   // - (void)addKeyObject:(type *)object
8487   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8488     std::string SelectorName =
8489         (Twine("add") + UpperKey + Twine("Object")).str();
8490     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8491     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8492       if (ReturnType.isNull()) {
8493         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8494         Builder.AddTextChunk("void");
8495         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8496       }
8497 
8498       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8499       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8500       Builder.AddPlaceholderChunk("object-type");
8501       Builder.AddTextChunk(" *");
8502       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8503       Builder.AddTextChunk("object");
8504       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8505                                CXCursor_ObjCInstanceMethodDecl));
8506     }
8507   }
8508 
8509   // - (void)addKey:(NSSet *)objects
8510   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8511     std::string SelectorName = (Twine("add") + UpperKey).str();
8512     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8513     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8514       if (ReturnType.isNull()) {
8515         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8516         Builder.AddTextChunk("void");
8517         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8518       }
8519 
8520       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8521       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8522       Builder.AddTextChunk("NSSet *");
8523       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8524       Builder.AddTextChunk("objects");
8525       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8526                                CXCursor_ObjCInstanceMethodDecl));
8527     }
8528   }
8529 
8530   // - (void)removeKeyObject:(type *)object
8531   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8532     std::string SelectorName =
8533         (Twine("remove") + UpperKey + Twine("Object")).str();
8534     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8535     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8536       if (ReturnType.isNull()) {
8537         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8538         Builder.AddTextChunk("void");
8539         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8540       }
8541 
8542       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8543       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8544       Builder.AddPlaceholderChunk("object-type");
8545       Builder.AddTextChunk(" *");
8546       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8547       Builder.AddTextChunk("object");
8548       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8549                                CXCursor_ObjCInstanceMethodDecl));
8550     }
8551   }
8552 
8553   // - (void)removeKey:(NSSet *)objects
8554   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8555     std::string SelectorName = (Twine("remove") + UpperKey).str();
8556     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8557     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8558       if (ReturnType.isNull()) {
8559         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8560         Builder.AddTextChunk("void");
8561         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8562       }
8563 
8564       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8565       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8566       Builder.AddTextChunk("NSSet *");
8567       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8568       Builder.AddTextChunk("objects");
8569       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8570                                CXCursor_ObjCInstanceMethodDecl));
8571     }
8572   }
8573 
8574   // - (void)intersectKey:(NSSet *)objects
8575   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8576     std::string SelectorName = (Twine("intersect") + UpperKey).str();
8577     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8578     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8579       if (ReturnType.isNull()) {
8580         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8581         Builder.AddTextChunk("void");
8582         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8583       }
8584 
8585       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8586       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8587       Builder.AddTextChunk("NSSet *");
8588       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8589       Builder.AddTextChunk("objects");
8590       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8591                                CXCursor_ObjCInstanceMethodDecl));
8592     }
8593   }
8594 
8595   // Key-Value Observing
8596   // + (NSSet *)keyPathsForValuesAffectingKey
8597   if (!IsInstanceMethod &&
8598       (ReturnType.isNull() ||
8599        (ReturnType->isObjCObjectPointerType() &&
8600         ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
8601         ReturnType->castAs<ObjCObjectPointerType>()
8602                 ->getInterfaceDecl()
8603                 ->getName() == "NSSet"))) {
8604     std::string SelectorName =
8605         (Twine("keyPathsForValuesAffecting") + UpperKey).str();
8606     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8607     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
8608             .second) {
8609       if (ReturnType.isNull()) {
8610         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8611         Builder.AddTextChunk("NSSet<NSString *> *");
8612         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8613       }
8614 
8615       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
8616       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
8617                                CXCursor_ObjCClassMethodDecl));
8618     }
8619   }
8620 
8621   // + (BOOL)automaticallyNotifiesObserversForKey
8622   if (!IsInstanceMethod &&
8623       (ReturnType.isNull() || ReturnType->isIntegerType() ||
8624        ReturnType->isBooleanType())) {
8625     std::string SelectorName =
8626         (Twine("automaticallyNotifiesObserversOf") + UpperKey).str();
8627     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8628     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
8629             .second) {
8630       if (ReturnType.isNull()) {
8631         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8632         Builder.AddTextChunk("BOOL");
8633         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8634       }
8635 
8636       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
8637       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
8638                                CXCursor_ObjCClassMethodDecl));
8639     }
8640   }
8641 }
8642 
8643 void Sema::CodeCompleteObjCMethodDecl(Scope *S, Optional<bool> IsInstanceMethod,
8644                                       ParsedType ReturnTy) {
8645   // Determine the return type of the method we're declaring, if
8646   // provided.
8647   QualType ReturnType = GetTypeFromParser(ReturnTy);
8648   Decl *IDecl = nullptr;
8649   if (CurContext->isObjCContainer()) {
8650     ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext);
8651     IDecl = OCD;
8652   }
8653   // Determine where we should start searching for methods.
8654   ObjCContainerDecl *SearchDecl = nullptr;
8655   bool IsInImplementation = false;
8656   if (Decl *D = IDecl) {
8657     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
8658       SearchDecl = Impl->getClassInterface();
8659       IsInImplementation = true;
8660     } else if (ObjCCategoryImplDecl *CatImpl =
8661                    dyn_cast<ObjCCategoryImplDecl>(D)) {
8662       SearchDecl = CatImpl->getCategoryDecl();
8663       IsInImplementation = true;
8664     } else
8665       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
8666   }
8667 
8668   if (!SearchDecl && S) {
8669     if (DeclContext *DC = S->getEntity())
8670       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
8671   }
8672 
8673   if (!SearchDecl) {
8674     HandleCodeCompleteResults(this, CodeCompleter,
8675                               CodeCompletionContext::CCC_Other, nullptr, 0);
8676     return;
8677   }
8678 
8679   // Find all of the methods that we could declare/implement here.
8680   KnownMethodsMap KnownMethods;
8681   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, ReturnType,
8682                            KnownMethods);
8683 
8684   // Add declarations or definitions for each of the known methods.
8685   typedef CodeCompletionResult Result;
8686   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8687                         CodeCompleter->getCodeCompletionTUInfo(),
8688                         CodeCompletionContext::CCC_Other);
8689   Results.EnterNewScope();
8690   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
8691   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
8692                                  MEnd = KnownMethods.end();
8693        M != MEnd; ++M) {
8694     ObjCMethodDecl *Method = M->second.getPointer();
8695     CodeCompletionBuilder Builder(Results.getAllocator(),
8696                                   Results.getCodeCompletionTUInfo());
8697 
8698     // Add the '-'/'+' prefix if it wasn't provided yet.
8699     if (!IsInstanceMethod) {
8700       Builder.AddTextChunk(Method->isInstanceMethod() ? "-" : "+");
8701       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8702     }
8703 
8704     // If the result type was not already provided, add it to the
8705     // pattern as (type).
8706     if (ReturnType.isNull()) {
8707       QualType ResTy = Method->getSendResultType().stripObjCKindOfType(Context);
8708       AttributedType::stripOuterNullability(ResTy);
8709       AddObjCPassingTypeChunk(ResTy, Method->getObjCDeclQualifier(), Context,
8710                               Policy, Builder);
8711     }
8712 
8713     Selector Sel = Method->getSelector();
8714 
8715     // Add the first part of the selector to the pattern.
8716     Builder.AddTypedTextChunk(
8717         Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
8718 
8719     // Add parameters to the pattern.
8720     unsigned I = 0;
8721     for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
8722                                         PEnd = Method->param_end();
8723          P != PEnd; (void)++P, ++I) {
8724       // Add the part of the selector name.
8725       if (I == 0)
8726         Builder.AddTypedTextChunk(":");
8727       else if (I < Sel.getNumArgs()) {
8728         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8729         Builder.AddTypedTextChunk(
8730             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
8731       } else
8732         break;
8733 
8734       // Add the parameter type.
8735       QualType ParamType;
8736       if ((*P)->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability)
8737         ParamType = (*P)->getType();
8738       else
8739         ParamType = (*P)->getOriginalType();
8740       ParamType = ParamType.substObjCTypeArgs(
8741           Context, {}, ObjCSubstitutionContext::Parameter);
8742       AttributedType::stripOuterNullability(ParamType);
8743       AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(), Context,
8744                               Policy, Builder);
8745 
8746       if (IdentifierInfo *Id = (*P)->getIdentifier())
8747         Builder.AddTextChunk(Builder.getAllocator().CopyString(Id->getName()));
8748     }
8749 
8750     if (Method->isVariadic()) {
8751       if (Method->param_size() > 0)
8752         Builder.AddChunk(CodeCompletionString::CK_Comma);
8753       Builder.AddTextChunk("...");
8754     }
8755 
8756     if (IsInImplementation && Results.includeCodePatterns()) {
8757       // We will be defining the method here, so add a compound statement.
8758       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8759       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
8760       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
8761       if (!Method->getReturnType()->isVoidType()) {
8762         // If the result type is not void, add a return clause.
8763         Builder.AddTextChunk("return");
8764         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8765         Builder.AddPlaceholderChunk("expression");
8766         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
8767       } else
8768         Builder.AddPlaceholderChunk("statements");
8769 
8770       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
8771       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
8772     }
8773 
8774     unsigned Priority = CCP_CodePattern;
8775     auto R = Result(Builder.TakeString(), Method, Priority);
8776     if (!M->second.getInt())
8777       setInBaseClass(R);
8778     Results.AddResult(std::move(R));
8779   }
8780 
8781   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
8782   // the properties in this class and its categories.
8783   if (Context.getLangOpts().ObjC) {
8784     SmallVector<ObjCContainerDecl *, 4> Containers;
8785     Containers.push_back(SearchDecl);
8786 
8787     VisitedSelectorSet KnownSelectors;
8788     for (KnownMethodsMap::iterator M = KnownMethods.begin(),
8789                                    MEnd = KnownMethods.end();
8790          M != MEnd; ++M)
8791       KnownSelectors.insert(M->first);
8792 
8793     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
8794     if (!IFace)
8795       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
8796         IFace = Category->getClassInterface();
8797 
8798     if (IFace)
8799       for (auto *Cat : IFace->visible_categories())
8800         Containers.push_back(Cat);
8801 
8802     if (IsInstanceMethod) {
8803       for (unsigned I = 0, N = Containers.size(); I != N; ++I)
8804         for (auto *P : Containers[I]->instance_properties())
8805           AddObjCKeyValueCompletions(P, *IsInstanceMethod, ReturnType, Context,
8806                                      KnownSelectors, Results);
8807     }
8808   }
8809 
8810   Results.ExitScope();
8811 
8812   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8813                             Results.data(), Results.size());
8814 }
8815 
8816 void Sema::CodeCompleteObjCMethodDeclSelector(
8817     Scope *S, bool IsInstanceMethod, bool AtParameterName, ParsedType ReturnTy,
8818     ArrayRef<IdentifierInfo *> SelIdents) {
8819   // If we have an external source, load the entire class method
8820   // pool from the AST file.
8821   if (ExternalSource) {
8822     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N;
8823          ++I) {
8824       Selector Sel = ExternalSource->GetExternalSelector(I);
8825       if (Sel.isNull() || MethodPool.count(Sel))
8826         continue;
8827 
8828       ReadMethodPool(Sel);
8829     }
8830   }
8831 
8832   // Build the set of methods we can see.
8833   typedef CodeCompletionResult Result;
8834   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8835                         CodeCompleter->getCodeCompletionTUInfo(),
8836                         CodeCompletionContext::CCC_Other);
8837 
8838   if (ReturnTy)
8839     Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType());
8840 
8841   Results.EnterNewScope();
8842   for (GlobalMethodPool::iterator M = MethodPool.begin(),
8843                                   MEnd = MethodPool.end();
8844        M != MEnd; ++M) {
8845     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first
8846                                                      : &M->second.second;
8847          MethList && MethList->getMethod(); MethList = MethList->getNext()) {
8848       if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
8849         continue;
8850 
8851       if (AtParameterName) {
8852         // Suggest parameter names we've seen before.
8853         unsigned NumSelIdents = SelIdents.size();
8854         if (NumSelIdents &&
8855             NumSelIdents <= MethList->getMethod()->param_size()) {
8856           ParmVarDecl *Param =
8857               MethList->getMethod()->parameters()[NumSelIdents - 1];
8858           if (Param->getIdentifier()) {
8859             CodeCompletionBuilder Builder(Results.getAllocator(),
8860                                           Results.getCodeCompletionTUInfo());
8861             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
8862                 Param->getIdentifier()->getName()));
8863             Results.AddResult(Builder.TakeString());
8864           }
8865         }
8866 
8867         continue;
8868       }
8869 
8870       Result R(MethList->getMethod(),
8871                Results.getBasePriority(MethList->getMethod()), nullptr);
8872       R.StartParameter = SelIdents.size();
8873       R.AllParametersAreInformative = false;
8874       R.DeclaringEntity = true;
8875       Results.MaybeAddResult(R, CurContext);
8876     }
8877   }
8878 
8879   Results.ExitScope();
8880 
8881   if (!AtParameterName && !SelIdents.empty() &&
8882       SelIdents.front()->getName().startswith("init")) {
8883     for (const auto &M : PP.macros()) {
8884       if (M.first->getName() != "NS_DESIGNATED_INITIALIZER")
8885         continue;
8886       Results.EnterNewScope();
8887       CodeCompletionBuilder Builder(Results.getAllocator(),
8888                                     Results.getCodeCompletionTUInfo());
8889       Builder.AddTypedTextChunk(
8890           Builder.getAllocator().CopyString(M.first->getName()));
8891       Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_Macro,
8892                                              CXCursor_MacroDefinition));
8893       Results.ExitScope();
8894     }
8895   }
8896 
8897   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8898                             Results.data(), Results.size());
8899 }
8900 
8901 void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
8902   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8903                         CodeCompleter->getCodeCompletionTUInfo(),
8904                         CodeCompletionContext::CCC_PreprocessorDirective);
8905   Results.EnterNewScope();
8906 
8907   // #if <condition>
8908   CodeCompletionBuilder Builder(Results.getAllocator(),
8909                                 Results.getCodeCompletionTUInfo());
8910   Builder.AddTypedTextChunk("if");
8911   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8912   Builder.AddPlaceholderChunk("condition");
8913   Results.AddResult(Builder.TakeString());
8914 
8915   // #ifdef <macro>
8916   Builder.AddTypedTextChunk("ifdef");
8917   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8918   Builder.AddPlaceholderChunk("macro");
8919   Results.AddResult(Builder.TakeString());
8920 
8921   // #ifndef <macro>
8922   Builder.AddTypedTextChunk("ifndef");
8923   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8924   Builder.AddPlaceholderChunk("macro");
8925   Results.AddResult(Builder.TakeString());
8926 
8927   if (InConditional) {
8928     // #elif <condition>
8929     Builder.AddTypedTextChunk("elif");
8930     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8931     Builder.AddPlaceholderChunk("condition");
8932     Results.AddResult(Builder.TakeString());
8933 
8934     // #else
8935     Builder.AddTypedTextChunk("else");
8936     Results.AddResult(Builder.TakeString());
8937 
8938     // #endif
8939     Builder.AddTypedTextChunk("endif");
8940     Results.AddResult(Builder.TakeString());
8941   }
8942 
8943   // #include "header"
8944   Builder.AddTypedTextChunk("include");
8945   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8946   Builder.AddTextChunk("\"");
8947   Builder.AddPlaceholderChunk("header");
8948   Builder.AddTextChunk("\"");
8949   Results.AddResult(Builder.TakeString());
8950 
8951   // #include <header>
8952   Builder.AddTypedTextChunk("include");
8953   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8954   Builder.AddTextChunk("<");
8955   Builder.AddPlaceholderChunk("header");
8956   Builder.AddTextChunk(">");
8957   Results.AddResult(Builder.TakeString());
8958 
8959   // #define <macro>
8960   Builder.AddTypedTextChunk("define");
8961   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8962   Builder.AddPlaceholderChunk("macro");
8963   Results.AddResult(Builder.TakeString());
8964 
8965   // #define <macro>(<args>)
8966   Builder.AddTypedTextChunk("define");
8967   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8968   Builder.AddPlaceholderChunk("macro");
8969   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8970   Builder.AddPlaceholderChunk("args");
8971   Builder.AddChunk(CodeCompletionString::CK_RightParen);
8972   Results.AddResult(Builder.TakeString());
8973 
8974   // #undef <macro>
8975   Builder.AddTypedTextChunk("undef");
8976   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8977   Builder.AddPlaceholderChunk("macro");
8978   Results.AddResult(Builder.TakeString());
8979 
8980   // #line <number>
8981   Builder.AddTypedTextChunk("line");
8982   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8983   Builder.AddPlaceholderChunk("number");
8984   Results.AddResult(Builder.TakeString());
8985 
8986   // #line <number> "filename"
8987   Builder.AddTypedTextChunk("line");
8988   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8989   Builder.AddPlaceholderChunk("number");
8990   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8991   Builder.AddTextChunk("\"");
8992   Builder.AddPlaceholderChunk("filename");
8993   Builder.AddTextChunk("\"");
8994   Results.AddResult(Builder.TakeString());
8995 
8996   // #error <message>
8997   Builder.AddTypedTextChunk("error");
8998   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8999   Builder.AddPlaceholderChunk("message");
9000   Results.AddResult(Builder.TakeString());
9001 
9002   // #pragma <arguments>
9003   Builder.AddTypedTextChunk("pragma");
9004   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9005   Builder.AddPlaceholderChunk("arguments");
9006   Results.AddResult(Builder.TakeString());
9007 
9008   if (getLangOpts().ObjC) {
9009     // #import "header"
9010     Builder.AddTypedTextChunk("import");
9011     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9012     Builder.AddTextChunk("\"");
9013     Builder.AddPlaceholderChunk("header");
9014     Builder.AddTextChunk("\"");
9015     Results.AddResult(Builder.TakeString());
9016 
9017     // #import <header>
9018     Builder.AddTypedTextChunk("import");
9019     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9020     Builder.AddTextChunk("<");
9021     Builder.AddPlaceholderChunk("header");
9022     Builder.AddTextChunk(">");
9023     Results.AddResult(Builder.TakeString());
9024   }
9025 
9026   // #include_next "header"
9027   Builder.AddTypedTextChunk("include_next");
9028   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9029   Builder.AddTextChunk("\"");
9030   Builder.AddPlaceholderChunk("header");
9031   Builder.AddTextChunk("\"");
9032   Results.AddResult(Builder.TakeString());
9033 
9034   // #include_next <header>
9035   Builder.AddTypedTextChunk("include_next");
9036   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9037   Builder.AddTextChunk("<");
9038   Builder.AddPlaceholderChunk("header");
9039   Builder.AddTextChunk(">");
9040   Results.AddResult(Builder.TakeString());
9041 
9042   // #warning <message>
9043   Builder.AddTypedTextChunk("warning");
9044   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9045   Builder.AddPlaceholderChunk("message");
9046   Results.AddResult(Builder.TakeString());
9047 
9048   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
9049   // completions for them. And __include_macros is a Clang-internal extension
9050   // that we don't want to encourage anyone to use.
9051 
9052   // FIXME: we don't support #assert or #unassert, so don't suggest them.
9053   Results.ExitScope();
9054 
9055   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9056                             Results.data(), Results.size());
9057 }
9058 
9059 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
9060   CodeCompleteOrdinaryName(S, S->getFnParent() ? Sema::PCC_RecoveryInFunction
9061                                                : Sema::PCC_Namespace);
9062 }
9063 
9064 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
9065   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
9066                         CodeCompleter->getCodeCompletionTUInfo(),
9067                         IsDefinition ? CodeCompletionContext::CCC_MacroName
9068                                      : CodeCompletionContext::CCC_MacroNameUse);
9069   if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
9070     // Add just the names of macros, not their arguments.
9071     CodeCompletionBuilder Builder(Results.getAllocator(),
9072                                   Results.getCodeCompletionTUInfo());
9073     Results.EnterNewScope();
9074     for (Preprocessor::macro_iterator M = PP.macro_begin(),
9075                                       MEnd = PP.macro_end();
9076          M != MEnd; ++M) {
9077       Builder.AddTypedTextChunk(
9078           Builder.getAllocator().CopyString(M->first->getName()));
9079       Results.AddResult(CodeCompletionResult(
9080           Builder.TakeString(), CCP_CodePattern, CXCursor_MacroDefinition));
9081     }
9082     Results.ExitScope();
9083   } else if (IsDefinition) {
9084     // FIXME: Can we detect when the user just wrote an include guard above?
9085   }
9086 
9087   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9088                             Results.data(), Results.size());
9089 }
9090 
9091 void Sema::CodeCompletePreprocessorExpression() {
9092   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
9093                         CodeCompleter->getCodeCompletionTUInfo(),
9094                         CodeCompletionContext::CCC_PreprocessorExpression);
9095 
9096   if (!CodeCompleter || CodeCompleter->includeMacros())
9097     AddMacroResults(PP, Results,
9098                     !CodeCompleter || CodeCompleter->loadExternal(), true);
9099 
9100   // defined (<macro>)
9101   Results.EnterNewScope();
9102   CodeCompletionBuilder Builder(Results.getAllocator(),
9103                                 Results.getCodeCompletionTUInfo());
9104   Builder.AddTypedTextChunk("defined");
9105   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9106   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9107   Builder.AddPlaceholderChunk("macro");
9108   Builder.AddChunk(CodeCompletionString::CK_RightParen);
9109   Results.AddResult(Builder.TakeString());
9110   Results.ExitScope();
9111 
9112   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9113                             Results.data(), Results.size());
9114 }
9115 
9116 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
9117                                                  IdentifierInfo *Macro,
9118                                                  MacroInfo *MacroInfo,
9119                                                  unsigned Argument) {
9120   // FIXME: In the future, we could provide "overload" results, much like we
9121   // do for function calls.
9122 
9123   // Now just ignore this. There will be another code-completion callback
9124   // for the expanded tokens.
9125 }
9126 
9127 // This handles completion inside an #include filename, e.g. #include <foo/ba
9128 // We look for the directory "foo" under each directory on the include path,
9129 // list its files, and reassemble the appropriate #include.
9130 void Sema::CodeCompleteIncludedFile(llvm::StringRef Dir, bool Angled) {
9131   // RelDir should use /, but unescaped \ is possible on windows!
9132   // Our completions will normalize to / for simplicity, this case is rare.
9133   std::string RelDir = llvm::sys::path::convert_to_slash(Dir);
9134   // We need the native slashes for the actual file system interactions.
9135   SmallString<128> NativeRelDir = StringRef(RelDir);
9136   llvm::sys::path::native(NativeRelDir);
9137   llvm::vfs::FileSystem &FS =
9138       getSourceManager().getFileManager().getVirtualFileSystem();
9139 
9140   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
9141                         CodeCompleter->getCodeCompletionTUInfo(),
9142                         CodeCompletionContext::CCC_IncludedFile);
9143   llvm::DenseSet<StringRef> SeenResults; // To deduplicate results.
9144 
9145   // Helper: adds one file or directory completion result.
9146   auto AddCompletion = [&](StringRef Filename, bool IsDirectory) {
9147     SmallString<64> TypedChunk = Filename;
9148     // Directory completion is up to the slash, e.g. <sys/
9149     TypedChunk.push_back(IsDirectory ? '/' : Angled ? '>' : '"');
9150     auto R = SeenResults.insert(TypedChunk);
9151     if (R.second) { // New completion
9152       const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk);
9153       *R.first = InternedTyped; // Avoid dangling StringRef.
9154       CodeCompletionBuilder Builder(CodeCompleter->getAllocator(),
9155                                     CodeCompleter->getCodeCompletionTUInfo());
9156       Builder.AddTypedTextChunk(InternedTyped);
9157       // The result is a "Pattern", which is pretty opaque.
9158       // We may want to include the real filename to allow smart ranking.
9159       Results.AddResult(CodeCompletionResult(Builder.TakeString()));
9160     }
9161   };
9162 
9163   // Helper: scans IncludeDir for nice files, and adds results for each.
9164   auto AddFilesFromIncludeDir = [&](StringRef IncludeDir,
9165                                     bool IsSystem,
9166                                     DirectoryLookup::LookupType_t LookupType) {
9167     llvm::SmallString<128> Dir = IncludeDir;
9168     if (!NativeRelDir.empty()) {
9169       if (LookupType == DirectoryLookup::LT_Framework) {
9170         // For a framework dir, #include <Foo/Bar/> actually maps to
9171         // a path of Foo.framework/Headers/Bar/.
9172         auto Begin = llvm::sys::path::begin(NativeRelDir);
9173         auto End = llvm::sys::path::end(NativeRelDir);
9174 
9175         llvm::sys::path::append(Dir, *Begin + ".framework", "Headers");
9176         llvm::sys::path::append(Dir, ++Begin, End);
9177       } else {
9178         llvm::sys::path::append(Dir, NativeRelDir);
9179       }
9180     }
9181 
9182     std::error_code EC;
9183     unsigned Count = 0;
9184     for (auto It = FS.dir_begin(Dir, EC);
9185          !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) {
9186       if (++Count == 2500) // If we happen to hit a huge directory,
9187         break;             // bail out early so we're not too slow.
9188       StringRef Filename = llvm::sys::path::filename(It->path());
9189 
9190       // To know whether a symlink should be treated as file or a directory, we
9191       // have to stat it. This should be cheap enough as there shouldn't be many
9192       // symlinks.
9193       llvm::sys::fs::file_type Type = It->type();
9194       if (Type == llvm::sys::fs::file_type::symlink_file) {
9195         if (auto FileStatus = FS.status(It->path()))
9196           Type = FileStatus->getType();
9197       }
9198       switch (Type) {
9199       case llvm::sys::fs::file_type::directory_file:
9200         // All entries in a framework directory must have a ".framework" suffix,
9201         // but the suffix does not appear in the source code's include/import.
9202         if (LookupType == DirectoryLookup::LT_Framework &&
9203             NativeRelDir.empty() && !Filename.consume_back(".framework"))
9204           break;
9205 
9206         AddCompletion(Filename, /*IsDirectory=*/true);
9207         break;
9208       case llvm::sys::fs::file_type::regular_file:
9209         // Only files that really look like headers. (Except in system dirs).
9210         if (!IsSystem) {
9211           // Header extensions from Types.def, which we can't depend on here.
9212           if (!(Filename.endswith_lower(".h") ||
9213                 Filename.endswith_lower(".hh") ||
9214                 Filename.endswith_lower(".hpp") ||
9215                 Filename.endswith_lower(".inc")))
9216             break;
9217         }
9218         AddCompletion(Filename, /*IsDirectory=*/false);
9219         break;
9220       default:
9221         break;
9222       }
9223     }
9224   };
9225 
9226   // Helper: adds results relative to IncludeDir, if possible.
9227   auto AddFilesFromDirLookup = [&](const DirectoryLookup &IncludeDir,
9228                                    bool IsSystem) {
9229     switch (IncludeDir.getLookupType()) {
9230     case DirectoryLookup::LT_HeaderMap:
9231       // header maps are not (currently) enumerable.
9232       break;
9233     case DirectoryLookup::LT_NormalDir:
9234       AddFilesFromIncludeDir(IncludeDir.getDir()->getName(), IsSystem,
9235                              DirectoryLookup::LT_NormalDir);
9236       break;
9237     case DirectoryLookup::LT_Framework:
9238       AddFilesFromIncludeDir(IncludeDir.getFrameworkDir()->getName(), IsSystem,
9239                              DirectoryLookup::LT_Framework);
9240       break;
9241     }
9242   };
9243 
9244   // Finally with all our helpers, we can scan the include path.
9245   // Do this in standard order so deduplication keeps the right file.
9246   // (In case we decide to add more details to the results later).
9247   const auto &S = PP.getHeaderSearchInfo();
9248   using llvm::make_range;
9249   if (!Angled) {
9250     // The current directory is on the include path for "quoted" includes.
9251     auto *CurFile = PP.getCurrentFileLexer()->getFileEntry();
9252     if (CurFile && CurFile->getDir())
9253       AddFilesFromIncludeDir(CurFile->getDir()->getName(), false,
9254                              DirectoryLookup::LT_NormalDir);
9255     for (const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end()))
9256       AddFilesFromDirLookup(D, false);
9257   }
9258   for (const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end()))
9259     AddFilesFromDirLookup(D, false);
9260   for (const auto &D : make_range(S.system_dir_begin(), S.system_dir_end()))
9261     AddFilesFromDirLookup(D, true);
9262 
9263   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9264                             Results.data(), Results.size());
9265 }
9266 
9267 void Sema::CodeCompleteNaturalLanguage() {
9268   HandleCodeCompleteResults(this, CodeCompleter,
9269                             CodeCompletionContext::CCC_NaturalLanguage, nullptr,
9270                             0);
9271 }
9272 
9273 void Sema::CodeCompleteAvailabilityPlatformName() {
9274   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
9275                         CodeCompleter->getCodeCompletionTUInfo(),
9276                         CodeCompletionContext::CCC_Other);
9277   Results.EnterNewScope();
9278   static const char *Platforms[] = {"macOS", "iOS", "watchOS", "tvOS"};
9279   for (const char *Platform : llvm::makeArrayRef(Platforms)) {
9280     Results.AddResult(CodeCompletionResult(Platform));
9281     Results.AddResult(CodeCompletionResult(Results.getAllocator().CopyString(
9282         Twine(Platform) + "ApplicationExtension")));
9283   }
9284   Results.ExitScope();
9285   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9286                             Results.data(), Results.size());
9287 }
9288 
9289 void Sema::GatherGlobalCodeCompletions(
9290     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
9291     SmallVectorImpl<CodeCompletionResult> &Results) {
9292   ResultBuilder Builder(*this, Allocator, CCTUInfo,
9293                         CodeCompletionContext::CCC_Recovery);
9294   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
9295     CodeCompletionDeclConsumer Consumer(Builder,
9296                                         Context.getTranslationUnitDecl());
9297     LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName,
9298                        Consumer,
9299                        !CodeCompleter || CodeCompleter->loadExternal());
9300   }
9301 
9302   if (!CodeCompleter || CodeCompleter->includeMacros())
9303     AddMacroResults(PP, Builder,
9304                     !CodeCompleter || CodeCompleter->loadExternal(), true);
9305 
9306   Results.clear();
9307   Results.insert(Results.end(), Builder.data(),
9308                  Builder.data() + Builder.size());
9309 }
9310