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