xref: /freebsd/contrib/llvm-project/clang/lib/Sema/SemaCodeComplete.cpp (revision 5e801ac66d24704442eba426ed13c3effb8a34e7)
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/Scope.h"
40 #include "clang/Sema/ScopeInfo.h"
41 #include "clang/Sema/Sema.h"
42 #include "clang/Sema/SemaInternal.h"
43 #include "llvm/ADT/ArrayRef.h"
44 #include "llvm/ADT/DenseSet.h"
45 #include "llvm/ADT/SmallBitVector.h"
46 #include "llvm/ADT/SmallPtrSet.h"
47 #include "llvm/ADT/SmallString.h"
48 #include "llvm/ADT/StringExtras.h"
49 #include "llvm/ADT/StringSwitch.h"
50 #include "llvm/ADT/Twine.h"
51 #include "llvm/ADT/iterator_range.h"
52 #include "llvm/Support/Casting.h"
53 #include "llvm/Support/Path.h"
54 #include "llvm/Support/raw_ostream.h"
55 #include <list>
56 #include <map>
57 #include <string>
58 #include <vector>
59 
60 using namespace clang;
61 using namespace sema;
62 
63 namespace {
64 /// A container of code-completion results.
65 class ResultBuilder {
66 public:
67   /// The type of a name-lookup filter, which can be provided to the
68   /// name-lookup routines to specify which declarations should be included in
69   /// the result set (when it returns true) and which declarations should be
70   /// filtered out (returns false).
71   typedef bool (ResultBuilder::*LookupFilter)(const NamedDecl *) const;
72 
73   typedef CodeCompletionResult Result;
74 
75 private:
76   /// The actual results we have found.
77   std::vector<Result> Results;
78 
79   /// A record of all of the declarations we have found and placed
80   /// into the result set, used to ensure that no declaration ever gets into
81   /// the result set twice.
82   llvm::SmallPtrSet<const Decl *, 16> AllDeclsFound;
83 
84   typedef std::pair<const NamedDecl *, unsigned> DeclIndexPair;
85 
86   /// An entry in the shadow map, which is optimized to store
87   /// a single (declaration, index) mapping (the common case) but
88   /// can also store a list of (declaration, index) mappings.
89   class ShadowMapEntry {
90     typedef SmallVector<DeclIndexPair, 4> DeclIndexPairVector;
91 
92     /// Contains either the solitary NamedDecl * or a vector
93     /// of (declaration, index) pairs.
94     llvm::PointerUnion<const NamedDecl *, DeclIndexPairVector *> DeclOrVector;
95 
96     /// When the entry contains a single declaration, this is
97     /// the index associated with that entry.
98     unsigned SingleDeclIndex;
99 
100   public:
101     ShadowMapEntry() : DeclOrVector(), SingleDeclIndex(0) {}
102     ShadowMapEntry(const ShadowMapEntry &) = delete;
103     ShadowMapEntry(ShadowMapEntry &&Move) { *this = std::move(Move); }
104     ShadowMapEntry &operator=(const ShadowMapEntry &) = delete;
105     ShadowMapEntry &operator=(ShadowMapEntry &&Move) {
106       SingleDeclIndex = Move.SingleDeclIndex;
107       DeclOrVector = Move.DeclOrVector;
108       Move.DeclOrVector = nullptr;
109       return *this;
110     }
111 
112     void Add(const NamedDecl *ND, unsigned Index) {
113       if (DeclOrVector.isNull()) {
114         // 0 - > 1 elements: just set the single element information.
115         DeclOrVector = ND;
116         SingleDeclIndex = Index;
117         return;
118       }
119 
120       if (const NamedDecl *PrevND =
121               DeclOrVector.dyn_cast<const NamedDecl *>()) {
122         // 1 -> 2 elements: create the vector of results and push in the
123         // existing declaration.
124         DeclIndexPairVector *Vec = new DeclIndexPairVector;
125         Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex));
126         DeclOrVector = Vec;
127       }
128 
129       // Add the new element to the end of the vector.
130       DeclOrVector.get<DeclIndexPairVector *>()->push_back(
131           DeclIndexPair(ND, Index));
132     }
133 
134     ~ShadowMapEntry() {
135       if (DeclIndexPairVector *Vec =
136               DeclOrVector.dyn_cast<DeclIndexPairVector *>()) {
137         delete Vec;
138         DeclOrVector = ((NamedDecl *)nullptr);
139       }
140     }
141 
142     // Iteration.
143     class iterator;
144     iterator begin() const;
145     iterator end() const;
146   };
147 
148   /// A mapping from declaration names to the declarations that have
149   /// this name within a particular scope and their index within the list of
150   /// results.
151   typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap;
152 
153   /// The semantic analysis object for which results are being
154   /// produced.
155   Sema &SemaRef;
156 
157   /// The allocator used to allocate new code-completion strings.
158   CodeCompletionAllocator &Allocator;
159 
160   CodeCompletionTUInfo &CCTUInfo;
161 
162   /// If non-NULL, a filter function used to remove any code-completion
163   /// results that are not desirable.
164   LookupFilter Filter;
165 
166   /// Whether we should allow declarations as
167   /// nested-name-specifiers that would otherwise be filtered out.
168   bool AllowNestedNameSpecifiers;
169 
170   /// If set, the type that we would prefer our resulting value
171   /// declarations to have.
172   ///
173   /// Closely matching the preferred type gives a boost to a result's
174   /// priority.
175   CanQualType PreferredType;
176 
177   /// A list of shadow maps, which is used to model name hiding at
178   /// different levels of, e.g., the inheritance hierarchy.
179   std::list<ShadowMap> ShadowMaps;
180 
181   /// Overloaded C++ member functions found by SemaLookup.
182   /// Used to determine when one overload is dominated by another.
183   llvm::DenseMap<std::pair<DeclContext *, /*Name*/uintptr_t>, ShadowMapEntry>
184       OverloadMap;
185 
186   /// If we're potentially referring to a C++ member function, the set
187   /// of qualifiers applied to the object type.
188   Qualifiers ObjectTypeQualifiers;
189   /// The kind of the object expression, for rvalue/lvalue overloads.
190   ExprValueKind ObjectKind;
191 
192   /// Whether the \p ObjectTypeQualifiers field is active.
193   bool HasObjectTypeQualifiers;
194 
195   /// The selector that we prefer.
196   Selector PreferredSelector;
197 
198   /// The completion context in which we are gathering results.
199   CodeCompletionContext CompletionContext;
200 
201   /// If we are in an instance method definition, the \@implementation
202   /// object.
203   ObjCImplementationDecl *ObjCImplementation;
204 
205   void AdjustResultPriorityForDecl(Result &R);
206 
207   void MaybeAddConstructorResults(Result R);
208 
209 public:
210   explicit ResultBuilder(Sema &SemaRef, CodeCompletionAllocator &Allocator,
211                          CodeCompletionTUInfo &CCTUInfo,
212                          const CodeCompletionContext &CompletionContext,
213                          LookupFilter Filter = nullptr)
214       : SemaRef(SemaRef), Allocator(Allocator), CCTUInfo(CCTUInfo),
215         Filter(Filter), AllowNestedNameSpecifiers(false),
216         HasObjectTypeQualifiers(false), CompletionContext(CompletionContext),
217         ObjCImplementation(nullptr) {
218     // If this is an Objective-C instance method definition, dig out the
219     // corresponding implementation.
220     switch (CompletionContext.getKind()) {
221     case CodeCompletionContext::CCC_Expression:
222     case CodeCompletionContext::CCC_ObjCMessageReceiver:
223     case CodeCompletionContext::CCC_ParenthesizedExpression:
224     case CodeCompletionContext::CCC_Statement:
225     case CodeCompletionContext::CCC_Recovery:
226       if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl())
227         if (Method->isInstanceMethod())
228           if (ObjCInterfaceDecl *Interface = Method->getClassInterface())
229             ObjCImplementation = Interface->getImplementation();
230       break;
231 
232     default:
233       break;
234     }
235   }
236 
237   /// Determine the priority for a reference to the given declaration.
238   unsigned getBasePriority(const NamedDecl *D);
239 
240   /// Whether we should include code patterns in the completion
241   /// results.
242   bool includeCodePatterns() const {
243     return SemaRef.CodeCompleter &&
244            SemaRef.CodeCompleter->includeCodePatterns();
245   }
246 
247   /// Set the filter used for code-completion results.
248   void setFilter(LookupFilter Filter) { this->Filter = Filter; }
249 
250   Result *data() { return Results.empty() ? nullptr : &Results.front(); }
251   unsigned size() const { return Results.size(); }
252   bool empty() const { return Results.empty(); }
253 
254   /// Specify the preferred type.
255   void setPreferredType(QualType T) {
256     PreferredType = SemaRef.Context.getCanonicalType(T);
257   }
258 
259   /// Set the cv-qualifiers on the object type, for us in filtering
260   /// calls to member functions.
261   ///
262   /// When there are qualifiers in this set, they will be used to filter
263   /// out member functions that aren't available (because there will be a
264   /// cv-qualifier mismatch) or prefer functions with an exact qualifier
265   /// match.
266   void setObjectTypeQualifiers(Qualifiers Quals, ExprValueKind Kind) {
267     ObjectTypeQualifiers = Quals;
268     ObjectKind = Kind;
269     HasObjectTypeQualifiers = true;
270   }
271 
272   /// Set the preferred selector.
273   ///
274   /// When an Objective-C method declaration result is added, and that
275   /// method's selector matches this preferred selector, we give that method
276   /// a slight priority boost.
277   void setPreferredSelector(Selector Sel) { PreferredSelector = Sel; }
278 
279   /// Retrieve the code-completion context for which results are
280   /// being collected.
281   const CodeCompletionContext &getCompletionContext() const {
282     return CompletionContext;
283   }
284 
285   /// Specify whether nested-name-specifiers are allowed.
286   void allowNestedNameSpecifiers(bool Allow = true) {
287     AllowNestedNameSpecifiers = Allow;
288   }
289 
290   /// Return the semantic analysis object for which we are collecting
291   /// code completion results.
292   Sema &getSema() const { return SemaRef; }
293 
294   /// Retrieve the allocator used to allocate code completion strings.
295   CodeCompletionAllocator &getAllocator() const { return Allocator; }
296 
297   CodeCompletionTUInfo &getCodeCompletionTUInfo() const { return CCTUInfo; }
298 
299   /// Determine whether the given declaration is at all interesting
300   /// as a code-completion result.
301   ///
302   /// \param ND the declaration that we are inspecting.
303   ///
304   /// \param AsNestedNameSpecifier will be set true if this declaration is
305   /// only interesting when it is a nested-name-specifier.
306   bool isInterestingDecl(const NamedDecl *ND,
307                          bool &AsNestedNameSpecifier) const;
308 
309   /// Check whether the result is hidden by the Hiding declaration.
310   ///
311   /// \returns true if the result is hidden and cannot be found, false if
312   /// the hidden result could still be found. When false, \p R may be
313   /// modified to describe how the result can be found (e.g., via extra
314   /// qualification).
315   bool CheckHiddenResult(Result &R, DeclContext *CurContext,
316                          const NamedDecl *Hiding);
317 
318   /// Add a new result to this result set (if it isn't already in one
319   /// of the shadow maps), or replace an existing result (for, e.g., a
320   /// redeclaration).
321   ///
322   /// \param R the result to add (if it is unique).
323   ///
324   /// \param CurContext the context in which this result will be named.
325   void MaybeAddResult(Result R, DeclContext *CurContext = nullptr);
326 
327   /// Add a new result to this result set, where we already know
328   /// the hiding declaration (if any).
329   ///
330   /// \param R the result to add (if it is unique).
331   ///
332   /// \param CurContext the context in which this result will be named.
333   ///
334   /// \param Hiding the declaration that hides the result.
335   ///
336   /// \param InBaseClass whether the result was found in a base
337   /// class of the searched context.
338   void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding,
339                  bool InBaseClass);
340 
341   /// Add a new non-declaration result to this result set.
342   void AddResult(Result R);
343 
344   /// Enter into a new scope.
345   void EnterNewScope();
346 
347   /// Exit from the current scope.
348   void ExitScope();
349 
350   /// Ignore this declaration, if it is seen again.
351   void Ignore(const Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); }
352 
353   /// Add a visited context.
354   void addVisitedContext(DeclContext *Ctx) {
355     CompletionContext.addVisitedContext(Ctx);
356   }
357 
358   /// \name Name lookup predicates
359   ///
360   /// These predicates can be passed to the name lookup functions to filter the
361   /// results of name lookup. All of the predicates have the same type, so that
362   ///
363   //@{
364   bool IsOrdinaryName(const NamedDecl *ND) const;
365   bool IsOrdinaryNonTypeName(const NamedDecl *ND) const;
366   bool IsIntegralConstantValue(const NamedDecl *ND) const;
367   bool IsOrdinaryNonValueName(const NamedDecl *ND) const;
368   bool IsNestedNameSpecifier(const NamedDecl *ND) const;
369   bool IsEnum(const NamedDecl *ND) const;
370   bool IsClassOrStruct(const NamedDecl *ND) const;
371   bool IsUnion(const NamedDecl *ND) const;
372   bool IsNamespace(const NamedDecl *ND) const;
373   bool IsNamespaceOrAlias(const NamedDecl *ND) const;
374   bool IsType(const NamedDecl *ND) const;
375   bool IsMember(const NamedDecl *ND) const;
376   bool IsObjCIvar(const NamedDecl *ND) const;
377   bool IsObjCMessageReceiver(const NamedDecl *ND) const;
378   bool IsObjCMessageReceiverOrLambdaCapture(const NamedDecl *ND) const;
379   bool IsObjCCollection(const NamedDecl *ND) const;
380   bool IsImpossibleToSatisfy(const NamedDecl *ND) const;
381   //@}
382 };
383 } // namespace
384 
385 void PreferredTypeBuilder::enterReturn(Sema &S, SourceLocation Tok) {
386   if (!Enabled)
387     return;
388   if (isa<BlockDecl>(S.CurContext)) {
389     if (sema::BlockScopeInfo *BSI = S.getCurBlock()) {
390       ComputeType = nullptr;
391       Type = BSI->ReturnType;
392       ExpectedLoc = Tok;
393     }
394   } else if (const auto *Function = dyn_cast<FunctionDecl>(S.CurContext)) {
395     ComputeType = nullptr;
396     Type = Function->getReturnType();
397     ExpectedLoc = Tok;
398   } else if (const auto *Method = dyn_cast<ObjCMethodDecl>(S.CurContext)) {
399     ComputeType = nullptr;
400     Type = Method->getReturnType();
401     ExpectedLoc = Tok;
402   }
403 }
404 
405 void PreferredTypeBuilder::enterVariableInit(SourceLocation Tok, Decl *D) {
406   if (!Enabled)
407     return;
408   auto *VD = llvm::dyn_cast_or_null<ValueDecl>(D);
409   ComputeType = nullptr;
410   Type = VD ? VD->getType() : QualType();
411   ExpectedLoc = Tok;
412 }
413 
414 static QualType getDesignatedType(QualType BaseType, const Designation &Desig);
415 
416 void PreferredTypeBuilder::enterDesignatedInitializer(SourceLocation Tok,
417                                                       QualType BaseType,
418                                                       const Designation &D) {
419   if (!Enabled)
420     return;
421   ComputeType = nullptr;
422   Type = getDesignatedType(BaseType, D);
423   ExpectedLoc = Tok;
424 }
425 
426 void PreferredTypeBuilder::enterFunctionArgument(
427     SourceLocation Tok, llvm::function_ref<QualType()> ComputeType) {
428   if (!Enabled)
429     return;
430   this->ComputeType = ComputeType;
431   Type = QualType();
432   ExpectedLoc = Tok;
433 }
434 
435 void PreferredTypeBuilder::enterParenExpr(SourceLocation Tok,
436                                           SourceLocation LParLoc) {
437   if (!Enabled)
438     return;
439   // expected type for parenthesized expression does not change.
440   if (ExpectedLoc == LParLoc)
441     ExpectedLoc = Tok;
442 }
443 
444 static QualType getPreferredTypeOfBinaryRHS(Sema &S, Expr *LHS,
445                                             tok::TokenKind Op) {
446   if (!LHS)
447     return QualType();
448 
449   QualType LHSType = LHS->getType();
450   if (LHSType->isPointerType()) {
451     if (Op == tok::plus || Op == tok::plusequal || Op == tok::minusequal)
452       return S.getASTContext().getPointerDiffType();
453     // Pointer difference is more common than subtracting an int from a pointer.
454     if (Op == tok::minus)
455       return LHSType;
456   }
457 
458   switch (Op) {
459   // No way to infer the type of RHS from LHS.
460   case tok::comma:
461     return QualType();
462   // Prefer the type of the left operand for all of these.
463   // Arithmetic operations.
464   case tok::plus:
465   case tok::plusequal:
466   case tok::minus:
467   case tok::minusequal:
468   case tok::percent:
469   case tok::percentequal:
470   case tok::slash:
471   case tok::slashequal:
472   case tok::star:
473   case tok::starequal:
474   // Assignment.
475   case tok::equal:
476   // Comparison operators.
477   case tok::equalequal:
478   case tok::exclaimequal:
479   case tok::less:
480   case tok::lessequal:
481   case tok::greater:
482   case tok::greaterequal:
483   case tok::spaceship:
484     return LHS->getType();
485   // Binary shifts are often overloaded, so don't try to guess those.
486   case tok::greatergreater:
487   case tok::greatergreaterequal:
488   case tok::lessless:
489   case tok::lesslessequal:
490     if (LHSType->isIntegralOrEnumerationType())
491       return S.getASTContext().IntTy;
492     return QualType();
493   // Logical operators, assume we want bool.
494   case tok::ampamp:
495   case tok::pipepipe:
496   case tok::caretcaret:
497     return S.getASTContext().BoolTy;
498   // Operators often used for bit manipulation are typically used with the type
499   // of the left argument.
500   case tok::pipe:
501   case tok::pipeequal:
502   case tok::caret:
503   case tok::caretequal:
504   case tok::amp:
505   case tok::ampequal:
506     if (LHSType->isIntegralOrEnumerationType())
507       return LHSType;
508     return QualType();
509   // RHS should be a pointer to a member of the 'LHS' type, but we can't give
510   // any particular type here.
511   case tok::periodstar:
512   case tok::arrowstar:
513     return QualType();
514   default:
515     // FIXME(ibiryukov): handle the missing op, re-add the assertion.
516     // assert(false && "unhandled binary op");
517     return QualType();
518   }
519 }
520 
521 /// Get preferred type for an argument of an unary expression. \p ContextType is
522 /// preferred type of the whole unary expression.
523 static QualType getPreferredTypeOfUnaryArg(Sema &S, QualType ContextType,
524                                            tok::TokenKind Op) {
525   switch (Op) {
526   case tok::exclaim:
527     return S.getASTContext().BoolTy;
528   case tok::amp:
529     if (!ContextType.isNull() && ContextType->isPointerType())
530       return ContextType->getPointeeType();
531     return QualType();
532   case tok::star:
533     if (ContextType.isNull())
534       return QualType();
535     return S.getASTContext().getPointerType(ContextType.getNonReferenceType());
536   case tok::plus:
537   case tok::minus:
538   case tok::tilde:
539   case tok::minusminus:
540   case tok::plusplus:
541     if (ContextType.isNull())
542       return S.getASTContext().IntTy;
543     // leave as is, these operators typically return the same type.
544     return ContextType;
545   case tok::kw___real:
546   case tok::kw___imag:
547     return QualType();
548   default:
549     assert(false && "unhandled unary op");
550     return QualType();
551   }
552 }
553 
554 void PreferredTypeBuilder::enterBinary(Sema &S, SourceLocation Tok, Expr *LHS,
555                                        tok::TokenKind Op) {
556   if (!Enabled)
557     return;
558   ComputeType = nullptr;
559   Type = getPreferredTypeOfBinaryRHS(S, LHS, Op);
560   ExpectedLoc = Tok;
561 }
562 
563 void PreferredTypeBuilder::enterMemAccess(Sema &S, SourceLocation Tok,
564                                           Expr *Base) {
565   if (!Enabled || !Base)
566     return;
567   // Do we have expected type for Base?
568   if (ExpectedLoc != Base->getBeginLoc())
569     return;
570   // Keep the expected type, only update the location.
571   ExpectedLoc = Tok;
572   return;
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 CodeCompletionString *
3762 CodeCompleteConsumer::OverloadCandidate::CreateSignatureString(
3763     unsigned CurrentArg, Sema &S, CodeCompletionAllocator &Allocator,
3764     CodeCompletionTUInfo &CCTUInfo, bool IncludeBriefComments) const {
3765   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
3766   // Show signatures of constructors as they are declared:
3767   //   vector(int n) rather than vector<string>(int n)
3768   // This is less noisy without being less clear, and avoids tricky cases.
3769   Policy.SuppressTemplateArgsInCXXConstructors = true;
3770 
3771   // FIXME: Set priority, availability appropriately.
3772   CodeCompletionBuilder Result(Allocator, CCTUInfo, 1,
3773                                CXAvailability_Available);
3774   FunctionDecl *FDecl = getFunction();
3775   const FunctionProtoType *Proto =
3776       dyn_cast<FunctionProtoType>(getFunctionType());
3777   if (!FDecl && !Proto) {
3778     // Function without a prototype. Just give the return type and a
3779     // highlighted ellipsis.
3780     const FunctionType *FT = getFunctionType();
3781     Result.AddResultTypeChunk(Result.getAllocator().CopyString(
3782         FT->getReturnType().getAsString(Policy)));
3783     Result.AddChunk(CodeCompletionString::CK_LeftParen);
3784     Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "...");
3785     Result.AddChunk(CodeCompletionString::CK_RightParen);
3786     return Result.TakeString();
3787   }
3788 
3789   if (FDecl) {
3790     if (IncludeBriefComments) {
3791       if (auto RC = getParameterComment(S.getASTContext(), *this, CurrentArg))
3792         Result.addBriefComment(RC->getBriefText(S.getASTContext()));
3793     }
3794     AddResultTypeChunk(S.Context, Policy, FDecl, QualType(), Result);
3795 
3796     std::string Name;
3797     llvm::raw_string_ostream OS(Name);
3798     FDecl->getDeclName().print(OS, Policy);
3799     Result.AddTextChunk(Result.getAllocator().CopyString(OS.str()));
3800   } else {
3801     Result.AddResultTypeChunk(Result.getAllocator().CopyString(
3802         Proto->getReturnType().getAsString(Policy)));
3803   }
3804 
3805   Result.AddChunk(CodeCompletionString::CK_LeftParen);
3806   AddOverloadParameterChunks(S.getASTContext(), Policy, FDecl, Proto, Result,
3807                              CurrentArg);
3808   Result.AddChunk(CodeCompletionString::CK_RightParen);
3809 
3810   return Result.TakeString();
3811 }
3812 
3813 unsigned clang::getMacroUsagePriority(StringRef MacroName,
3814                                       const LangOptions &LangOpts,
3815                                       bool PreferredTypeIsPointer) {
3816   unsigned Priority = CCP_Macro;
3817 
3818   // Treat the "nil", "Nil" and "NULL" macros as null pointer constants.
3819   if (MacroName.equals("nil") || MacroName.equals("NULL") ||
3820       MacroName.equals("Nil")) {
3821     Priority = CCP_Constant;
3822     if (PreferredTypeIsPointer)
3823       Priority = Priority / CCF_SimilarTypeMatch;
3824   }
3825   // Treat "YES", "NO", "true", and "false" as constants.
3826   else if (MacroName.equals("YES") || MacroName.equals("NO") ||
3827            MacroName.equals("true") || MacroName.equals("false"))
3828     Priority = CCP_Constant;
3829   // Treat "bool" as a type.
3830   else if (MacroName.equals("bool"))
3831     Priority = CCP_Type + (LangOpts.ObjC ? CCD_bool_in_ObjC : 0);
3832 
3833   return Priority;
3834 }
3835 
3836 CXCursorKind clang::getCursorKindForDecl(const Decl *D) {
3837   if (!D)
3838     return CXCursor_UnexposedDecl;
3839 
3840   switch (D->getKind()) {
3841   case Decl::Enum:
3842     return CXCursor_EnumDecl;
3843   case Decl::EnumConstant:
3844     return CXCursor_EnumConstantDecl;
3845   case Decl::Field:
3846     return CXCursor_FieldDecl;
3847   case Decl::Function:
3848     return CXCursor_FunctionDecl;
3849   case Decl::ObjCCategory:
3850     return CXCursor_ObjCCategoryDecl;
3851   case Decl::ObjCCategoryImpl:
3852     return CXCursor_ObjCCategoryImplDecl;
3853   case Decl::ObjCImplementation:
3854     return CXCursor_ObjCImplementationDecl;
3855 
3856   case Decl::ObjCInterface:
3857     return CXCursor_ObjCInterfaceDecl;
3858   case Decl::ObjCIvar:
3859     return CXCursor_ObjCIvarDecl;
3860   case Decl::ObjCMethod:
3861     return cast<ObjCMethodDecl>(D)->isInstanceMethod()
3862                ? CXCursor_ObjCInstanceMethodDecl
3863                : CXCursor_ObjCClassMethodDecl;
3864   case Decl::CXXMethod:
3865     return CXCursor_CXXMethod;
3866   case Decl::CXXConstructor:
3867     return CXCursor_Constructor;
3868   case Decl::CXXDestructor:
3869     return CXCursor_Destructor;
3870   case Decl::CXXConversion:
3871     return CXCursor_ConversionFunction;
3872   case Decl::ObjCProperty:
3873     return CXCursor_ObjCPropertyDecl;
3874   case Decl::ObjCProtocol:
3875     return CXCursor_ObjCProtocolDecl;
3876   case Decl::ParmVar:
3877     return CXCursor_ParmDecl;
3878   case Decl::Typedef:
3879     return CXCursor_TypedefDecl;
3880   case Decl::TypeAlias:
3881     return CXCursor_TypeAliasDecl;
3882   case Decl::TypeAliasTemplate:
3883     return CXCursor_TypeAliasTemplateDecl;
3884   case Decl::Var:
3885     return CXCursor_VarDecl;
3886   case Decl::Namespace:
3887     return CXCursor_Namespace;
3888   case Decl::NamespaceAlias:
3889     return CXCursor_NamespaceAlias;
3890   case Decl::TemplateTypeParm:
3891     return CXCursor_TemplateTypeParameter;
3892   case Decl::NonTypeTemplateParm:
3893     return CXCursor_NonTypeTemplateParameter;
3894   case Decl::TemplateTemplateParm:
3895     return CXCursor_TemplateTemplateParameter;
3896   case Decl::FunctionTemplate:
3897     return CXCursor_FunctionTemplate;
3898   case Decl::ClassTemplate:
3899     return CXCursor_ClassTemplate;
3900   case Decl::AccessSpec:
3901     return CXCursor_CXXAccessSpecifier;
3902   case Decl::ClassTemplatePartialSpecialization:
3903     return CXCursor_ClassTemplatePartialSpecialization;
3904   case Decl::UsingDirective:
3905     return CXCursor_UsingDirective;
3906   case Decl::StaticAssert:
3907     return CXCursor_StaticAssert;
3908   case Decl::Friend:
3909     return CXCursor_FriendDecl;
3910   case Decl::TranslationUnit:
3911     return CXCursor_TranslationUnit;
3912 
3913   case Decl::Using:
3914   case Decl::UnresolvedUsingValue:
3915   case Decl::UnresolvedUsingTypename:
3916     return CXCursor_UsingDeclaration;
3917 
3918   case Decl::UsingEnum:
3919     return CXCursor_EnumDecl;
3920 
3921   case Decl::ObjCPropertyImpl:
3922     switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) {
3923     case ObjCPropertyImplDecl::Dynamic:
3924       return CXCursor_ObjCDynamicDecl;
3925 
3926     case ObjCPropertyImplDecl::Synthesize:
3927       return CXCursor_ObjCSynthesizeDecl;
3928     }
3929     llvm_unreachable("Unexpected Kind!");
3930 
3931   case Decl::Import:
3932     return CXCursor_ModuleImportDecl;
3933 
3934   case Decl::ObjCTypeParam:
3935     return CXCursor_TemplateTypeParameter;
3936 
3937   default:
3938     if (const auto *TD = dyn_cast<TagDecl>(D)) {
3939       switch (TD->getTagKind()) {
3940       case TTK_Interface: // fall through
3941       case TTK_Struct:
3942         return CXCursor_StructDecl;
3943       case TTK_Class:
3944         return CXCursor_ClassDecl;
3945       case TTK_Union:
3946         return CXCursor_UnionDecl;
3947       case TTK_Enum:
3948         return CXCursor_EnumDecl;
3949       }
3950     }
3951   }
3952 
3953   return CXCursor_UnexposedDecl;
3954 }
3955 
3956 static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results,
3957                             bool LoadExternal, bool IncludeUndefined,
3958                             bool TargetTypeIsPointer = false) {
3959   typedef CodeCompletionResult Result;
3960 
3961   Results.EnterNewScope();
3962 
3963   for (Preprocessor::macro_iterator M = PP.macro_begin(LoadExternal),
3964                                     MEnd = PP.macro_end(LoadExternal);
3965        M != MEnd; ++M) {
3966     auto MD = PP.getMacroDefinition(M->first);
3967     if (IncludeUndefined || MD) {
3968       MacroInfo *MI = MD.getMacroInfo();
3969       if (MI && MI->isUsedForHeaderGuard())
3970         continue;
3971 
3972       Results.AddResult(
3973           Result(M->first, MI,
3974                  getMacroUsagePriority(M->first->getName(), PP.getLangOpts(),
3975                                        TargetTypeIsPointer)));
3976     }
3977   }
3978 
3979   Results.ExitScope();
3980 }
3981 
3982 static void AddPrettyFunctionResults(const LangOptions &LangOpts,
3983                                      ResultBuilder &Results) {
3984   typedef CodeCompletionResult Result;
3985 
3986   Results.EnterNewScope();
3987 
3988   Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant));
3989   Results.AddResult(Result("__FUNCTION__", CCP_Constant));
3990   if (LangOpts.C99 || LangOpts.CPlusPlus11)
3991     Results.AddResult(Result("__func__", CCP_Constant));
3992   Results.ExitScope();
3993 }
3994 
3995 static void HandleCodeCompleteResults(Sema *S,
3996                                       CodeCompleteConsumer *CodeCompleter,
3997                                       CodeCompletionContext Context,
3998                                       CodeCompletionResult *Results,
3999                                       unsigned NumResults) {
4000   if (CodeCompleter)
4001     CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults);
4002 }
4003 
4004 static CodeCompletionContext
4005 mapCodeCompletionContext(Sema &S, Sema::ParserCompletionContext PCC) {
4006   switch (PCC) {
4007   case Sema::PCC_Namespace:
4008     return CodeCompletionContext::CCC_TopLevel;
4009 
4010   case Sema::PCC_Class:
4011     return CodeCompletionContext::CCC_ClassStructUnion;
4012 
4013   case Sema::PCC_ObjCInterface:
4014     return CodeCompletionContext::CCC_ObjCInterface;
4015 
4016   case Sema::PCC_ObjCImplementation:
4017     return CodeCompletionContext::CCC_ObjCImplementation;
4018 
4019   case Sema::PCC_ObjCInstanceVariableList:
4020     return CodeCompletionContext::CCC_ObjCIvarList;
4021 
4022   case Sema::PCC_Template:
4023   case Sema::PCC_MemberTemplate:
4024     if (S.CurContext->isFileContext())
4025       return CodeCompletionContext::CCC_TopLevel;
4026     if (S.CurContext->isRecord())
4027       return CodeCompletionContext::CCC_ClassStructUnion;
4028     return CodeCompletionContext::CCC_Other;
4029 
4030   case Sema::PCC_RecoveryInFunction:
4031     return CodeCompletionContext::CCC_Recovery;
4032 
4033   case Sema::PCC_ForInit:
4034     if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 ||
4035         S.getLangOpts().ObjC)
4036       return CodeCompletionContext::CCC_ParenthesizedExpression;
4037     else
4038       return CodeCompletionContext::CCC_Expression;
4039 
4040   case Sema::PCC_Expression:
4041     return CodeCompletionContext::CCC_Expression;
4042   case Sema::PCC_Condition:
4043     return CodeCompletionContext(CodeCompletionContext::CCC_Expression,
4044                                  S.getASTContext().BoolTy);
4045 
4046   case Sema::PCC_Statement:
4047     return CodeCompletionContext::CCC_Statement;
4048 
4049   case Sema::PCC_Type:
4050     return CodeCompletionContext::CCC_Type;
4051 
4052   case Sema::PCC_ParenthesizedExpression:
4053     return CodeCompletionContext::CCC_ParenthesizedExpression;
4054 
4055   case Sema::PCC_LocalDeclarationSpecifiers:
4056     return CodeCompletionContext::CCC_Type;
4057   }
4058 
4059   llvm_unreachable("Invalid ParserCompletionContext!");
4060 }
4061 
4062 /// If we're in a C++ virtual member function, add completion results
4063 /// that invoke the functions we override, since it's common to invoke the
4064 /// overridden function as well as adding new functionality.
4065 ///
4066 /// \param S The semantic analysis object for which we are generating results.
4067 ///
4068 /// \param InContext This context in which the nested-name-specifier preceding
4069 /// the code-completion point
4070 static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext,
4071                                   ResultBuilder &Results) {
4072   // Look through blocks.
4073   DeclContext *CurContext = S.CurContext;
4074   while (isa<BlockDecl>(CurContext))
4075     CurContext = CurContext->getParent();
4076 
4077   CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext);
4078   if (!Method || !Method->isVirtual())
4079     return;
4080 
4081   // We need to have names for all of the parameters, if we're going to
4082   // generate a forwarding call.
4083   for (auto P : Method->parameters())
4084     if (!P->getDeclName())
4085       return;
4086 
4087   PrintingPolicy Policy = getCompletionPrintingPolicy(S);
4088   for (const CXXMethodDecl *Overridden : Method->overridden_methods()) {
4089     CodeCompletionBuilder Builder(Results.getAllocator(),
4090                                   Results.getCodeCompletionTUInfo());
4091     if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl())
4092       continue;
4093 
4094     // If we need a nested-name-specifier, add one now.
4095     if (!InContext) {
4096       NestedNameSpecifier *NNS = getRequiredQualification(
4097           S.Context, CurContext, Overridden->getDeclContext());
4098       if (NNS) {
4099         std::string Str;
4100         llvm::raw_string_ostream OS(Str);
4101         NNS->print(OS, Policy);
4102         Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str()));
4103       }
4104     } else if (!InContext->Equals(Overridden->getDeclContext()))
4105       continue;
4106 
4107     Builder.AddTypedTextChunk(
4108         Results.getAllocator().CopyString(Overridden->getNameAsString()));
4109     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4110     bool FirstParam = true;
4111     for (auto P : Method->parameters()) {
4112       if (FirstParam)
4113         FirstParam = false;
4114       else
4115         Builder.AddChunk(CodeCompletionString::CK_Comma);
4116 
4117       Builder.AddPlaceholderChunk(
4118           Results.getAllocator().CopyString(P->getIdentifier()->getName()));
4119     }
4120     Builder.AddChunk(CodeCompletionString::CK_RightParen);
4121     Results.AddResult(CodeCompletionResult(
4122         Builder.TakeString(), CCP_SuperCompletion, CXCursor_CXXMethod,
4123         CXAvailability_Available, Overridden));
4124     Results.Ignore(Overridden);
4125   }
4126 }
4127 
4128 void Sema::CodeCompleteModuleImport(SourceLocation ImportLoc,
4129                                     ModuleIdPath Path) {
4130   typedef CodeCompletionResult Result;
4131   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4132                         CodeCompleter->getCodeCompletionTUInfo(),
4133                         CodeCompletionContext::CCC_Other);
4134   Results.EnterNewScope();
4135 
4136   CodeCompletionAllocator &Allocator = Results.getAllocator();
4137   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
4138   typedef CodeCompletionResult Result;
4139   if (Path.empty()) {
4140     // Enumerate all top-level modules.
4141     SmallVector<Module *, 8> Modules;
4142     PP.getHeaderSearchInfo().collectAllModules(Modules);
4143     for (unsigned I = 0, N = Modules.size(); I != N; ++I) {
4144       Builder.AddTypedTextChunk(
4145           Builder.getAllocator().CopyString(Modules[I]->Name));
4146       Results.AddResult(Result(
4147           Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl,
4148           Modules[I]->isAvailable() ? CXAvailability_Available
4149                                     : CXAvailability_NotAvailable));
4150     }
4151   } else if (getLangOpts().Modules) {
4152     // Load the named module.
4153     Module *Mod =
4154         PP.getModuleLoader().loadModule(ImportLoc, Path, Module::AllVisible,
4155                                         /*IsInclusionDirective=*/false);
4156     // Enumerate submodules.
4157     if (Mod) {
4158       for (Module::submodule_iterator Sub = Mod->submodule_begin(),
4159                                       SubEnd = Mod->submodule_end();
4160            Sub != SubEnd; ++Sub) {
4161 
4162         Builder.AddTypedTextChunk(
4163             Builder.getAllocator().CopyString((*Sub)->Name));
4164         Results.AddResult(Result(
4165             Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl,
4166             (*Sub)->isAvailable() ? CXAvailability_Available
4167                                   : CXAvailability_NotAvailable));
4168       }
4169     }
4170   }
4171   Results.ExitScope();
4172   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4173                             Results.data(), Results.size());
4174 }
4175 
4176 void Sema::CodeCompleteOrdinaryName(Scope *S,
4177                                     ParserCompletionContext CompletionContext) {
4178   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4179                         CodeCompleter->getCodeCompletionTUInfo(),
4180                         mapCodeCompletionContext(*this, CompletionContext));
4181   Results.EnterNewScope();
4182 
4183   // Determine how to filter results, e.g., so that the names of
4184   // values (functions, enumerators, function templates, etc.) are
4185   // only allowed where we can have an expression.
4186   switch (CompletionContext) {
4187   case PCC_Namespace:
4188   case PCC_Class:
4189   case PCC_ObjCInterface:
4190   case PCC_ObjCImplementation:
4191   case PCC_ObjCInstanceVariableList:
4192   case PCC_Template:
4193   case PCC_MemberTemplate:
4194   case PCC_Type:
4195   case PCC_LocalDeclarationSpecifiers:
4196     Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
4197     break;
4198 
4199   case PCC_Statement:
4200   case PCC_ParenthesizedExpression:
4201   case PCC_Expression:
4202   case PCC_ForInit:
4203   case PCC_Condition:
4204     if (WantTypesInContext(CompletionContext, getLangOpts()))
4205       Results.setFilter(&ResultBuilder::IsOrdinaryName);
4206     else
4207       Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
4208 
4209     if (getLangOpts().CPlusPlus)
4210       MaybeAddOverrideCalls(*this, /*InContext=*/nullptr, Results);
4211     break;
4212 
4213   case PCC_RecoveryInFunction:
4214     // Unfiltered
4215     break;
4216   }
4217 
4218   // If we are in a C++ non-static member function, check the qualifiers on
4219   // the member function to filter/prioritize the results list.
4220   auto ThisType = getCurrentThisType();
4221   if (!ThisType.isNull())
4222     Results.setObjectTypeQualifiers(ThisType->getPointeeType().getQualifiers(),
4223                                     VK_LValue);
4224 
4225   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4226   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4227                      CodeCompleter->includeGlobals(),
4228                      CodeCompleter->loadExternal());
4229 
4230   AddOrdinaryNameResults(CompletionContext, S, *this, Results);
4231   Results.ExitScope();
4232 
4233   switch (CompletionContext) {
4234   case PCC_ParenthesizedExpression:
4235   case PCC_Expression:
4236   case PCC_Statement:
4237   case PCC_RecoveryInFunction:
4238     if (S->getFnParent())
4239       AddPrettyFunctionResults(getLangOpts(), Results);
4240     break;
4241 
4242   case PCC_Namespace:
4243   case PCC_Class:
4244   case PCC_ObjCInterface:
4245   case PCC_ObjCImplementation:
4246   case PCC_ObjCInstanceVariableList:
4247   case PCC_Template:
4248   case PCC_MemberTemplate:
4249   case PCC_ForInit:
4250   case PCC_Condition:
4251   case PCC_Type:
4252   case PCC_LocalDeclarationSpecifiers:
4253     break;
4254   }
4255 
4256   if (CodeCompleter->includeMacros())
4257     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
4258 
4259   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4260                             Results.data(), Results.size());
4261 }
4262 
4263 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
4264                                        ParsedType Receiver,
4265                                        ArrayRef<IdentifierInfo *> SelIdents,
4266                                        bool AtArgumentExpression, bool IsSuper,
4267                                        ResultBuilder &Results);
4268 
4269 void Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS,
4270                                 bool AllowNonIdentifiers,
4271                                 bool AllowNestedNameSpecifiers) {
4272   typedef CodeCompletionResult Result;
4273   ResultBuilder Results(
4274       *this, CodeCompleter->getAllocator(),
4275       CodeCompleter->getCodeCompletionTUInfo(),
4276       AllowNestedNameSpecifiers
4277           // FIXME: Try to separate codepath leading here to deduce whether we
4278           // need an existing symbol or a new one.
4279           ? CodeCompletionContext::CCC_SymbolOrNewName
4280           : CodeCompletionContext::CCC_NewName);
4281   Results.EnterNewScope();
4282 
4283   // Type qualifiers can come after names.
4284   Results.AddResult(Result("const"));
4285   Results.AddResult(Result("volatile"));
4286   if (getLangOpts().C99)
4287     Results.AddResult(Result("restrict"));
4288 
4289   if (getLangOpts().CPlusPlus) {
4290     if (getLangOpts().CPlusPlus11 &&
4291         (DS.getTypeSpecType() == DeclSpec::TST_class ||
4292          DS.getTypeSpecType() == DeclSpec::TST_struct))
4293       Results.AddResult("final");
4294 
4295     if (AllowNonIdentifiers) {
4296       Results.AddResult(Result("operator"));
4297     }
4298 
4299     // Add nested-name-specifiers.
4300     if (AllowNestedNameSpecifiers) {
4301       Results.allowNestedNameSpecifiers();
4302       Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy);
4303       CodeCompletionDeclConsumer Consumer(Results, CurContext);
4304       LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer,
4305                          CodeCompleter->includeGlobals(),
4306                          CodeCompleter->loadExternal());
4307       Results.setFilter(nullptr);
4308     }
4309   }
4310   Results.ExitScope();
4311 
4312   // If we're in a context where we might have an expression (rather than a
4313   // declaration), and what we've seen so far is an Objective-C type that could
4314   // be a receiver of a class message, this may be a class message send with
4315   // the initial opening bracket '[' missing. Add appropriate completions.
4316   if (AllowNonIdentifiers && !AllowNestedNameSpecifiers &&
4317       DS.getParsedSpecifiers() == DeclSpec::PQ_TypeSpecifier &&
4318       DS.getTypeSpecType() == DeclSpec::TST_typename &&
4319       DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified &&
4320       DS.getTypeSpecSign() == TypeSpecifierSign::Unspecified &&
4321       !DS.isTypeAltiVecVector() && S &&
4322       (S->getFlags() & Scope::DeclScope) != 0 &&
4323       (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope |
4324                         Scope::FunctionPrototypeScope | Scope::AtCatchScope)) ==
4325           0) {
4326     ParsedType T = DS.getRepAsType();
4327     if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType())
4328       AddClassMessageCompletions(*this, S, T, None, false, false, Results);
4329   }
4330 
4331   // Note that we intentionally suppress macro results here, since we do not
4332   // encourage using macros to produce the names of entities.
4333 
4334   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4335                             Results.data(), Results.size());
4336 }
4337 
4338 static const char *underscoreAttrScope(llvm::StringRef Scope) {
4339   if (Scope == "clang")
4340     return "_Clang";
4341   if (Scope == "gnu")
4342     return "__gnu__";
4343   return nullptr;
4344 }
4345 
4346 static const char *noUnderscoreAttrScope(llvm::StringRef Scope) {
4347   if (Scope == "_Clang")
4348     return "clang";
4349   if (Scope == "__gnu__")
4350     return "gnu";
4351   return nullptr;
4352 }
4353 
4354 void Sema::CodeCompleteAttribute(AttributeCommonInfo::Syntax Syntax,
4355                                  AttributeCompletion Completion,
4356                                  const IdentifierInfo *InScope) {
4357   if (Completion == AttributeCompletion::None)
4358     return;
4359   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
4360                         CodeCompleter->getCodeCompletionTUInfo(),
4361                         CodeCompletionContext::CCC_Attribute);
4362 
4363   // We're going to iterate over the normalized spellings of the attribute.
4364   // These don't include "underscore guarding": the normalized spelling is
4365   // clang::foo but you can also write _Clang::__foo__.
4366   //
4367   // (Clang supports a mix like clang::__foo__ but we won't suggest it: either
4368   // you care about clashing with macros or you don't).
4369   //
4370   // So if we're already in a scope, we determine its canonical spellings
4371   // (for comparison with normalized attr spelling) and remember whether it was
4372   // underscore-guarded (so we know how to spell contained attributes).
4373   llvm::StringRef InScopeName;
4374   bool InScopeUnderscore = false;
4375   if (InScope) {
4376     InScopeName = InScope->getName();
4377     if (const char *NoUnderscore = noUnderscoreAttrScope(InScopeName)) {
4378       InScopeName = NoUnderscore;
4379       InScopeUnderscore = true;
4380     }
4381   }
4382   bool SyntaxSupportsGuards = Syntax == AttributeCommonInfo::AS_GNU ||
4383                               Syntax == AttributeCommonInfo::AS_CXX11 ||
4384                               Syntax == AttributeCommonInfo::AS_C2x;
4385 
4386   llvm::DenseSet<llvm::StringRef> FoundScopes;
4387   auto AddCompletions = [&](const ParsedAttrInfo &A) {
4388     if (A.IsTargetSpecific && !A.existsInTarget(Context.getTargetInfo()))
4389       return;
4390     if (!A.acceptsLangOpts(getLangOpts()))
4391       return;
4392     for (const auto &S : A.Spellings) {
4393       if (S.Syntax != Syntax)
4394         continue;
4395       llvm::StringRef Name = S.NormalizedFullName;
4396       llvm::StringRef Scope;
4397       if ((Syntax == AttributeCommonInfo::AS_CXX11 ||
4398            Syntax == AttributeCommonInfo::AS_C2x)) {
4399         std::tie(Scope, Name) = Name.split("::");
4400         if (Name.empty()) // oops, unscoped
4401           std::swap(Name, Scope);
4402       }
4403 
4404       // Do we just want a list of scopes rather than attributes?
4405       if (Completion == AttributeCompletion::Scope) {
4406         // Make sure to emit each scope only once.
4407         if (!Scope.empty() && FoundScopes.insert(Scope).second) {
4408           Results.AddResult(
4409               CodeCompletionResult(Results.getAllocator().CopyString(Scope)));
4410           // Include alternate form (__gnu__ instead of gnu).
4411           if (const char *Scope2 = underscoreAttrScope(Scope))
4412             Results.AddResult(CodeCompletionResult(Scope2));
4413         }
4414         continue;
4415       }
4416 
4417       // If a scope was specified, it must match but we don't need to print it.
4418       if (!InScopeName.empty()) {
4419         if (Scope != InScopeName)
4420           continue;
4421         Scope = "";
4422       }
4423 
4424       auto Add = [&](llvm::StringRef Scope, llvm::StringRef Name,
4425                      bool Underscores) {
4426         CodeCompletionBuilder Builder(Results.getAllocator(),
4427                                       Results.getCodeCompletionTUInfo());
4428         llvm::SmallString<32> Text;
4429         if (!Scope.empty()) {
4430           Text.append(Scope);
4431           Text.append("::");
4432         }
4433         if (Underscores)
4434           Text.append("__");
4435         Text.append(Name);
4436         if (Underscores)
4437           Text.append("__");
4438         Builder.AddTypedTextChunk(Results.getAllocator().CopyString(Text));
4439 
4440         if (!A.ArgNames.empty()) {
4441           Builder.AddChunk(CodeCompletionString::CK_LeftParen, "(");
4442           bool First = true;
4443           for (const char *Arg : A.ArgNames) {
4444             if (!First)
4445               Builder.AddChunk(CodeCompletionString::CK_Comma, ", ");
4446             First = false;
4447             Builder.AddPlaceholderChunk(Arg);
4448           }
4449           Builder.AddChunk(CodeCompletionString::CK_RightParen, ")");
4450         }
4451 
4452         Results.AddResult(Builder.TakeString());
4453       };
4454 
4455       // Generate the non-underscore-guarded result.
4456       // Note this is (a suffix of) the NormalizedFullName, no need to copy.
4457       // If an underscore-guarded scope was specified, only the
4458       // underscore-guarded attribute name is relevant.
4459       if (!InScopeUnderscore)
4460         Add(Scope, Name, /*Underscores=*/false);
4461 
4462       // Generate the underscore-guarded version, for syntaxes that support it.
4463       // We skip this if the scope was already spelled and not guarded, or
4464       // we must spell it and can't guard it.
4465       if (!(InScope && !InScopeUnderscore) && SyntaxSupportsGuards) {
4466         llvm::SmallString<32> Guarded;
4467         if (Scope.empty()) {
4468           Add(Scope, Name, /*Underscores=*/true);
4469         } else {
4470           const char *GuardedScope = underscoreAttrScope(Scope);
4471           if (!GuardedScope)
4472             continue;
4473           Add(GuardedScope, Name, /*Underscores=*/true);
4474         }
4475       }
4476 
4477       // It may be nice to include the Kind so we can look up the docs later.
4478     }
4479   };
4480 
4481   for (const auto *A : ParsedAttrInfo::getAllBuiltin())
4482     AddCompletions(*A);
4483   for (const auto &Entry : ParsedAttrInfoRegistry::entries())
4484     AddCompletions(*Entry.instantiate());
4485 
4486   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4487                             Results.data(), Results.size());
4488 }
4489 
4490 struct Sema::CodeCompleteExpressionData {
4491   CodeCompleteExpressionData(QualType PreferredType = QualType(),
4492                              bool IsParenthesized = false)
4493       : PreferredType(PreferredType), IntegralConstantExpression(false),
4494         ObjCCollection(false), IsParenthesized(IsParenthesized) {}
4495 
4496   QualType PreferredType;
4497   bool IntegralConstantExpression;
4498   bool ObjCCollection;
4499   bool IsParenthesized;
4500   SmallVector<Decl *, 4> IgnoreDecls;
4501 };
4502 
4503 namespace {
4504 /// Information that allows to avoid completing redundant enumerators.
4505 struct CoveredEnumerators {
4506   llvm::SmallPtrSet<EnumConstantDecl *, 8> Seen;
4507   NestedNameSpecifier *SuggestedQualifier = nullptr;
4508 };
4509 } // namespace
4510 
4511 static void AddEnumerators(ResultBuilder &Results, ASTContext &Context,
4512                            EnumDecl *Enum, DeclContext *CurContext,
4513                            const CoveredEnumerators &Enumerators) {
4514   NestedNameSpecifier *Qualifier = Enumerators.SuggestedQualifier;
4515   if (Context.getLangOpts().CPlusPlus && !Qualifier && Enumerators.Seen.empty()) {
4516     // If there are no prior enumerators in C++, check whether we have to
4517     // qualify the names of the enumerators that we suggest, because they
4518     // may not be visible in this scope.
4519     Qualifier = getRequiredQualification(Context, CurContext, Enum);
4520   }
4521 
4522   Results.EnterNewScope();
4523   for (auto *E : Enum->enumerators()) {
4524     if (Enumerators.Seen.count(E))
4525       continue;
4526 
4527     CodeCompletionResult R(E, CCP_EnumInCase, Qualifier);
4528     Results.AddResult(R, CurContext, nullptr, false);
4529   }
4530   Results.ExitScope();
4531 }
4532 
4533 /// Try to find a corresponding FunctionProtoType for function-like types (e.g.
4534 /// function pointers, std::function, etc).
4535 static const FunctionProtoType *TryDeconstructFunctionLike(QualType T) {
4536   assert(!T.isNull());
4537   // Try to extract first template argument from std::function<> and similar.
4538   // Note we only handle the sugared types, they closely match what users wrote.
4539   // We explicitly choose to not handle ClassTemplateSpecializationDecl.
4540   if (auto *Specialization = T->getAs<TemplateSpecializationType>()) {
4541     if (Specialization->getNumArgs() != 1)
4542       return nullptr;
4543     const TemplateArgument &Argument = Specialization->getArg(0);
4544     if (Argument.getKind() != TemplateArgument::Type)
4545       return nullptr;
4546     return Argument.getAsType()->getAs<FunctionProtoType>();
4547   }
4548   // Handle other cases.
4549   if (T->isPointerType())
4550     T = T->getPointeeType();
4551   return T->getAs<FunctionProtoType>();
4552 }
4553 
4554 /// Adds a pattern completion for a lambda expression with the specified
4555 /// parameter types and placeholders for parameter names.
4556 static void AddLambdaCompletion(ResultBuilder &Results,
4557                                 llvm::ArrayRef<QualType> Parameters,
4558                                 const LangOptions &LangOpts) {
4559   if (!Results.includeCodePatterns())
4560     return;
4561   CodeCompletionBuilder Completion(Results.getAllocator(),
4562                                    Results.getCodeCompletionTUInfo());
4563   // [](<parameters>) {}
4564   Completion.AddChunk(CodeCompletionString::CK_LeftBracket);
4565   Completion.AddPlaceholderChunk("=");
4566   Completion.AddChunk(CodeCompletionString::CK_RightBracket);
4567   if (!Parameters.empty()) {
4568     Completion.AddChunk(CodeCompletionString::CK_LeftParen);
4569     bool First = true;
4570     for (auto Parameter : Parameters) {
4571       if (!First)
4572         Completion.AddChunk(CodeCompletionString::ChunkKind::CK_Comma);
4573       else
4574         First = false;
4575 
4576       constexpr llvm::StringLiteral NamePlaceholder = "!#!NAME_GOES_HERE!#!";
4577       std::string Type = std::string(NamePlaceholder);
4578       Parameter.getAsStringInternal(Type, PrintingPolicy(LangOpts));
4579       llvm::StringRef Prefix, Suffix;
4580       std::tie(Prefix, Suffix) = llvm::StringRef(Type).split(NamePlaceholder);
4581       Prefix = Prefix.rtrim();
4582       Suffix = Suffix.ltrim();
4583 
4584       Completion.AddTextChunk(Completion.getAllocator().CopyString(Prefix));
4585       Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4586       Completion.AddPlaceholderChunk("parameter");
4587       Completion.AddTextChunk(Completion.getAllocator().CopyString(Suffix));
4588     };
4589     Completion.AddChunk(CodeCompletionString::CK_RightParen);
4590   }
4591   Completion.AddChunk(clang::CodeCompletionString::CK_HorizontalSpace);
4592   Completion.AddChunk(CodeCompletionString::CK_LeftBrace);
4593   Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4594   Completion.AddPlaceholderChunk("body");
4595   Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace);
4596   Completion.AddChunk(CodeCompletionString::CK_RightBrace);
4597 
4598   Results.AddResult(Completion.TakeString());
4599 }
4600 
4601 /// Perform code-completion in an expression context when we know what
4602 /// type we're looking for.
4603 void Sema::CodeCompleteExpression(Scope *S,
4604                                   const CodeCompleteExpressionData &Data) {
4605   ResultBuilder Results(
4606       *this, CodeCompleter->getAllocator(),
4607       CodeCompleter->getCodeCompletionTUInfo(),
4608       CodeCompletionContext(
4609           Data.IsParenthesized
4610               ? CodeCompletionContext::CCC_ParenthesizedExpression
4611               : CodeCompletionContext::CCC_Expression,
4612           Data.PreferredType));
4613   auto PCC =
4614       Data.IsParenthesized ? PCC_ParenthesizedExpression : PCC_Expression;
4615   if (Data.ObjCCollection)
4616     Results.setFilter(&ResultBuilder::IsObjCCollection);
4617   else if (Data.IntegralConstantExpression)
4618     Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
4619   else if (WantTypesInContext(PCC, getLangOpts()))
4620     Results.setFilter(&ResultBuilder::IsOrdinaryName);
4621   else
4622     Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
4623 
4624   if (!Data.PreferredType.isNull())
4625     Results.setPreferredType(Data.PreferredType.getNonReferenceType());
4626 
4627   // Ignore any declarations that we were told that we don't care about.
4628   for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I)
4629     Results.Ignore(Data.IgnoreDecls[I]);
4630 
4631   CodeCompletionDeclConsumer Consumer(Results, CurContext);
4632   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
4633                      CodeCompleter->includeGlobals(),
4634                      CodeCompleter->loadExternal());
4635 
4636   Results.EnterNewScope();
4637   AddOrdinaryNameResults(PCC, S, *this, Results);
4638   Results.ExitScope();
4639 
4640   bool PreferredTypeIsPointer = false;
4641   if (!Data.PreferredType.isNull()) {
4642     PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() ||
4643                              Data.PreferredType->isMemberPointerType() ||
4644                              Data.PreferredType->isBlockPointerType();
4645     if (Data.PreferredType->isEnumeralType()) {
4646       EnumDecl *Enum = Data.PreferredType->castAs<EnumType>()->getDecl();
4647       if (auto *Def = Enum->getDefinition())
4648         Enum = Def;
4649       // FIXME: collect covered enumerators in cases like:
4650       //        if (x == my_enum::one) { ... } else if (x == ^) {}
4651       AddEnumerators(Results, Context, Enum, CurContext, CoveredEnumerators());
4652     }
4653   }
4654 
4655   if (S->getFnParent() && !Data.ObjCCollection &&
4656       !Data.IntegralConstantExpression)
4657     AddPrettyFunctionResults(getLangOpts(), Results);
4658 
4659   if (CodeCompleter->includeMacros())
4660     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false,
4661                     PreferredTypeIsPointer);
4662 
4663   // Complete a lambda expression when preferred type is a function.
4664   if (!Data.PreferredType.isNull() && getLangOpts().CPlusPlus11) {
4665     if (const FunctionProtoType *F =
4666             TryDeconstructFunctionLike(Data.PreferredType))
4667       AddLambdaCompletion(Results, F->getParamTypes(), getLangOpts());
4668   }
4669 
4670   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
4671                             Results.data(), Results.size());
4672 }
4673 
4674 void Sema::CodeCompleteExpression(Scope *S, QualType PreferredType,
4675                                   bool IsParenthesized) {
4676   return CodeCompleteExpression(
4677       S, CodeCompleteExpressionData(PreferredType, IsParenthesized));
4678 }
4679 
4680 void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E,
4681                                          QualType PreferredType) {
4682   if (E.isInvalid())
4683     CodeCompleteExpression(S, PreferredType);
4684   else if (getLangOpts().ObjC)
4685     CodeCompleteObjCInstanceMessage(S, E.get(), None, false);
4686 }
4687 
4688 /// The set of properties that have already been added, referenced by
4689 /// property name.
4690 typedef llvm::SmallPtrSet<IdentifierInfo *, 16> AddedPropertiesSet;
4691 
4692 /// Retrieve the container definition, if any?
4693 static ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) {
4694   if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) {
4695     if (Interface->hasDefinition())
4696       return Interface->getDefinition();
4697 
4698     return Interface;
4699   }
4700 
4701   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
4702     if (Protocol->hasDefinition())
4703       return Protocol->getDefinition();
4704 
4705     return Protocol;
4706   }
4707   return Container;
4708 }
4709 
4710 /// Adds a block invocation code completion result for the given block
4711 /// declaration \p BD.
4712 static void AddObjCBlockCall(ASTContext &Context, const PrintingPolicy &Policy,
4713                              CodeCompletionBuilder &Builder,
4714                              const NamedDecl *BD,
4715                              const FunctionTypeLoc &BlockLoc,
4716                              const FunctionProtoTypeLoc &BlockProtoLoc) {
4717   Builder.AddResultTypeChunk(
4718       GetCompletionTypeString(BlockLoc.getReturnLoc().getType(), Context,
4719                               Policy, Builder.getAllocator()));
4720 
4721   AddTypedNameChunk(Context, Policy, BD, Builder);
4722   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4723 
4724   if (BlockProtoLoc && BlockProtoLoc.getTypePtr()->isVariadic()) {
4725     Builder.AddPlaceholderChunk("...");
4726   } else {
4727     for (unsigned I = 0, N = BlockLoc.getNumParams(); I != N; ++I) {
4728       if (I)
4729         Builder.AddChunk(CodeCompletionString::CK_Comma);
4730 
4731       // Format the placeholder string.
4732       std::string PlaceholderStr =
4733           FormatFunctionParameter(Policy, BlockLoc.getParam(I));
4734 
4735       if (I == N - 1 && BlockProtoLoc &&
4736           BlockProtoLoc.getTypePtr()->isVariadic())
4737         PlaceholderStr += ", ...";
4738 
4739       // Add the placeholder string.
4740       Builder.AddPlaceholderChunk(
4741           Builder.getAllocator().CopyString(PlaceholderStr));
4742     }
4743   }
4744 
4745   Builder.AddChunk(CodeCompletionString::CK_RightParen);
4746 }
4747 
4748 static void
4749 AddObjCProperties(const CodeCompletionContext &CCContext,
4750                   ObjCContainerDecl *Container, bool AllowCategories,
4751                   bool AllowNullaryMethods, DeclContext *CurContext,
4752                   AddedPropertiesSet &AddedProperties, ResultBuilder &Results,
4753                   bool IsBaseExprStatement = false,
4754                   bool IsClassProperty = false, bool InOriginalClass = true) {
4755   typedef CodeCompletionResult Result;
4756 
4757   // Retrieve the definition.
4758   Container = getContainerDef(Container);
4759 
4760   // Add properties in this container.
4761   const auto AddProperty = [&](const ObjCPropertyDecl *P) {
4762     if (!AddedProperties.insert(P->getIdentifier()).second)
4763       return;
4764 
4765     // FIXME: Provide block invocation completion for non-statement
4766     // expressions.
4767     if (!P->getType().getTypePtr()->isBlockPointerType() ||
4768         !IsBaseExprStatement) {
4769       Result R = Result(P, Results.getBasePriority(P), nullptr);
4770       if (!InOriginalClass)
4771         setInBaseClass(R);
4772       Results.MaybeAddResult(R, CurContext);
4773       return;
4774     }
4775 
4776     // Block setter and invocation completion is provided only when we are able
4777     // to find the FunctionProtoTypeLoc with parameter names for the block.
4778     FunctionTypeLoc BlockLoc;
4779     FunctionProtoTypeLoc BlockProtoLoc;
4780     findTypeLocationForBlockDecl(P->getTypeSourceInfo(), BlockLoc,
4781                                  BlockProtoLoc);
4782     if (!BlockLoc) {
4783       Result R = Result(P, Results.getBasePriority(P), nullptr);
4784       if (!InOriginalClass)
4785         setInBaseClass(R);
4786       Results.MaybeAddResult(R, CurContext);
4787       return;
4788     }
4789 
4790     // The default completion result for block properties should be the block
4791     // invocation completion when the base expression is a statement.
4792     CodeCompletionBuilder Builder(Results.getAllocator(),
4793                                   Results.getCodeCompletionTUInfo());
4794     AddObjCBlockCall(Container->getASTContext(),
4795                      getCompletionPrintingPolicy(Results.getSema()), Builder, P,
4796                      BlockLoc, BlockProtoLoc);
4797     Result R = Result(Builder.TakeString(), P, Results.getBasePriority(P));
4798     if (!InOriginalClass)
4799       setInBaseClass(R);
4800     Results.MaybeAddResult(R, CurContext);
4801 
4802     // Provide additional block setter completion iff the base expression is a
4803     // statement and the block property is mutable.
4804     if (!P->isReadOnly()) {
4805       CodeCompletionBuilder Builder(Results.getAllocator(),
4806                                     Results.getCodeCompletionTUInfo());
4807       AddResultTypeChunk(Container->getASTContext(),
4808                          getCompletionPrintingPolicy(Results.getSema()), P,
4809                          CCContext.getBaseType(), Builder);
4810       Builder.AddTypedTextChunk(
4811           Results.getAllocator().CopyString(P->getName()));
4812       Builder.AddChunk(CodeCompletionString::CK_Equal);
4813 
4814       std::string PlaceholderStr = formatBlockPlaceholder(
4815           getCompletionPrintingPolicy(Results.getSema()), P, BlockLoc,
4816           BlockProtoLoc, /*SuppressBlockName=*/true);
4817       // Add the placeholder string.
4818       Builder.AddPlaceholderChunk(
4819           Builder.getAllocator().CopyString(PlaceholderStr));
4820 
4821       // When completing blocks properties that return void the default
4822       // property completion result should show up before the setter,
4823       // otherwise the setter completion should show up before the default
4824       // property completion, as we normally want to use the result of the
4825       // call.
4826       Result R =
4827           Result(Builder.TakeString(), P,
4828                  Results.getBasePriority(P) +
4829                      (BlockLoc.getTypePtr()->getReturnType()->isVoidType()
4830                           ? CCD_BlockPropertySetter
4831                           : -CCD_BlockPropertySetter));
4832       if (!InOriginalClass)
4833         setInBaseClass(R);
4834       Results.MaybeAddResult(R, CurContext);
4835     }
4836   };
4837 
4838   if (IsClassProperty) {
4839     for (const auto *P : Container->class_properties())
4840       AddProperty(P);
4841   } else {
4842     for (const auto *P : Container->instance_properties())
4843       AddProperty(P);
4844   }
4845 
4846   // Add nullary methods or implicit class properties
4847   if (AllowNullaryMethods) {
4848     ASTContext &Context = Container->getASTContext();
4849     PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
4850     // Adds a method result
4851     const auto AddMethod = [&](const ObjCMethodDecl *M) {
4852       IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0);
4853       if (!Name)
4854         return;
4855       if (!AddedProperties.insert(Name).second)
4856         return;
4857       CodeCompletionBuilder Builder(Results.getAllocator(),
4858                                     Results.getCodeCompletionTUInfo());
4859       AddResultTypeChunk(Context, Policy, M, CCContext.getBaseType(), Builder);
4860       Builder.AddTypedTextChunk(
4861           Results.getAllocator().CopyString(Name->getName()));
4862       Result R = Result(Builder.TakeString(), M,
4863                         CCP_MemberDeclaration + CCD_MethodAsProperty);
4864       if (!InOriginalClass)
4865         setInBaseClass(R);
4866       Results.MaybeAddResult(R, CurContext);
4867     };
4868 
4869     if (IsClassProperty) {
4870       for (const auto *M : Container->methods()) {
4871         // Gather the class method that can be used as implicit property
4872         // getters. Methods with arguments or methods that return void aren't
4873         // added to the results as they can't be used as a getter.
4874         if (!M->getSelector().isUnarySelector() ||
4875             M->getReturnType()->isVoidType() || M->isInstanceMethod())
4876           continue;
4877         AddMethod(M);
4878       }
4879     } else {
4880       for (auto *M : Container->methods()) {
4881         if (M->getSelector().isUnarySelector())
4882           AddMethod(M);
4883       }
4884     }
4885   }
4886 
4887   // Add properties in referenced protocols.
4888   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
4889     for (auto *P : Protocol->protocols())
4890       AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods,
4891                         CurContext, AddedProperties, Results,
4892                         IsBaseExprStatement, IsClassProperty,
4893                         /*InOriginalClass*/ false);
4894   } else if (ObjCInterfaceDecl *IFace =
4895                  dyn_cast<ObjCInterfaceDecl>(Container)) {
4896     if (AllowCategories) {
4897       // Look through categories.
4898       for (auto *Cat : IFace->known_categories())
4899         AddObjCProperties(CCContext, Cat, AllowCategories, AllowNullaryMethods,
4900                           CurContext, AddedProperties, Results,
4901                           IsBaseExprStatement, IsClassProperty,
4902                           InOriginalClass);
4903     }
4904 
4905     // Look through protocols.
4906     for (auto *I : IFace->all_referenced_protocols())
4907       AddObjCProperties(CCContext, I, AllowCategories, AllowNullaryMethods,
4908                         CurContext, AddedProperties, Results,
4909                         IsBaseExprStatement, IsClassProperty,
4910                         /*InOriginalClass*/ false);
4911 
4912     // Look in the superclass.
4913     if (IFace->getSuperClass())
4914       AddObjCProperties(CCContext, IFace->getSuperClass(), AllowCategories,
4915                         AllowNullaryMethods, CurContext, AddedProperties,
4916                         Results, IsBaseExprStatement, IsClassProperty,
4917                         /*InOriginalClass*/ false);
4918   } else if (const auto *Category =
4919                  dyn_cast<ObjCCategoryDecl>(Container)) {
4920     // Look through protocols.
4921     for (auto *P : Category->protocols())
4922       AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods,
4923                         CurContext, AddedProperties, Results,
4924                         IsBaseExprStatement, IsClassProperty,
4925                         /*InOriginalClass*/ false);
4926   }
4927 }
4928 
4929 static void AddRecordMembersCompletionResults(
4930     Sema &SemaRef, ResultBuilder &Results, Scope *S, QualType BaseType,
4931     ExprValueKind BaseKind, RecordDecl *RD, Optional<FixItHint> AccessOpFixIt) {
4932   // Indicate that we are performing a member access, and the cv-qualifiers
4933   // for the base object type.
4934   Results.setObjectTypeQualifiers(BaseType.getQualifiers(), BaseKind);
4935 
4936   // Access to a C/C++ class, struct, or union.
4937   Results.allowNestedNameSpecifiers();
4938   std::vector<FixItHint> FixIts;
4939   if (AccessOpFixIt)
4940     FixIts.emplace_back(AccessOpFixIt.getValue());
4941   CodeCompletionDeclConsumer Consumer(Results, RD, BaseType, std::move(FixIts));
4942   SemaRef.LookupVisibleDecls(RD, Sema::LookupMemberName, Consumer,
4943                              SemaRef.CodeCompleter->includeGlobals(),
4944                              /*IncludeDependentBases=*/true,
4945                              SemaRef.CodeCompleter->loadExternal());
4946 
4947   if (SemaRef.getLangOpts().CPlusPlus) {
4948     if (!Results.empty()) {
4949       // The "template" keyword can follow "->" or "." in the grammar.
4950       // However, we only want to suggest the template keyword if something
4951       // is dependent.
4952       bool IsDependent = BaseType->isDependentType();
4953       if (!IsDependent) {
4954         for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent())
4955           if (DeclContext *Ctx = DepScope->getEntity()) {
4956             IsDependent = Ctx->isDependentContext();
4957             break;
4958           }
4959       }
4960 
4961       if (IsDependent)
4962         Results.AddResult(CodeCompletionResult("template"));
4963     }
4964   }
4965 }
4966 
4967 // Returns the RecordDecl inside the BaseType, falling back to primary template
4968 // in case of specializations. Since we might not have a decl for the
4969 // instantiation/specialization yet, e.g. dependent code.
4970 static RecordDecl *getAsRecordDecl(const QualType BaseType) {
4971   if (auto *RD = BaseType->getAsRecordDecl()) {
4972     if (const auto *CTSD =
4973             llvm::dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
4974       // Template might not be instantiated yet, fall back to primary template
4975       // in such cases.
4976       if (CTSD->getTemplateSpecializationKind() == TSK_Undeclared)
4977         RD = CTSD->getSpecializedTemplate()->getTemplatedDecl();
4978     }
4979     return RD;
4980   }
4981 
4982   if (const auto *TST = BaseType->getAs<TemplateSpecializationType>()) {
4983     if (const auto *TD = dyn_cast_or_null<ClassTemplateDecl>(
4984             TST->getTemplateName().getAsTemplateDecl())) {
4985       return TD->getTemplatedDecl();
4986     }
4987   }
4988 
4989   return nullptr;
4990 }
4991 
4992 namespace {
4993 // Collects completion-relevant information about a concept-constrainted type T.
4994 // In particular, examines the constraint expressions to find members of T.
4995 //
4996 // The design is very simple: we walk down each constraint looking for
4997 // expressions of the form T.foo().
4998 // If we're extra lucky, the return type is specified.
4999 // We don't do any clever handling of && or || in constraint expressions, we
5000 // take members from both branches.
5001 //
5002 // For example, given:
5003 //   template <class T> concept X = requires (T t, string& s) { t.print(s); };
5004 //   template <X U> void foo(U u) { u.^ }
5005 // We want to suggest the inferred member function 'print(string)'.
5006 // We see that u has type U, so X<U> holds.
5007 // X<U> requires t.print(s) to be valid, where t has type U (substituted for T).
5008 // By looking at the CallExpr we find the signature of print().
5009 //
5010 // While we tend to know in advance which kind of members (access via . -> ::)
5011 // we want, it's simpler just to gather them all and post-filter.
5012 //
5013 // FIXME: some of this machinery could be used for non-concept type-parms too,
5014 // enabling completion for type parameters based on other uses of that param.
5015 //
5016 // FIXME: there are other cases where a type can be constrained by a concept,
5017 // e.g. inside `if constexpr(ConceptSpecializationExpr) { ... }`
5018 class ConceptInfo {
5019 public:
5020   // Describes a likely member of a type, inferred by concept constraints.
5021   // Offered as a code completion for T. T-> and T:: contexts.
5022   struct Member {
5023     // Always non-null: we only handle members with ordinary identifier names.
5024     const IdentifierInfo *Name = nullptr;
5025     // Set for functions we've seen called.
5026     // We don't have the declared parameter types, only the actual types of
5027     // arguments we've seen. These are still valuable, as it's hard to render
5028     // a useful function completion with neither parameter types nor names!
5029     llvm::Optional<SmallVector<QualType, 1>> ArgTypes;
5030     // Whether this is accessed as T.member, T->member, or T::member.
5031     enum AccessOperator {
5032       Colons,
5033       Arrow,
5034       Dot,
5035     } Operator = Dot;
5036     // What's known about the type of a variable or return type of a function.
5037     const TypeConstraint *ResultType = nullptr;
5038     // FIXME: also track:
5039     //   - kind of entity (function/variable/type), to expose structured results
5040     //   - template args kinds/types, as a proxy for template params
5041 
5042     // For now we simply return these results as "pattern" strings.
5043     CodeCompletionString *render(Sema &S, CodeCompletionAllocator &Alloc,
5044                                  CodeCompletionTUInfo &Info) const {
5045       CodeCompletionBuilder B(Alloc, Info);
5046       // Result type
5047       if (ResultType) {
5048         std::string AsString;
5049         {
5050           llvm::raw_string_ostream OS(AsString);
5051           QualType ExactType = deduceType(*ResultType);
5052           if (!ExactType.isNull())
5053             ExactType.print(OS, getCompletionPrintingPolicy(S));
5054           else
5055             ResultType->print(OS, getCompletionPrintingPolicy(S));
5056         }
5057         B.AddResultTypeChunk(Alloc.CopyString(AsString));
5058       }
5059       // Member name
5060       B.AddTypedTextChunk(Alloc.CopyString(Name->getName()));
5061       // Function argument list
5062       if (ArgTypes) {
5063         B.AddChunk(clang::CodeCompletionString::CK_LeftParen);
5064         bool First = true;
5065         for (QualType Arg : *ArgTypes) {
5066           if (First)
5067             First = false;
5068           else {
5069             B.AddChunk(clang::CodeCompletionString::CK_Comma);
5070             B.AddChunk(clang::CodeCompletionString::CK_HorizontalSpace);
5071           }
5072           B.AddPlaceholderChunk(Alloc.CopyString(
5073               Arg.getAsString(getCompletionPrintingPolicy(S))));
5074         }
5075         B.AddChunk(clang::CodeCompletionString::CK_RightParen);
5076       }
5077       return B.TakeString();
5078     }
5079   };
5080 
5081   // BaseType is the type parameter T to infer members from.
5082   // T must be accessible within S, as we use it to find the template entity
5083   // that T is attached to in order to gather the relevant constraints.
5084   ConceptInfo(const TemplateTypeParmType &BaseType, Scope *S) {
5085     auto *TemplatedEntity = getTemplatedEntity(BaseType.getDecl(), S);
5086     for (const Expr *E : constraintsForTemplatedEntity(TemplatedEntity))
5087       believe(E, &BaseType);
5088   }
5089 
5090   std::vector<Member> members() {
5091     std::vector<Member> Results;
5092     for (const auto &E : this->Results)
5093       Results.push_back(E.second);
5094     llvm::sort(Results, [](const Member &L, const Member &R) {
5095       return L.Name->getName() < R.Name->getName();
5096     });
5097     return Results;
5098   }
5099 
5100 private:
5101   // Infer members of T, given that the expression E (dependent on T) is true.
5102   void believe(const Expr *E, const TemplateTypeParmType *T) {
5103     if (!E || !T)
5104       return;
5105     if (auto *CSE = dyn_cast<ConceptSpecializationExpr>(E)) {
5106       // If the concept is
5107       //   template <class A, class B> concept CD = f<A, B>();
5108       // And the concept specialization is
5109       //   CD<int, T>
5110       // Then we're substituting T for B, so we want to make f<A, B>() true
5111       // by adding members to B - i.e. believe(f<A, B>(), B);
5112       //
5113       // For simplicity:
5114       // - we don't attempt to substitute int for A
5115       // - when T is used in other ways (like CD<T*>) we ignore it
5116       ConceptDecl *CD = CSE->getNamedConcept();
5117       TemplateParameterList *Params = CD->getTemplateParameters();
5118       unsigned Index = 0;
5119       for (const auto &Arg : CSE->getTemplateArguments()) {
5120         if (Index >= Params->size())
5121           break; // Won't happen in valid code.
5122         if (isApprox(Arg, T)) {
5123           auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Params->getParam(Index));
5124           if (!TTPD)
5125             continue;
5126           // T was used as an argument, and bound to the parameter TT.
5127           auto *TT = cast<TemplateTypeParmType>(TTPD->getTypeForDecl());
5128           // So now we know the constraint as a function of TT is true.
5129           believe(CD->getConstraintExpr(), TT);
5130           // (concepts themselves have no associated constraints to require)
5131         }
5132 
5133         ++Index;
5134       }
5135     } else if (auto *BO = dyn_cast<BinaryOperator>(E)) {
5136       // For A && B, we can infer members from both branches.
5137       // For A || B, the union is still more useful than the intersection.
5138       if (BO->getOpcode() == BO_LAnd || BO->getOpcode() == BO_LOr) {
5139         believe(BO->getLHS(), T);
5140         believe(BO->getRHS(), T);
5141       }
5142     } else if (auto *RE = dyn_cast<RequiresExpr>(E)) {
5143       // A requires(){...} lets us infer members from each requirement.
5144       for (const concepts::Requirement *Req : RE->getRequirements()) {
5145         if (!Req->isDependent())
5146           continue; // Can't tell us anything about T.
5147         // Now Req cannot a substitution-error: those aren't dependent.
5148 
5149         if (auto *TR = dyn_cast<concepts::TypeRequirement>(Req)) {
5150           // Do a full traversal so we get `foo` from `typename T::foo::bar`.
5151           QualType AssertedType = TR->getType()->getType();
5152           ValidVisitor(this, T).TraverseType(AssertedType);
5153         } else if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
5154           ValidVisitor Visitor(this, T);
5155           // If we have a type constraint on the value of the expression,
5156           // AND the whole outer expression describes a member, then we'll
5157           // be able to use the constraint to provide the return type.
5158           if (ER->getReturnTypeRequirement().isTypeConstraint()) {
5159             Visitor.OuterType =
5160                 ER->getReturnTypeRequirement().getTypeConstraint();
5161             Visitor.OuterExpr = ER->getExpr();
5162           }
5163           Visitor.TraverseStmt(ER->getExpr());
5164         } else if (auto *NR = dyn_cast<concepts::NestedRequirement>(Req)) {
5165           believe(NR->getConstraintExpr(), T);
5166         }
5167       }
5168     }
5169   }
5170 
5171   // This visitor infers members of T based on traversing expressions/types
5172   // that involve T. It is invoked with code known to be valid for T.
5173   class ValidVisitor : public RecursiveASTVisitor<ValidVisitor> {
5174     ConceptInfo *Outer;
5175     const TemplateTypeParmType *T;
5176 
5177     CallExpr *Caller = nullptr;
5178     Expr *Callee = nullptr;
5179 
5180   public:
5181     // If set, OuterExpr is constrained by OuterType.
5182     Expr *OuterExpr = nullptr;
5183     const TypeConstraint *OuterType = nullptr;
5184 
5185     ValidVisitor(ConceptInfo *Outer, const TemplateTypeParmType *T)
5186         : Outer(Outer), T(T) {
5187       assert(T);
5188     }
5189 
5190     // In T.foo or T->foo, `foo` is a member function/variable.
5191     bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) {
5192       const Type *Base = E->getBaseType().getTypePtr();
5193       bool IsArrow = E->isArrow();
5194       if (Base->isPointerType() && IsArrow) {
5195         IsArrow = false;
5196         Base = Base->getPointeeType().getTypePtr();
5197       }
5198       if (isApprox(Base, T))
5199         addValue(E, E->getMember(), IsArrow ? Member::Arrow : Member::Dot);
5200       return true;
5201     }
5202 
5203     // In T::foo, `foo` is a static member function/variable.
5204     bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
5205       if (E->getQualifier() && isApprox(E->getQualifier()->getAsType(), T))
5206         addValue(E, E->getDeclName(), Member::Colons);
5207       return true;
5208     }
5209 
5210     // In T::typename foo, `foo` is a type.
5211     bool VisitDependentNameType(DependentNameType *DNT) {
5212       const auto *Q = DNT->getQualifier();
5213       if (Q && isApprox(Q->getAsType(), T))
5214         addType(DNT->getIdentifier());
5215       return true;
5216     }
5217 
5218     // In T::foo::bar, `foo` must be a type.
5219     // VisitNNS() doesn't exist, and TraverseNNS isn't always called :-(
5220     bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNSL) {
5221       if (NNSL) {
5222         NestedNameSpecifier *NNS = NNSL.getNestedNameSpecifier();
5223         const auto *Q = NNS->getPrefix();
5224         if (Q && isApprox(Q->getAsType(), T))
5225           addType(NNS->getAsIdentifier());
5226       }
5227       // FIXME: also handle T::foo<X>::bar
5228       return RecursiveASTVisitor::TraverseNestedNameSpecifierLoc(NNSL);
5229     }
5230 
5231     // FIXME also handle T::foo<X>
5232 
5233     // Track the innermost caller/callee relationship so we can tell if a
5234     // nested expr is being called as a function.
5235     bool VisitCallExpr(CallExpr *CE) {
5236       Caller = CE;
5237       Callee = CE->getCallee();
5238       return true;
5239     }
5240 
5241   private:
5242     void addResult(Member &&M) {
5243       auto R = Outer->Results.try_emplace(M.Name);
5244       Member &O = R.first->second;
5245       // Overwrite existing if the new member has more info.
5246       // The preference of . vs :: vs -> is fairly arbitrary.
5247       if (/*Inserted*/ R.second ||
5248           std::make_tuple(M.ArgTypes.hasValue(), M.ResultType != nullptr,
5249                           M.Operator) > std::make_tuple(O.ArgTypes.hasValue(),
5250                                                         O.ResultType != nullptr,
5251                                                         O.Operator))
5252         O = std::move(M);
5253     }
5254 
5255     void addType(const IdentifierInfo *Name) {
5256       if (!Name)
5257         return;
5258       Member M;
5259       M.Name = Name;
5260       M.Operator = Member::Colons;
5261       addResult(std::move(M));
5262     }
5263 
5264     void addValue(Expr *E, DeclarationName Name,
5265                   Member::AccessOperator Operator) {
5266       if (!Name.isIdentifier())
5267         return;
5268       Member Result;
5269       Result.Name = Name.getAsIdentifierInfo();
5270       Result.Operator = Operator;
5271       // If this is the callee of an immediately-enclosing CallExpr, then
5272       // treat it as a method, otherwise it's a variable.
5273       if (Caller != nullptr && Callee == E) {
5274         Result.ArgTypes.emplace();
5275         for (const auto *Arg : Caller->arguments())
5276           Result.ArgTypes->push_back(Arg->getType());
5277         if (Caller == OuterExpr) {
5278           Result.ResultType = OuterType;
5279         }
5280       } else {
5281         if (E == OuterExpr)
5282           Result.ResultType = OuterType;
5283       }
5284       addResult(std::move(Result));
5285     }
5286   };
5287 
5288   static bool isApprox(const TemplateArgument &Arg, const Type *T) {
5289     return Arg.getKind() == TemplateArgument::Type &&
5290            isApprox(Arg.getAsType().getTypePtr(), T);
5291   }
5292 
5293   static bool isApprox(const Type *T1, const Type *T2) {
5294     return T1 && T2 &&
5295            T1->getCanonicalTypeUnqualified() ==
5296                T2->getCanonicalTypeUnqualified();
5297   }
5298 
5299   // Returns the DeclContext immediately enclosed by the template parameter
5300   // scope. For primary templates, this is the templated (e.g.) CXXRecordDecl.
5301   // For specializations, this is e.g. ClassTemplatePartialSpecializationDecl.
5302   static DeclContext *getTemplatedEntity(const TemplateTypeParmDecl *D,
5303                                          Scope *S) {
5304     if (D == nullptr)
5305       return nullptr;
5306     Scope *Inner = nullptr;
5307     while (S) {
5308       if (S->isTemplateParamScope() && S->isDeclScope(D))
5309         return Inner ? Inner->getEntity() : nullptr;
5310       Inner = S;
5311       S = S->getParent();
5312     }
5313     return nullptr;
5314   }
5315 
5316   // Gets all the type constraint expressions that might apply to the type
5317   // variables associated with DC (as returned by getTemplatedEntity()).
5318   static SmallVector<const Expr *, 1>
5319   constraintsForTemplatedEntity(DeclContext *DC) {
5320     SmallVector<const Expr *, 1> Result;
5321     if (DC == nullptr)
5322       return Result;
5323     // Primary templates can have constraints.
5324     if (const auto *TD = cast<Decl>(DC)->getDescribedTemplate())
5325       TD->getAssociatedConstraints(Result);
5326     // Partial specializations may have constraints.
5327     if (const auto *CTPSD =
5328             dyn_cast<ClassTemplatePartialSpecializationDecl>(DC))
5329       CTPSD->getAssociatedConstraints(Result);
5330     if (const auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(DC))
5331       VTPSD->getAssociatedConstraints(Result);
5332     return Result;
5333   }
5334 
5335   // Attempt to find the unique type satisfying a constraint.
5336   // This lets us show e.g. `int` instead of `std::same_as<int>`.
5337   static QualType deduceType(const TypeConstraint &T) {
5338     // Assume a same_as<T> return type constraint is std::same_as or equivalent.
5339     // In this case the return type is T.
5340     DeclarationName DN = T.getNamedConcept()->getDeclName();
5341     if (DN.isIdentifier() && DN.getAsIdentifierInfo()->isStr("same_as"))
5342       if (const auto *Args = T.getTemplateArgsAsWritten())
5343         if (Args->getNumTemplateArgs() == 1) {
5344           const auto &Arg = Args->arguments().front().getArgument();
5345           if (Arg.getKind() == TemplateArgument::Type)
5346             return Arg.getAsType();
5347         }
5348     return {};
5349   }
5350 
5351   llvm::DenseMap<const IdentifierInfo *, Member> Results;
5352 };
5353 
5354 // Returns a type for E that yields acceptable member completions.
5355 // In particular, when E->getType() is DependentTy, try to guess a likely type.
5356 // We accept some lossiness (like dropping parameters).
5357 // We only try to handle common expressions on the LHS of MemberExpr.
5358 QualType getApproximateType(const Expr *E) {
5359   QualType Unresolved = E->getType();
5360   if (Unresolved.isNull() ||
5361       !Unresolved->isSpecificBuiltinType(BuiltinType::Dependent))
5362     return Unresolved;
5363   E = E->IgnoreParens();
5364   // A call: approximate-resolve callee to a function type, get its return type
5365   if (const CallExpr *CE = llvm::dyn_cast<CallExpr>(E)) {
5366     QualType Callee = getApproximateType(CE->getCallee());
5367     if (Callee.isNull() ||
5368         Callee->isSpecificPlaceholderType(BuiltinType::BoundMember))
5369       Callee = Expr::findBoundMemberType(CE->getCallee());
5370     if (Callee.isNull())
5371       return Unresolved;
5372 
5373     if (const auto *FnTypePtr = Callee->getAs<PointerType>()) {
5374       Callee = FnTypePtr->getPointeeType();
5375     } else if (const auto *BPT = Callee->getAs<BlockPointerType>()) {
5376       Callee = BPT->getPointeeType();
5377     }
5378     if (const FunctionType *FnType = Callee->getAs<FunctionType>())
5379       return FnType->getReturnType().getNonReferenceType();
5380 
5381     // Unresolved call: try to guess the return type.
5382     if (const auto *OE = llvm::dyn_cast<OverloadExpr>(CE->getCallee())) {
5383       // If all candidates have the same approximate return type, use it.
5384       // Discard references and const to allow more to be "the same".
5385       // (In particular, if there's one candidate + ADL, resolve it).
5386       const Type *Common = nullptr;
5387       for (const auto *D : OE->decls()) {
5388         QualType ReturnType;
5389         if (const auto *FD = llvm::dyn_cast<FunctionDecl>(D))
5390           ReturnType = FD->getReturnType();
5391         else if (const auto *FTD = llvm::dyn_cast<FunctionTemplateDecl>(D))
5392           ReturnType = FTD->getTemplatedDecl()->getReturnType();
5393         if (ReturnType.isNull())
5394           continue;
5395         const Type *Candidate =
5396             ReturnType.getNonReferenceType().getCanonicalType().getTypePtr();
5397         if (Common && Common != Candidate)
5398           return Unresolved; // Multiple candidates.
5399         Common = Candidate;
5400       }
5401       if (Common != nullptr)
5402         return QualType(Common, 0);
5403     }
5404   }
5405   // A dependent member: approximate-resolve the base, then lookup.
5406   if (const auto *CDSME = llvm::dyn_cast<CXXDependentScopeMemberExpr>(E)) {
5407     QualType Base = CDSME->isImplicitAccess()
5408                         ? CDSME->getBaseType()
5409                         : getApproximateType(CDSME->getBase());
5410     if (CDSME->isArrow() && !Base.isNull())
5411       Base = Base->getPointeeType(); // could handle unique_ptr etc here?
5412     RecordDecl *RD = Base.isNull() ? nullptr : getAsRecordDecl(Base);
5413     if (RD && RD->isCompleteDefinition()) {
5414       for (const auto *Member : RD->lookup(CDSME->getMember()))
5415         if (const ValueDecl *VD = llvm::dyn_cast<ValueDecl>(Member))
5416           return VD->getType().getNonReferenceType();
5417     }
5418   }
5419   return Unresolved;
5420 }
5421 
5422 // If \p Base is ParenListExpr, assume a chain of comma operators and pick the
5423 // last expr. We expect other ParenListExprs to be resolved to e.g. constructor
5424 // calls before here. (So the ParenListExpr should be nonempty, but check just
5425 // in case)
5426 Expr *unwrapParenList(Expr *Base) {
5427   if (auto *PLE = llvm::dyn_cast_or_null<ParenListExpr>(Base)) {
5428     if (PLE->getNumExprs() == 0)
5429       return nullptr;
5430     Base = PLE->getExpr(PLE->getNumExprs() - 1);
5431   }
5432   return Base;
5433 }
5434 
5435 } // namespace
5436 
5437 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base,
5438                                            Expr *OtherOpBase,
5439                                            SourceLocation OpLoc, bool IsArrow,
5440                                            bool IsBaseExprStatement,
5441                                            QualType PreferredType) {
5442   Base = unwrapParenList(Base);
5443   OtherOpBase = unwrapParenList(OtherOpBase);
5444   if (!Base || !CodeCompleter)
5445     return;
5446 
5447   ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow);
5448   if (ConvertedBase.isInvalid())
5449     return;
5450   QualType ConvertedBaseType = getApproximateType(ConvertedBase.get());
5451 
5452   enum CodeCompletionContext::Kind contextKind;
5453 
5454   if (IsArrow) {
5455     if (const auto *Ptr = ConvertedBaseType->getAs<PointerType>())
5456       ConvertedBaseType = Ptr->getPointeeType();
5457   }
5458 
5459   if (IsArrow) {
5460     contextKind = CodeCompletionContext::CCC_ArrowMemberAccess;
5461   } else {
5462     if (ConvertedBaseType->isObjCObjectPointerType() ||
5463         ConvertedBaseType->isObjCObjectOrInterfaceType()) {
5464       contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess;
5465     } else {
5466       contextKind = CodeCompletionContext::CCC_DotMemberAccess;
5467     }
5468   }
5469 
5470   CodeCompletionContext CCContext(contextKind, ConvertedBaseType);
5471   CCContext.setPreferredType(PreferredType);
5472   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5473                         CodeCompleter->getCodeCompletionTUInfo(), CCContext,
5474                         &ResultBuilder::IsMember);
5475 
5476   auto DoCompletion = [&](Expr *Base, bool IsArrow,
5477                           Optional<FixItHint> AccessOpFixIt) -> bool {
5478     if (!Base)
5479       return false;
5480 
5481     ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow);
5482     if (ConvertedBase.isInvalid())
5483       return false;
5484     Base = ConvertedBase.get();
5485 
5486     QualType BaseType = getApproximateType(Base);
5487     if (BaseType.isNull())
5488       return false;
5489     ExprValueKind BaseKind = Base->getValueKind();
5490 
5491     if (IsArrow) {
5492       if (const PointerType *Ptr = BaseType->getAs<PointerType>()) {
5493         BaseType = Ptr->getPointeeType();
5494         BaseKind = VK_LValue;
5495       } else if (BaseType->isObjCObjectPointerType() ||
5496                  BaseType->isTemplateTypeParmType()) {
5497         // Both cases (dot/arrow) handled below.
5498       } else {
5499         return false;
5500       }
5501     }
5502 
5503     if (RecordDecl *RD = getAsRecordDecl(BaseType)) {
5504       AddRecordMembersCompletionResults(*this, Results, S, BaseType, BaseKind,
5505                                         RD, std::move(AccessOpFixIt));
5506     } else if (const auto *TTPT =
5507                    dyn_cast<TemplateTypeParmType>(BaseType.getTypePtr())) {
5508       auto Operator =
5509           IsArrow ? ConceptInfo::Member::Arrow : ConceptInfo::Member::Dot;
5510       for (const auto &R : ConceptInfo(*TTPT, S).members()) {
5511         if (R.Operator != Operator)
5512           continue;
5513         CodeCompletionResult Result(
5514             R.render(*this, CodeCompleter->getAllocator(),
5515                      CodeCompleter->getCodeCompletionTUInfo()));
5516         if (AccessOpFixIt)
5517           Result.FixIts.push_back(*AccessOpFixIt);
5518         Results.AddResult(std::move(Result));
5519       }
5520     } else if (!IsArrow && BaseType->isObjCObjectPointerType()) {
5521       // Objective-C property reference. Bail if we're performing fix-it code
5522       // completion since Objective-C properties are normally backed by ivars,
5523       // most Objective-C fix-its here would have little value.
5524       if (AccessOpFixIt.hasValue()) {
5525         return false;
5526       }
5527       AddedPropertiesSet AddedProperties;
5528 
5529       if (const ObjCObjectPointerType *ObjCPtr =
5530               BaseType->getAsObjCInterfacePointerType()) {
5531         // Add property results based on our interface.
5532         assert(ObjCPtr && "Non-NULL pointer guaranteed above!");
5533         AddObjCProperties(CCContext, ObjCPtr->getInterfaceDecl(), true,
5534                           /*AllowNullaryMethods=*/true, CurContext,
5535                           AddedProperties, Results, IsBaseExprStatement);
5536       }
5537 
5538       // Add properties from the protocols in a qualified interface.
5539       for (auto *I : BaseType->castAs<ObjCObjectPointerType>()->quals())
5540         AddObjCProperties(CCContext, I, true, /*AllowNullaryMethods=*/true,
5541                           CurContext, AddedProperties, Results,
5542                           IsBaseExprStatement, /*IsClassProperty*/ false,
5543                           /*InOriginalClass*/ false);
5544     } else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
5545                (!IsArrow && BaseType->isObjCObjectType())) {
5546       // Objective-C instance variable access. Bail if we're performing fix-it
5547       // code completion since Objective-C properties are normally backed by
5548       // ivars, most Objective-C fix-its here would have little value.
5549       if (AccessOpFixIt.hasValue()) {
5550         return false;
5551       }
5552       ObjCInterfaceDecl *Class = nullptr;
5553       if (const ObjCObjectPointerType *ObjCPtr =
5554               BaseType->getAs<ObjCObjectPointerType>())
5555         Class = ObjCPtr->getInterfaceDecl();
5556       else
5557         Class = BaseType->castAs<ObjCObjectType>()->getInterface();
5558 
5559       // Add all ivars from this class and its superclasses.
5560       if (Class) {
5561         CodeCompletionDeclConsumer Consumer(Results, Class, BaseType);
5562         Results.setFilter(&ResultBuilder::IsObjCIvar);
5563         LookupVisibleDecls(
5564             Class, LookupMemberName, Consumer, CodeCompleter->includeGlobals(),
5565             /*IncludeDependentBases=*/false, CodeCompleter->loadExternal());
5566       }
5567     }
5568 
5569     // FIXME: How do we cope with isa?
5570     return true;
5571   };
5572 
5573   Results.EnterNewScope();
5574 
5575   bool CompletionSucceded = DoCompletion(Base, IsArrow, None);
5576   if (CodeCompleter->includeFixIts()) {
5577     const CharSourceRange OpRange =
5578         CharSourceRange::getTokenRange(OpLoc, OpLoc);
5579     CompletionSucceded |= DoCompletion(
5580         OtherOpBase, !IsArrow,
5581         FixItHint::CreateReplacement(OpRange, IsArrow ? "." : "->"));
5582   }
5583 
5584   Results.ExitScope();
5585 
5586   if (!CompletionSucceded)
5587     return;
5588 
5589   // Hand off the results found for code completion.
5590   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5591                             Results.data(), Results.size());
5592 }
5593 
5594 void Sema::CodeCompleteObjCClassPropertyRefExpr(Scope *S,
5595                                                 IdentifierInfo &ClassName,
5596                                                 SourceLocation ClassNameLoc,
5597                                                 bool IsBaseExprStatement) {
5598   IdentifierInfo *ClassNamePtr = &ClassName;
5599   ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(ClassNamePtr, ClassNameLoc);
5600   if (!IFace)
5601     return;
5602   CodeCompletionContext CCContext(
5603       CodeCompletionContext::CCC_ObjCPropertyAccess);
5604   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5605                         CodeCompleter->getCodeCompletionTUInfo(), CCContext,
5606                         &ResultBuilder::IsMember);
5607   Results.EnterNewScope();
5608   AddedPropertiesSet AddedProperties;
5609   AddObjCProperties(CCContext, IFace, true,
5610                     /*AllowNullaryMethods=*/true, CurContext, AddedProperties,
5611                     Results, IsBaseExprStatement,
5612                     /*IsClassProperty=*/true);
5613   Results.ExitScope();
5614   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5615                             Results.data(), Results.size());
5616 }
5617 
5618 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) {
5619   if (!CodeCompleter)
5620     return;
5621 
5622   ResultBuilder::LookupFilter Filter = nullptr;
5623   enum CodeCompletionContext::Kind ContextKind =
5624       CodeCompletionContext::CCC_Other;
5625   switch ((DeclSpec::TST)TagSpec) {
5626   case DeclSpec::TST_enum:
5627     Filter = &ResultBuilder::IsEnum;
5628     ContextKind = CodeCompletionContext::CCC_EnumTag;
5629     break;
5630 
5631   case DeclSpec::TST_union:
5632     Filter = &ResultBuilder::IsUnion;
5633     ContextKind = CodeCompletionContext::CCC_UnionTag;
5634     break;
5635 
5636   case DeclSpec::TST_struct:
5637   case DeclSpec::TST_class:
5638   case DeclSpec::TST_interface:
5639     Filter = &ResultBuilder::IsClassOrStruct;
5640     ContextKind = CodeCompletionContext::CCC_ClassOrStructTag;
5641     break;
5642 
5643   default:
5644     llvm_unreachable("Unknown type specifier kind in CodeCompleteTag");
5645   }
5646 
5647   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5648                         CodeCompleter->getCodeCompletionTUInfo(), ContextKind);
5649   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5650 
5651   // First pass: look for tags.
5652   Results.setFilter(Filter);
5653   LookupVisibleDecls(S, LookupTagName, Consumer,
5654                      CodeCompleter->includeGlobals(),
5655                      CodeCompleter->loadExternal());
5656 
5657   if (CodeCompleter->includeGlobals()) {
5658     // Second pass: look for nested name specifiers.
5659     Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
5660     LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer,
5661                        CodeCompleter->includeGlobals(),
5662                        CodeCompleter->loadExternal());
5663   }
5664 
5665   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5666                             Results.data(), Results.size());
5667 }
5668 
5669 static void AddTypeQualifierResults(DeclSpec &DS, ResultBuilder &Results,
5670                                     const LangOptions &LangOpts) {
5671   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const))
5672     Results.AddResult("const");
5673   if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile))
5674     Results.AddResult("volatile");
5675   if (LangOpts.C99 && !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict))
5676     Results.AddResult("restrict");
5677   if (LangOpts.C11 && !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic))
5678     Results.AddResult("_Atomic");
5679   if (LangOpts.MSVCCompat && !(DS.getTypeQualifiers() & DeclSpec::TQ_unaligned))
5680     Results.AddResult("__unaligned");
5681 }
5682 
5683 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) {
5684   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5685                         CodeCompleter->getCodeCompletionTUInfo(),
5686                         CodeCompletionContext::CCC_TypeQualifiers);
5687   Results.EnterNewScope();
5688   AddTypeQualifierResults(DS, Results, LangOpts);
5689   Results.ExitScope();
5690   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5691                             Results.data(), Results.size());
5692 }
5693 
5694 void Sema::CodeCompleteFunctionQualifiers(DeclSpec &DS, Declarator &D,
5695                                           const VirtSpecifiers *VS) {
5696   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5697                         CodeCompleter->getCodeCompletionTUInfo(),
5698                         CodeCompletionContext::CCC_TypeQualifiers);
5699   Results.EnterNewScope();
5700   AddTypeQualifierResults(DS, Results, LangOpts);
5701   if (LangOpts.CPlusPlus11) {
5702     Results.AddResult("noexcept");
5703     if (D.getContext() == DeclaratorContext::Member && !D.isCtorOrDtor() &&
5704         !D.isStaticMember()) {
5705       if (!VS || !VS->isFinalSpecified())
5706         Results.AddResult("final");
5707       if (!VS || !VS->isOverrideSpecified())
5708         Results.AddResult("override");
5709     }
5710   }
5711   Results.ExitScope();
5712   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5713                             Results.data(), Results.size());
5714 }
5715 
5716 void Sema::CodeCompleteBracketDeclarator(Scope *S) {
5717   CodeCompleteExpression(S, QualType(getASTContext().getSizeType()));
5718 }
5719 
5720 void Sema::CodeCompleteCase(Scope *S) {
5721   if (getCurFunction()->SwitchStack.empty() || !CodeCompleter)
5722     return;
5723 
5724   SwitchStmt *Switch = getCurFunction()->SwitchStack.back().getPointer();
5725   // Condition expression might be invalid, do not continue in this case.
5726   if (!Switch->getCond())
5727     return;
5728   QualType type = Switch->getCond()->IgnoreImplicit()->getType();
5729   if (!type->isEnumeralType()) {
5730     CodeCompleteExpressionData Data(type);
5731     Data.IntegralConstantExpression = true;
5732     CodeCompleteExpression(S, Data);
5733     return;
5734   }
5735 
5736   // Code-complete the cases of a switch statement over an enumeration type
5737   // by providing the list of
5738   EnumDecl *Enum = type->castAs<EnumType>()->getDecl();
5739   if (EnumDecl *Def = Enum->getDefinition())
5740     Enum = Def;
5741 
5742   // Determine which enumerators we have already seen in the switch statement.
5743   // FIXME: Ideally, we would also be able to look *past* the code-completion
5744   // token, in case we are code-completing in the middle of the switch and not
5745   // at the end. However, we aren't able to do so at the moment.
5746   CoveredEnumerators Enumerators;
5747   for (SwitchCase *SC = Switch->getSwitchCaseList(); SC;
5748        SC = SC->getNextSwitchCase()) {
5749     CaseStmt *Case = dyn_cast<CaseStmt>(SC);
5750     if (!Case)
5751       continue;
5752 
5753     Expr *CaseVal = Case->getLHS()->IgnoreParenCasts();
5754     if (auto *DRE = dyn_cast<DeclRefExpr>(CaseVal))
5755       if (auto *Enumerator =
5756               dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
5757         // We look into the AST of the case statement to determine which
5758         // enumerator was named. Alternatively, we could compute the value of
5759         // the integral constant expression, then compare it against the
5760         // values of each enumerator. However, value-based approach would not
5761         // work as well with C++ templates where enumerators declared within a
5762         // template are type- and value-dependent.
5763         Enumerators.Seen.insert(Enumerator);
5764 
5765         // If this is a qualified-id, keep track of the nested-name-specifier
5766         // so that we can reproduce it as part of code completion, e.g.,
5767         //
5768         //   switch (TagD.getKind()) {
5769         //     case TagDecl::TK_enum:
5770         //       break;
5771         //     case XXX
5772         //
5773         // At the XXX, our completions are TagDecl::TK_union,
5774         // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union,
5775         // TK_struct, and TK_class.
5776         Enumerators.SuggestedQualifier = DRE->getQualifier();
5777       }
5778   }
5779 
5780   // Add any enumerators that have not yet been mentioned.
5781   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5782                         CodeCompleter->getCodeCompletionTUInfo(),
5783                         CodeCompletionContext::CCC_Expression);
5784   AddEnumerators(Results, Context, Enum, CurContext, Enumerators);
5785 
5786   if (CodeCompleter->includeMacros()) {
5787     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
5788   }
5789   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5790                             Results.data(), Results.size());
5791 }
5792 
5793 static bool anyNullArguments(ArrayRef<Expr *> Args) {
5794   if (Args.size() && !Args.data())
5795     return true;
5796 
5797   for (unsigned I = 0; I != Args.size(); ++I)
5798     if (!Args[I])
5799       return true;
5800 
5801   return false;
5802 }
5803 
5804 typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate;
5805 
5806 static void mergeCandidatesWithResults(
5807     Sema &SemaRef, SmallVectorImpl<ResultCandidate> &Results,
5808     OverloadCandidateSet &CandidateSet, SourceLocation Loc, size_t ArgSize) {
5809   // Sort the overload candidate set by placing the best overloads first.
5810   llvm::stable_sort(CandidateSet, [&](const OverloadCandidate &X,
5811                                       const OverloadCandidate &Y) {
5812     return isBetterOverloadCandidate(SemaRef, X, Y, Loc,
5813                                      CandidateSet.getKind());
5814   });
5815 
5816   // Add the remaining viable overload candidates as code-completion results.
5817   for (OverloadCandidate &Candidate : CandidateSet) {
5818     if (Candidate.Function) {
5819       if (Candidate.Function->isDeleted())
5820         continue;
5821       if (shouldEnforceArgLimit(/*PartialOverloading=*/true,
5822                                 Candidate.Function) &&
5823           Candidate.Function->getNumParams() <= ArgSize &&
5824           // Having zero args is annoying, normally we don't surface a function
5825           // with 2 params, if you already have 2 params, because you are
5826           // inserting the 3rd now. But with zero, it helps the user to figure
5827           // out there are no overloads that take any arguments. Hence we are
5828           // keeping the overload.
5829           ArgSize > 0)
5830         continue;
5831     }
5832     if (Candidate.Viable)
5833       Results.push_back(ResultCandidate(Candidate.Function));
5834   }
5835 }
5836 
5837 /// Get the type of the Nth parameter from a given set of overload
5838 /// candidates.
5839 static QualType getParamType(Sema &SemaRef,
5840                              ArrayRef<ResultCandidate> Candidates, unsigned N) {
5841 
5842   // Given the overloads 'Candidates' for a function call matching all arguments
5843   // up to N, return the type of the Nth parameter if it is the same for all
5844   // overload candidates.
5845   QualType ParamType;
5846   for (auto &Candidate : Candidates) {
5847     if (const auto *FType = Candidate.getFunctionType())
5848       if (const auto *Proto = dyn_cast<FunctionProtoType>(FType))
5849         if (N < Proto->getNumParams()) {
5850           if (ParamType.isNull())
5851             ParamType = Proto->getParamType(N);
5852           else if (!SemaRef.Context.hasSameUnqualifiedType(
5853                        ParamType.getNonReferenceType(),
5854                        Proto->getParamType(N).getNonReferenceType()))
5855             // Otherwise return a default-constructed QualType.
5856             return QualType();
5857         }
5858   }
5859 
5860   return ParamType;
5861 }
5862 
5863 static QualType
5864 ProduceSignatureHelp(Sema &SemaRef, Scope *S,
5865                      MutableArrayRef<ResultCandidate> Candidates,
5866                      unsigned CurrentArg, SourceLocation OpenParLoc) {
5867   if (Candidates.empty())
5868     return QualType();
5869   if (SemaRef.getPreprocessor().isCodeCompletionReached())
5870     SemaRef.CodeCompleter->ProcessOverloadCandidates(
5871         SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc);
5872   return getParamType(SemaRef, Candidates, CurrentArg);
5873 }
5874 
5875 QualType Sema::ProduceCallSignatureHelp(Scope *S, Expr *Fn,
5876                                         ArrayRef<Expr *> Args,
5877                                         SourceLocation OpenParLoc) {
5878   Fn = unwrapParenList(Fn);
5879   if (!CodeCompleter || !Fn)
5880     return QualType();
5881 
5882   // FIXME: Provide support for variadic template functions.
5883   // Ignore type-dependent call expressions entirely.
5884   if (Fn->isTypeDependent() || anyNullArguments(Args))
5885     return QualType();
5886   // In presence of dependent args we surface all possible signatures using the
5887   // non-dependent args in the prefix. Afterwards we do a post filtering to make
5888   // sure provided candidates satisfy parameter count restrictions.
5889   auto ArgsWithoutDependentTypes =
5890       Args.take_while([](Expr *Arg) { return !Arg->isTypeDependent(); });
5891 
5892   SmallVector<ResultCandidate, 8> Results;
5893 
5894   Expr *NakedFn = Fn->IgnoreParenCasts();
5895   // Build an overload candidate set based on the functions we find.
5896   SourceLocation Loc = Fn->getExprLoc();
5897   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
5898 
5899   if (auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) {
5900     AddOverloadedCallCandidates(ULE, ArgsWithoutDependentTypes, CandidateSet,
5901                                 /*PartialOverloading=*/true);
5902   } else if (auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) {
5903     TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr;
5904     if (UME->hasExplicitTemplateArgs()) {
5905       UME->copyTemplateArgumentsInto(TemplateArgsBuffer);
5906       TemplateArgs = &TemplateArgsBuffer;
5907     }
5908 
5909     // Add the base as first argument (use a nullptr if the base is implicit).
5910     SmallVector<Expr *, 12> ArgExprs(
5911         1, UME->isImplicitAccess() ? nullptr : UME->getBase());
5912     ArgExprs.append(ArgsWithoutDependentTypes.begin(),
5913                     ArgsWithoutDependentTypes.end());
5914     UnresolvedSet<8> Decls;
5915     Decls.append(UME->decls_begin(), UME->decls_end());
5916     const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase();
5917     AddFunctionCandidates(Decls, ArgExprs, CandidateSet, TemplateArgs,
5918                           /*SuppressUserConversions=*/false,
5919                           /*PartialOverloading=*/true, FirstArgumentIsBase);
5920   } else {
5921     FunctionDecl *FD = nullptr;
5922     if (auto *MCE = dyn_cast<MemberExpr>(NakedFn))
5923       FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl());
5924     else if (auto *DRE = dyn_cast<DeclRefExpr>(NakedFn))
5925       FD = dyn_cast<FunctionDecl>(DRE->getDecl());
5926     if (FD) { // We check whether it's a resolved function declaration.
5927       if (!getLangOpts().CPlusPlus ||
5928           !FD->getType()->getAs<FunctionProtoType>())
5929         Results.push_back(ResultCandidate(FD));
5930       else
5931         AddOverloadCandidate(FD, DeclAccessPair::make(FD, FD->getAccess()),
5932                              ArgsWithoutDependentTypes, CandidateSet,
5933                              /*SuppressUserConversions=*/false,
5934                              /*PartialOverloading=*/true);
5935 
5936     } else if (auto DC = NakedFn->getType()->getAsCXXRecordDecl()) {
5937       // If expression's type is CXXRecordDecl, it may overload the function
5938       // call operator, so we check if it does and add them as candidates.
5939       // A complete type is needed to lookup for member function call operators.
5940       if (isCompleteType(Loc, NakedFn->getType())) {
5941         DeclarationName OpName =
5942             Context.DeclarationNames.getCXXOperatorName(OO_Call);
5943         LookupResult R(*this, OpName, Loc, LookupOrdinaryName);
5944         LookupQualifiedName(R, DC);
5945         R.suppressDiagnostics();
5946         SmallVector<Expr *, 12> ArgExprs(1, NakedFn);
5947         ArgExprs.append(ArgsWithoutDependentTypes.begin(),
5948                         ArgsWithoutDependentTypes.end());
5949         AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs, CandidateSet,
5950                               /*ExplicitArgs=*/nullptr,
5951                               /*SuppressUserConversions=*/false,
5952                               /*PartialOverloading=*/true);
5953       }
5954     } else {
5955       // Lastly we check whether expression's type is function pointer or
5956       // function.
5957       QualType T = NakedFn->getType();
5958       if (!T->getPointeeType().isNull())
5959         T = T->getPointeeType();
5960 
5961       if (auto FP = T->getAs<FunctionProtoType>()) {
5962         if (!TooManyArguments(FP->getNumParams(),
5963                               ArgsWithoutDependentTypes.size(),
5964                               /*PartialOverloading=*/true) ||
5965             FP->isVariadic())
5966           Results.push_back(ResultCandidate(FP));
5967       } else if (auto FT = T->getAs<FunctionType>())
5968         // No prototype and declaration, it may be a K & R style function.
5969         Results.push_back(ResultCandidate(FT));
5970     }
5971   }
5972   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc, Args.size());
5973   QualType ParamType =
5974       ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc);
5975   return !CandidateSet.empty() ? ParamType : QualType();
5976 }
5977 
5978 QualType Sema::ProduceConstructorSignatureHelp(Scope *S, QualType Type,
5979                                                SourceLocation Loc,
5980                                                ArrayRef<Expr *> Args,
5981                                                SourceLocation OpenParLoc) {
5982   if (!CodeCompleter)
5983     return QualType();
5984 
5985   // A complete type is needed to lookup for constructors.
5986   CXXRecordDecl *RD =
5987       isCompleteType(Loc, Type) ? Type->getAsCXXRecordDecl() : nullptr;
5988   if (!RD)
5989     return Type;
5990 
5991   // FIXME: Provide support for member initializers.
5992   // FIXME: Provide support for variadic template constructors.
5993 
5994   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
5995 
5996   for (NamedDecl *C : LookupConstructors(RD)) {
5997     if (auto *FD = dyn_cast<FunctionDecl>(C)) {
5998       AddOverloadCandidate(FD, DeclAccessPair::make(FD, C->getAccess()), Args,
5999                            CandidateSet,
6000                            /*SuppressUserConversions=*/false,
6001                            /*PartialOverloading=*/true,
6002                            /*AllowExplicit*/ true);
6003     } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(C)) {
6004       AddTemplateOverloadCandidate(
6005           FTD, DeclAccessPair::make(FTD, C->getAccess()),
6006           /*ExplicitTemplateArgs=*/nullptr, Args, CandidateSet,
6007           /*SuppressUserConversions=*/false,
6008           /*PartialOverloading=*/true);
6009     }
6010   }
6011 
6012   SmallVector<ResultCandidate, 8> Results;
6013   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc, Args.size());
6014   return ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc);
6015 }
6016 
6017 QualType Sema::ProduceCtorInitMemberSignatureHelp(
6018     Scope *S, Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy,
6019     ArrayRef<Expr *> ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc) {
6020   if (!CodeCompleter)
6021     return QualType();
6022 
6023   CXXConstructorDecl *Constructor =
6024       dyn_cast<CXXConstructorDecl>(ConstructorDecl);
6025   if (!Constructor)
6026     return QualType();
6027   // FIXME: Add support for Base class constructors as well.
6028   if (ValueDecl *MemberDecl = tryLookupCtorInitMemberDecl(
6029           Constructor->getParent(), SS, TemplateTypeTy, II))
6030     return ProduceConstructorSignatureHelp(getCurScope(), MemberDecl->getType(),
6031                                            MemberDecl->getLocation(), ArgExprs,
6032                                            OpenParLoc);
6033   return QualType();
6034 }
6035 
6036 static QualType getDesignatedType(QualType BaseType, const Designation &Desig) {
6037   for (unsigned I = 0; I < Desig.getNumDesignators(); ++I) {
6038     if (BaseType.isNull())
6039       break;
6040     QualType NextType;
6041     const auto &D = Desig.getDesignator(I);
6042     if (D.isArrayDesignator() || D.isArrayRangeDesignator()) {
6043       if (BaseType->isArrayType())
6044         NextType = BaseType->getAsArrayTypeUnsafe()->getElementType();
6045     } else {
6046       assert(D.isFieldDesignator());
6047       auto *RD = getAsRecordDecl(BaseType);
6048       if (RD && RD->isCompleteDefinition()) {
6049         for (const auto *Member : RD->lookup(D.getField()))
6050           if (const FieldDecl *FD = llvm::dyn_cast<FieldDecl>(Member)) {
6051             NextType = FD->getType();
6052             break;
6053           }
6054       }
6055     }
6056     BaseType = NextType;
6057   }
6058   return BaseType;
6059 }
6060 
6061 void Sema::CodeCompleteDesignator(QualType BaseType,
6062                                   llvm::ArrayRef<Expr *> InitExprs,
6063                                   const Designation &D) {
6064   BaseType = getDesignatedType(BaseType, D);
6065   if (BaseType.isNull())
6066     return;
6067   const auto *RD = getAsRecordDecl(BaseType);
6068   if (!RD || RD->fields().empty())
6069     return;
6070 
6071   CodeCompletionContext CCC(CodeCompletionContext::CCC_DotMemberAccess,
6072                             BaseType);
6073   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6074                         CodeCompleter->getCodeCompletionTUInfo(), CCC);
6075 
6076   Results.EnterNewScope();
6077   for (const auto *FD : RD->fields()) {
6078     // FIXME: Make use of previous designators to mark any fields before those
6079     // inaccessible, and also compute the next initializer priority.
6080     ResultBuilder::Result Result(FD, Results.getBasePriority(FD));
6081     Results.AddResult(Result, CurContext, /*Hiding=*/nullptr);
6082   }
6083   Results.ExitScope();
6084   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6085                             Results.data(), Results.size());
6086 }
6087 
6088 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) {
6089   ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
6090   if (!VD) {
6091     CodeCompleteOrdinaryName(S, PCC_Expression);
6092     return;
6093   }
6094 
6095   CodeCompleteExpressionData Data;
6096   Data.PreferredType = VD->getType();
6097   // Ignore VD to avoid completing the variable itself, e.g. in 'int foo = ^'.
6098   Data.IgnoreDecls.push_back(VD);
6099 
6100   CodeCompleteExpression(S, Data);
6101 }
6102 
6103 void Sema::CodeCompleteAfterIf(Scope *S, bool IsBracedThen) {
6104   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6105                         CodeCompleter->getCodeCompletionTUInfo(),
6106                         mapCodeCompletionContext(*this, PCC_Statement));
6107   Results.setFilter(&ResultBuilder::IsOrdinaryName);
6108   Results.EnterNewScope();
6109 
6110   CodeCompletionDeclConsumer Consumer(Results, CurContext);
6111   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6112                      CodeCompleter->includeGlobals(),
6113                      CodeCompleter->loadExternal());
6114 
6115   AddOrdinaryNameResults(PCC_Statement, S, *this, Results);
6116 
6117   // "else" block
6118   CodeCompletionBuilder Builder(Results.getAllocator(),
6119                                 Results.getCodeCompletionTUInfo());
6120 
6121   auto AddElseBodyPattern = [&] {
6122     if (IsBracedThen) {
6123       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6124       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6125       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6126       Builder.AddPlaceholderChunk("statements");
6127       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6128       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6129     } else {
6130       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
6131       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6132       Builder.AddPlaceholderChunk("statement");
6133       Builder.AddChunk(CodeCompletionString::CK_SemiColon);
6134     }
6135   };
6136   Builder.AddTypedTextChunk("else");
6137   if (Results.includeCodePatterns())
6138     AddElseBodyPattern();
6139   Results.AddResult(Builder.TakeString());
6140 
6141   // "else if" block
6142   Builder.AddTypedTextChunk("else if");
6143   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6144   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6145   if (getLangOpts().CPlusPlus)
6146     Builder.AddPlaceholderChunk("condition");
6147   else
6148     Builder.AddPlaceholderChunk("expression");
6149   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6150   if (Results.includeCodePatterns()) {
6151     AddElseBodyPattern();
6152   }
6153   Results.AddResult(Builder.TakeString());
6154 
6155   Results.ExitScope();
6156 
6157   if (S->getFnParent())
6158     AddPrettyFunctionResults(getLangOpts(), Results);
6159 
6160   if (CodeCompleter->includeMacros())
6161     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
6162 
6163   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6164                             Results.data(), Results.size());
6165 }
6166 
6167 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
6168                                    bool EnteringContext,
6169                                    bool IsUsingDeclaration, QualType BaseType,
6170                                    QualType PreferredType) {
6171   if (SS.isEmpty() || !CodeCompleter)
6172     return;
6173 
6174   CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol, PreferredType);
6175   CC.setIsUsingDeclaration(IsUsingDeclaration);
6176   CC.setCXXScopeSpecifier(SS);
6177 
6178   // We want to keep the scope specifier even if it's invalid (e.g. the scope
6179   // "a::b::" is not corresponding to any context/namespace in the AST), since
6180   // it can be useful for global code completion which have information about
6181   // contexts/symbols that are not in the AST.
6182   if (SS.isInvalid()) {
6183     // As SS is invalid, we try to collect accessible contexts from the current
6184     // scope with a dummy lookup so that the completion consumer can try to
6185     // guess what the specified scope is.
6186     ResultBuilder DummyResults(*this, CodeCompleter->getAllocator(),
6187                                CodeCompleter->getCodeCompletionTUInfo(), CC);
6188     if (!PreferredType.isNull())
6189       DummyResults.setPreferredType(PreferredType);
6190     if (S->getEntity()) {
6191       CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(),
6192                                           BaseType);
6193       LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6194                          /*IncludeGlobalScope=*/false,
6195                          /*LoadExternal=*/false);
6196     }
6197     HandleCodeCompleteResults(this, CodeCompleter,
6198                               DummyResults.getCompletionContext(), nullptr, 0);
6199     return;
6200   }
6201   // Always pretend to enter a context to ensure that a dependent type
6202   // resolves to a dependent record.
6203   DeclContext *Ctx = computeDeclContext(SS, /*EnteringContext=*/true);
6204 
6205   // Try to instantiate any non-dependent declaration contexts before
6206   // we look in them. Bail out if we fail.
6207   NestedNameSpecifier *NNS = SS.getScopeRep();
6208   if (NNS != nullptr && SS.isValid() && !NNS->isDependent()) {
6209     if (Ctx == nullptr || RequireCompleteDeclContext(SS, Ctx))
6210       return;
6211   }
6212 
6213   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6214                         CodeCompleter->getCodeCompletionTUInfo(), CC);
6215   if (!PreferredType.isNull())
6216     Results.setPreferredType(PreferredType);
6217   Results.EnterNewScope();
6218 
6219   // The "template" keyword can follow "::" in the grammar, but only
6220   // put it into the grammar if the nested-name-specifier is dependent.
6221   // FIXME: results is always empty, this appears to be dead.
6222   if (!Results.empty() && NNS->isDependent())
6223     Results.AddResult("template");
6224 
6225   // If the scope is a concept-constrained type parameter, infer nested
6226   // members based on the constraints.
6227   if (const auto *TTPT =
6228           dyn_cast_or_null<TemplateTypeParmType>(NNS->getAsType())) {
6229     for (const auto &R : ConceptInfo(*TTPT, S).members()) {
6230       if (R.Operator != ConceptInfo::Member::Colons)
6231         continue;
6232       Results.AddResult(CodeCompletionResult(
6233           R.render(*this, CodeCompleter->getAllocator(),
6234                    CodeCompleter->getCodeCompletionTUInfo())));
6235     }
6236   }
6237 
6238   // Add calls to overridden virtual functions, if there are any.
6239   //
6240   // FIXME: This isn't wonderful, because we don't know whether we're actually
6241   // in a context that permits expressions. This is a general issue with
6242   // qualified-id completions.
6243   if (Ctx && !EnteringContext)
6244     MaybeAddOverrideCalls(*this, Ctx, Results);
6245   Results.ExitScope();
6246 
6247   if (Ctx &&
6248       (CodeCompleter->includeNamespaceLevelDecls() || !Ctx->isFileContext())) {
6249     CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType);
6250     LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer,
6251                        /*IncludeGlobalScope=*/true,
6252                        /*IncludeDependentBases=*/true,
6253                        CodeCompleter->loadExternal());
6254   }
6255 
6256   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6257                             Results.data(), Results.size());
6258 }
6259 
6260 void Sema::CodeCompleteUsing(Scope *S) {
6261   if (!CodeCompleter)
6262     return;
6263 
6264   // This can be both a using alias or using declaration, in the former we
6265   // expect a new name and a symbol in the latter case.
6266   CodeCompletionContext Context(CodeCompletionContext::CCC_SymbolOrNewName);
6267   Context.setIsUsingDeclaration(true);
6268 
6269   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6270                         CodeCompleter->getCodeCompletionTUInfo(), Context,
6271                         &ResultBuilder::IsNestedNameSpecifier);
6272   Results.EnterNewScope();
6273 
6274   // If we aren't in class scope, we could see the "namespace" keyword.
6275   if (!S->isClassScope())
6276     Results.AddResult(CodeCompletionResult("namespace"));
6277 
6278   // After "using", we can see anything that would start a
6279   // nested-name-specifier.
6280   CodeCompletionDeclConsumer Consumer(Results, CurContext);
6281   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6282                      CodeCompleter->includeGlobals(),
6283                      CodeCompleter->loadExternal());
6284   Results.ExitScope();
6285 
6286   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6287                             Results.data(), Results.size());
6288 }
6289 
6290 void Sema::CodeCompleteUsingDirective(Scope *S) {
6291   if (!CodeCompleter)
6292     return;
6293 
6294   // After "using namespace", we expect to see a namespace name or namespace
6295   // alias.
6296   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6297                         CodeCompleter->getCodeCompletionTUInfo(),
6298                         CodeCompletionContext::CCC_Namespace,
6299                         &ResultBuilder::IsNamespaceOrAlias);
6300   Results.EnterNewScope();
6301   CodeCompletionDeclConsumer Consumer(Results, CurContext);
6302   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6303                      CodeCompleter->includeGlobals(),
6304                      CodeCompleter->loadExternal());
6305   Results.ExitScope();
6306   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6307                             Results.data(), Results.size());
6308 }
6309 
6310 void Sema::CodeCompleteNamespaceDecl(Scope *S) {
6311   if (!CodeCompleter)
6312     return;
6313 
6314   DeclContext *Ctx = S->getEntity();
6315   if (!S->getParent())
6316     Ctx = Context.getTranslationUnitDecl();
6317 
6318   bool SuppressedGlobalResults =
6319       Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
6320 
6321   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6322                         CodeCompleter->getCodeCompletionTUInfo(),
6323                         SuppressedGlobalResults
6324                             ? CodeCompletionContext::CCC_Namespace
6325                             : CodeCompletionContext::CCC_Other,
6326                         &ResultBuilder::IsNamespace);
6327 
6328   if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
6329     // We only want to see those namespaces that have already been defined
6330     // within this scope, because its likely that the user is creating an
6331     // extended namespace declaration. Keep track of the most recent
6332     // definition of each namespace.
6333     std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
6334     for (DeclContext::specific_decl_iterator<NamespaceDecl>
6335              NS(Ctx->decls_begin()),
6336          NSEnd(Ctx->decls_end());
6337          NS != NSEnd; ++NS)
6338       OrigToLatest[NS->getOriginalNamespace()] = *NS;
6339 
6340     // Add the most recent definition (or extended definition) of each
6341     // namespace to the list of results.
6342     Results.EnterNewScope();
6343     for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
6344              NS = OrigToLatest.begin(),
6345              NSEnd = OrigToLatest.end();
6346          NS != NSEnd; ++NS)
6347       Results.AddResult(
6348           CodeCompletionResult(NS->second, Results.getBasePriority(NS->second),
6349                                nullptr),
6350           CurContext, nullptr, false);
6351     Results.ExitScope();
6352   }
6353 
6354   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6355                             Results.data(), Results.size());
6356 }
6357 
6358 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S) {
6359   if (!CodeCompleter)
6360     return;
6361 
6362   // After "namespace", we expect to see a namespace or alias.
6363   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6364                         CodeCompleter->getCodeCompletionTUInfo(),
6365                         CodeCompletionContext::CCC_Namespace,
6366                         &ResultBuilder::IsNamespaceOrAlias);
6367   CodeCompletionDeclConsumer Consumer(Results, CurContext);
6368   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6369                      CodeCompleter->includeGlobals(),
6370                      CodeCompleter->loadExternal());
6371   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6372                             Results.data(), Results.size());
6373 }
6374 
6375 void Sema::CodeCompleteOperatorName(Scope *S) {
6376   if (!CodeCompleter)
6377     return;
6378 
6379   typedef CodeCompletionResult Result;
6380   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6381                         CodeCompleter->getCodeCompletionTUInfo(),
6382                         CodeCompletionContext::CCC_Type,
6383                         &ResultBuilder::IsType);
6384   Results.EnterNewScope();
6385 
6386   // Add the names of overloadable operators. Note that OO_Conditional is not
6387   // actually overloadable.
6388 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
6389   if (OO_##Name != OO_Conditional)                                             \
6390     Results.AddResult(Result(Spelling));
6391 #include "clang/Basic/OperatorKinds.def"
6392 
6393   // Add any type names visible from the current scope
6394   Results.allowNestedNameSpecifiers();
6395   CodeCompletionDeclConsumer Consumer(Results, CurContext);
6396   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6397                      CodeCompleter->includeGlobals(),
6398                      CodeCompleter->loadExternal());
6399 
6400   // Add any type specifiers
6401   AddTypeSpecifierResults(getLangOpts(), Results);
6402   Results.ExitScope();
6403 
6404   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6405                             Results.data(), Results.size());
6406 }
6407 
6408 void Sema::CodeCompleteConstructorInitializer(
6409     Decl *ConstructorD, ArrayRef<CXXCtorInitializer *> Initializers) {
6410   if (!ConstructorD)
6411     return;
6412 
6413   AdjustDeclIfTemplate(ConstructorD);
6414 
6415   auto *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD);
6416   if (!Constructor)
6417     return;
6418 
6419   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6420                         CodeCompleter->getCodeCompletionTUInfo(),
6421                         CodeCompletionContext::CCC_Symbol);
6422   Results.EnterNewScope();
6423 
6424   // Fill in any already-initialized fields or base classes.
6425   llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
6426   llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
6427   for (unsigned I = 0, E = Initializers.size(); I != E; ++I) {
6428     if (Initializers[I]->isBaseInitializer())
6429       InitializedBases.insert(Context.getCanonicalType(
6430           QualType(Initializers[I]->getBaseClass(), 0)));
6431     else
6432       InitializedFields.insert(
6433           cast<FieldDecl>(Initializers[I]->getAnyMember()));
6434   }
6435 
6436   // Add completions for base classes.
6437   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
6438   bool SawLastInitializer = Initializers.empty();
6439   CXXRecordDecl *ClassDecl = Constructor->getParent();
6440 
6441   auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) {
6442     CodeCompletionBuilder Builder(Results.getAllocator(),
6443                                   Results.getCodeCompletionTUInfo());
6444     Builder.AddTypedTextChunk(Name);
6445     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6446     if (const auto *Function = dyn_cast<FunctionDecl>(ND))
6447       AddFunctionParameterChunks(PP, Policy, Function, Builder);
6448     else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND))
6449       AddFunctionParameterChunks(PP, Policy, FunTemplDecl->getTemplatedDecl(),
6450                                  Builder);
6451     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6452     return Builder.TakeString();
6453   };
6454   auto AddDefaultCtorInit = [&](const char *Name, const char *Type,
6455                                 const NamedDecl *ND) {
6456     CodeCompletionBuilder Builder(Results.getAllocator(),
6457                                   Results.getCodeCompletionTUInfo());
6458     Builder.AddTypedTextChunk(Name);
6459     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6460     Builder.AddPlaceholderChunk(Type);
6461     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6462     if (ND) {
6463       auto CCR = CodeCompletionResult(
6464           Builder.TakeString(), ND,
6465           SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration);
6466       if (isa<FieldDecl>(ND))
6467         CCR.CursorKind = CXCursor_MemberRef;
6468       return Results.AddResult(CCR);
6469     }
6470     return Results.AddResult(CodeCompletionResult(
6471         Builder.TakeString(),
6472         SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration));
6473   };
6474   auto AddCtorsWithName = [&](const CXXRecordDecl *RD, unsigned int Priority,
6475                               const char *Name, const FieldDecl *FD) {
6476     if (!RD)
6477       return AddDefaultCtorInit(Name,
6478                                 FD ? Results.getAllocator().CopyString(
6479                                          FD->getType().getAsString(Policy))
6480                                    : Name,
6481                                 FD);
6482     auto Ctors = getConstructors(Context, RD);
6483     if (Ctors.begin() == Ctors.end())
6484       return AddDefaultCtorInit(Name, Name, RD);
6485     for (const NamedDecl *Ctor : Ctors) {
6486       auto CCR = CodeCompletionResult(GenerateCCS(Ctor, Name), RD, Priority);
6487       CCR.CursorKind = getCursorKindForDecl(Ctor);
6488       Results.AddResult(CCR);
6489     }
6490   };
6491   auto AddBase = [&](const CXXBaseSpecifier &Base) {
6492     const char *BaseName =
6493         Results.getAllocator().CopyString(Base.getType().getAsString(Policy));
6494     const auto *RD = Base.getType()->getAsCXXRecordDecl();
6495     AddCtorsWithName(
6496         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
6497         BaseName, nullptr);
6498   };
6499   auto AddField = [&](const FieldDecl *FD) {
6500     const char *FieldName =
6501         Results.getAllocator().CopyString(FD->getIdentifier()->getName());
6502     const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl();
6503     AddCtorsWithName(
6504         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
6505         FieldName, FD);
6506   };
6507 
6508   for (const auto &Base : ClassDecl->bases()) {
6509     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
6510              .second) {
6511       SawLastInitializer =
6512           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
6513           Context.hasSameUnqualifiedType(
6514               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
6515       continue;
6516     }
6517 
6518     AddBase(Base);
6519     SawLastInitializer = false;
6520   }
6521 
6522   // Add completions for virtual base classes.
6523   for (const auto &Base : ClassDecl->vbases()) {
6524     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
6525              .second) {
6526       SawLastInitializer =
6527           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
6528           Context.hasSameUnqualifiedType(
6529               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
6530       continue;
6531     }
6532 
6533     AddBase(Base);
6534     SawLastInitializer = false;
6535   }
6536 
6537   // Add completions for members.
6538   for (auto *Field : ClassDecl->fields()) {
6539     if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))
6540              .second) {
6541       SawLastInitializer = !Initializers.empty() &&
6542                            Initializers.back()->isAnyMemberInitializer() &&
6543                            Initializers.back()->getAnyMember() == Field;
6544       continue;
6545     }
6546 
6547     if (!Field->getDeclName())
6548       continue;
6549 
6550     AddField(Field);
6551     SawLastInitializer = false;
6552   }
6553   Results.ExitScope();
6554 
6555   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6556                             Results.data(), Results.size());
6557 }
6558 
6559 /// Determine whether this scope denotes a namespace.
6560 static bool isNamespaceScope(Scope *S) {
6561   DeclContext *DC = S->getEntity();
6562   if (!DC)
6563     return false;
6564 
6565   return DC->isFileContext();
6566 }
6567 
6568 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro,
6569                                         bool AfterAmpersand) {
6570   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6571                         CodeCompleter->getCodeCompletionTUInfo(),
6572                         CodeCompletionContext::CCC_Other);
6573   Results.EnterNewScope();
6574 
6575   // Note what has already been captured.
6576   llvm::SmallPtrSet<IdentifierInfo *, 4> Known;
6577   bool IncludedThis = false;
6578   for (const auto &C : Intro.Captures) {
6579     if (C.Kind == LCK_This) {
6580       IncludedThis = true;
6581       continue;
6582     }
6583 
6584     Known.insert(C.Id);
6585   }
6586 
6587   // Look for other capturable variables.
6588   for (; S && !isNamespaceScope(S); S = S->getParent()) {
6589     for (const auto *D : S->decls()) {
6590       const auto *Var = dyn_cast<VarDecl>(D);
6591       if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>())
6592         continue;
6593 
6594       if (Known.insert(Var->getIdentifier()).second)
6595         Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration),
6596                           CurContext, nullptr, false);
6597     }
6598   }
6599 
6600   // Add 'this', if it would be valid.
6601   if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy)
6602     addThisCompletion(*this, Results);
6603 
6604   Results.ExitScope();
6605 
6606   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6607                             Results.data(), Results.size());
6608 }
6609 
6610 void Sema::CodeCompleteAfterFunctionEquals(Declarator &D) {
6611   if (!LangOpts.CPlusPlus11)
6612     return;
6613   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6614                         CodeCompleter->getCodeCompletionTUInfo(),
6615                         CodeCompletionContext::CCC_Other);
6616   auto ShouldAddDefault = [&D, this]() {
6617     if (!D.isFunctionDeclarator())
6618       return false;
6619     auto &Id = D.getName();
6620     if (Id.getKind() == UnqualifiedIdKind::IK_DestructorName)
6621       return true;
6622     // FIXME(liuhui): Ideally, we should check the constructor parameter list to
6623     // verify that it is the default, copy or move constructor?
6624     if (Id.getKind() == UnqualifiedIdKind::IK_ConstructorName &&
6625         D.getFunctionTypeInfo().NumParams <= 1)
6626       return true;
6627     if (Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId) {
6628       auto Op = Id.OperatorFunctionId.Operator;
6629       // FIXME(liuhui): Ideally, we should check the function parameter list to
6630       // verify that it is the copy or move assignment?
6631       if (Op == OverloadedOperatorKind::OO_Equal)
6632         return true;
6633       if (LangOpts.CPlusPlus20 &&
6634           (Op == OverloadedOperatorKind::OO_EqualEqual ||
6635            Op == OverloadedOperatorKind::OO_ExclaimEqual ||
6636            Op == OverloadedOperatorKind::OO_Less ||
6637            Op == OverloadedOperatorKind::OO_LessEqual ||
6638            Op == OverloadedOperatorKind::OO_Greater ||
6639            Op == OverloadedOperatorKind::OO_GreaterEqual ||
6640            Op == OverloadedOperatorKind::OO_Spaceship))
6641         return true;
6642     }
6643     return false;
6644   };
6645 
6646   Results.EnterNewScope();
6647   if (ShouldAddDefault())
6648     Results.AddResult("default");
6649   // FIXME(liuhui): Ideally, we should only provide `delete` completion for the
6650   // first function declaration.
6651   Results.AddResult("delete");
6652   Results.ExitScope();
6653   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6654                             Results.data(), Results.size());
6655 }
6656 
6657 /// Macro that optionally prepends an "@" to the string literal passed in via
6658 /// Keyword, depending on whether NeedAt is true or false.
6659 #define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword)
6660 
6661 static void AddObjCImplementationResults(const LangOptions &LangOpts,
6662                                          ResultBuilder &Results, bool NeedAt) {
6663   typedef CodeCompletionResult Result;
6664   // Since we have an implementation, we can end it.
6665   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
6666 
6667   CodeCompletionBuilder Builder(Results.getAllocator(),
6668                                 Results.getCodeCompletionTUInfo());
6669   if (LangOpts.ObjC) {
6670     // @dynamic
6671     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "dynamic"));
6672     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6673     Builder.AddPlaceholderChunk("property");
6674     Results.AddResult(Result(Builder.TakeString()));
6675 
6676     // @synthesize
6677     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synthesize"));
6678     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6679     Builder.AddPlaceholderChunk("property");
6680     Results.AddResult(Result(Builder.TakeString()));
6681   }
6682 }
6683 
6684 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
6685                                     ResultBuilder &Results, bool NeedAt) {
6686   typedef CodeCompletionResult Result;
6687 
6688   // Since we have an interface or protocol, we can end it.
6689   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
6690 
6691   if (LangOpts.ObjC) {
6692     // @property
6693     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "property")));
6694 
6695     // @required
6696     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "required")));
6697 
6698     // @optional
6699     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "optional")));
6700   }
6701 }
6702 
6703 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
6704   typedef CodeCompletionResult Result;
6705   CodeCompletionBuilder Builder(Results.getAllocator(),
6706                                 Results.getCodeCompletionTUInfo());
6707 
6708   // @class name ;
6709   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "class"));
6710   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6711   Builder.AddPlaceholderChunk("name");
6712   Results.AddResult(Result(Builder.TakeString()));
6713 
6714   if (Results.includeCodePatterns()) {
6715     // @interface name
6716     // FIXME: Could introduce the whole pattern, including superclasses and
6717     // such.
6718     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "interface"));
6719     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6720     Builder.AddPlaceholderChunk("class");
6721     Results.AddResult(Result(Builder.TakeString()));
6722 
6723     // @protocol name
6724     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
6725     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6726     Builder.AddPlaceholderChunk("protocol");
6727     Results.AddResult(Result(Builder.TakeString()));
6728 
6729     // @implementation name
6730     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "implementation"));
6731     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6732     Builder.AddPlaceholderChunk("class");
6733     Results.AddResult(Result(Builder.TakeString()));
6734   }
6735 
6736   // @compatibility_alias name
6737   Builder.AddTypedTextChunk(
6738       OBJC_AT_KEYWORD_NAME(NeedAt, "compatibility_alias"));
6739   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6740   Builder.AddPlaceholderChunk("alias");
6741   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6742   Builder.AddPlaceholderChunk("class");
6743   Results.AddResult(Result(Builder.TakeString()));
6744 
6745   if (Results.getSema().getLangOpts().Modules) {
6746     // @import name
6747     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import"));
6748     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6749     Builder.AddPlaceholderChunk("module");
6750     Results.AddResult(Result(Builder.TakeString()));
6751   }
6752 }
6753 
6754 void Sema::CodeCompleteObjCAtDirective(Scope *S) {
6755   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6756                         CodeCompleter->getCodeCompletionTUInfo(),
6757                         CodeCompletionContext::CCC_Other);
6758   Results.EnterNewScope();
6759   if (isa<ObjCImplDecl>(CurContext))
6760     AddObjCImplementationResults(getLangOpts(), Results, false);
6761   else if (CurContext->isObjCContainer())
6762     AddObjCInterfaceResults(getLangOpts(), Results, false);
6763   else
6764     AddObjCTopLevelResults(Results, false);
6765   Results.ExitScope();
6766   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6767                             Results.data(), Results.size());
6768 }
6769 
6770 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
6771   typedef CodeCompletionResult Result;
6772   CodeCompletionBuilder Builder(Results.getAllocator(),
6773                                 Results.getCodeCompletionTUInfo());
6774 
6775   // @encode ( type-name )
6776   const char *EncodeType = "char[]";
6777   if (Results.getSema().getLangOpts().CPlusPlus ||
6778       Results.getSema().getLangOpts().ConstStrings)
6779     EncodeType = "const char[]";
6780   Builder.AddResultTypeChunk(EncodeType);
6781   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "encode"));
6782   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6783   Builder.AddPlaceholderChunk("type-name");
6784   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6785   Results.AddResult(Result(Builder.TakeString()));
6786 
6787   // @protocol ( protocol-name )
6788   Builder.AddResultTypeChunk("Protocol *");
6789   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
6790   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6791   Builder.AddPlaceholderChunk("protocol-name");
6792   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6793   Results.AddResult(Result(Builder.TakeString()));
6794 
6795   // @selector ( selector )
6796   Builder.AddResultTypeChunk("SEL");
6797   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "selector"));
6798   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6799   Builder.AddPlaceholderChunk("selector");
6800   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6801   Results.AddResult(Result(Builder.TakeString()));
6802 
6803   // @"string"
6804   Builder.AddResultTypeChunk("NSString *");
6805   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "\""));
6806   Builder.AddPlaceholderChunk("string");
6807   Builder.AddTextChunk("\"");
6808   Results.AddResult(Result(Builder.TakeString()));
6809 
6810   // @[objects, ...]
6811   Builder.AddResultTypeChunk("NSArray *");
6812   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "["));
6813   Builder.AddPlaceholderChunk("objects, ...");
6814   Builder.AddChunk(CodeCompletionString::CK_RightBracket);
6815   Results.AddResult(Result(Builder.TakeString()));
6816 
6817   // @{key : object, ...}
6818   Builder.AddResultTypeChunk("NSDictionary *");
6819   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "{"));
6820   Builder.AddPlaceholderChunk("key");
6821   Builder.AddChunk(CodeCompletionString::CK_Colon);
6822   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6823   Builder.AddPlaceholderChunk("object, ...");
6824   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6825   Results.AddResult(Result(Builder.TakeString()));
6826 
6827   // @(expression)
6828   Builder.AddResultTypeChunk("id");
6829   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "("));
6830   Builder.AddPlaceholderChunk("expression");
6831   Builder.AddChunk(CodeCompletionString::CK_RightParen);
6832   Results.AddResult(Result(Builder.TakeString()));
6833 }
6834 
6835 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
6836   typedef CodeCompletionResult Result;
6837   CodeCompletionBuilder Builder(Results.getAllocator(),
6838                                 Results.getCodeCompletionTUInfo());
6839 
6840   if (Results.includeCodePatterns()) {
6841     // @try { statements } @catch ( declaration ) { statements } @finally
6842     //   { statements }
6843     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "try"));
6844     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6845     Builder.AddPlaceholderChunk("statements");
6846     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6847     Builder.AddTextChunk("@catch");
6848     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6849     Builder.AddPlaceholderChunk("parameter");
6850     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6851     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6852     Builder.AddPlaceholderChunk("statements");
6853     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6854     Builder.AddTextChunk("@finally");
6855     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6856     Builder.AddPlaceholderChunk("statements");
6857     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6858     Results.AddResult(Result(Builder.TakeString()));
6859   }
6860 
6861   // @throw
6862   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "throw"));
6863   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6864   Builder.AddPlaceholderChunk("expression");
6865   Results.AddResult(Result(Builder.TakeString()));
6866 
6867   if (Results.includeCodePatterns()) {
6868     // @synchronized ( expression ) { statements }
6869     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synchronized"));
6870     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6871     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6872     Builder.AddPlaceholderChunk("expression");
6873     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6874     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6875     Builder.AddPlaceholderChunk("statements");
6876     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6877     Results.AddResult(Result(Builder.TakeString()));
6878   }
6879 }
6880 
6881 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
6882                                      ResultBuilder &Results, bool NeedAt) {
6883   typedef CodeCompletionResult Result;
6884   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "private")));
6885   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "protected")));
6886   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "public")));
6887   if (LangOpts.ObjC)
6888     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "package")));
6889 }
6890 
6891 void Sema::CodeCompleteObjCAtVisibility(Scope *S) {
6892   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6893                         CodeCompleter->getCodeCompletionTUInfo(),
6894                         CodeCompletionContext::CCC_Other);
6895   Results.EnterNewScope();
6896   AddObjCVisibilityResults(getLangOpts(), Results, false);
6897   Results.ExitScope();
6898   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6899                             Results.data(), Results.size());
6900 }
6901 
6902 void Sema::CodeCompleteObjCAtStatement(Scope *S) {
6903   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6904                         CodeCompleter->getCodeCompletionTUInfo(),
6905                         CodeCompletionContext::CCC_Other);
6906   Results.EnterNewScope();
6907   AddObjCStatementResults(Results, false);
6908   AddObjCExpressionResults(Results, false);
6909   Results.ExitScope();
6910   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6911                             Results.data(), Results.size());
6912 }
6913 
6914 void Sema::CodeCompleteObjCAtExpression(Scope *S) {
6915   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6916                         CodeCompleter->getCodeCompletionTUInfo(),
6917                         CodeCompletionContext::CCC_Other);
6918   Results.EnterNewScope();
6919   AddObjCExpressionResults(Results, false);
6920   Results.ExitScope();
6921   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6922                             Results.data(), Results.size());
6923 }
6924 
6925 /// Determine whether the addition of the given flag to an Objective-C
6926 /// property's attributes will cause a conflict.
6927 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
6928   // Check if we've already added this flag.
6929   if (Attributes & NewFlag)
6930     return true;
6931 
6932   Attributes |= NewFlag;
6933 
6934   // Check for collisions with "readonly".
6935   if ((Attributes & ObjCPropertyAttribute::kind_readonly) &&
6936       (Attributes & ObjCPropertyAttribute::kind_readwrite))
6937     return true;
6938 
6939   // Check for more than one of { assign, copy, retain, strong, weak }.
6940   unsigned AssignCopyRetMask =
6941       Attributes &
6942       (ObjCPropertyAttribute::kind_assign |
6943        ObjCPropertyAttribute::kind_unsafe_unretained |
6944        ObjCPropertyAttribute::kind_copy | ObjCPropertyAttribute::kind_retain |
6945        ObjCPropertyAttribute::kind_strong | ObjCPropertyAttribute::kind_weak);
6946   if (AssignCopyRetMask &&
6947       AssignCopyRetMask != ObjCPropertyAttribute::kind_assign &&
6948       AssignCopyRetMask != ObjCPropertyAttribute::kind_unsafe_unretained &&
6949       AssignCopyRetMask != ObjCPropertyAttribute::kind_copy &&
6950       AssignCopyRetMask != ObjCPropertyAttribute::kind_retain &&
6951       AssignCopyRetMask != ObjCPropertyAttribute::kind_strong &&
6952       AssignCopyRetMask != ObjCPropertyAttribute::kind_weak)
6953     return true;
6954 
6955   return false;
6956 }
6957 
6958 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
6959   if (!CodeCompleter)
6960     return;
6961 
6962   unsigned Attributes = ODS.getPropertyAttributes();
6963 
6964   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6965                         CodeCompleter->getCodeCompletionTUInfo(),
6966                         CodeCompletionContext::CCC_Other);
6967   Results.EnterNewScope();
6968   if (!ObjCPropertyFlagConflicts(Attributes,
6969                                  ObjCPropertyAttribute::kind_readonly))
6970     Results.AddResult(CodeCompletionResult("readonly"));
6971   if (!ObjCPropertyFlagConflicts(Attributes,
6972                                  ObjCPropertyAttribute::kind_assign))
6973     Results.AddResult(CodeCompletionResult("assign"));
6974   if (!ObjCPropertyFlagConflicts(Attributes,
6975                                  ObjCPropertyAttribute::kind_unsafe_unretained))
6976     Results.AddResult(CodeCompletionResult("unsafe_unretained"));
6977   if (!ObjCPropertyFlagConflicts(Attributes,
6978                                  ObjCPropertyAttribute::kind_readwrite))
6979     Results.AddResult(CodeCompletionResult("readwrite"));
6980   if (!ObjCPropertyFlagConflicts(Attributes,
6981                                  ObjCPropertyAttribute::kind_retain))
6982     Results.AddResult(CodeCompletionResult("retain"));
6983   if (!ObjCPropertyFlagConflicts(Attributes,
6984                                  ObjCPropertyAttribute::kind_strong))
6985     Results.AddResult(CodeCompletionResult("strong"));
6986   if (!ObjCPropertyFlagConflicts(Attributes, ObjCPropertyAttribute::kind_copy))
6987     Results.AddResult(CodeCompletionResult("copy"));
6988   if (!ObjCPropertyFlagConflicts(Attributes,
6989                                  ObjCPropertyAttribute::kind_nonatomic))
6990     Results.AddResult(CodeCompletionResult("nonatomic"));
6991   if (!ObjCPropertyFlagConflicts(Attributes,
6992                                  ObjCPropertyAttribute::kind_atomic))
6993     Results.AddResult(CodeCompletionResult("atomic"));
6994 
6995   // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC.
6996   if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC)
6997     if (!ObjCPropertyFlagConflicts(Attributes,
6998                                    ObjCPropertyAttribute::kind_weak))
6999       Results.AddResult(CodeCompletionResult("weak"));
7000 
7001   if (!ObjCPropertyFlagConflicts(Attributes,
7002                                  ObjCPropertyAttribute::kind_setter)) {
7003     CodeCompletionBuilder Setter(Results.getAllocator(),
7004                                  Results.getCodeCompletionTUInfo());
7005     Setter.AddTypedTextChunk("setter");
7006     Setter.AddTextChunk("=");
7007     Setter.AddPlaceholderChunk("method");
7008     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
7009   }
7010   if (!ObjCPropertyFlagConflicts(Attributes,
7011                                  ObjCPropertyAttribute::kind_getter)) {
7012     CodeCompletionBuilder Getter(Results.getAllocator(),
7013                                  Results.getCodeCompletionTUInfo());
7014     Getter.AddTypedTextChunk("getter");
7015     Getter.AddTextChunk("=");
7016     Getter.AddPlaceholderChunk("method");
7017     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
7018   }
7019   if (!ObjCPropertyFlagConflicts(Attributes,
7020                                  ObjCPropertyAttribute::kind_nullability)) {
7021     Results.AddResult(CodeCompletionResult("nonnull"));
7022     Results.AddResult(CodeCompletionResult("nullable"));
7023     Results.AddResult(CodeCompletionResult("null_unspecified"));
7024     Results.AddResult(CodeCompletionResult("null_resettable"));
7025   }
7026   Results.ExitScope();
7027   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7028                             Results.data(), Results.size());
7029 }
7030 
7031 /// Describes the kind of Objective-C method that we want to find
7032 /// via code completion.
7033 enum ObjCMethodKind {
7034   MK_Any, ///< Any kind of method, provided it means other specified criteria.
7035   MK_ZeroArgSelector, ///< Zero-argument (unary) selector.
7036   MK_OneArgSelector   ///< One-argument selector.
7037 };
7038 
7039 static bool isAcceptableObjCSelector(Selector Sel, ObjCMethodKind WantKind,
7040                                      ArrayRef<IdentifierInfo *> SelIdents,
7041                                      bool AllowSameLength = true) {
7042   unsigned NumSelIdents = SelIdents.size();
7043   if (NumSelIdents > Sel.getNumArgs())
7044     return false;
7045 
7046   switch (WantKind) {
7047   case MK_Any:
7048     break;
7049   case MK_ZeroArgSelector:
7050     return Sel.isUnarySelector();
7051   case MK_OneArgSelector:
7052     return Sel.getNumArgs() == 1;
7053   }
7054 
7055   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
7056     return false;
7057 
7058   for (unsigned I = 0; I != NumSelIdents; ++I)
7059     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
7060       return false;
7061 
7062   return true;
7063 }
7064 
7065 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
7066                                    ObjCMethodKind WantKind,
7067                                    ArrayRef<IdentifierInfo *> SelIdents,
7068                                    bool AllowSameLength = true) {
7069   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
7070                                   AllowSameLength);
7071 }
7072 
7073 /// A set of selectors, which is used to avoid introducing multiple
7074 /// completions with the same selector into the result set.
7075 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
7076 
7077 /// Add all of the Objective-C methods in the given Objective-C
7078 /// container to the set of results.
7079 ///
7080 /// The container will be a class, protocol, category, or implementation of
7081 /// any of the above. This mether will recurse to include methods from
7082 /// the superclasses of classes along with their categories, protocols, and
7083 /// implementations.
7084 ///
7085 /// \param Container the container in which we'll look to find methods.
7086 ///
7087 /// \param WantInstanceMethods Whether to add instance methods (only); if
7088 /// false, this routine will add factory methods (only).
7089 ///
7090 /// \param CurContext the context in which we're performing the lookup that
7091 /// finds methods.
7092 ///
7093 /// \param AllowSameLength Whether we allow a method to be added to the list
7094 /// when it has the same number of parameters as we have selector identifiers.
7095 ///
7096 /// \param Results the structure into which we'll add results.
7097 static void AddObjCMethods(ObjCContainerDecl *Container,
7098                            bool WantInstanceMethods, ObjCMethodKind WantKind,
7099                            ArrayRef<IdentifierInfo *> SelIdents,
7100                            DeclContext *CurContext,
7101                            VisitedSelectorSet &Selectors, bool AllowSameLength,
7102                            ResultBuilder &Results, bool InOriginalClass = true,
7103                            bool IsRootClass = false) {
7104   typedef CodeCompletionResult Result;
7105   Container = getContainerDef(Container);
7106   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
7107   IsRootClass = IsRootClass || (IFace && !IFace->getSuperClass());
7108   for (ObjCMethodDecl *M : Container->methods()) {
7109     // The instance methods on the root class can be messaged via the
7110     // metaclass.
7111     if (M->isInstanceMethod() == WantInstanceMethods ||
7112         (IsRootClass && !WantInstanceMethods)) {
7113       // Check whether the selector identifiers we've been given are a
7114       // subset of the identifiers for this particular method.
7115       if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength))
7116         continue;
7117 
7118       if (!Selectors.insert(M->getSelector()).second)
7119         continue;
7120 
7121       Result R = Result(M, Results.getBasePriority(M), nullptr);
7122       R.StartParameter = SelIdents.size();
7123       R.AllParametersAreInformative = (WantKind != MK_Any);
7124       if (!InOriginalClass)
7125         setInBaseClass(R);
7126       Results.MaybeAddResult(R, CurContext);
7127     }
7128   }
7129 
7130   // Visit the protocols of protocols.
7131   if (const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
7132     if (Protocol->hasDefinition()) {
7133       const ObjCList<ObjCProtocolDecl> &Protocols =
7134           Protocol->getReferencedProtocols();
7135       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7136                                                 E = Protocols.end();
7137            I != E; ++I)
7138         AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
7139                        Selectors, AllowSameLength, Results, false, IsRootClass);
7140     }
7141   }
7142 
7143   if (!IFace || !IFace->hasDefinition())
7144     return;
7145 
7146   // Add methods in protocols.
7147   for (ObjCProtocolDecl *I : IFace->protocols())
7148     AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext,
7149                    Selectors, AllowSameLength, Results, false, IsRootClass);
7150 
7151   // Add methods in categories.
7152   for (ObjCCategoryDecl *CatDecl : IFace->known_categories()) {
7153     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
7154                    CurContext, Selectors, AllowSameLength, Results,
7155                    InOriginalClass, IsRootClass);
7156 
7157     // Add a categories protocol methods.
7158     const ObjCList<ObjCProtocolDecl> &Protocols =
7159         CatDecl->getReferencedProtocols();
7160     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7161                                               E = Protocols.end();
7162          I != E; ++I)
7163       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
7164                      Selectors, AllowSameLength, Results, false, IsRootClass);
7165 
7166     // Add methods in category implementations.
7167     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
7168       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
7169                      Selectors, AllowSameLength, Results, InOriginalClass,
7170                      IsRootClass);
7171   }
7172 
7173   // Add methods in superclass.
7174   // Avoid passing in IsRootClass since root classes won't have super classes.
7175   if (IFace->getSuperClass())
7176     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
7177                    SelIdents, CurContext, Selectors, AllowSameLength, Results,
7178                    /*IsRootClass=*/false);
7179 
7180   // Add methods in our implementation, if any.
7181   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
7182     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
7183                    Selectors, AllowSameLength, Results, InOriginalClass,
7184                    IsRootClass);
7185 }
7186 
7187 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) {
7188   // Try to find the interface where getters might live.
7189   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
7190   if (!Class) {
7191     if (ObjCCategoryDecl *Category =
7192             dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
7193       Class = Category->getClassInterface();
7194 
7195     if (!Class)
7196       return;
7197   }
7198 
7199   // Find all of the potential getters.
7200   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7201                         CodeCompleter->getCodeCompletionTUInfo(),
7202                         CodeCompletionContext::CCC_Other);
7203   Results.EnterNewScope();
7204 
7205   VisitedSelectorSet Selectors;
7206   AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors,
7207                  /*AllowSameLength=*/true, Results);
7208   Results.ExitScope();
7209   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7210                             Results.data(), Results.size());
7211 }
7212 
7213 void Sema::CodeCompleteObjCPropertySetter(Scope *S) {
7214   // Try to find the interface where setters might live.
7215   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
7216   if (!Class) {
7217     if (ObjCCategoryDecl *Category =
7218             dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
7219       Class = Category->getClassInterface();
7220 
7221     if (!Class)
7222       return;
7223   }
7224 
7225   // Find all of the potential getters.
7226   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7227                         CodeCompleter->getCodeCompletionTUInfo(),
7228                         CodeCompletionContext::CCC_Other);
7229   Results.EnterNewScope();
7230 
7231   VisitedSelectorSet Selectors;
7232   AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext, Selectors,
7233                  /*AllowSameLength=*/true, Results);
7234 
7235   Results.ExitScope();
7236   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7237                             Results.data(), Results.size());
7238 }
7239 
7240 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
7241                                        bool IsParameter) {
7242   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7243                         CodeCompleter->getCodeCompletionTUInfo(),
7244                         CodeCompletionContext::CCC_Type);
7245   Results.EnterNewScope();
7246 
7247   // Add context-sensitive, Objective-C parameter-passing keywords.
7248   bool AddedInOut = false;
7249   if ((DS.getObjCDeclQualifier() &
7250        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
7251     Results.AddResult("in");
7252     Results.AddResult("inout");
7253     AddedInOut = true;
7254   }
7255   if ((DS.getObjCDeclQualifier() &
7256        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
7257     Results.AddResult("out");
7258     if (!AddedInOut)
7259       Results.AddResult("inout");
7260   }
7261   if ((DS.getObjCDeclQualifier() &
7262        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
7263         ObjCDeclSpec::DQ_Oneway)) == 0) {
7264     Results.AddResult("bycopy");
7265     Results.AddResult("byref");
7266     Results.AddResult("oneway");
7267   }
7268   if ((DS.getObjCDeclQualifier() & ObjCDeclSpec::DQ_CSNullability) == 0) {
7269     Results.AddResult("nonnull");
7270     Results.AddResult("nullable");
7271     Results.AddResult("null_unspecified");
7272   }
7273 
7274   // If we're completing the return type of an Objective-C method and the
7275   // identifier IBAction refers to a macro, provide a completion item for
7276   // an action, e.g.,
7277   //   IBAction)<#selector#>:(id)sender
7278   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
7279       PP.isMacroDefined("IBAction")) {
7280     CodeCompletionBuilder Builder(Results.getAllocator(),
7281                                   Results.getCodeCompletionTUInfo(),
7282                                   CCP_CodePattern, CXAvailability_Available);
7283     Builder.AddTypedTextChunk("IBAction");
7284     Builder.AddChunk(CodeCompletionString::CK_RightParen);
7285     Builder.AddPlaceholderChunk("selector");
7286     Builder.AddChunk(CodeCompletionString::CK_Colon);
7287     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7288     Builder.AddTextChunk("id");
7289     Builder.AddChunk(CodeCompletionString::CK_RightParen);
7290     Builder.AddTextChunk("sender");
7291     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
7292   }
7293 
7294   // If we're completing the return type, provide 'instancetype'.
7295   if (!IsParameter) {
7296     Results.AddResult(CodeCompletionResult("instancetype"));
7297   }
7298 
7299   // Add various builtin type names and specifiers.
7300   AddOrdinaryNameResults(PCC_Type, S, *this, Results);
7301   Results.ExitScope();
7302 
7303   // Add the various type names
7304   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
7305   CodeCompletionDeclConsumer Consumer(Results, CurContext);
7306   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
7307                      CodeCompleter->includeGlobals(),
7308                      CodeCompleter->loadExternal());
7309 
7310   if (CodeCompleter->includeMacros())
7311     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
7312 
7313   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7314                             Results.data(), Results.size());
7315 }
7316 
7317 /// When we have an expression with type "id", we may assume
7318 /// that it has some more-specific class type based on knowledge of
7319 /// common uses of Objective-C. This routine returns that class type,
7320 /// or NULL if no better result could be determined.
7321 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
7322   auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
7323   if (!Msg)
7324     return nullptr;
7325 
7326   Selector Sel = Msg->getSelector();
7327   if (Sel.isNull())
7328     return nullptr;
7329 
7330   IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
7331   if (!Id)
7332     return nullptr;
7333 
7334   ObjCMethodDecl *Method = Msg->getMethodDecl();
7335   if (!Method)
7336     return nullptr;
7337 
7338   // Determine the class that we're sending the message to.
7339   ObjCInterfaceDecl *IFace = nullptr;
7340   switch (Msg->getReceiverKind()) {
7341   case ObjCMessageExpr::Class:
7342     if (const ObjCObjectType *ObjType =
7343             Msg->getClassReceiver()->getAs<ObjCObjectType>())
7344       IFace = ObjType->getInterface();
7345     break;
7346 
7347   case ObjCMessageExpr::Instance: {
7348     QualType T = Msg->getInstanceReceiver()->getType();
7349     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
7350       IFace = Ptr->getInterfaceDecl();
7351     break;
7352   }
7353 
7354   case ObjCMessageExpr::SuperInstance:
7355   case ObjCMessageExpr::SuperClass:
7356     break;
7357   }
7358 
7359   if (!IFace)
7360     return nullptr;
7361 
7362   ObjCInterfaceDecl *Super = IFace->getSuperClass();
7363   if (Method->isInstanceMethod())
7364     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
7365         .Case("retain", IFace)
7366         .Case("strong", IFace)
7367         .Case("autorelease", IFace)
7368         .Case("copy", IFace)
7369         .Case("copyWithZone", IFace)
7370         .Case("mutableCopy", IFace)
7371         .Case("mutableCopyWithZone", IFace)
7372         .Case("awakeFromCoder", IFace)
7373         .Case("replacementObjectFromCoder", IFace)
7374         .Case("class", IFace)
7375         .Case("classForCoder", IFace)
7376         .Case("superclass", Super)
7377         .Default(nullptr);
7378 
7379   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
7380       .Case("new", IFace)
7381       .Case("alloc", IFace)
7382       .Case("allocWithZone", IFace)
7383       .Case("class", IFace)
7384       .Case("superclass", Super)
7385       .Default(nullptr);
7386 }
7387 
7388 // Add a special completion for a message send to "super", which fills in the
7389 // most likely case of forwarding all of our arguments to the superclass
7390 // function.
7391 ///
7392 /// \param S The semantic analysis object.
7393 ///
7394 /// \param NeedSuperKeyword Whether we need to prefix this completion with
7395 /// the "super" keyword. Otherwise, we just need to provide the arguments.
7396 ///
7397 /// \param SelIdents The identifiers in the selector that have already been
7398 /// provided as arguments for a send to "super".
7399 ///
7400 /// \param Results The set of results to augment.
7401 ///
7402 /// \returns the Objective-C method declaration that would be invoked by
7403 /// this "super" completion. If NULL, no completion was added.
7404 static ObjCMethodDecl *
7405 AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,
7406                        ArrayRef<IdentifierInfo *> SelIdents,
7407                        ResultBuilder &Results) {
7408   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
7409   if (!CurMethod)
7410     return nullptr;
7411 
7412   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
7413   if (!Class)
7414     return nullptr;
7415 
7416   // Try to find a superclass method with the same selector.
7417   ObjCMethodDecl *SuperMethod = nullptr;
7418   while ((Class = Class->getSuperClass()) && !SuperMethod) {
7419     // Check in the class
7420     SuperMethod = Class->getMethod(CurMethod->getSelector(),
7421                                    CurMethod->isInstanceMethod());
7422 
7423     // Check in categories or class extensions.
7424     if (!SuperMethod) {
7425       for (const auto *Cat : Class->known_categories()) {
7426         if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(),
7427                                           CurMethod->isInstanceMethod())))
7428           break;
7429       }
7430     }
7431   }
7432 
7433   if (!SuperMethod)
7434     return nullptr;
7435 
7436   // Check whether the superclass method has the same signature.
7437   if (CurMethod->param_size() != SuperMethod->param_size() ||
7438       CurMethod->isVariadic() != SuperMethod->isVariadic())
7439     return nullptr;
7440 
7441   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
7442                                       CurPEnd = CurMethod->param_end(),
7443                                       SuperP = SuperMethod->param_begin();
7444        CurP != CurPEnd; ++CurP, ++SuperP) {
7445     // Make sure the parameter types are compatible.
7446     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
7447                                           (*SuperP)->getType()))
7448       return nullptr;
7449 
7450     // Make sure we have a parameter name to forward!
7451     if (!(*CurP)->getIdentifier())
7452       return nullptr;
7453   }
7454 
7455   // We have a superclass method. Now, form the send-to-super completion.
7456   CodeCompletionBuilder Builder(Results.getAllocator(),
7457                                 Results.getCodeCompletionTUInfo());
7458 
7459   // Give this completion a return type.
7460   AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod,
7461                      Results.getCompletionContext().getBaseType(), Builder);
7462 
7463   // If we need the "super" keyword, add it (plus some spacing).
7464   if (NeedSuperKeyword) {
7465     Builder.AddTypedTextChunk("super");
7466     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7467   }
7468 
7469   Selector Sel = CurMethod->getSelector();
7470   if (Sel.isUnarySelector()) {
7471     if (NeedSuperKeyword)
7472       Builder.AddTextChunk(
7473           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
7474     else
7475       Builder.AddTypedTextChunk(
7476           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
7477   } else {
7478     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
7479     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
7480       if (I > SelIdents.size())
7481         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7482 
7483       if (I < SelIdents.size())
7484         Builder.AddInformativeChunk(
7485             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
7486       else if (NeedSuperKeyword || I > SelIdents.size()) {
7487         Builder.AddTextChunk(
7488             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
7489         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
7490             (*CurP)->getIdentifier()->getName()));
7491       } else {
7492         Builder.AddTypedTextChunk(
7493             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
7494         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
7495             (*CurP)->getIdentifier()->getName()));
7496       }
7497     }
7498   }
7499 
7500   Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod,
7501                                          CCP_SuperCompletion));
7502   return SuperMethod;
7503 }
7504 
7505 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {
7506   typedef CodeCompletionResult Result;
7507   ResultBuilder Results(
7508       *this, CodeCompleter->getAllocator(),
7509       CodeCompleter->getCodeCompletionTUInfo(),
7510       CodeCompletionContext::CCC_ObjCMessageReceiver,
7511       getLangOpts().CPlusPlus11
7512           ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
7513           : &ResultBuilder::IsObjCMessageReceiver);
7514 
7515   CodeCompletionDeclConsumer Consumer(Results, CurContext);
7516   Results.EnterNewScope();
7517   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
7518                      CodeCompleter->includeGlobals(),
7519                      CodeCompleter->loadExternal());
7520 
7521   // If we are in an Objective-C method inside a class that has a superclass,
7522   // add "super" as an option.
7523   if (ObjCMethodDecl *Method = getCurMethodDecl())
7524     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
7525       if (Iface->getSuperClass()) {
7526         Results.AddResult(Result("super"));
7527 
7528         AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results);
7529       }
7530 
7531   if (getLangOpts().CPlusPlus11)
7532     addThisCompletion(*this, Results);
7533 
7534   Results.ExitScope();
7535 
7536   if (CodeCompleter->includeMacros())
7537     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
7538   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7539                             Results.data(), Results.size());
7540 }
7541 
7542 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
7543                                         ArrayRef<IdentifierInfo *> SelIdents,
7544                                         bool AtArgumentExpression) {
7545   ObjCInterfaceDecl *CDecl = nullptr;
7546   if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
7547     // Figure out which interface we're in.
7548     CDecl = CurMethod->getClassInterface();
7549     if (!CDecl)
7550       return;
7551 
7552     // Find the superclass of this class.
7553     CDecl = CDecl->getSuperClass();
7554     if (!CDecl)
7555       return;
7556 
7557     if (CurMethod->isInstanceMethod()) {
7558       // We are inside an instance method, which means that the message
7559       // send [super ...] is actually calling an instance method on the
7560       // current object.
7561       return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents,
7562                                              AtArgumentExpression, CDecl);
7563     }
7564 
7565     // Fall through to send to the superclass in CDecl.
7566   } else {
7567     // "super" may be the name of a type or variable. Figure out which
7568     // it is.
7569     IdentifierInfo *Super = getSuperIdentifier();
7570     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, LookupOrdinaryName);
7571     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
7572       // "super" names an interface. Use it.
7573     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
7574       if (const ObjCObjectType *Iface =
7575               Context.getTypeDeclType(TD)->getAs<ObjCObjectType>())
7576         CDecl = Iface->getInterface();
7577     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
7578       // "super" names an unresolved type; we can't be more specific.
7579     } else {
7580       // Assume that "super" names some kind of value and parse that way.
7581       CXXScopeSpec SS;
7582       SourceLocation TemplateKWLoc;
7583       UnqualifiedId id;
7584       id.setIdentifier(Super, SuperLoc);
7585       ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id,
7586                                                /*HasTrailingLParen=*/false,
7587                                                /*IsAddressOfOperand=*/false);
7588       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
7589                                              SelIdents, AtArgumentExpression);
7590     }
7591 
7592     // Fall through
7593   }
7594 
7595   ParsedType Receiver;
7596   if (CDecl)
7597     Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));
7598   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
7599                                       AtArgumentExpression,
7600                                       /*IsSuper=*/true);
7601 }
7602 
7603 /// Given a set of code-completion results for the argument of a message
7604 /// send, determine the preferred type (if any) for that argument expression.
7605 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
7606                                                        unsigned NumSelIdents) {
7607   typedef CodeCompletionResult Result;
7608   ASTContext &Context = Results.getSema().Context;
7609 
7610   QualType PreferredType;
7611   unsigned BestPriority = CCP_Unlikely * 2;
7612   Result *ResultsData = Results.data();
7613   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
7614     Result &R = ResultsData[I];
7615     if (R.Kind == Result::RK_Declaration &&
7616         isa<ObjCMethodDecl>(R.Declaration)) {
7617       if (R.Priority <= BestPriority) {
7618         const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
7619         if (NumSelIdents <= Method->param_size()) {
7620           QualType MyPreferredType =
7621               Method->parameters()[NumSelIdents - 1]->getType();
7622           if (R.Priority < BestPriority || PreferredType.isNull()) {
7623             BestPriority = R.Priority;
7624             PreferredType = MyPreferredType;
7625           } else if (!Context.hasSameUnqualifiedType(PreferredType,
7626                                                      MyPreferredType)) {
7627             PreferredType = QualType();
7628           }
7629         }
7630       }
7631     }
7632   }
7633 
7634   return PreferredType;
7635 }
7636 
7637 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
7638                                        ParsedType Receiver,
7639                                        ArrayRef<IdentifierInfo *> SelIdents,
7640                                        bool AtArgumentExpression, bool IsSuper,
7641                                        ResultBuilder &Results) {
7642   typedef CodeCompletionResult Result;
7643   ObjCInterfaceDecl *CDecl = nullptr;
7644 
7645   // If the given name refers to an interface type, retrieve the
7646   // corresponding declaration.
7647   if (Receiver) {
7648     QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr);
7649     if (!T.isNull())
7650       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
7651         CDecl = Interface->getInterface();
7652   }
7653 
7654   // Add all of the factory methods in this Objective-C class, its protocols,
7655   // superclasses, categories, implementation, etc.
7656   Results.EnterNewScope();
7657 
7658   // If this is a send-to-super, try to add the special "super" send
7659   // completion.
7660   if (IsSuper) {
7661     if (ObjCMethodDecl *SuperMethod =
7662             AddSuperSendCompletion(SemaRef, false, SelIdents, Results))
7663       Results.Ignore(SuperMethod);
7664   }
7665 
7666   // If we're inside an Objective-C method definition, prefer its selector to
7667   // others.
7668   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
7669     Results.setPreferredSelector(CurMethod->getSelector());
7670 
7671   VisitedSelectorSet Selectors;
7672   if (CDecl)
7673     AddObjCMethods(CDecl, false, MK_Any, SelIdents, SemaRef.CurContext,
7674                    Selectors, AtArgumentExpression, Results);
7675   else {
7676     // We're messaging "id" as a type; provide all class/factory methods.
7677 
7678     // If we have an external source, load the entire class method
7679     // pool from the AST file.
7680     if (SemaRef.getExternalSource()) {
7681       for (uint32_t I = 0,
7682                     N = SemaRef.getExternalSource()->GetNumExternalSelectors();
7683            I != N; ++I) {
7684         Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I);
7685         if (Sel.isNull() || SemaRef.MethodPool.count(Sel))
7686           continue;
7687 
7688         SemaRef.ReadMethodPool(Sel);
7689       }
7690     }
7691 
7692     for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(),
7693                                           MEnd = SemaRef.MethodPool.end();
7694          M != MEnd; ++M) {
7695       for (ObjCMethodList *MethList = &M->second.second;
7696            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
7697         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
7698           continue;
7699 
7700         Result R(MethList->getMethod(),
7701                  Results.getBasePriority(MethList->getMethod()), nullptr);
7702         R.StartParameter = SelIdents.size();
7703         R.AllParametersAreInformative = false;
7704         Results.MaybeAddResult(R, SemaRef.CurContext);
7705       }
7706     }
7707   }
7708 
7709   Results.ExitScope();
7710 }
7711 
7712 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
7713                                         ArrayRef<IdentifierInfo *> SelIdents,
7714                                         bool AtArgumentExpression,
7715                                         bool IsSuper) {
7716 
7717   QualType T = this->GetTypeFromParser(Receiver);
7718 
7719   ResultBuilder Results(
7720       *this, CodeCompleter->getAllocator(),
7721       CodeCompleter->getCodeCompletionTUInfo(),
7722       CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, T,
7723                             SelIdents));
7724 
7725   AddClassMessageCompletions(*this, S, Receiver, SelIdents,
7726                              AtArgumentExpression, IsSuper, Results);
7727 
7728   // If we're actually at the argument expression (rather than prior to the
7729   // selector), we're actually performing code completion for an expression.
7730   // Determine whether we have a single, best method. If so, we can
7731   // code-complete the expression using the corresponding parameter type as
7732   // our preferred type, improving completion results.
7733   if (AtArgumentExpression) {
7734     QualType PreferredType =
7735         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
7736     if (PreferredType.isNull())
7737       CodeCompleteOrdinaryName(S, PCC_Expression);
7738     else
7739       CodeCompleteExpression(S, PreferredType);
7740     return;
7741   }
7742 
7743   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7744                             Results.data(), Results.size());
7745 }
7746 
7747 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,
7748                                            ArrayRef<IdentifierInfo *> SelIdents,
7749                                            bool AtArgumentExpression,
7750                                            ObjCInterfaceDecl *Super) {
7751   typedef CodeCompletionResult Result;
7752 
7753   Expr *RecExpr = static_cast<Expr *>(Receiver);
7754 
7755   // If necessary, apply function/array conversion to the receiver.
7756   // C99 6.7.5.3p[7,8].
7757   if (RecExpr) {
7758     ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr);
7759     if (Conv.isInvalid()) // conversion failed. bail.
7760       return;
7761     RecExpr = Conv.get();
7762   }
7763   QualType ReceiverType = RecExpr
7764                               ? RecExpr->getType()
7765                               : Super ? Context.getObjCObjectPointerType(
7766                                             Context.getObjCInterfaceType(Super))
7767                                       : Context.getObjCIdType();
7768 
7769   // If we're messaging an expression with type "id" or "Class", check
7770   // whether we know something special about the receiver that allows
7771   // us to assume a more-specific receiver type.
7772   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) {
7773     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
7774       if (ReceiverType->isObjCClassType())
7775         return CodeCompleteObjCClassMessage(
7776             S, ParsedType::make(Context.getObjCInterfaceType(IFace)), SelIdents,
7777             AtArgumentExpression, Super);
7778 
7779       ReceiverType =
7780           Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace));
7781     }
7782   } else if (RecExpr && getLangOpts().CPlusPlus) {
7783     ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr);
7784     if (Conv.isUsable()) {
7785       RecExpr = Conv.get();
7786       ReceiverType = RecExpr->getType();
7787     }
7788   }
7789 
7790   // Build the set of methods we can see.
7791   ResultBuilder Results(
7792       *this, CodeCompleter->getAllocator(),
7793       CodeCompleter->getCodeCompletionTUInfo(),
7794       CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
7795                             ReceiverType, SelIdents));
7796 
7797   Results.EnterNewScope();
7798 
7799   // If this is a send-to-super, try to add the special "super" send
7800   // completion.
7801   if (Super) {
7802     if (ObjCMethodDecl *SuperMethod =
7803             AddSuperSendCompletion(*this, false, SelIdents, Results))
7804       Results.Ignore(SuperMethod);
7805   }
7806 
7807   // If we're inside an Objective-C method definition, prefer its selector to
7808   // others.
7809   if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
7810     Results.setPreferredSelector(CurMethod->getSelector());
7811 
7812   // Keep track of the selectors we've already added.
7813   VisitedSelectorSet Selectors;
7814 
7815   // Handle messages to Class. This really isn't a message to an instance
7816   // method, so we treat it the same way we would treat a message send to a
7817   // class method.
7818   if (ReceiverType->isObjCClassType() ||
7819       ReceiverType->isObjCQualifiedClassType()) {
7820     if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
7821       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
7822         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, CurContext,
7823                        Selectors, AtArgumentExpression, Results);
7824     }
7825   }
7826   // Handle messages to a qualified ID ("id<foo>").
7827   else if (const ObjCObjectPointerType *QualID =
7828                ReceiverType->getAsObjCQualifiedIdType()) {
7829     // Search protocols for instance methods.
7830     for (auto *I : QualID->quals())
7831       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors,
7832                      AtArgumentExpression, Results);
7833   }
7834   // Handle messages to a pointer to interface type.
7835   else if (const ObjCObjectPointerType *IFacePtr =
7836                ReceiverType->getAsObjCInterfacePointerType()) {
7837     // Search the class, its superclasses, etc., for instance methods.
7838     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
7839                    CurContext, Selectors, AtArgumentExpression, Results);
7840 
7841     // Search protocols for instance methods.
7842     for (auto *I : IFacePtr->quals())
7843       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors,
7844                      AtArgumentExpression, Results);
7845   }
7846   // Handle messages to "id".
7847   else if (ReceiverType->isObjCIdType()) {
7848     // We're messaging "id", so provide all instance methods we know
7849     // about as code-completion results.
7850 
7851     // If we have an external source, load the entire class method
7852     // pool from the AST file.
7853     if (ExternalSource) {
7854       for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
7855            I != N; ++I) {
7856         Selector Sel = ExternalSource->GetExternalSelector(I);
7857         if (Sel.isNull() || MethodPool.count(Sel))
7858           continue;
7859 
7860         ReadMethodPool(Sel);
7861       }
7862     }
7863 
7864     for (GlobalMethodPool::iterator M = MethodPool.begin(),
7865                                     MEnd = MethodPool.end();
7866          M != MEnd; ++M) {
7867       for (ObjCMethodList *MethList = &M->second.first;
7868            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
7869         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
7870           continue;
7871 
7872         if (!Selectors.insert(MethList->getMethod()->getSelector()).second)
7873           continue;
7874 
7875         Result R(MethList->getMethod(),
7876                  Results.getBasePriority(MethList->getMethod()), nullptr);
7877         R.StartParameter = SelIdents.size();
7878         R.AllParametersAreInformative = false;
7879         Results.MaybeAddResult(R, CurContext);
7880       }
7881     }
7882   }
7883   Results.ExitScope();
7884 
7885   // If we're actually at the argument expression (rather than prior to the
7886   // selector), we're actually performing code completion for an expression.
7887   // Determine whether we have a single, best method. If so, we can
7888   // code-complete the expression using the corresponding parameter type as
7889   // our preferred type, improving completion results.
7890   if (AtArgumentExpression) {
7891     QualType PreferredType =
7892         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
7893     if (PreferredType.isNull())
7894       CodeCompleteOrdinaryName(S, PCC_Expression);
7895     else
7896       CodeCompleteExpression(S, PreferredType);
7897     return;
7898   }
7899 
7900   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7901                             Results.data(), Results.size());
7902 }
7903 
7904 void Sema::CodeCompleteObjCForCollection(Scope *S,
7905                                          DeclGroupPtrTy IterationVar) {
7906   CodeCompleteExpressionData Data;
7907   Data.ObjCCollection = true;
7908 
7909   if (IterationVar.getAsOpaquePtr()) {
7910     DeclGroupRef DG = IterationVar.get();
7911     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
7912       if (*I)
7913         Data.IgnoreDecls.push_back(*I);
7914     }
7915   }
7916 
7917   CodeCompleteExpression(S, Data);
7918 }
7919 
7920 void Sema::CodeCompleteObjCSelector(Scope *S,
7921                                     ArrayRef<IdentifierInfo *> SelIdents) {
7922   // If we have an external source, load the entire class method
7923   // pool from the AST file.
7924   if (ExternalSource) {
7925     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N;
7926          ++I) {
7927       Selector Sel = ExternalSource->GetExternalSelector(I);
7928       if (Sel.isNull() || MethodPool.count(Sel))
7929         continue;
7930 
7931       ReadMethodPool(Sel);
7932     }
7933   }
7934 
7935   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7936                         CodeCompleter->getCodeCompletionTUInfo(),
7937                         CodeCompletionContext::CCC_SelectorName);
7938   Results.EnterNewScope();
7939   for (GlobalMethodPool::iterator M = MethodPool.begin(),
7940                                   MEnd = MethodPool.end();
7941        M != MEnd; ++M) {
7942 
7943     Selector Sel = M->first;
7944     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents))
7945       continue;
7946 
7947     CodeCompletionBuilder Builder(Results.getAllocator(),
7948                                   Results.getCodeCompletionTUInfo());
7949     if (Sel.isUnarySelector()) {
7950       Builder.AddTypedTextChunk(
7951           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
7952       Results.AddResult(Builder.TakeString());
7953       continue;
7954     }
7955 
7956     std::string Accumulator;
7957     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
7958       if (I == SelIdents.size()) {
7959         if (!Accumulator.empty()) {
7960           Builder.AddInformativeChunk(
7961               Builder.getAllocator().CopyString(Accumulator));
7962           Accumulator.clear();
7963         }
7964       }
7965 
7966       Accumulator += Sel.getNameForSlot(I);
7967       Accumulator += ':';
7968     }
7969     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator));
7970     Results.AddResult(Builder.TakeString());
7971   }
7972   Results.ExitScope();
7973 
7974   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7975                             Results.data(), Results.size());
7976 }
7977 
7978 /// Add all of the protocol declarations that we find in the given
7979 /// (translation unit) context.
7980 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
7981                                bool OnlyForwardDeclarations,
7982                                ResultBuilder &Results) {
7983   typedef CodeCompletionResult Result;
7984 
7985   for (const auto *D : Ctx->decls()) {
7986     // Record any protocols we find.
7987     if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D))
7988       if (!OnlyForwardDeclarations || !Proto->hasDefinition())
7989         Results.AddResult(
7990             Result(Proto, Results.getBasePriority(Proto), nullptr), CurContext,
7991             nullptr, false);
7992   }
7993 }
7994 
7995 void Sema::CodeCompleteObjCProtocolReferences(
7996     ArrayRef<IdentifierLocPair> Protocols) {
7997   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7998                         CodeCompleter->getCodeCompletionTUInfo(),
7999                         CodeCompletionContext::CCC_ObjCProtocolName);
8000 
8001   if (CodeCompleter->includeGlobals()) {
8002     Results.EnterNewScope();
8003 
8004     // Tell the result set to ignore all of the protocols we have
8005     // already seen.
8006     // FIXME: This doesn't work when caching code-completion results.
8007     for (const IdentifierLocPair &Pair : Protocols)
8008       if (ObjCProtocolDecl *Protocol = LookupProtocol(Pair.first, Pair.second))
8009         Results.Ignore(Protocol);
8010 
8011     // Add all protocols.
8012     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false,
8013                        Results);
8014 
8015     Results.ExitScope();
8016   }
8017 
8018   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8019                             Results.data(), Results.size());
8020 }
8021 
8022 void Sema::CodeCompleteObjCProtocolDecl(Scope *) {
8023   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8024                         CodeCompleter->getCodeCompletionTUInfo(),
8025                         CodeCompletionContext::CCC_ObjCProtocolName);
8026 
8027   if (CodeCompleter->includeGlobals()) {
8028     Results.EnterNewScope();
8029 
8030     // Add all protocols.
8031     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true,
8032                        Results);
8033 
8034     Results.ExitScope();
8035   }
8036 
8037   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8038                             Results.data(), Results.size());
8039 }
8040 
8041 /// Add all of the Objective-C interface declarations that we find in
8042 /// the given (translation unit) context.
8043 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
8044                                 bool OnlyForwardDeclarations,
8045                                 bool OnlyUnimplemented,
8046                                 ResultBuilder &Results) {
8047   typedef CodeCompletionResult Result;
8048 
8049   for (const auto *D : Ctx->decls()) {
8050     // Record any interfaces we find.
8051     if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
8052       if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
8053           (!OnlyUnimplemented || !Class->getImplementation()))
8054         Results.AddResult(
8055             Result(Class, Results.getBasePriority(Class), nullptr), CurContext,
8056             nullptr, false);
8057   }
8058 }
8059 
8060 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
8061   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8062                         CodeCompleter->getCodeCompletionTUInfo(),
8063                         CodeCompletionContext::CCC_ObjCInterfaceName);
8064   Results.EnterNewScope();
8065 
8066   if (CodeCompleter->includeGlobals()) {
8067     // Add all classes.
8068     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
8069                         false, Results);
8070   }
8071 
8072   Results.ExitScope();
8073 
8074   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8075                             Results.data(), Results.size());
8076 }
8077 
8078 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
8079                                       SourceLocation ClassNameLoc) {
8080   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8081                         CodeCompleter->getCodeCompletionTUInfo(),
8082                         CodeCompletionContext::CCC_ObjCInterfaceName);
8083   Results.EnterNewScope();
8084 
8085   // Make sure that we ignore the class we're currently defining.
8086   NamedDecl *CurClass =
8087       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
8088   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
8089     Results.Ignore(CurClass);
8090 
8091   if (CodeCompleter->includeGlobals()) {
8092     // Add all classes.
8093     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
8094                         false, Results);
8095   }
8096 
8097   Results.ExitScope();
8098 
8099   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8100                             Results.data(), Results.size());
8101 }
8102 
8103 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
8104   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8105                         CodeCompleter->getCodeCompletionTUInfo(),
8106                         CodeCompletionContext::CCC_ObjCImplementation);
8107   Results.EnterNewScope();
8108 
8109   if (CodeCompleter->includeGlobals()) {
8110     // Add all unimplemented classes.
8111     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
8112                         true, Results);
8113   }
8114 
8115   Results.ExitScope();
8116 
8117   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8118                             Results.data(), Results.size());
8119 }
8120 
8121 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
8122                                              IdentifierInfo *ClassName,
8123                                              SourceLocation ClassNameLoc) {
8124   typedef CodeCompletionResult Result;
8125 
8126   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8127                         CodeCompleter->getCodeCompletionTUInfo(),
8128                         CodeCompletionContext::CCC_ObjCCategoryName);
8129 
8130   // Ignore any categories we find that have already been implemented by this
8131   // interface.
8132   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
8133   NamedDecl *CurClass =
8134       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
8135   if (ObjCInterfaceDecl *Class =
8136           dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) {
8137     for (const auto *Cat : Class->visible_categories())
8138       CategoryNames.insert(Cat->getIdentifier());
8139   }
8140 
8141   // Add all of the categories we know about.
8142   Results.EnterNewScope();
8143   TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
8144   for (const auto *D : TU->decls())
8145     if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D))
8146       if (CategoryNames.insert(Category->getIdentifier()).second)
8147         Results.AddResult(
8148             Result(Category, Results.getBasePriority(Category), nullptr),
8149             CurContext, nullptr, false);
8150   Results.ExitScope();
8151 
8152   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8153                             Results.data(), Results.size());
8154 }
8155 
8156 void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
8157                                                   IdentifierInfo *ClassName,
8158                                                   SourceLocation ClassNameLoc) {
8159   typedef CodeCompletionResult Result;
8160 
8161   // Find the corresponding interface. If we couldn't find the interface, the
8162   // program itself is ill-formed. However, we'll try to be helpful still by
8163   // providing the list of all of the categories we know about.
8164   NamedDecl *CurClass =
8165       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
8166   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
8167   if (!Class)
8168     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
8169 
8170   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8171                         CodeCompleter->getCodeCompletionTUInfo(),
8172                         CodeCompletionContext::CCC_ObjCCategoryName);
8173 
8174   // Add all of the categories that have have corresponding interface
8175   // declarations in this class and any of its superclasses, except for
8176   // already-implemented categories in the class itself.
8177   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
8178   Results.EnterNewScope();
8179   bool IgnoreImplemented = true;
8180   while (Class) {
8181     for (const auto *Cat : Class->visible_categories()) {
8182       if ((!IgnoreImplemented || !Cat->getImplementation()) &&
8183           CategoryNames.insert(Cat->getIdentifier()).second)
8184         Results.AddResult(Result(Cat, Results.getBasePriority(Cat), nullptr),
8185                           CurContext, nullptr, false);
8186     }
8187 
8188     Class = Class->getSuperClass();
8189     IgnoreImplemented = false;
8190   }
8191   Results.ExitScope();
8192 
8193   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8194                             Results.data(), Results.size());
8195 }
8196 
8197 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) {
8198   CodeCompletionContext CCContext(CodeCompletionContext::CCC_Other);
8199   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8200                         CodeCompleter->getCodeCompletionTUInfo(), CCContext);
8201 
8202   // Figure out where this @synthesize lives.
8203   ObjCContainerDecl *Container =
8204       dyn_cast_or_null<ObjCContainerDecl>(CurContext);
8205   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
8206                      !isa<ObjCCategoryImplDecl>(Container)))
8207     return;
8208 
8209   // Ignore any properties that have already been implemented.
8210   Container = getContainerDef(Container);
8211   for (const auto *D : Container->decls())
8212     if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D))
8213       Results.Ignore(PropertyImpl->getPropertyDecl());
8214 
8215   // Add any properties that we find.
8216   AddedPropertiesSet AddedProperties;
8217   Results.EnterNewScope();
8218   if (ObjCImplementationDecl *ClassImpl =
8219           dyn_cast<ObjCImplementationDecl>(Container))
8220     AddObjCProperties(CCContext, ClassImpl->getClassInterface(), false,
8221                       /*AllowNullaryMethods=*/false, CurContext,
8222                       AddedProperties, Results);
8223   else
8224     AddObjCProperties(CCContext,
8225                       cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
8226                       false, /*AllowNullaryMethods=*/false, CurContext,
8227                       AddedProperties, Results);
8228   Results.ExitScope();
8229 
8230   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8231                             Results.data(), Results.size());
8232 }
8233 
8234 void Sema::CodeCompleteObjCPropertySynthesizeIvar(
8235     Scope *S, IdentifierInfo *PropertyName) {
8236   typedef CodeCompletionResult Result;
8237   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8238                         CodeCompleter->getCodeCompletionTUInfo(),
8239                         CodeCompletionContext::CCC_Other);
8240 
8241   // Figure out where this @synthesize lives.
8242   ObjCContainerDecl *Container =
8243       dyn_cast_or_null<ObjCContainerDecl>(CurContext);
8244   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
8245                      !isa<ObjCCategoryImplDecl>(Container)))
8246     return;
8247 
8248   // Figure out which interface we're looking into.
8249   ObjCInterfaceDecl *Class = nullptr;
8250   if (ObjCImplementationDecl *ClassImpl =
8251           dyn_cast<ObjCImplementationDecl>(Container))
8252     Class = ClassImpl->getClassInterface();
8253   else
8254     Class = cast<ObjCCategoryImplDecl>(Container)
8255                 ->getCategoryDecl()
8256                 ->getClassInterface();
8257 
8258   // Determine the type of the property we're synthesizing.
8259   QualType PropertyType = Context.getObjCIdType();
8260   if (Class) {
8261     if (ObjCPropertyDecl *Property = Class->FindPropertyDeclaration(
8262             PropertyName, ObjCPropertyQueryKind::OBJC_PR_query_instance)) {
8263       PropertyType =
8264           Property->getType().getNonReferenceType().getUnqualifiedType();
8265 
8266       // Give preference to ivars
8267       Results.setPreferredType(PropertyType);
8268     }
8269   }
8270 
8271   // Add all of the instance variables in this class and its superclasses.
8272   Results.EnterNewScope();
8273   bool SawSimilarlyNamedIvar = false;
8274   std::string NameWithPrefix;
8275   NameWithPrefix += '_';
8276   NameWithPrefix += PropertyName->getName();
8277   std::string NameWithSuffix = PropertyName->getName().str();
8278   NameWithSuffix += '_';
8279   for (; Class; Class = Class->getSuperClass()) {
8280     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
8281          Ivar = Ivar->getNextIvar()) {
8282       Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), nullptr),
8283                         CurContext, nullptr, false);
8284 
8285       // Determine whether we've seen an ivar with a name similar to the
8286       // property.
8287       if ((PropertyName == Ivar->getIdentifier() ||
8288            NameWithPrefix == Ivar->getName() ||
8289            NameWithSuffix == Ivar->getName())) {
8290         SawSimilarlyNamedIvar = true;
8291 
8292         // Reduce the priority of this result by one, to give it a slight
8293         // advantage over other results whose names don't match so closely.
8294         if (Results.size() &&
8295             Results.data()[Results.size() - 1].Kind ==
8296                 CodeCompletionResult::RK_Declaration &&
8297             Results.data()[Results.size() - 1].Declaration == Ivar)
8298           Results.data()[Results.size() - 1].Priority--;
8299       }
8300     }
8301   }
8302 
8303   if (!SawSimilarlyNamedIvar) {
8304     // Create ivar result _propName, that the user can use to synthesize
8305     // an ivar of the appropriate type.
8306     unsigned Priority = CCP_MemberDeclaration + 1;
8307     typedef CodeCompletionResult Result;
8308     CodeCompletionAllocator &Allocator = Results.getAllocator();
8309     CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(),
8310                                   Priority, CXAvailability_Available);
8311 
8312     PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
8313     Builder.AddResultTypeChunk(
8314         GetCompletionTypeString(PropertyType, Context, Policy, Allocator));
8315     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
8316     Results.AddResult(
8317         Result(Builder.TakeString(), Priority, CXCursor_ObjCIvarDecl));
8318   }
8319 
8320   Results.ExitScope();
8321 
8322   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8323                             Results.data(), Results.size());
8324 }
8325 
8326 // Mapping from selectors to the methods that implement that selector, along
8327 // with the "in original class" flag.
8328 typedef llvm::DenseMap<Selector,
8329                        llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>>
8330     KnownMethodsMap;
8331 
8332 /// Find all of the methods that reside in the given container
8333 /// (and its superclasses, protocols, etc.) that meet the given
8334 /// criteria. Insert those methods into the map of known methods,
8335 /// indexed by selector so they can be easily found.
8336 static void FindImplementableMethods(ASTContext &Context,
8337                                      ObjCContainerDecl *Container,
8338                                      Optional<bool> WantInstanceMethods,
8339                                      QualType ReturnType,
8340                                      KnownMethodsMap &KnownMethods,
8341                                      bool InOriginalClass = true) {
8342   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
8343     // Make sure we have a definition; that's what we'll walk.
8344     if (!IFace->hasDefinition())
8345       return;
8346 
8347     IFace = IFace->getDefinition();
8348     Container = IFace;
8349 
8350     const ObjCList<ObjCProtocolDecl> &Protocols =
8351         IFace->getReferencedProtocols();
8352     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
8353                                               E = Protocols.end();
8354          I != E; ++I)
8355       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
8356                                KnownMethods, InOriginalClass);
8357 
8358     // Add methods from any class extensions and categories.
8359     for (auto *Cat : IFace->visible_categories()) {
8360       FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType,
8361                                KnownMethods, false);
8362     }
8363 
8364     // Visit the superclass.
8365     if (IFace->getSuperClass())
8366       FindImplementableMethods(Context, IFace->getSuperClass(),
8367                                WantInstanceMethods, ReturnType, KnownMethods,
8368                                false);
8369   }
8370 
8371   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
8372     // Recurse into protocols.
8373     const ObjCList<ObjCProtocolDecl> &Protocols =
8374         Category->getReferencedProtocols();
8375     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
8376                                               E = Protocols.end();
8377          I != E; ++I)
8378       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
8379                                KnownMethods, InOriginalClass);
8380 
8381     // If this category is the original class, jump to the interface.
8382     if (InOriginalClass && Category->getClassInterface())
8383       FindImplementableMethods(Context, Category->getClassInterface(),
8384                                WantInstanceMethods, ReturnType, KnownMethods,
8385                                false);
8386   }
8387 
8388   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
8389     // Make sure we have a definition; that's what we'll walk.
8390     if (!Protocol->hasDefinition())
8391       return;
8392     Protocol = Protocol->getDefinition();
8393     Container = Protocol;
8394 
8395     // Recurse into protocols.
8396     const ObjCList<ObjCProtocolDecl> &Protocols =
8397         Protocol->getReferencedProtocols();
8398     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
8399                                               E = Protocols.end();
8400          I != E; ++I)
8401       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
8402                                KnownMethods, false);
8403   }
8404 
8405   // Add methods in this container. This operation occurs last because
8406   // we want the methods from this container to override any methods
8407   // we've previously seen with the same selector.
8408   for (auto *M : Container->methods()) {
8409     if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) {
8410       if (!ReturnType.isNull() &&
8411           !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType()))
8412         continue;
8413 
8414       KnownMethods[M->getSelector()] =
8415           KnownMethodsMap::mapped_type(M, InOriginalClass);
8416     }
8417   }
8418 }
8419 
8420 /// Add the parenthesized return or parameter type chunk to a code
8421 /// completion string.
8422 static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals,
8423                                     ASTContext &Context,
8424                                     const PrintingPolicy &Policy,
8425                                     CodeCompletionBuilder &Builder) {
8426   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8427   std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals, Type);
8428   if (!Quals.empty())
8429     Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
8430   Builder.AddTextChunk(
8431       GetCompletionTypeString(Type, Context, Policy, Builder.getAllocator()));
8432   Builder.AddChunk(CodeCompletionString::CK_RightParen);
8433 }
8434 
8435 /// Determine whether the given class is or inherits from a class by
8436 /// the given name.
8437 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name) {
8438   if (!Class)
8439     return false;
8440 
8441   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
8442     return true;
8443 
8444   return InheritsFromClassNamed(Class->getSuperClass(), Name);
8445 }
8446 
8447 /// Add code completions for Objective-C Key-Value Coding (KVC) and
8448 /// Key-Value Observing (KVO).
8449 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
8450                                        bool IsInstanceMethod,
8451                                        QualType ReturnType, ASTContext &Context,
8452                                        VisitedSelectorSet &KnownSelectors,
8453                                        ResultBuilder &Results) {
8454   IdentifierInfo *PropName = Property->getIdentifier();
8455   if (!PropName || PropName->getLength() == 0)
8456     return;
8457 
8458   PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
8459 
8460   // Builder that will create each code completion.
8461   typedef CodeCompletionResult Result;
8462   CodeCompletionAllocator &Allocator = Results.getAllocator();
8463   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
8464 
8465   // The selector table.
8466   SelectorTable &Selectors = Context.Selectors;
8467 
8468   // The property name, copied into the code completion allocation region
8469   // on demand.
8470   struct KeyHolder {
8471     CodeCompletionAllocator &Allocator;
8472     StringRef Key;
8473     const char *CopiedKey;
8474 
8475     KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key)
8476         : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {}
8477 
8478     operator const char *() {
8479       if (CopiedKey)
8480         return CopiedKey;
8481 
8482       return CopiedKey = Allocator.CopyString(Key);
8483     }
8484   } Key(Allocator, PropName->getName());
8485 
8486   // The uppercased name of the property name.
8487   std::string UpperKey = std::string(PropName->getName());
8488   if (!UpperKey.empty())
8489     UpperKey[0] = toUppercase(UpperKey[0]);
8490 
8491   bool ReturnTypeMatchesProperty =
8492       ReturnType.isNull() ||
8493       Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
8494                                      Property->getType());
8495   bool ReturnTypeMatchesVoid = ReturnType.isNull() || ReturnType->isVoidType();
8496 
8497   // Add the normal accessor -(type)key.
8498   if (IsInstanceMethod &&
8499       KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second &&
8500       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
8501     if (ReturnType.isNull())
8502       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
8503                               Builder);
8504 
8505     Builder.AddTypedTextChunk(Key);
8506     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
8507                              CXCursor_ObjCInstanceMethodDecl));
8508   }
8509 
8510   // If we have an integral or boolean property (or the user has provided
8511   // an integral or boolean return type), add the accessor -(type)isKey.
8512   if (IsInstanceMethod &&
8513       ((!ReturnType.isNull() &&
8514         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
8515        (ReturnType.isNull() && (Property->getType()->isIntegerType() ||
8516                                 Property->getType()->isBooleanType())))) {
8517     std::string SelectorName = (Twine("is") + UpperKey).str();
8518     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8519     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
8520             .second) {
8521       if (ReturnType.isNull()) {
8522         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8523         Builder.AddTextChunk("BOOL");
8524         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8525       }
8526 
8527       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
8528       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
8529                                CXCursor_ObjCInstanceMethodDecl));
8530     }
8531   }
8532 
8533   // Add the normal mutator.
8534   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
8535       !Property->getSetterMethodDecl()) {
8536     std::string SelectorName = (Twine("set") + UpperKey).str();
8537     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8538     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8539       if (ReturnType.isNull()) {
8540         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8541         Builder.AddTextChunk("void");
8542         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8543       }
8544 
8545       Builder.AddTypedTextChunk(
8546           Allocator.CopyString(SelectorId->getName() + ":"));
8547       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
8548                               Builder);
8549       Builder.AddTextChunk(Key);
8550       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
8551                                CXCursor_ObjCInstanceMethodDecl));
8552     }
8553   }
8554 
8555   // Indexed and unordered accessors
8556   unsigned IndexedGetterPriority = CCP_CodePattern;
8557   unsigned IndexedSetterPriority = CCP_CodePattern;
8558   unsigned UnorderedGetterPriority = CCP_CodePattern;
8559   unsigned UnorderedSetterPriority = CCP_CodePattern;
8560   if (const auto *ObjCPointer =
8561           Property->getType()->getAs<ObjCObjectPointerType>()) {
8562     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
8563       // If this interface type is not provably derived from a known
8564       // collection, penalize the corresponding completions.
8565       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
8566         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
8567         if (!InheritsFromClassNamed(IFace, "NSArray"))
8568           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
8569       }
8570 
8571       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
8572         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
8573         if (!InheritsFromClassNamed(IFace, "NSSet"))
8574           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
8575       }
8576     }
8577   } else {
8578     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
8579     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
8580     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
8581     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
8582   }
8583 
8584   // Add -(NSUInteger)countOf<key>
8585   if (IsInstanceMethod &&
8586       (ReturnType.isNull() || ReturnType->isIntegerType())) {
8587     std::string SelectorName = (Twine("countOf") + UpperKey).str();
8588     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8589     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
8590             .second) {
8591       if (ReturnType.isNull()) {
8592         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8593         Builder.AddTextChunk("NSUInteger");
8594         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8595       }
8596 
8597       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
8598       Results.AddResult(
8599           Result(Builder.TakeString(),
8600                  std::min(IndexedGetterPriority, UnorderedGetterPriority),
8601                  CXCursor_ObjCInstanceMethodDecl));
8602     }
8603   }
8604 
8605   // Indexed getters
8606   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
8607   if (IsInstanceMethod &&
8608       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
8609     std::string SelectorName = (Twine("objectIn") + UpperKey + "AtIndex").str();
8610     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8611     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8612       if (ReturnType.isNull()) {
8613         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8614         Builder.AddTextChunk("id");
8615         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8616       }
8617 
8618       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8619       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8620       Builder.AddTextChunk("NSUInteger");
8621       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8622       Builder.AddTextChunk("index");
8623       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
8624                                CXCursor_ObjCInstanceMethodDecl));
8625     }
8626   }
8627 
8628   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
8629   if (IsInstanceMethod &&
8630       (ReturnType.isNull() ||
8631        (ReturnType->isObjCObjectPointerType() &&
8632         ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
8633         ReturnType->castAs<ObjCObjectPointerType>()
8634                 ->getInterfaceDecl()
8635                 ->getName() == "NSArray"))) {
8636     std::string SelectorName = (Twine(Property->getName()) + "AtIndexes").str();
8637     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8638     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8639       if (ReturnType.isNull()) {
8640         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8641         Builder.AddTextChunk("NSArray *");
8642         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8643       }
8644 
8645       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8646       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8647       Builder.AddTextChunk("NSIndexSet *");
8648       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8649       Builder.AddTextChunk("indexes");
8650       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
8651                                CXCursor_ObjCInstanceMethodDecl));
8652     }
8653   }
8654 
8655   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
8656   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8657     std::string SelectorName = (Twine("get") + UpperKey).str();
8658     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
8659                                       &Context.Idents.get("range")};
8660 
8661     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
8662       if (ReturnType.isNull()) {
8663         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8664         Builder.AddTextChunk("void");
8665         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8666       }
8667 
8668       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8669       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8670       Builder.AddPlaceholderChunk("object-type");
8671       Builder.AddTextChunk(" **");
8672       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8673       Builder.AddTextChunk("buffer");
8674       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8675       Builder.AddTypedTextChunk("range:");
8676       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8677       Builder.AddTextChunk("NSRange");
8678       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8679       Builder.AddTextChunk("inRange");
8680       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
8681                                CXCursor_ObjCInstanceMethodDecl));
8682     }
8683   }
8684 
8685   // Mutable indexed accessors
8686 
8687   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
8688   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8689     std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str();
8690     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get("insertObject"),
8691                                       &Context.Idents.get(SelectorName)};
8692 
8693     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
8694       if (ReturnType.isNull()) {
8695         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8696         Builder.AddTextChunk("void");
8697         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8698       }
8699 
8700       Builder.AddTypedTextChunk("insertObject:");
8701       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8702       Builder.AddPlaceholderChunk("object-type");
8703       Builder.AddTextChunk(" *");
8704       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8705       Builder.AddTextChunk("object");
8706       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8707       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8708       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8709       Builder.AddPlaceholderChunk("NSUInteger");
8710       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8711       Builder.AddTextChunk("index");
8712       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8713                                CXCursor_ObjCInstanceMethodDecl));
8714     }
8715   }
8716 
8717   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
8718   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8719     std::string SelectorName = (Twine("insert") + UpperKey).str();
8720     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
8721                                       &Context.Idents.get("atIndexes")};
8722 
8723     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
8724       if (ReturnType.isNull()) {
8725         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8726         Builder.AddTextChunk("void");
8727         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8728       }
8729 
8730       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8731       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8732       Builder.AddTextChunk("NSArray *");
8733       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8734       Builder.AddTextChunk("array");
8735       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8736       Builder.AddTypedTextChunk("atIndexes:");
8737       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8738       Builder.AddPlaceholderChunk("NSIndexSet *");
8739       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8740       Builder.AddTextChunk("indexes");
8741       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8742                                CXCursor_ObjCInstanceMethodDecl));
8743     }
8744   }
8745 
8746   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
8747   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8748     std::string SelectorName =
8749         (Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
8750     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8751     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8752       if (ReturnType.isNull()) {
8753         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8754         Builder.AddTextChunk("void");
8755         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8756       }
8757 
8758       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8759       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8760       Builder.AddTextChunk("NSUInteger");
8761       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8762       Builder.AddTextChunk("index");
8763       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8764                                CXCursor_ObjCInstanceMethodDecl));
8765     }
8766   }
8767 
8768   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
8769   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8770     std::string SelectorName = (Twine("remove") + UpperKey + "AtIndexes").str();
8771     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8772     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8773       if (ReturnType.isNull()) {
8774         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8775         Builder.AddTextChunk("void");
8776         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8777       }
8778 
8779       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8780       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8781       Builder.AddTextChunk("NSIndexSet *");
8782       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8783       Builder.AddTextChunk("indexes");
8784       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8785                                CXCursor_ObjCInstanceMethodDecl));
8786     }
8787   }
8788 
8789   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
8790   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8791     std::string SelectorName =
8792         (Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
8793     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
8794                                       &Context.Idents.get("withObject")};
8795 
8796     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
8797       if (ReturnType.isNull()) {
8798         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8799         Builder.AddTextChunk("void");
8800         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8801       }
8802 
8803       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8804       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8805       Builder.AddPlaceholderChunk("NSUInteger");
8806       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8807       Builder.AddTextChunk("index");
8808       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8809       Builder.AddTypedTextChunk("withObject:");
8810       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8811       Builder.AddTextChunk("id");
8812       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8813       Builder.AddTextChunk("object");
8814       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8815                                CXCursor_ObjCInstanceMethodDecl));
8816     }
8817   }
8818 
8819   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
8820   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8821     std::string SelectorName1 =
8822         (Twine("replace") + UpperKey + "AtIndexes").str();
8823     std::string SelectorName2 = (Twine("with") + UpperKey).str();
8824     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1),
8825                                       &Context.Idents.get(SelectorName2)};
8826 
8827     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
8828       if (ReturnType.isNull()) {
8829         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8830         Builder.AddTextChunk("void");
8831         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8832       }
8833 
8834       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
8835       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8836       Builder.AddPlaceholderChunk("NSIndexSet *");
8837       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8838       Builder.AddTextChunk("indexes");
8839       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8840       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
8841       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8842       Builder.AddTextChunk("NSArray *");
8843       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8844       Builder.AddTextChunk("array");
8845       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
8846                                CXCursor_ObjCInstanceMethodDecl));
8847     }
8848   }
8849 
8850   // Unordered getters
8851   // - (NSEnumerator *)enumeratorOfKey
8852   if (IsInstanceMethod &&
8853       (ReturnType.isNull() ||
8854        (ReturnType->isObjCObjectPointerType() &&
8855         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
8856         ReturnType->getAs<ObjCObjectPointerType>()
8857                 ->getInterfaceDecl()
8858                 ->getName() == "NSEnumerator"))) {
8859     std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str();
8860     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8861     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
8862             .second) {
8863       if (ReturnType.isNull()) {
8864         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8865         Builder.AddTextChunk("NSEnumerator *");
8866         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8867       }
8868 
8869       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
8870       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
8871                                CXCursor_ObjCInstanceMethodDecl));
8872     }
8873   }
8874 
8875   // - (type *)memberOfKey:(type *)object
8876   if (IsInstanceMethod &&
8877       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
8878     std::string SelectorName = (Twine("memberOf") + UpperKey).str();
8879     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8880     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8881       if (ReturnType.isNull()) {
8882         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8883         Builder.AddPlaceholderChunk("object-type");
8884         Builder.AddTextChunk(" *");
8885         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8886       }
8887 
8888       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8889       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8890       if (ReturnType.isNull()) {
8891         Builder.AddPlaceholderChunk("object-type");
8892         Builder.AddTextChunk(" *");
8893       } else {
8894         Builder.AddTextChunk(GetCompletionTypeString(
8895             ReturnType, Context, Policy, Builder.getAllocator()));
8896       }
8897       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8898       Builder.AddTextChunk("object");
8899       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
8900                                CXCursor_ObjCInstanceMethodDecl));
8901     }
8902   }
8903 
8904   // Mutable unordered accessors
8905   // - (void)addKeyObject:(type *)object
8906   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8907     std::string SelectorName =
8908         (Twine("add") + UpperKey + Twine("Object")).str();
8909     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8910     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8911       if (ReturnType.isNull()) {
8912         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8913         Builder.AddTextChunk("void");
8914         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8915       }
8916 
8917       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8918       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8919       Builder.AddPlaceholderChunk("object-type");
8920       Builder.AddTextChunk(" *");
8921       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8922       Builder.AddTextChunk("object");
8923       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8924                                CXCursor_ObjCInstanceMethodDecl));
8925     }
8926   }
8927 
8928   // - (void)addKey:(NSSet *)objects
8929   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8930     std::string SelectorName = (Twine("add") + UpperKey).str();
8931     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8932     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8933       if (ReturnType.isNull()) {
8934         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8935         Builder.AddTextChunk("void");
8936         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8937       }
8938 
8939       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8940       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8941       Builder.AddTextChunk("NSSet *");
8942       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8943       Builder.AddTextChunk("objects");
8944       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8945                                CXCursor_ObjCInstanceMethodDecl));
8946     }
8947   }
8948 
8949   // - (void)removeKeyObject:(type *)object
8950   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8951     std::string SelectorName =
8952         (Twine("remove") + UpperKey + Twine("Object")).str();
8953     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8954     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8955       if (ReturnType.isNull()) {
8956         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8957         Builder.AddTextChunk("void");
8958         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8959       }
8960 
8961       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8962       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8963       Builder.AddPlaceholderChunk("object-type");
8964       Builder.AddTextChunk(" *");
8965       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8966       Builder.AddTextChunk("object");
8967       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8968                                CXCursor_ObjCInstanceMethodDecl));
8969     }
8970   }
8971 
8972   // - (void)removeKey:(NSSet *)objects
8973   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8974     std::string SelectorName = (Twine("remove") + UpperKey).str();
8975     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8976     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8977       if (ReturnType.isNull()) {
8978         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8979         Builder.AddTextChunk("void");
8980         Builder.AddChunk(CodeCompletionString::CK_RightParen);
8981       }
8982 
8983       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
8984       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8985       Builder.AddTextChunk("NSSet *");
8986       Builder.AddChunk(CodeCompletionString::CK_RightParen);
8987       Builder.AddTextChunk("objects");
8988       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
8989                                CXCursor_ObjCInstanceMethodDecl));
8990     }
8991   }
8992 
8993   // - (void)intersectKey:(NSSet *)objects
8994   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
8995     std::string SelectorName = (Twine("intersect") + UpperKey).str();
8996     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
8997     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
8998       if (ReturnType.isNull()) {
8999         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9000         Builder.AddTextChunk("void");
9001         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9002       }
9003 
9004       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9005       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9006       Builder.AddTextChunk("NSSet *");
9007       Builder.AddChunk(CodeCompletionString::CK_RightParen);
9008       Builder.AddTextChunk("objects");
9009       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
9010                                CXCursor_ObjCInstanceMethodDecl));
9011     }
9012   }
9013 
9014   // Key-Value Observing
9015   // + (NSSet *)keyPathsForValuesAffectingKey
9016   if (!IsInstanceMethod &&
9017       (ReturnType.isNull() ||
9018        (ReturnType->isObjCObjectPointerType() &&
9019         ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
9020         ReturnType->castAs<ObjCObjectPointerType>()
9021                 ->getInterfaceDecl()
9022                 ->getName() == "NSSet"))) {
9023     std::string SelectorName =
9024         (Twine("keyPathsForValuesAffecting") + UpperKey).str();
9025     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9026     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
9027             .second) {
9028       if (ReturnType.isNull()) {
9029         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9030         Builder.AddTextChunk("NSSet<NSString *> *");
9031         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9032       }
9033 
9034       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
9035       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
9036                                CXCursor_ObjCClassMethodDecl));
9037     }
9038   }
9039 
9040   // + (BOOL)automaticallyNotifiesObserversForKey
9041   if (!IsInstanceMethod &&
9042       (ReturnType.isNull() || ReturnType->isIntegerType() ||
9043        ReturnType->isBooleanType())) {
9044     std::string SelectorName =
9045         (Twine("automaticallyNotifiesObserversOf") + UpperKey).str();
9046     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9047     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
9048             .second) {
9049       if (ReturnType.isNull()) {
9050         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9051         Builder.AddTextChunk("BOOL");
9052         Builder.AddChunk(CodeCompletionString::CK_RightParen);
9053       }
9054 
9055       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
9056       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
9057                                CXCursor_ObjCClassMethodDecl));
9058     }
9059   }
9060 }
9061 
9062 void Sema::CodeCompleteObjCMethodDecl(Scope *S, Optional<bool> IsInstanceMethod,
9063                                       ParsedType ReturnTy) {
9064   // Determine the return type of the method we're declaring, if
9065   // provided.
9066   QualType ReturnType = GetTypeFromParser(ReturnTy);
9067   Decl *IDecl = nullptr;
9068   if (CurContext->isObjCContainer()) {
9069     ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext);
9070     IDecl = OCD;
9071   }
9072   // Determine where we should start searching for methods.
9073   ObjCContainerDecl *SearchDecl = nullptr;
9074   bool IsInImplementation = false;
9075   if (Decl *D = IDecl) {
9076     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
9077       SearchDecl = Impl->getClassInterface();
9078       IsInImplementation = true;
9079     } else if (ObjCCategoryImplDecl *CatImpl =
9080                    dyn_cast<ObjCCategoryImplDecl>(D)) {
9081       SearchDecl = CatImpl->getCategoryDecl();
9082       IsInImplementation = true;
9083     } else
9084       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
9085   }
9086 
9087   if (!SearchDecl && S) {
9088     if (DeclContext *DC = S->getEntity())
9089       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
9090   }
9091 
9092   if (!SearchDecl) {
9093     HandleCodeCompleteResults(this, CodeCompleter,
9094                               CodeCompletionContext::CCC_Other, nullptr, 0);
9095     return;
9096   }
9097 
9098   // Find all of the methods that we could declare/implement here.
9099   KnownMethodsMap KnownMethods;
9100   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, ReturnType,
9101                            KnownMethods);
9102 
9103   // Add declarations or definitions for each of the known methods.
9104   typedef CodeCompletionResult Result;
9105   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
9106                         CodeCompleter->getCodeCompletionTUInfo(),
9107                         CodeCompletionContext::CCC_Other);
9108   Results.EnterNewScope();
9109   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
9110   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
9111                                  MEnd = KnownMethods.end();
9112        M != MEnd; ++M) {
9113     ObjCMethodDecl *Method = M->second.getPointer();
9114     CodeCompletionBuilder Builder(Results.getAllocator(),
9115                                   Results.getCodeCompletionTUInfo());
9116 
9117     // Add the '-'/'+' prefix if it wasn't provided yet.
9118     if (!IsInstanceMethod) {
9119       Builder.AddTextChunk(Method->isInstanceMethod() ? "-" : "+");
9120       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9121     }
9122 
9123     // If the result type was not already provided, add it to the
9124     // pattern as (type).
9125     if (ReturnType.isNull()) {
9126       QualType ResTy = Method->getSendResultType().stripObjCKindOfType(Context);
9127       AttributedType::stripOuterNullability(ResTy);
9128       AddObjCPassingTypeChunk(ResTy, Method->getObjCDeclQualifier(), Context,
9129                               Policy, Builder);
9130     }
9131 
9132     Selector Sel = Method->getSelector();
9133 
9134     if (Sel.isUnarySelector()) {
9135       // Unary selectors have no arguments.
9136       Builder.AddTypedTextChunk(
9137           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
9138     } else {
9139       // Add all parameters to the pattern.
9140       unsigned I = 0;
9141       for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
9142                                           PEnd = Method->param_end();
9143            P != PEnd; (void)++P, ++I) {
9144         // Add the part of the selector name.
9145         if (I == 0)
9146           Builder.AddTypedTextChunk(
9147               Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
9148         else if (I < Sel.getNumArgs()) {
9149           Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9150           Builder.AddTypedTextChunk(
9151               Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
9152         } else
9153           break;
9154 
9155         // Add the parameter type.
9156         QualType ParamType;
9157         if ((*P)->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability)
9158           ParamType = (*P)->getType();
9159         else
9160           ParamType = (*P)->getOriginalType();
9161         ParamType = ParamType.substObjCTypeArgs(
9162             Context, {}, ObjCSubstitutionContext::Parameter);
9163         AttributedType::stripOuterNullability(ParamType);
9164         AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(),
9165                                 Context, Policy, Builder);
9166 
9167         if (IdentifierInfo *Id = (*P)->getIdentifier())
9168           Builder.AddTextChunk(
9169               Builder.getAllocator().CopyString(Id->getName()));
9170       }
9171     }
9172 
9173     if (Method->isVariadic()) {
9174       if (Method->param_size() > 0)
9175         Builder.AddChunk(CodeCompletionString::CK_Comma);
9176       Builder.AddTextChunk("...");
9177     }
9178 
9179     if (IsInImplementation && Results.includeCodePatterns()) {
9180       // We will be defining the method here, so add a compound statement.
9181       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9182       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
9183       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
9184       if (!Method->getReturnType()->isVoidType()) {
9185         // If the result type is not void, add a return clause.
9186         Builder.AddTextChunk("return");
9187         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9188         Builder.AddPlaceholderChunk("expression");
9189         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
9190       } else
9191         Builder.AddPlaceholderChunk("statements");
9192 
9193       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
9194       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
9195     }
9196 
9197     unsigned Priority = CCP_CodePattern;
9198     auto R = Result(Builder.TakeString(), Method, Priority);
9199     if (!M->second.getInt())
9200       setInBaseClass(R);
9201     Results.AddResult(std::move(R));
9202   }
9203 
9204   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
9205   // the properties in this class and its categories.
9206   if (Context.getLangOpts().ObjC) {
9207     SmallVector<ObjCContainerDecl *, 4> Containers;
9208     Containers.push_back(SearchDecl);
9209 
9210     VisitedSelectorSet KnownSelectors;
9211     for (KnownMethodsMap::iterator M = KnownMethods.begin(),
9212                                    MEnd = KnownMethods.end();
9213          M != MEnd; ++M)
9214       KnownSelectors.insert(M->first);
9215 
9216     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
9217     if (!IFace)
9218       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
9219         IFace = Category->getClassInterface();
9220 
9221     if (IFace)
9222       for (auto *Cat : IFace->visible_categories())
9223         Containers.push_back(Cat);
9224 
9225     if (IsInstanceMethod) {
9226       for (unsigned I = 0, N = Containers.size(); I != N; ++I)
9227         for (auto *P : Containers[I]->instance_properties())
9228           AddObjCKeyValueCompletions(P, *IsInstanceMethod, ReturnType, Context,
9229                                      KnownSelectors, Results);
9230     }
9231   }
9232 
9233   Results.ExitScope();
9234 
9235   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9236                             Results.data(), Results.size());
9237 }
9238 
9239 void Sema::CodeCompleteObjCMethodDeclSelector(
9240     Scope *S, bool IsInstanceMethod, bool AtParameterName, ParsedType ReturnTy,
9241     ArrayRef<IdentifierInfo *> SelIdents) {
9242   // If we have an external source, load the entire class method
9243   // pool from the AST file.
9244   if (ExternalSource) {
9245     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N;
9246          ++I) {
9247       Selector Sel = ExternalSource->GetExternalSelector(I);
9248       if (Sel.isNull() || MethodPool.count(Sel))
9249         continue;
9250 
9251       ReadMethodPool(Sel);
9252     }
9253   }
9254 
9255   // Build the set of methods we can see.
9256   typedef CodeCompletionResult Result;
9257   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
9258                         CodeCompleter->getCodeCompletionTUInfo(),
9259                         CodeCompletionContext::CCC_Other);
9260 
9261   if (ReturnTy)
9262     Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType());
9263 
9264   Results.EnterNewScope();
9265   for (GlobalMethodPool::iterator M = MethodPool.begin(),
9266                                   MEnd = MethodPool.end();
9267        M != MEnd; ++M) {
9268     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first
9269                                                      : &M->second.second;
9270          MethList && MethList->getMethod(); MethList = MethList->getNext()) {
9271       if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
9272         continue;
9273 
9274       if (AtParameterName) {
9275         // Suggest parameter names we've seen before.
9276         unsigned NumSelIdents = SelIdents.size();
9277         if (NumSelIdents &&
9278             NumSelIdents <= MethList->getMethod()->param_size()) {
9279           ParmVarDecl *Param =
9280               MethList->getMethod()->parameters()[NumSelIdents - 1];
9281           if (Param->getIdentifier()) {
9282             CodeCompletionBuilder Builder(Results.getAllocator(),
9283                                           Results.getCodeCompletionTUInfo());
9284             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
9285                 Param->getIdentifier()->getName()));
9286             Results.AddResult(Builder.TakeString());
9287           }
9288         }
9289 
9290         continue;
9291       }
9292 
9293       Result R(MethList->getMethod(),
9294                Results.getBasePriority(MethList->getMethod()), nullptr);
9295       R.StartParameter = SelIdents.size();
9296       R.AllParametersAreInformative = false;
9297       R.DeclaringEntity = true;
9298       Results.MaybeAddResult(R, CurContext);
9299     }
9300   }
9301 
9302   Results.ExitScope();
9303 
9304   if (!AtParameterName && !SelIdents.empty() &&
9305       SelIdents.front()->getName().startswith("init")) {
9306     for (const auto &M : PP.macros()) {
9307       if (M.first->getName() != "NS_DESIGNATED_INITIALIZER")
9308         continue;
9309       Results.EnterNewScope();
9310       CodeCompletionBuilder Builder(Results.getAllocator(),
9311                                     Results.getCodeCompletionTUInfo());
9312       Builder.AddTypedTextChunk(
9313           Builder.getAllocator().CopyString(M.first->getName()));
9314       Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_Macro,
9315                                              CXCursor_MacroDefinition));
9316       Results.ExitScope();
9317     }
9318   }
9319 
9320   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9321                             Results.data(), Results.size());
9322 }
9323 
9324 void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
9325   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
9326                         CodeCompleter->getCodeCompletionTUInfo(),
9327                         CodeCompletionContext::CCC_PreprocessorDirective);
9328   Results.EnterNewScope();
9329 
9330   // #if <condition>
9331   CodeCompletionBuilder Builder(Results.getAllocator(),
9332                                 Results.getCodeCompletionTUInfo());
9333   Builder.AddTypedTextChunk("if");
9334   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9335   Builder.AddPlaceholderChunk("condition");
9336   Results.AddResult(Builder.TakeString());
9337 
9338   // #ifdef <macro>
9339   Builder.AddTypedTextChunk("ifdef");
9340   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9341   Builder.AddPlaceholderChunk("macro");
9342   Results.AddResult(Builder.TakeString());
9343 
9344   // #ifndef <macro>
9345   Builder.AddTypedTextChunk("ifndef");
9346   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9347   Builder.AddPlaceholderChunk("macro");
9348   Results.AddResult(Builder.TakeString());
9349 
9350   if (InConditional) {
9351     // #elif <condition>
9352     Builder.AddTypedTextChunk("elif");
9353     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9354     Builder.AddPlaceholderChunk("condition");
9355     Results.AddResult(Builder.TakeString());
9356 
9357     // #elifdef <macro>
9358     Builder.AddTypedTextChunk("elifdef");
9359     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9360     Builder.AddPlaceholderChunk("macro");
9361     Results.AddResult(Builder.TakeString());
9362 
9363     // #elifndef <macro>
9364     Builder.AddTypedTextChunk("elifndef");
9365     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9366     Builder.AddPlaceholderChunk("macro");
9367     Results.AddResult(Builder.TakeString());
9368 
9369     // #else
9370     Builder.AddTypedTextChunk("else");
9371     Results.AddResult(Builder.TakeString());
9372 
9373     // #endif
9374     Builder.AddTypedTextChunk("endif");
9375     Results.AddResult(Builder.TakeString());
9376   }
9377 
9378   // #include "header"
9379   Builder.AddTypedTextChunk("include");
9380   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9381   Builder.AddTextChunk("\"");
9382   Builder.AddPlaceholderChunk("header");
9383   Builder.AddTextChunk("\"");
9384   Results.AddResult(Builder.TakeString());
9385 
9386   // #include <header>
9387   Builder.AddTypedTextChunk("include");
9388   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9389   Builder.AddTextChunk("<");
9390   Builder.AddPlaceholderChunk("header");
9391   Builder.AddTextChunk(">");
9392   Results.AddResult(Builder.TakeString());
9393 
9394   // #define <macro>
9395   Builder.AddTypedTextChunk("define");
9396   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9397   Builder.AddPlaceholderChunk("macro");
9398   Results.AddResult(Builder.TakeString());
9399 
9400   // #define <macro>(<args>)
9401   Builder.AddTypedTextChunk("define");
9402   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9403   Builder.AddPlaceholderChunk("macro");
9404   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9405   Builder.AddPlaceholderChunk("args");
9406   Builder.AddChunk(CodeCompletionString::CK_RightParen);
9407   Results.AddResult(Builder.TakeString());
9408 
9409   // #undef <macro>
9410   Builder.AddTypedTextChunk("undef");
9411   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9412   Builder.AddPlaceholderChunk("macro");
9413   Results.AddResult(Builder.TakeString());
9414 
9415   // #line <number>
9416   Builder.AddTypedTextChunk("line");
9417   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9418   Builder.AddPlaceholderChunk("number");
9419   Results.AddResult(Builder.TakeString());
9420 
9421   // #line <number> "filename"
9422   Builder.AddTypedTextChunk("line");
9423   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9424   Builder.AddPlaceholderChunk("number");
9425   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9426   Builder.AddTextChunk("\"");
9427   Builder.AddPlaceholderChunk("filename");
9428   Builder.AddTextChunk("\"");
9429   Results.AddResult(Builder.TakeString());
9430 
9431   // #error <message>
9432   Builder.AddTypedTextChunk("error");
9433   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9434   Builder.AddPlaceholderChunk("message");
9435   Results.AddResult(Builder.TakeString());
9436 
9437   // #pragma <arguments>
9438   Builder.AddTypedTextChunk("pragma");
9439   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9440   Builder.AddPlaceholderChunk("arguments");
9441   Results.AddResult(Builder.TakeString());
9442 
9443   if (getLangOpts().ObjC) {
9444     // #import "header"
9445     Builder.AddTypedTextChunk("import");
9446     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9447     Builder.AddTextChunk("\"");
9448     Builder.AddPlaceholderChunk("header");
9449     Builder.AddTextChunk("\"");
9450     Results.AddResult(Builder.TakeString());
9451 
9452     // #import <header>
9453     Builder.AddTypedTextChunk("import");
9454     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9455     Builder.AddTextChunk("<");
9456     Builder.AddPlaceholderChunk("header");
9457     Builder.AddTextChunk(">");
9458     Results.AddResult(Builder.TakeString());
9459   }
9460 
9461   // #include_next "header"
9462   Builder.AddTypedTextChunk("include_next");
9463   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9464   Builder.AddTextChunk("\"");
9465   Builder.AddPlaceholderChunk("header");
9466   Builder.AddTextChunk("\"");
9467   Results.AddResult(Builder.TakeString());
9468 
9469   // #include_next <header>
9470   Builder.AddTypedTextChunk("include_next");
9471   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9472   Builder.AddTextChunk("<");
9473   Builder.AddPlaceholderChunk("header");
9474   Builder.AddTextChunk(">");
9475   Results.AddResult(Builder.TakeString());
9476 
9477   // #warning <message>
9478   Builder.AddTypedTextChunk("warning");
9479   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9480   Builder.AddPlaceholderChunk("message");
9481   Results.AddResult(Builder.TakeString());
9482 
9483   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
9484   // completions for them. And __include_macros is a Clang-internal extension
9485   // that we don't want to encourage anyone to use.
9486 
9487   // FIXME: we don't support #assert or #unassert, so don't suggest them.
9488   Results.ExitScope();
9489 
9490   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9491                             Results.data(), Results.size());
9492 }
9493 
9494 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
9495   CodeCompleteOrdinaryName(S, S->getFnParent() ? Sema::PCC_RecoveryInFunction
9496                                                : Sema::PCC_Namespace);
9497 }
9498 
9499 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
9500   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
9501                         CodeCompleter->getCodeCompletionTUInfo(),
9502                         IsDefinition ? CodeCompletionContext::CCC_MacroName
9503                                      : CodeCompletionContext::CCC_MacroNameUse);
9504   if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
9505     // Add just the names of macros, not their arguments.
9506     CodeCompletionBuilder Builder(Results.getAllocator(),
9507                                   Results.getCodeCompletionTUInfo());
9508     Results.EnterNewScope();
9509     for (Preprocessor::macro_iterator M = PP.macro_begin(),
9510                                       MEnd = PP.macro_end();
9511          M != MEnd; ++M) {
9512       Builder.AddTypedTextChunk(
9513           Builder.getAllocator().CopyString(M->first->getName()));
9514       Results.AddResult(CodeCompletionResult(
9515           Builder.TakeString(), CCP_CodePattern, CXCursor_MacroDefinition));
9516     }
9517     Results.ExitScope();
9518   } else if (IsDefinition) {
9519     // FIXME: Can we detect when the user just wrote an include guard above?
9520   }
9521 
9522   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9523                             Results.data(), Results.size());
9524 }
9525 
9526 void Sema::CodeCompletePreprocessorExpression() {
9527   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
9528                         CodeCompleter->getCodeCompletionTUInfo(),
9529                         CodeCompletionContext::CCC_PreprocessorExpression);
9530 
9531   if (!CodeCompleter || CodeCompleter->includeMacros())
9532     AddMacroResults(PP, Results,
9533                     !CodeCompleter || CodeCompleter->loadExternal(), true);
9534 
9535   // defined (<macro>)
9536   Results.EnterNewScope();
9537   CodeCompletionBuilder Builder(Results.getAllocator(),
9538                                 Results.getCodeCompletionTUInfo());
9539   Builder.AddTypedTextChunk("defined");
9540   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
9541   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9542   Builder.AddPlaceholderChunk("macro");
9543   Builder.AddChunk(CodeCompletionString::CK_RightParen);
9544   Results.AddResult(Builder.TakeString());
9545   Results.ExitScope();
9546 
9547   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9548                             Results.data(), Results.size());
9549 }
9550 
9551 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
9552                                                  IdentifierInfo *Macro,
9553                                                  MacroInfo *MacroInfo,
9554                                                  unsigned Argument) {
9555   // FIXME: In the future, we could provide "overload" results, much like we
9556   // do for function calls.
9557 
9558   // Now just ignore this. There will be another code-completion callback
9559   // for the expanded tokens.
9560 }
9561 
9562 // This handles completion inside an #include filename, e.g. #include <foo/ba
9563 // We look for the directory "foo" under each directory on the include path,
9564 // list its files, and reassemble the appropriate #include.
9565 void Sema::CodeCompleteIncludedFile(llvm::StringRef Dir, bool Angled) {
9566   // RelDir should use /, but unescaped \ is possible on windows!
9567   // Our completions will normalize to / for simplicity, this case is rare.
9568   std::string RelDir = llvm::sys::path::convert_to_slash(Dir);
9569   // We need the native slashes for the actual file system interactions.
9570   SmallString<128> NativeRelDir = StringRef(RelDir);
9571   llvm::sys::path::native(NativeRelDir);
9572   llvm::vfs::FileSystem &FS =
9573       getSourceManager().getFileManager().getVirtualFileSystem();
9574 
9575   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
9576                         CodeCompleter->getCodeCompletionTUInfo(),
9577                         CodeCompletionContext::CCC_IncludedFile);
9578   llvm::DenseSet<StringRef> SeenResults; // To deduplicate results.
9579 
9580   // Helper: adds one file or directory completion result.
9581   auto AddCompletion = [&](StringRef Filename, bool IsDirectory) {
9582     SmallString<64> TypedChunk = Filename;
9583     // Directory completion is up to the slash, e.g. <sys/
9584     TypedChunk.push_back(IsDirectory ? '/' : Angled ? '>' : '"');
9585     auto R = SeenResults.insert(TypedChunk);
9586     if (R.second) { // New completion
9587       const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk);
9588       *R.first = InternedTyped; // Avoid dangling StringRef.
9589       CodeCompletionBuilder Builder(CodeCompleter->getAllocator(),
9590                                     CodeCompleter->getCodeCompletionTUInfo());
9591       Builder.AddTypedTextChunk(InternedTyped);
9592       // The result is a "Pattern", which is pretty opaque.
9593       // We may want to include the real filename to allow smart ranking.
9594       Results.AddResult(CodeCompletionResult(Builder.TakeString()));
9595     }
9596   };
9597 
9598   // Helper: scans IncludeDir for nice files, and adds results for each.
9599   auto AddFilesFromIncludeDir = [&](StringRef IncludeDir,
9600                                     bool IsSystem,
9601                                     DirectoryLookup::LookupType_t LookupType) {
9602     llvm::SmallString<128> Dir = IncludeDir;
9603     if (!NativeRelDir.empty()) {
9604       if (LookupType == DirectoryLookup::LT_Framework) {
9605         // For a framework dir, #include <Foo/Bar/> actually maps to
9606         // a path of Foo.framework/Headers/Bar/.
9607         auto Begin = llvm::sys::path::begin(NativeRelDir);
9608         auto End = llvm::sys::path::end(NativeRelDir);
9609 
9610         llvm::sys::path::append(Dir, *Begin + ".framework", "Headers");
9611         llvm::sys::path::append(Dir, ++Begin, End);
9612       } else {
9613         llvm::sys::path::append(Dir, NativeRelDir);
9614       }
9615     }
9616 
9617     const StringRef &Dirname = llvm::sys::path::filename(Dir);
9618     const bool isQt = Dirname.startswith("Qt") || Dirname == "ActiveQt";
9619     const bool ExtensionlessHeaders =
9620         IsSystem || isQt || Dir.endswith(".framework/Headers");
9621     std::error_code EC;
9622     unsigned Count = 0;
9623     for (auto It = FS.dir_begin(Dir, EC);
9624          !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) {
9625       if (++Count == 2500) // If we happen to hit a huge directory,
9626         break;             // bail out early so we're not too slow.
9627       StringRef Filename = llvm::sys::path::filename(It->path());
9628 
9629       // To know whether a symlink should be treated as file or a directory, we
9630       // have to stat it. This should be cheap enough as there shouldn't be many
9631       // symlinks.
9632       llvm::sys::fs::file_type Type = It->type();
9633       if (Type == llvm::sys::fs::file_type::symlink_file) {
9634         if (auto FileStatus = FS.status(It->path()))
9635           Type = FileStatus->getType();
9636       }
9637       switch (Type) {
9638       case llvm::sys::fs::file_type::directory_file:
9639         // All entries in a framework directory must have a ".framework" suffix,
9640         // but the suffix does not appear in the source code's include/import.
9641         if (LookupType == DirectoryLookup::LT_Framework &&
9642             NativeRelDir.empty() && !Filename.consume_back(".framework"))
9643           break;
9644 
9645         AddCompletion(Filename, /*IsDirectory=*/true);
9646         break;
9647       case llvm::sys::fs::file_type::regular_file: {
9648         // Only files that really look like headers. (Except in special dirs).
9649         // Header extensions from Types.def, which we can't depend on here.
9650         const bool IsHeader = Filename.endswith_insensitive(".h") ||
9651                               Filename.endswith_insensitive(".hh") ||
9652                               Filename.endswith_insensitive(".hpp") ||
9653                               Filename.endswith_insensitive(".inc") ||
9654                               (ExtensionlessHeaders && !Filename.contains('.'));
9655         if (!IsHeader)
9656           break;
9657         AddCompletion(Filename, /*IsDirectory=*/false);
9658         break;
9659       }
9660       default:
9661         break;
9662       }
9663     }
9664   };
9665 
9666   // Helper: adds results relative to IncludeDir, if possible.
9667   auto AddFilesFromDirLookup = [&](const DirectoryLookup &IncludeDir,
9668                                    bool IsSystem) {
9669     switch (IncludeDir.getLookupType()) {
9670     case DirectoryLookup::LT_HeaderMap:
9671       // header maps are not (currently) enumerable.
9672       break;
9673     case DirectoryLookup::LT_NormalDir:
9674       AddFilesFromIncludeDir(IncludeDir.getDir()->getName(), IsSystem,
9675                              DirectoryLookup::LT_NormalDir);
9676       break;
9677     case DirectoryLookup::LT_Framework:
9678       AddFilesFromIncludeDir(IncludeDir.getFrameworkDir()->getName(), IsSystem,
9679                              DirectoryLookup::LT_Framework);
9680       break;
9681     }
9682   };
9683 
9684   // Finally with all our helpers, we can scan the include path.
9685   // Do this in standard order so deduplication keeps the right file.
9686   // (In case we decide to add more details to the results later).
9687   const auto &S = PP.getHeaderSearchInfo();
9688   using llvm::make_range;
9689   if (!Angled) {
9690     // The current directory is on the include path for "quoted" includes.
9691     auto *CurFile = PP.getCurrentFileLexer()->getFileEntry();
9692     if (CurFile && CurFile->getDir())
9693       AddFilesFromIncludeDir(CurFile->getDir()->getName(), false,
9694                              DirectoryLookup::LT_NormalDir);
9695     for (const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end()))
9696       AddFilesFromDirLookup(D, false);
9697   }
9698   for (const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end()))
9699     AddFilesFromDirLookup(D, false);
9700   for (const auto &D : make_range(S.system_dir_begin(), S.system_dir_end()))
9701     AddFilesFromDirLookup(D, true);
9702 
9703   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9704                             Results.data(), Results.size());
9705 }
9706 
9707 void Sema::CodeCompleteNaturalLanguage() {
9708   HandleCodeCompleteResults(this, CodeCompleter,
9709                             CodeCompletionContext::CCC_NaturalLanguage, nullptr,
9710                             0);
9711 }
9712 
9713 void Sema::CodeCompleteAvailabilityPlatformName() {
9714   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
9715                         CodeCompleter->getCodeCompletionTUInfo(),
9716                         CodeCompletionContext::CCC_Other);
9717   Results.EnterNewScope();
9718   static const char *Platforms[] = {"macOS", "iOS", "watchOS", "tvOS"};
9719   for (const char *Platform : llvm::makeArrayRef(Platforms)) {
9720     Results.AddResult(CodeCompletionResult(Platform));
9721     Results.AddResult(CodeCompletionResult(Results.getAllocator().CopyString(
9722         Twine(Platform) + "ApplicationExtension")));
9723   }
9724   Results.ExitScope();
9725   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
9726                             Results.data(), Results.size());
9727 }
9728 
9729 void Sema::GatherGlobalCodeCompletions(
9730     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
9731     SmallVectorImpl<CodeCompletionResult> &Results) {
9732   ResultBuilder Builder(*this, Allocator, CCTUInfo,
9733                         CodeCompletionContext::CCC_Recovery);
9734   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
9735     CodeCompletionDeclConsumer Consumer(Builder,
9736                                         Context.getTranslationUnitDecl());
9737     LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName,
9738                        Consumer,
9739                        !CodeCompleter || CodeCompleter->loadExternal());
9740   }
9741 
9742   if (!CodeCompleter || CodeCompleter->includeMacros())
9743     AddMacroResults(PP, Builder,
9744                     !CodeCompleter || CodeCompleter->loadExternal(), true);
9745 
9746   Results.clear();
9747   Results.insert(Results.end(), Builder.data(),
9748                  Builder.data() + Builder.size());
9749 }
9750