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