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   if (!CandidateSet.empty()) {
4793     // Sort the overload candidate set by placing the best overloads first.
4794     std::stable_sort(
4795         CandidateSet.begin(), CandidateSet.end(),
4796         [&](const OverloadCandidate &X, const OverloadCandidate &Y) {
4797           return isBetterOverloadCandidate(SemaRef, X, Y, Loc,
4798                                            CandidateSet.getKind());
4799         });
4800 
4801     // Add the remaining viable overload candidates as code-completion results.
4802     for (OverloadCandidate &Candidate : CandidateSet) {
4803       if (Candidate.Function && Candidate.Function->isDeleted())
4804         continue;
4805       if (Candidate.Viable)
4806         Results.push_back(ResultCandidate(Candidate.Function));
4807     }
4808   }
4809 }
4810 
4811 /// Get the type of the Nth parameter from a given set of overload
4812 /// candidates.
4813 static QualType getParamType(Sema &SemaRef,
4814                              ArrayRef<ResultCandidate> Candidates, unsigned N) {
4815 
4816   // Given the overloads 'Candidates' for a function call matching all arguments
4817   // up to N, return the type of the Nth parameter if it is the same for all
4818   // overload candidates.
4819   QualType ParamType;
4820   for (auto &Candidate : Candidates) {
4821     if (const auto *FType = Candidate.getFunctionType())
4822       if (const auto *Proto = dyn_cast<FunctionProtoType>(FType))
4823         if (N < Proto->getNumParams()) {
4824           if (ParamType.isNull())
4825             ParamType = Proto->getParamType(N);
4826           else if (!SemaRef.Context.hasSameUnqualifiedType(
4827                        ParamType.getNonReferenceType(),
4828                        Proto->getParamType(N).getNonReferenceType()))
4829             // Otherwise return a default-constructed QualType.
4830             return QualType();
4831         }
4832   }
4833 
4834   return ParamType;
4835 }
4836 
4837 static QualType
4838 ProduceSignatureHelp(Sema &SemaRef, Scope *S,
4839                      MutableArrayRef<ResultCandidate> Candidates,
4840                      unsigned CurrentArg, SourceLocation OpenParLoc) {
4841   if (Candidates.empty())
4842     return QualType();
4843   SemaRef.CodeCompleter->ProcessOverloadCandidates(
4844       SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc);
4845   return getParamType(SemaRef, Candidates, CurrentArg);
4846 }
4847 
4848 QualType Sema::ProduceCallSignatureHelp(Scope *S, Expr *Fn,
4849                                         ArrayRef<Expr *> Args,
4850                                         SourceLocation OpenParLoc) {
4851   if (!CodeCompleter)
4852     return QualType();
4853 
4854   // FIXME: Provide support for variadic template functions.
4855   // Ignore type-dependent call expressions entirely.
4856   if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) ||
4857       Expr::hasAnyTypeDependentArguments(Args)) {
4858     return QualType();
4859   }
4860 
4861   // Build an overload candidate set based on the functions we find.
4862   SourceLocation Loc = Fn->getExprLoc();
4863   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
4864 
4865   SmallVector<ResultCandidate, 8> Results;
4866 
4867   Expr *NakedFn = Fn->IgnoreParenCasts();
4868   if (auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn))
4869     AddOverloadedCallCandidates(ULE, Args, CandidateSet,
4870                                 /*PartialOverloading=*/true);
4871   else if (auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) {
4872     TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr;
4873     if (UME->hasExplicitTemplateArgs()) {
4874       UME->copyTemplateArgumentsInto(TemplateArgsBuffer);
4875       TemplateArgs = &TemplateArgsBuffer;
4876     }
4877 
4878     // Add the base as first argument (use a nullptr if the base is implicit).
4879     SmallVector<Expr *, 12> ArgExprs(
4880         1, UME->isImplicitAccess() ? nullptr : UME->getBase());
4881     ArgExprs.append(Args.begin(), Args.end());
4882     UnresolvedSet<8> Decls;
4883     Decls.append(UME->decls_begin(), UME->decls_end());
4884     const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase();
4885     AddFunctionCandidates(Decls, ArgExprs, CandidateSet, TemplateArgs,
4886                           /*SuppressUsedConversions=*/false,
4887                           /*PartialOverloading=*/true, FirstArgumentIsBase);
4888   } else {
4889     FunctionDecl *FD = nullptr;
4890     if (auto *MCE = dyn_cast<MemberExpr>(NakedFn))
4891       FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl());
4892     else if (auto *DRE = dyn_cast<DeclRefExpr>(NakedFn))
4893       FD = dyn_cast<FunctionDecl>(DRE->getDecl());
4894     if (FD) { // We check whether it's a resolved function declaration.
4895       if (!getLangOpts().CPlusPlus ||
4896           !FD->getType()->getAs<FunctionProtoType>())
4897         Results.push_back(ResultCandidate(FD));
4898       else
4899         AddOverloadCandidate(FD, DeclAccessPair::make(FD, FD->getAccess()),
4900                              Args, CandidateSet,
4901                              /*SuppressUsedConversions=*/false,
4902                              /*PartialOverloading=*/true);
4903 
4904     } else if (auto DC = NakedFn->getType()->getAsCXXRecordDecl()) {
4905       // If expression's type is CXXRecordDecl, it may overload the function
4906       // call operator, so we check if it does and add them as candidates.
4907       // A complete type is needed to lookup for member function call operators.
4908       if (isCompleteType(Loc, NakedFn->getType())) {
4909         DeclarationName OpName =
4910             Context.DeclarationNames.getCXXOperatorName(OO_Call);
4911         LookupResult R(*this, OpName, Loc, LookupOrdinaryName);
4912         LookupQualifiedName(R, DC);
4913         R.suppressDiagnostics();
4914         SmallVector<Expr *, 12> ArgExprs(1, NakedFn);
4915         ArgExprs.append(Args.begin(), Args.end());
4916         AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs, CandidateSet,
4917                               /*ExplicitArgs=*/nullptr,
4918                               /*SuppressUsedConversions=*/false,
4919                               /*PartialOverloading=*/true);
4920       }
4921     } else {
4922       // Lastly we check whether expression's type is function pointer or
4923       // function.
4924       QualType T = NakedFn->getType();
4925       if (!T->getPointeeType().isNull())
4926         T = T->getPointeeType();
4927 
4928       if (auto FP = T->getAs<FunctionProtoType>()) {
4929         if (!TooManyArguments(FP->getNumParams(), Args.size(),
4930                               /*PartialOverloading=*/true) ||
4931             FP->isVariadic())
4932           Results.push_back(ResultCandidate(FP));
4933       } else if (auto FT = T->getAs<FunctionType>())
4934         // No prototype and declaration, it may be a K & R style function.
4935         Results.push_back(ResultCandidate(FT));
4936     }
4937   }
4938   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc);
4939   QualType ParamType =
4940       ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc);
4941   return !CandidateSet.empty() ? ParamType : QualType();
4942 }
4943 
4944 QualType Sema::ProduceConstructorSignatureHelp(Scope *S, QualType Type,
4945                                                SourceLocation Loc,
4946                                                ArrayRef<Expr *> Args,
4947                                                SourceLocation OpenParLoc) {
4948   if (!CodeCompleter)
4949     return QualType();
4950 
4951   // A complete type is needed to lookup for constructors.
4952   CXXRecordDecl *RD =
4953       isCompleteType(Loc, Type) ? Type->getAsCXXRecordDecl() : nullptr;
4954   if (!RD)
4955     return Type;
4956 
4957   // FIXME: Provide support for member initializers.
4958   // FIXME: Provide support for variadic template constructors.
4959 
4960   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
4961 
4962   for (NamedDecl *C : LookupConstructors(RD)) {
4963     if (auto *FD = dyn_cast<FunctionDecl>(C)) {
4964       AddOverloadCandidate(FD, DeclAccessPair::make(FD, C->getAccess()), Args,
4965                            CandidateSet,
4966                            /*SuppressUsedConversions=*/false,
4967                            /*PartialOverloading=*/true);
4968     } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(C)) {
4969       AddTemplateOverloadCandidate(
4970           FTD, DeclAccessPair::make(FTD, C->getAccess()),
4971           /*ExplicitTemplateArgs=*/nullptr, Args, CandidateSet,
4972           /*SuppressUsedConversions=*/false,
4973           /*PartialOverloading=*/true);
4974     }
4975   }
4976 
4977   SmallVector<ResultCandidate, 8> Results;
4978   mergeCandidatesWithResults(*this, Results, CandidateSet, Loc);
4979   return ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc);
4980 }
4981 
4982 QualType Sema::ProduceCtorInitMemberSignatureHelp(
4983     Scope *S, Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy,
4984     ArrayRef<Expr *> ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc) {
4985   if (!CodeCompleter)
4986     return QualType();
4987 
4988   CXXConstructorDecl *Constructor =
4989       dyn_cast<CXXConstructorDecl>(ConstructorDecl);
4990   if (!Constructor)
4991     return QualType();
4992   // FIXME: Add support for Base class constructors as well.
4993   if (ValueDecl *MemberDecl = tryLookupCtorInitMemberDecl(
4994           Constructor->getParent(), SS, TemplateTypeTy, II))
4995     return ProduceConstructorSignatureHelp(getCurScope(), MemberDecl->getType(),
4996                                            MemberDecl->getLocation(), ArgExprs,
4997                                            OpenParLoc);
4998   return QualType();
4999 }
5000 
5001 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) {
5002   ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
5003   if (!VD) {
5004     CodeCompleteOrdinaryName(S, PCC_Expression);
5005     return;
5006   }
5007 
5008   CodeCompleteExpressionData Data;
5009   Data.PreferredType = VD->getType();
5010   // Ignore VD to avoid completing the variable itself, e.g. in 'int foo = ^'.
5011   Data.IgnoreDecls.push_back(VD);
5012 
5013   CodeCompleteExpression(S, Data);
5014 }
5015 
5016 void Sema::CodeCompleteAfterIf(Scope *S) {
5017   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5018                         CodeCompleter->getCodeCompletionTUInfo(),
5019                         mapCodeCompletionContext(*this, PCC_Statement));
5020   Results.setFilter(&ResultBuilder::IsOrdinaryName);
5021   Results.EnterNewScope();
5022 
5023   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5024   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5025                      CodeCompleter->includeGlobals(),
5026                      CodeCompleter->loadExternal());
5027 
5028   AddOrdinaryNameResults(PCC_Statement, S, *this, Results);
5029 
5030   // "else" block
5031   CodeCompletionBuilder Builder(Results.getAllocator(),
5032                                 Results.getCodeCompletionTUInfo());
5033   Builder.AddTypedTextChunk("else");
5034   if (Results.includeCodePatterns()) {
5035     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5036     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5037     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5038     Builder.AddPlaceholderChunk("statements");
5039     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5040     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5041   }
5042   Results.AddResult(Builder.TakeString());
5043 
5044   // "else if" block
5045   Builder.AddTypedTextChunk("else");
5046   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5047   Builder.AddTextChunk("if");
5048   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5049   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5050   if (getLangOpts().CPlusPlus)
5051     Builder.AddPlaceholderChunk("condition");
5052   else
5053     Builder.AddPlaceholderChunk("expression");
5054   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5055   if (Results.includeCodePatterns()) {
5056     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5057     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5058     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5059     Builder.AddPlaceholderChunk("statements");
5060     Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
5061     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5062   }
5063   Results.AddResult(Builder.TakeString());
5064 
5065   Results.ExitScope();
5066 
5067   if (S->getFnParent())
5068     AddPrettyFunctionResults(getLangOpts(), Results);
5069 
5070   if (CodeCompleter->includeMacros())
5071     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
5072 
5073   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5074                             Results.data(), Results.size());
5075 }
5076 
5077 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS,
5078                                    bool EnteringContext, QualType BaseType) {
5079   if (SS.isEmpty() || !CodeCompleter)
5080     return;
5081 
5082   // We want to keep the scope specifier even if it's invalid (e.g. the scope
5083   // "a::b::" is not corresponding to any context/namespace in the AST), since
5084   // it can be useful for global code completion which have information about
5085   // contexts/symbols that are not in the AST.
5086   if (SS.isInvalid()) {
5087     CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol);
5088     CC.setCXXScopeSpecifier(SS);
5089     // As SS is invalid, we try to collect accessible contexts from the current
5090     // scope with a dummy lookup so that the completion consumer can try to
5091     // guess what the specified scope is.
5092     ResultBuilder DummyResults(*this, CodeCompleter->getAllocator(),
5093                                CodeCompleter->getCodeCompletionTUInfo(), CC);
5094     if (S->getEntity()) {
5095       CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(),
5096                                           BaseType);
5097       LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5098                          /*IncludeGlobalScope=*/false,
5099                          /*LoadExternal=*/false);
5100     }
5101     HandleCodeCompleteResults(this, CodeCompleter,
5102                               DummyResults.getCompletionContext(), nullptr, 0);
5103     return;
5104   }
5105   // Always pretend to enter a context to ensure that a dependent type
5106   // resolves to a dependent record.
5107   DeclContext *Ctx = computeDeclContext(SS, /*EnteringContext=*/true);
5108   if (!Ctx)
5109     return;
5110 
5111   // Try to instantiate any non-dependent declaration contexts before
5112   // we look in them.
5113   if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx))
5114     return;
5115 
5116   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5117                         CodeCompleter->getCodeCompletionTUInfo(),
5118                         CodeCompletionContext::CCC_Symbol);
5119   Results.EnterNewScope();
5120 
5121   // The "template" keyword can follow "::" in the grammar, but only
5122   // put it into the grammar if the nested-name-specifier is dependent.
5123   NestedNameSpecifier *NNS = SS.getScopeRep();
5124   if (!Results.empty() && NNS->isDependent())
5125     Results.AddResult("template");
5126 
5127   // Add calls to overridden virtual functions, if there are any.
5128   //
5129   // FIXME: This isn't wonderful, because we don't know whether we're actually
5130   // in a context that permits expressions. This is a general issue with
5131   // qualified-id completions.
5132   if (!EnteringContext)
5133     MaybeAddOverrideCalls(*this, Ctx, Results);
5134   Results.ExitScope();
5135 
5136   if (CodeCompleter->includeNamespaceLevelDecls() ||
5137       (!Ctx->isNamespace() && !Ctx->isTranslationUnit())) {
5138     CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType);
5139     LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer,
5140                        /*IncludeGlobalScope=*/true,
5141                        /*IncludeDependentBases=*/true,
5142                        CodeCompleter->loadExternal());
5143   }
5144 
5145   auto CC = Results.getCompletionContext();
5146   CC.setCXXScopeSpecifier(SS);
5147 
5148   HandleCodeCompleteResults(this, CodeCompleter, CC, Results.data(),
5149                             Results.size());
5150 }
5151 
5152 void Sema::CodeCompleteUsing(Scope *S) {
5153   if (!CodeCompleter)
5154     return;
5155 
5156   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5157                         CodeCompleter->getCodeCompletionTUInfo(),
5158                         // This can be both a using alias or using
5159                         // declaration, in the former we expect a new name and a
5160                         // symbol in the latter case.
5161                         CodeCompletionContext::CCC_SymbolOrNewName,
5162                         &ResultBuilder::IsNestedNameSpecifier);
5163   Results.EnterNewScope();
5164 
5165   // If we aren't in class scope, we could see the "namespace" keyword.
5166   if (!S->isClassScope())
5167     Results.AddResult(CodeCompletionResult("namespace"));
5168 
5169   // After "using", we can see anything that would start a
5170   // nested-name-specifier.
5171   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5172   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5173                      CodeCompleter->includeGlobals(),
5174                      CodeCompleter->loadExternal());
5175   Results.ExitScope();
5176 
5177   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5178                             Results.data(), Results.size());
5179 }
5180 
5181 void Sema::CodeCompleteUsingDirective(Scope *S) {
5182   if (!CodeCompleter)
5183     return;
5184 
5185   // After "using namespace", we expect to see a namespace name or namespace
5186   // alias.
5187   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5188                         CodeCompleter->getCodeCompletionTUInfo(),
5189                         CodeCompletionContext::CCC_Namespace,
5190                         &ResultBuilder::IsNamespaceOrAlias);
5191   Results.EnterNewScope();
5192   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5193   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5194                      CodeCompleter->includeGlobals(),
5195                      CodeCompleter->loadExternal());
5196   Results.ExitScope();
5197   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5198                             Results.data(), Results.size());
5199 }
5200 
5201 void Sema::CodeCompleteNamespaceDecl(Scope *S) {
5202   if (!CodeCompleter)
5203     return;
5204 
5205   DeclContext *Ctx = S->getEntity();
5206   if (!S->getParent())
5207     Ctx = Context.getTranslationUnitDecl();
5208 
5209   bool SuppressedGlobalResults =
5210       Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
5211 
5212   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5213                         CodeCompleter->getCodeCompletionTUInfo(),
5214                         SuppressedGlobalResults
5215                             ? CodeCompletionContext::CCC_Namespace
5216                             : CodeCompletionContext::CCC_Other,
5217                         &ResultBuilder::IsNamespace);
5218 
5219   if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
5220     // We only want to see those namespaces that have already been defined
5221     // within this scope, because its likely that the user is creating an
5222     // extended namespace declaration. Keep track of the most recent
5223     // definition of each namespace.
5224     std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
5225     for (DeclContext::specific_decl_iterator<NamespaceDecl>
5226              NS(Ctx->decls_begin()),
5227          NSEnd(Ctx->decls_end());
5228          NS != NSEnd; ++NS)
5229       OrigToLatest[NS->getOriginalNamespace()] = *NS;
5230 
5231     // Add the most recent definition (or extended definition) of each
5232     // namespace to the list of results.
5233     Results.EnterNewScope();
5234     for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
5235              NS = OrigToLatest.begin(),
5236              NSEnd = OrigToLatest.end();
5237          NS != NSEnd; ++NS)
5238       Results.AddResult(
5239           CodeCompletionResult(NS->second, Results.getBasePriority(NS->second),
5240                                nullptr),
5241           CurContext, nullptr, false);
5242     Results.ExitScope();
5243   }
5244 
5245   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5246                             Results.data(), Results.size());
5247 }
5248 
5249 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S) {
5250   if (!CodeCompleter)
5251     return;
5252 
5253   // After "namespace", we expect to see a namespace or alias.
5254   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5255                         CodeCompleter->getCodeCompletionTUInfo(),
5256                         CodeCompletionContext::CCC_Namespace,
5257                         &ResultBuilder::IsNamespaceOrAlias);
5258   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5259   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5260                      CodeCompleter->includeGlobals(),
5261                      CodeCompleter->loadExternal());
5262   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5263                             Results.data(), Results.size());
5264 }
5265 
5266 void Sema::CodeCompleteOperatorName(Scope *S) {
5267   if (!CodeCompleter)
5268     return;
5269 
5270   typedef CodeCompletionResult Result;
5271   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5272                         CodeCompleter->getCodeCompletionTUInfo(),
5273                         CodeCompletionContext::CCC_Type,
5274                         &ResultBuilder::IsType);
5275   Results.EnterNewScope();
5276 
5277   // Add the names of overloadable operators.
5278 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
5279   if (std::strcmp(Spelling, "?"))                                              \
5280     Results.AddResult(Result(Spelling));
5281 #include "clang/Basic/OperatorKinds.def"
5282 
5283   // Add any type names visible from the current scope
5284   Results.allowNestedNameSpecifiers();
5285   CodeCompletionDeclConsumer Consumer(Results, CurContext);
5286   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
5287                      CodeCompleter->includeGlobals(),
5288                      CodeCompleter->loadExternal());
5289 
5290   // Add any type specifiers
5291   AddTypeSpecifierResults(getLangOpts(), Results);
5292   Results.ExitScope();
5293 
5294   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5295                             Results.data(), Results.size());
5296 }
5297 
5298 void Sema::CodeCompleteConstructorInitializer(
5299     Decl *ConstructorD, ArrayRef<CXXCtorInitializer *> Initializers) {
5300   if (!ConstructorD)
5301     return;
5302 
5303   AdjustDeclIfTemplate(ConstructorD);
5304 
5305   auto *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD);
5306   if (!Constructor)
5307     return;
5308 
5309   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5310                         CodeCompleter->getCodeCompletionTUInfo(),
5311                         CodeCompletionContext::CCC_Symbol);
5312   Results.EnterNewScope();
5313 
5314   // Fill in any already-initialized fields or base classes.
5315   llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
5316   llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
5317   for (unsigned I = 0, E = Initializers.size(); I != E; ++I) {
5318     if (Initializers[I]->isBaseInitializer())
5319       InitializedBases.insert(Context.getCanonicalType(
5320           QualType(Initializers[I]->getBaseClass(), 0)));
5321     else
5322       InitializedFields.insert(
5323           cast<FieldDecl>(Initializers[I]->getAnyMember()));
5324   }
5325 
5326   // Add completions for base classes.
5327   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
5328   bool SawLastInitializer = Initializers.empty();
5329   CXXRecordDecl *ClassDecl = Constructor->getParent();
5330 
5331   auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) {
5332     CodeCompletionBuilder Builder(Results.getAllocator(),
5333                                   Results.getCodeCompletionTUInfo());
5334     Builder.AddTypedTextChunk(Name);
5335     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5336     if (const auto *Function = dyn_cast<FunctionDecl>(ND))
5337       AddFunctionParameterChunks(PP, Policy, Function, Builder);
5338     else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND))
5339       AddFunctionParameterChunks(PP, Policy, FunTemplDecl->getTemplatedDecl(),
5340                                  Builder);
5341     Builder.AddChunk(CodeCompletionString::CK_RightParen);
5342     return Builder.TakeString();
5343   };
5344   auto AddDefaultCtorInit = [&](const char *Name, const char *Type,
5345                                 const NamedDecl *ND) {
5346     CodeCompletionBuilder Builder(Results.getAllocator(),
5347                                   Results.getCodeCompletionTUInfo());
5348     Builder.AddTypedTextChunk(Name);
5349     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5350     Builder.AddPlaceholderChunk(Type);
5351     Builder.AddChunk(CodeCompletionString::CK_RightParen);
5352     if (ND) {
5353       auto CCR = CodeCompletionResult(
5354           Builder.TakeString(), ND,
5355           SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration);
5356       if (isa<FieldDecl>(ND))
5357         CCR.CursorKind = CXCursor_MemberRef;
5358       return Results.AddResult(CCR);
5359     }
5360     return Results.AddResult(CodeCompletionResult(
5361         Builder.TakeString(),
5362         SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration));
5363   };
5364   auto AddCtorsWithName = [&](const CXXRecordDecl *RD, unsigned int Priority,
5365                               const char *Name, const FieldDecl *FD) {
5366     if (!RD)
5367       return AddDefaultCtorInit(Name,
5368                                 FD ? Results.getAllocator().CopyString(
5369                                          FD->getType().getAsString(Policy))
5370                                    : Name,
5371                                 FD);
5372     auto Ctors = getConstructors(Context, RD);
5373     if (Ctors.begin() == Ctors.end())
5374       return AddDefaultCtorInit(Name, Name, RD);
5375     for (const NamedDecl *Ctor : Ctors) {
5376       auto CCR = CodeCompletionResult(GenerateCCS(Ctor, Name), RD, Priority);
5377       CCR.CursorKind = getCursorKindForDecl(Ctor);
5378       Results.AddResult(CCR);
5379     }
5380   };
5381   auto AddBase = [&](const CXXBaseSpecifier &Base) {
5382     const char *BaseName =
5383         Results.getAllocator().CopyString(Base.getType().getAsString(Policy));
5384     const auto *RD = Base.getType()->getAsCXXRecordDecl();
5385     AddCtorsWithName(
5386         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
5387         BaseName, nullptr);
5388   };
5389   auto AddField = [&](const FieldDecl *FD) {
5390     const char *FieldName =
5391         Results.getAllocator().CopyString(FD->getIdentifier()->getName());
5392     const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl();
5393     AddCtorsWithName(
5394         RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
5395         FieldName, FD);
5396   };
5397 
5398   for (const auto &Base : ClassDecl->bases()) {
5399     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
5400              .second) {
5401       SawLastInitializer =
5402           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
5403           Context.hasSameUnqualifiedType(
5404               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
5405       continue;
5406     }
5407 
5408     AddBase(Base);
5409     SawLastInitializer = false;
5410   }
5411 
5412   // Add completions for virtual base classes.
5413   for (const auto &Base : ClassDecl->vbases()) {
5414     if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))
5415              .second) {
5416       SawLastInitializer =
5417           !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
5418           Context.hasSameUnqualifiedType(
5419               Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
5420       continue;
5421     }
5422 
5423     AddBase(Base);
5424     SawLastInitializer = false;
5425   }
5426 
5427   // Add completions for members.
5428   for (auto *Field : ClassDecl->fields()) {
5429     if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))
5430              .second) {
5431       SawLastInitializer = !Initializers.empty() &&
5432                            Initializers.back()->isAnyMemberInitializer() &&
5433                            Initializers.back()->getAnyMember() == Field;
5434       continue;
5435     }
5436 
5437     if (!Field->getDeclName())
5438       continue;
5439 
5440     AddField(Field);
5441     SawLastInitializer = false;
5442   }
5443   Results.ExitScope();
5444 
5445   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5446                             Results.data(), Results.size());
5447 }
5448 
5449 /// Determine whether this scope denotes a namespace.
5450 static bool isNamespaceScope(Scope *S) {
5451   DeclContext *DC = S->getEntity();
5452   if (!DC)
5453     return false;
5454 
5455   return DC->isFileContext();
5456 }
5457 
5458 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro,
5459                                         bool AfterAmpersand) {
5460   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5461                         CodeCompleter->getCodeCompletionTUInfo(),
5462                         CodeCompletionContext::CCC_Other);
5463   Results.EnterNewScope();
5464 
5465   // Note what has already been captured.
5466   llvm::SmallPtrSet<IdentifierInfo *, 4> Known;
5467   bool IncludedThis = false;
5468   for (const auto &C : Intro.Captures) {
5469     if (C.Kind == LCK_This) {
5470       IncludedThis = true;
5471       continue;
5472     }
5473 
5474     Known.insert(C.Id);
5475   }
5476 
5477   // Look for other capturable variables.
5478   for (; S && !isNamespaceScope(S); S = S->getParent()) {
5479     for (const auto *D : S->decls()) {
5480       const auto *Var = dyn_cast<VarDecl>(D);
5481       if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>())
5482         continue;
5483 
5484       if (Known.insert(Var->getIdentifier()).second)
5485         Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration),
5486                           CurContext, nullptr, false);
5487     }
5488   }
5489 
5490   // Add 'this', if it would be valid.
5491   if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy)
5492     addThisCompletion(*this, Results);
5493 
5494   Results.ExitScope();
5495 
5496   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5497                             Results.data(), Results.size());
5498 }
5499 
5500 /// Macro that optionally prepends an "@" to the string literal passed in via
5501 /// Keyword, depending on whether NeedAt is true or false.
5502 #define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword)
5503 
5504 static void AddObjCImplementationResults(const LangOptions &LangOpts,
5505                                          ResultBuilder &Results, bool NeedAt) {
5506   typedef CodeCompletionResult Result;
5507   // Since we have an implementation, we can end it.
5508   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
5509 
5510   CodeCompletionBuilder Builder(Results.getAllocator(),
5511                                 Results.getCodeCompletionTUInfo());
5512   if (LangOpts.ObjC) {
5513     // @dynamic
5514     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "dynamic"));
5515     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5516     Builder.AddPlaceholderChunk("property");
5517     Results.AddResult(Result(Builder.TakeString()));
5518 
5519     // @synthesize
5520     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synthesize"));
5521     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5522     Builder.AddPlaceholderChunk("property");
5523     Results.AddResult(Result(Builder.TakeString()));
5524   }
5525 }
5526 
5527 static void AddObjCInterfaceResults(const LangOptions &LangOpts,
5528                                     ResultBuilder &Results, bool NeedAt) {
5529   typedef CodeCompletionResult Result;
5530 
5531   // Since we have an interface or protocol, we can end it.
5532   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
5533 
5534   if (LangOpts.ObjC) {
5535     // @property
5536     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "property")));
5537 
5538     // @required
5539     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "required")));
5540 
5541     // @optional
5542     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "optional")));
5543   }
5544 }
5545 
5546 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
5547   typedef CodeCompletionResult Result;
5548   CodeCompletionBuilder Builder(Results.getAllocator(),
5549                                 Results.getCodeCompletionTUInfo());
5550 
5551   // @class name ;
5552   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "class"));
5553   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5554   Builder.AddPlaceholderChunk("name");
5555   Results.AddResult(Result(Builder.TakeString()));
5556 
5557   if (Results.includeCodePatterns()) {
5558     // @interface name
5559     // FIXME: Could introduce the whole pattern, including superclasses and
5560     // such.
5561     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "interface"));
5562     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5563     Builder.AddPlaceholderChunk("class");
5564     Results.AddResult(Result(Builder.TakeString()));
5565 
5566     // @protocol name
5567     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
5568     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5569     Builder.AddPlaceholderChunk("protocol");
5570     Results.AddResult(Result(Builder.TakeString()));
5571 
5572     // @implementation name
5573     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "implementation"));
5574     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5575     Builder.AddPlaceholderChunk("class");
5576     Results.AddResult(Result(Builder.TakeString()));
5577   }
5578 
5579   // @compatibility_alias name
5580   Builder.AddTypedTextChunk(
5581       OBJC_AT_KEYWORD_NAME(NeedAt, "compatibility_alias"));
5582   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5583   Builder.AddPlaceholderChunk("alias");
5584   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5585   Builder.AddPlaceholderChunk("class");
5586   Results.AddResult(Result(Builder.TakeString()));
5587 
5588   if (Results.getSema().getLangOpts().Modules) {
5589     // @import name
5590     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import"));
5591     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5592     Builder.AddPlaceholderChunk("module");
5593     Results.AddResult(Result(Builder.TakeString()));
5594   }
5595 }
5596 
5597 void Sema::CodeCompleteObjCAtDirective(Scope *S) {
5598   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5599                         CodeCompleter->getCodeCompletionTUInfo(),
5600                         CodeCompletionContext::CCC_Other);
5601   Results.EnterNewScope();
5602   if (isa<ObjCImplDecl>(CurContext))
5603     AddObjCImplementationResults(getLangOpts(), Results, false);
5604   else if (CurContext->isObjCContainer())
5605     AddObjCInterfaceResults(getLangOpts(), Results, false);
5606   else
5607     AddObjCTopLevelResults(Results, false);
5608   Results.ExitScope();
5609   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5610                             Results.data(), Results.size());
5611 }
5612 
5613 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
5614   typedef CodeCompletionResult Result;
5615   CodeCompletionBuilder Builder(Results.getAllocator(),
5616                                 Results.getCodeCompletionTUInfo());
5617 
5618   // @encode ( type-name )
5619   const char *EncodeType = "char[]";
5620   if (Results.getSema().getLangOpts().CPlusPlus ||
5621       Results.getSema().getLangOpts().ConstStrings)
5622     EncodeType = "const char[]";
5623   Builder.AddResultTypeChunk(EncodeType);
5624   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "encode"));
5625   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5626   Builder.AddPlaceholderChunk("type-name");
5627   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5628   Results.AddResult(Result(Builder.TakeString()));
5629 
5630   // @protocol ( protocol-name )
5631   Builder.AddResultTypeChunk("Protocol *");
5632   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
5633   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5634   Builder.AddPlaceholderChunk("protocol-name");
5635   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5636   Results.AddResult(Result(Builder.TakeString()));
5637 
5638   // @selector ( selector )
5639   Builder.AddResultTypeChunk("SEL");
5640   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "selector"));
5641   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5642   Builder.AddPlaceholderChunk("selector");
5643   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5644   Results.AddResult(Result(Builder.TakeString()));
5645 
5646   // @"string"
5647   Builder.AddResultTypeChunk("NSString *");
5648   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "\""));
5649   Builder.AddPlaceholderChunk("string");
5650   Builder.AddTextChunk("\"");
5651   Results.AddResult(Result(Builder.TakeString()));
5652 
5653   // @[objects, ...]
5654   Builder.AddResultTypeChunk("NSArray *");
5655   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "["));
5656   Builder.AddPlaceholderChunk("objects, ...");
5657   Builder.AddChunk(CodeCompletionString::CK_RightBracket);
5658   Results.AddResult(Result(Builder.TakeString()));
5659 
5660   // @{key : object, ...}
5661   Builder.AddResultTypeChunk("NSDictionary *");
5662   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "{"));
5663   Builder.AddPlaceholderChunk("key");
5664   Builder.AddChunk(CodeCompletionString::CK_Colon);
5665   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5666   Builder.AddPlaceholderChunk("object, ...");
5667   Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5668   Results.AddResult(Result(Builder.TakeString()));
5669 
5670   // @(expression)
5671   Builder.AddResultTypeChunk("id");
5672   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "("));
5673   Builder.AddPlaceholderChunk("expression");
5674   Builder.AddChunk(CodeCompletionString::CK_RightParen);
5675   Results.AddResult(Result(Builder.TakeString()));
5676 }
5677 
5678 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
5679   typedef CodeCompletionResult Result;
5680   CodeCompletionBuilder Builder(Results.getAllocator(),
5681                                 Results.getCodeCompletionTUInfo());
5682 
5683   if (Results.includeCodePatterns()) {
5684     // @try { statements } @catch ( declaration ) { statements } @finally
5685     //   { statements }
5686     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "try"));
5687     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5688     Builder.AddPlaceholderChunk("statements");
5689     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5690     Builder.AddTextChunk("@catch");
5691     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5692     Builder.AddPlaceholderChunk("parameter");
5693     Builder.AddChunk(CodeCompletionString::CK_RightParen);
5694     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5695     Builder.AddPlaceholderChunk("statements");
5696     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5697     Builder.AddTextChunk("@finally");
5698     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5699     Builder.AddPlaceholderChunk("statements");
5700     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5701     Results.AddResult(Result(Builder.TakeString()));
5702   }
5703 
5704   // @throw
5705   Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "throw"));
5706   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5707   Builder.AddPlaceholderChunk("expression");
5708   Results.AddResult(Result(Builder.TakeString()));
5709 
5710   if (Results.includeCodePatterns()) {
5711     // @synchronized ( expression ) { statements }
5712     Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synchronized"));
5713     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
5714     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5715     Builder.AddPlaceholderChunk("expression");
5716     Builder.AddChunk(CodeCompletionString::CK_RightParen);
5717     Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
5718     Builder.AddPlaceholderChunk("statements");
5719     Builder.AddChunk(CodeCompletionString::CK_RightBrace);
5720     Results.AddResult(Result(Builder.TakeString()));
5721   }
5722 }
5723 
5724 static void AddObjCVisibilityResults(const LangOptions &LangOpts,
5725                                      ResultBuilder &Results, bool NeedAt) {
5726   typedef CodeCompletionResult Result;
5727   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "private")));
5728   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "protected")));
5729   Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "public")));
5730   if (LangOpts.ObjC)
5731     Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "package")));
5732 }
5733 
5734 void Sema::CodeCompleteObjCAtVisibility(Scope *S) {
5735   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5736                         CodeCompleter->getCodeCompletionTUInfo(),
5737                         CodeCompletionContext::CCC_Other);
5738   Results.EnterNewScope();
5739   AddObjCVisibilityResults(getLangOpts(), Results, false);
5740   Results.ExitScope();
5741   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5742                             Results.data(), Results.size());
5743 }
5744 
5745 void Sema::CodeCompleteObjCAtStatement(Scope *S) {
5746   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5747                         CodeCompleter->getCodeCompletionTUInfo(),
5748                         CodeCompletionContext::CCC_Other);
5749   Results.EnterNewScope();
5750   AddObjCStatementResults(Results, false);
5751   AddObjCExpressionResults(Results, false);
5752   Results.ExitScope();
5753   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5754                             Results.data(), Results.size());
5755 }
5756 
5757 void Sema::CodeCompleteObjCAtExpression(Scope *S) {
5758   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5759                         CodeCompleter->getCodeCompletionTUInfo(),
5760                         CodeCompletionContext::CCC_Other);
5761   Results.EnterNewScope();
5762   AddObjCExpressionResults(Results, false);
5763   Results.ExitScope();
5764   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5765                             Results.data(), Results.size());
5766 }
5767 
5768 /// Determine whether the addition of the given flag to an Objective-C
5769 /// property's attributes will cause a conflict.
5770 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
5771   // Check if we've already added this flag.
5772   if (Attributes & NewFlag)
5773     return true;
5774 
5775   Attributes |= NewFlag;
5776 
5777   // Check for collisions with "readonly".
5778   if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
5779       (Attributes & ObjCDeclSpec::DQ_PR_readwrite))
5780     return true;
5781 
5782   // Check for more than one of { assign, copy, retain, strong, weak }.
5783   unsigned AssignCopyRetMask =
5784       Attributes &
5785       (ObjCDeclSpec::DQ_PR_assign | ObjCDeclSpec::DQ_PR_unsafe_unretained |
5786        ObjCDeclSpec::DQ_PR_copy | ObjCDeclSpec::DQ_PR_retain |
5787        ObjCDeclSpec::DQ_PR_strong | ObjCDeclSpec::DQ_PR_weak);
5788   if (AssignCopyRetMask && AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign &&
5789       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained &&
5790       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy &&
5791       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain &&
5792       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong &&
5793       AssignCopyRetMask != ObjCDeclSpec::DQ_PR_weak)
5794     return true;
5795 
5796   return false;
5797 }
5798 
5799 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
5800   if (!CodeCompleter)
5801     return;
5802 
5803   unsigned Attributes = ODS.getPropertyAttributes();
5804 
5805   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
5806                         CodeCompleter->getCodeCompletionTUInfo(),
5807                         CodeCompletionContext::CCC_Other);
5808   Results.EnterNewScope();
5809   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly))
5810     Results.AddResult(CodeCompletionResult("readonly"));
5811   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign))
5812     Results.AddResult(CodeCompletionResult("assign"));
5813   if (!ObjCPropertyFlagConflicts(Attributes,
5814                                  ObjCDeclSpec::DQ_PR_unsafe_unretained))
5815     Results.AddResult(CodeCompletionResult("unsafe_unretained"));
5816   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite))
5817     Results.AddResult(CodeCompletionResult("readwrite"));
5818   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain))
5819     Results.AddResult(CodeCompletionResult("retain"));
5820   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong))
5821     Results.AddResult(CodeCompletionResult("strong"));
5822   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy))
5823     Results.AddResult(CodeCompletionResult("copy"));
5824   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic))
5825     Results.AddResult(CodeCompletionResult("nonatomic"));
5826   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic))
5827     Results.AddResult(CodeCompletionResult("atomic"));
5828 
5829   // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC.
5830   if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC)
5831     if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_weak))
5832       Results.AddResult(CodeCompletionResult("weak"));
5833 
5834   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) {
5835     CodeCompletionBuilder Setter(Results.getAllocator(),
5836                                  Results.getCodeCompletionTUInfo());
5837     Setter.AddTypedTextChunk("setter");
5838     Setter.AddTextChunk("=");
5839     Setter.AddPlaceholderChunk("method");
5840     Results.AddResult(CodeCompletionResult(Setter.TakeString()));
5841   }
5842   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) {
5843     CodeCompletionBuilder Getter(Results.getAllocator(),
5844                                  Results.getCodeCompletionTUInfo());
5845     Getter.AddTypedTextChunk("getter");
5846     Getter.AddTextChunk("=");
5847     Getter.AddPlaceholderChunk("method");
5848     Results.AddResult(CodeCompletionResult(Getter.TakeString()));
5849   }
5850   if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nullability)) {
5851     Results.AddResult(CodeCompletionResult("nonnull"));
5852     Results.AddResult(CodeCompletionResult("nullable"));
5853     Results.AddResult(CodeCompletionResult("null_unspecified"));
5854     Results.AddResult(CodeCompletionResult("null_resettable"));
5855   }
5856   Results.ExitScope();
5857   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
5858                             Results.data(), Results.size());
5859 }
5860 
5861 /// Describes the kind of Objective-C method that we want to find
5862 /// via code completion.
5863 enum ObjCMethodKind {
5864   MK_Any, ///< Any kind of method, provided it means other specified criteria.
5865   MK_ZeroArgSelector, ///< Zero-argument (unary) selector.
5866   MK_OneArgSelector   ///< One-argument selector.
5867 };
5868 
5869 static bool isAcceptableObjCSelector(Selector Sel, ObjCMethodKind WantKind,
5870                                      ArrayRef<IdentifierInfo *> SelIdents,
5871                                      bool AllowSameLength = true) {
5872   unsigned NumSelIdents = SelIdents.size();
5873   if (NumSelIdents > Sel.getNumArgs())
5874     return false;
5875 
5876   switch (WantKind) {
5877   case MK_Any:
5878     break;
5879   case MK_ZeroArgSelector:
5880     return Sel.isUnarySelector();
5881   case MK_OneArgSelector:
5882     return Sel.getNumArgs() == 1;
5883   }
5884 
5885   if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
5886     return false;
5887 
5888   for (unsigned I = 0; I != NumSelIdents; ++I)
5889     if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
5890       return false;
5891 
5892   return true;
5893 }
5894 
5895 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,
5896                                    ObjCMethodKind WantKind,
5897                                    ArrayRef<IdentifierInfo *> SelIdents,
5898                                    bool AllowSameLength = true) {
5899   return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
5900                                   AllowSameLength);
5901 }
5902 
5903 /// A set of selectors, which is used to avoid introducing multiple
5904 /// completions with the same selector into the result set.
5905 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet;
5906 
5907 /// Add all of the Objective-C methods in the given Objective-C
5908 /// container to the set of results.
5909 ///
5910 /// The container will be a class, protocol, category, or implementation of
5911 /// any of the above. This mether will recurse to include methods from
5912 /// the superclasses of classes along with their categories, protocols, and
5913 /// implementations.
5914 ///
5915 /// \param Container the container in which we'll look to find methods.
5916 ///
5917 /// \param WantInstanceMethods Whether to add instance methods (only); if
5918 /// false, this routine will add factory methods (only).
5919 ///
5920 /// \param CurContext the context in which we're performing the lookup that
5921 /// finds methods.
5922 ///
5923 /// \param AllowSameLength Whether we allow a method to be added to the list
5924 /// when it has the same number of parameters as we have selector identifiers.
5925 ///
5926 /// \param Results the structure into which we'll add results.
5927 static void AddObjCMethods(ObjCContainerDecl *Container,
5928                            bool WantInstanceMethods, ObjCMethodKind WantKind,
5929                            ArrayRef<IdentifierInfo *> SelIdents,
5930                            DeclContext *CurContext,
5931                            VisitedSelectorSet &Selectors, bool AllowSameLength,
5932                            ResultBuilder &Results, bool InOriginalClass = true,
5933                            bool IsRootClass = false) {
5934   typedef CodeCompletionResult Result;
5935   Container = getContainerDef(Container);
5936   ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
5937   IsRootClass = IsRootClass || (IFace && !IFace->getSuperClass());
5938   for (ObjCMethodDecl *M : Container->methods()) {
5939     // The instance methods on the root class can be messaged via the
5940     // metaclass.
5941     if (M->isInstanceMethod() == WantInstanceMethods ||
5942         (IsRootClass && !WantInstanceMethods)) {
5943       // Check whether the selector identifiers we've been given are a
5944       // subset of the identifiers for this particular method.
5945       if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength))
5946         continue;
5947 
5948       if (!Selectors.insert(M->getSelector()).second)
5949         continue;
5950 
5951       Result R = Result(M, Results.getBasePriority(M), nullptr);
5952       R.StartParameter = SelIdents.size();
5953       R.AllParametersAreInformative = (WantKind != MK_Any);
5954       if (!InOriginalClass)
5955         setInBaseClass(R);
5956       Results.MaybeAddResult(R, CurContext);
5957     }
5958   }
5959 
5960   // Visit the protocols of protocols.
5961   if (const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
5962     if (Protocol->hasDefinition()) {
5963       const ObjCList<ObjCProtocolDecl> &Protocols =
5964           Protocol->getReferencedProtocols();
5965       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5966                                                 E = Protocols.end();
5967            I != E; ++I)
5968         AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
5969                        Selectors, AllowSameLength, Results, false, IsRootClass);
5970     }
5971   }
5972 
5973   if (!IFace || !IFace->hasDefinition())
5974     return;
5975 
5976   // Add methods in protocols.
5977   for (ObjCProtocolDecl *I : IFace->protocols())
5978     AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext,
5979                    Selectors, AllowSameLength, Results, false, IsRootClass);
5980 
5981   // Add methods in categories.
5982   for (ObjCCategoryDecl *CatDecl : IFace->known_categories()) {
5983     AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
5984                    CurContext, Selectors, AllowSameLength, Results,
5985                    InOriginalClass, IsRootClass);
5986 
5987     // Add a categories protocol methods.
5988     const ObjCList<ObjCProtocolDecl> &Protocols =
5989         CatDecl->getReferencedProtocols();
5990     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
5991                                               E = Protocols.end();
5992          I != E; ++I)
5993       AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
5994                      Selectors, AllowSameLength, Results, false, IsRootClass);
5995 
5996     // Add methods in category implementations.
5997     if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
5998       AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
5999                      Selectors, AllowSameLength, Results, InOriginalClass,
6000                      IsRootClass);
6001   }
6002 
6003   // Add methods in superclass.
6004   // Avoid passing in IsRootClass since root classes won't have super classes.
6005   if (IFace->getSuperClass())
6006     AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
6007                    SelIdents, CurContext, Selectors, AllowSameLength, Results,
6008                    /*IsRootClass=*/false);
6009 
6010   // Add methods in our implementation, if any.
6011   if (ObjCImplementationDecl *Impl = IFace->getImplementation())
6012     AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
6013                    Selectors, AllowSameLength, Results, InOriginalClass,
6014                    IsRootClass);
6015 }
6016 
6017 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) {
6018   // Try to find the interface where getters might live.
6019   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
6020   if (!Class) {
6021     if (ObjCCategoryDecl *Category =
6022             dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
6023       Class = Category->getClassInterface();
6024 
6025     if (!Class)
6026       return;
6027   }
6028 
6029   // Find all of the potential getters.
6030   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6031                         CodeCompleter->getCodeCompletionTUInfo(),
6032                         CodeCompletionContext::CCC_Other);
6033   Results.EnterNewScope();
6034 
6035   VisitedSelectorSet Selectors;
6036   AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors,
6037                  /*AllowSameLength=*/true, Results);
6038   Results.ExitScope();
6039   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6040                             Results.data(), Results.size());
6041 }
6042 
6043 void Sema::CodeCompleteObjCPropertySetter(Scope *S) {
6044   // Try to find the interface where setters might live.
6045   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext);
6046   if (!Class) {
6047     if (ObjCCategoryDecl *Category =
6048             dyn_cast_or_null<ObjCCategoryDecl>(CurContext))
6049       Class = Category->getClassInterface();
6050 
6051     if (!Class)
6052       return;
6053   }
6054 
6055   // Find all of the potential getters.
6056   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6057                         CodeCompleter->getCodeCompletionTUInfo(),
6058                         CodeCompletionContext::CCC_Other);
6059   Results.EnterNewScope();
6060 
6061   VisitedSelectorSet Selectors;
6062   AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext, Selectors,
6063                  /*AllowSameLength=*/true, Results);
6064 
6065   Results.ExitScope();
6066   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6067                             Results.data(), Results.size());
6068 }
6069 
6070 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
6071                                        bool IsParameter) {
6072   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6073                         CodeCompleter->getCodeCompletionTUInfo(),
6074                         CodeCompletionContext::CCC_Type);
6075   Results.EnterNewScope();
6076 
6077   // Add context-sensitive, Objective-C parameter-passing keywords.
6078   bool AddedInOut = false;
6079   if ((DS.getObjCDeclQualifier() &
6080        (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) {
6081     Results.AddResult("in");
6082     Results.AddResult("inout");
6083     AddedInOut = true;
6084   }
6085   if ((DS.getObjCDeclQualifier() &
6086        (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) {
6087     Results.AddResult("out");
6088     if (!AddedInOut)
6089       Results.AddResult("inout");
6090   }
6091   if ((DS.getObjCDeclQualifier() &
6092        (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref |
6093         ObjCDeclSpec::DQ_Oneway)) == 0) {
6094     Results.AddResult("bycopy");
6095     Results.AddResult("byref");
6096     Results.AddResult("oneway");
6097   }
6098   if ((DS.getObjCDeclQualifier() & ObjCDeclSpec::DQ_CSNullability) == 0) {
6099     Results.AddResult("nonnull");
6100     Results.AddResult("nullable");
6101     Results.AddResult("null_unspecified");
6102   }
6103 
6104   // If we're completing the return type of an Objective-C method and the
6105   // identifier IBAction refers to a macro, provide a completion item for
6106   // an action, e.g.,
6107   //   IBAction)<#selector#>:(id)sender
6108   if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
6109       PP.isMacroDefined("IBAction")) {
6110     CodeCompletionBuilder Builder(Results.getAllocator(),
6111                                   Results.getCodeCompletionTUInfo(),
6112                                   CCP_CodePattern, CXAvailability_Available);
6113     Builder.AddTypedTextChunk("IBAction");
6114     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6115     Builder.AddPlaceholderChunk("selector");
6116     Builder.AddChunk(CodeCompletionString::CK_Colon);
6117     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6118     Builder.AddTextChunk("id");
6119     Builder.AddChunk(CodeCompletionString::CK_RightParen);
6120     Builder.AddTextChunk("sender");
6121     Results.AddResult(CodeCompletionResult(Builder.TakeString()));
6122   }
6123 
6124   // If we're completing the return type, provide 'instancetype'.
6125   if (!IsParameter) {
6126     Results.AddResult(CodeCompletionResult("instancetype"));
6127   }
6128 
6129   // Add various builtin type names and specifiers.
6130   AddOrdinaryNameResults(PCC_Type, S, *this, Results);
6131   Results.ExitScope();
6132 
6133   // Add the various type names
6134   Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
6135   CodeCompletionDeclConsumer Consumer(Results, CurContext);
6136   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6137                      CodeCompleter->includeGlobals(),
6138                      CodeCompleter->loadExternal());
6139 
6140   if (CodeCompleter->includeMacros())
6141     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
6142 
6143   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6144                             Results.data(), Results.size());
6145 }
6146 
6147 /// When we have an expression with type "id", we may assume
6148 /// that it has some more-specific class type based on knowledge of
6149 /// common uses of Objective-C. This routine returns that class type,
6150 /// or NULL if no better result could be determined.
6151 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {
6152   auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
6153   if (!Msg)
6154     return nullptr;
6155 
6156   Selector Sel = Msg->getSelector();
6157   if (Sel.isNull())
6158     return nullptr;
6159 
6160   IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
6161   if (!Id)
6162     return nullptr;
6163 
6164   ObjCMethodDecl *Method = Msg->getMethodDecl();
6165   if (!Method)
6166     return nullptr;
6167 
6168   // Determine the class that we're sending the message to.
6169   ObjCInterfaceDecl *IFace = nullptr;
6170   switch (Msg->getReceiverKind()) {
6171   case ObjCMessageExpr::Class:
6172     if (const ObjCObjectType *ObjType =
6173             Msg->getClassReceiver()->getAs<ObjCObjectType>())
6174       IFace = ObjType->getInterface();
6175     break;
6176 
6177   case ObjCMessageExpr::Instance: {
6178     QualType T = Msg->getInstanceReceiver()->getType();
6179     if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
6180       IFace = Ptr->getInterfaceDecl();
6181     break;
6182   }
6183 
6184   case ObjCMessageExpr::SuperInstance:
6185   case ObjCMessageExpr::SuperClass:
6186     break;
6187   }
6188 
6189   if (!IFace)
6190     return nullptr;
6191 
6192   ObjCInterfaceDecl *Super = IFace->getSuperClass();
6193   if (Method->isInstanceMethod())
6194     return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
6195         .Case("retain", IFace)
6196         .Case("strong", IFace)
6197         .Case("autorelease", IFace)
6198         .Case("copy", IFace)
6199         .Case("copyWithZone", IFace)
6200         .Case("mutableCopy", IFace)
6201         .Case("mutableCopyWithZone", IFace)
6202         .Case("awakeFromCoder", IFace)
6203         .Case("replacementObjectFromCoder", IFace)
6204         .Case("class", IFace)
6205         .Case("classForCoder", IFace)
6206         .Case("superclass", Super)
6207         .Default(nullptr);
6208 
6209   return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
6210       .Case("new", IFace)
6211       .Case("alloc", IFace)
6212       .Case("allocWithZone", IFace)
6213       .Case("class", IFace)
6214       .Case("superclass", Super)
6215       .Default(nullptr);
6216 }
6217 
6218 // Add a special completion for a message send to "super", which fills in the
6219 // most likely case of forwarding all of our arguments to the superclass
6220 // function.
6221 ///
6222 /// \param S The semantic analysis object.
6223 ///
6224 /// \param NeedSuperKeyword Whether we need to prefix this completion with
6225 /// the "super" keyword. Otherwise, we just need to provide the arguments.
6226 ///
6227 /// \param SelIdents The identifiers in the selector that have already been
6228 /// provided as arguments for a send to "super".
6229 ///
6230 /// \param Results The set of results to augment.
6231 ///
6232 /// \returns the Objective-C method declaration that would be invoked by
6233 /// this "super" completion. If NULL, no completion was added.
6234 static ObjCMethodDecl *
6235 AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,
6236                        ArrayRef<IdentifierInfo *> SelIdents,
6237                        ResultBuilder &Results) {
6238   ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
6239   if (!CurMethod)
6240     return nullptr;
6241 
6242   ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
6243   if (!Class)
6244     return nullptr;
6245 
6246   // Try to find a superclass method with the same selector.
6247   ObjCMethodDecl *SuperMethod = nullptr;
6248   while ((Class = Class->getSuperClass()) && !SuperMethod) {
6249     // Check in the class
6250     SuperMethod = Class->getMethod(CurMethod->getSelector(),
6251                                    CurMethod->isInstanceMethod());
6252 
6253     // Check in categories or class extensions.
6254     if (!SuperMethod) {
6255       for (const auto *Cat : Class->known_categories()) {
6256         if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(),
6257                                           CurMethod->isInstanceMethod())))
6258           break;
6259       }
6260     }
6261   }
6262 
6263   if (!SuperMethod)
6264     return nullptr;
6265 
6266   // Check whether the superclass method has the same signature.
6267   if (CurMethod->param_size() != SuperMethod->param_size() ||
6268       CurMethod->isVariadic() != SuperMethod->isVariadic())
6269     return nullptr;
6270 
6271   for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
6272                                       CurPEnd = CurMethod->param_end(),
6273                                       SuperP = SuperMethod->param_begin();
6274        CurP != CurPEnd; ++CurP, ++SuperP) {
6275     // Make sure the parameter types are compatible.
6276     if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
6277                                           (*SuperP)->getType()))
6278       return nullptr;
6279 
6280     // Make sure we have a parameter name to forward!
6281     if (!(*CurP)->getIdentifier())
6282       return nullptr;
6283   }
6284 
6285   // We have a superclass method. Now, form the send-to-super completion.
6286   CodeCompletionBuilder Builder(Results.getAllocator(),
6287                                 Results.getCodeCompletionTUInfo());
6288 
6289   // Give this completion a return type.
6290   AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod,
6291                      Results.getCompletionContext().getBaseType(), Builder);
6292 
6293   // If we need the "super" keyword, add it (plus some spacing).
6294   if (NeedSuperKeyword) {
6295     Builder.AddTypedTextChunk("super");
6296     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6297   }
6298 
6299   Selector Sel = CurMethod->getSelector();
6300   if (Sel.isUnarySelector()) {
6301     if (NeedSuperKeyword)
6302       Builder.AddTextChunk(
6303           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
6304     else
6305       Builder.AddTypedTextChunk(
6306           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
6307   } else {
6308     ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
6309     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
6310       if (I > SelIdents.size())
6311         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
6312 
6313       if (I < SelIdents.size())
6314         Builder.AddInformativeChunk(
6315             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6316       else if (NeedSuperKeyword || I > SelIdents.size()) {
6317         Builder.AddTextChunk(
6318             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6319         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
6320             (*CurP)->getIdentifier()->getName()));
6321       } else {
6322         Builder.AddTypedTextChunk(
6323             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
6324         Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
6325             (*CurP)->getIdentifier()->getName()));
6326       }
6327     }
6328   }
6329 
6330   Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod,
6331                                          CCP_SuperCompletion));
6332   return SuperMethod;
6333 }
6334 
6335 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {
6336   typedef CodeCompletionResult Result;
6337   ResultBuilder Results(
6338       *this, CodeCompleter->getAllocator(),
6339       CodeCompleter->getCodeCompletionTUInfo(),
6340       CodeCompletionContext::CCC_ObjCMessageReceiver,
6341       getLangOpts().CPlusPlus11
6342           ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
6343           : &ResultBuilder::IsObjCMessageReceiver);
6344 
6345   CodeCompletionDeclConsumer Consumer(Results, CurContext);
6346   Results.EnterNewScope();
6347   LookupVisibleDecls(S, LookupOrdinaryName, Consumer,
6348                      CodeCompleter->includeGlobals(),
6349                      CodeCompleter->loadExternal());
6350 
6351   // If we are in an Objective-C method inside a class that has a superclass,
6352   // add "super" as an option.
6353   if (ObjCMethodDecl *Method = getCurMethodDecl())
6354     if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
6355       if (Iface->getSuperClass()) {
6356         Results.AddResult(Result("super"));
6357 
6358         AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results);
6359       }
6360 
6361   if (getLangOpts().CPlusPlus11)
6362     addThisCompletion(*this, Results);
6363 
6364   Results.ExitScope();
6365 
6366   if (CodeCompleter->includeMacros())
6367     AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false);
6368   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6369                             Results.data(), Results.size());
6370 }
6371 
6372 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
6373                                         ArrayRef<IdentifierInfo *> SelIdents,
6374                                         bool AtArgumentExpression) {
6375   ObjCInterfaceDecl *CDecl = nullptr;
6376   if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
6377     // Figure out which interface we're in.
6378     CDecl = CurMethod->getClassInterface();
6379     if (!CDecl)
6380       return;
6381 
6382     // Find the superclass of this class.
6383     CDecl = CDecl->getSuperClass();
6384     if (!CDecl)
6385       return;
6386 
6387     if (CurMethod->isInstanceMethod()) {
6388       // We are inside an instance method, which means that the message
6389       // send [super ...] is actually calling an instance method on the
6390       // current object.
6391       return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents,
6392                                              AtArgumentExpression, CDecl);
6393     }
6394 
6395     // Fall through to send to the superclass in CDecl.
6396   } else {
6397     // "super" may be the name of a type or variable. Figure out which
6398     // it is.
6399     IdentifierInfo *Super = getSuperIdentifier();
6400     NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, LookupOrdinaryName);
6401     if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
6402       // "super" names an interface. Use it.
6403     } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
6404       if (const ObjCObjectType *Iface =
6405               Context.getTypeDeclType(TD)->getAs<ObjCObjectType>())
6406         CDecl = Iface->getInterface();
6407     } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
6408       // "super" names an unresolved type; we can't be more specific.
6409     } else {
6410       // Assume that "super" names some kind of value and parse that way.
6411       CXXScopeSpec SS;
6412       SourceLocation TemplateKWLoc;
6413       UnqualifiedId id;
6414       id.setIdentifier(Super, SuperLoc);
6415       ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id,
6416                                                /*HasTrailingLParen=*/false,
6417                                                /*IsAddressOfOperand=*/false);
6418       return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
6419                                              SelIdents, AtArgumentExpression);
6420     }
6421 
6422     // Fall through
6423   }
6424 
6425   ParsedType Receiver;
6426   if (CDecl)
6427     Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));
6428   return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
6429                                       AtArgumentExpression,
6430                                       /*IsSuper=*/true);
6431 }
6432 
6433 /// Given a set of code-completion results for the argument of a message
6434 /// send, determine the preferred type (if any) for that argument expression.
6435 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,
6436                                                        unsigned NumSelIdents) {
6437   typedef CodeCompletionResult Result;
6438   ASTContext &Context = Results.getSema().Context;
6439 
6440   QualType PreferredType;
6441   unsigned BestPriority = CCP_Unlikely * 2;
6442   Result *ResultsData = Results.data();
6443   for (unsigned I = 0, N = Results.size(); I != N; ++I) {
6444     Result &R = ResultsData[I];
6445     if (R.Kind == Result::RK_Declaration &&
6446         isa<ObjCMethodDecl>(R.Declaration)) {
6447       if (R.Priority <= BestPriority) {
6448         const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
6449         if (NumSelIdents <= Method->param_size()) {
6450           QualType MyPreferredType =
6451               Method->parameters()[NumSelIdents - 1]->getType();
6452           if (R.Priority < BestPriority || PreferredType.isNull()) {
6453             BestPriority = R.Priority;
6454             PreferredType = MyPreferredType;
6455           } else if (!Context.hasSameUnqualifiedType(PreferredType,
6456                                                      MyPreferredType)) {
6457             PreferredType = QualType();
6458           }
6459         }
6460       }
6461     }
6462   }
6463 
6464   return PreferredType;
6465 }
6466 
6467 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,
6468                                        ParsedType Receiver,
6469                                        ArrayRef<IdentifierInfo *> SelIdents,
6470                                        bool AtArgumentExpression, bool IsSuper,
6471                                        ResultBuilder &Results) {
6472   typedef CodeCompletionResult Result;
6473   ObjCInterfaceDecl *CDecl = nullptr;
6474 
6475   // If the given name refers to an interface type, retrieve the
6476   // corresponding declaration.
6477   if (Receiver) {
6478     QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr);
6479     if (!T.isNull())
6480       if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
6481         CDecl = Interface->getInterface();
6482   }
6483 
6484   // Add all of the factory methods in this Objective-C class, its protocols,
6485   // superclasses, categories, implementation, etc.
6486   Results.EnterNewScope();
6487 
6488   // If this is a send-to-super, try to add the special "super" send
6489   // completion.
6490   if (IsSuper) {
6491     if (ObjCMethodDecl *SuperMethod =
6492             AddSuperSendCompletion(SemaRef, false, SelIdents, Results))
6493       Results.Ignore(SuperMethod);
6494   }
6495 
6496   // If we're inside an Objective-C method definition, prefer its selector to
6497   // others.
6498   if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
6499     Results.setPreferredSelector(CurMethod->getSelector());
6500 
6501   VisitedSelectorSet Selectors;
6502   if (CDecl)
6503     AddObjCMethods(CDecl, false, MK_Any, SelIdents, SemaRef.CurContext,
6504                    Selectors, AtArgumentExpression, Results);
6505   else {
6506     // We're messaging "id" as a type; provide all class/factory methods.
6507 
6508     // If we have an external source, load the entire class method
6509     // pool from the AST file.
6510     if (SemaRef.getExternalSource()) {
6511       for (uint32_t I = 0,
6512                     N = SemaRef.getExternalSource()->GetNumExternalSelectors();
6513            I != N; ++I) {
6514         Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I);
6515         if (Sel.isNull() || SemaRef.MethodPool.count(Sel))
6516           continue;
6517 
6518         SemaRef.ReadMethodPool(Sel);
6519       }
6520     }
6521 
6522     for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(),
6523                                           MEnd = SemaRef.MethodPool.end();
6524          M != MEnd; ++M) {
6525       for (ObjCMethodList *MethList = &M->second.second;
6526            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
6527         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
6528           continue;
6529 
6530         Result R(MethList->getMethod(),
6531                  Results.getBasePriority(MethList->getMethod()), nullptr);
6532         R.StartParameter = SelIdents.size();
6533         R.AllParametersAreInformative = false;
6534         Results.MaybeAddResult(R, SemaRef.CurContext);
6535       }
6536     }
6537   }
6538 
6539   Results.ExitScope();
6540 }
6541 
6542 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
6543                                         ArrayRef<IdentifierInfo *> SelIdents,
6544                                         bool AtArgumentExpression,
6545                                         bool IsSuper) {
6546 
6547   QualType T = this->GetTypeFromParser(Receiver);
6548 
6549   ResultBuilder Results(
6550       *this, CodeCompleter->getAllocator(),
6551       CodeCompleter->getCodeCompletionTUInfo(),
6552       CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, T,
6553                             SelIdents));
6554 
6555   AddClassMessageCompletions(*this, S, Receiver, SelIdents,
6556                              AtArgumentExpression, IsSuper, Results);
6557 
6558   // If we're actually at the argument expression (rather than prior to the
6559   // selector), we're actually performing code completion for an expression.
6560   // Determine whether we have a single, best method. If so, we can
6561   // code-complete the expression using the corresponding parameter type as
6562   // our preferred type, improving completion results.
6563   if (AtArgumentExpression) {
6564     QualType PreferredType =
6565         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
6566     if (PreferredType.isNull())
6567       CodeCompleteOrdinaryName(S, PCC_Expression);
6568     else
6569       CodeCompleteExpression(S, PreferredType);
6570     return;
6571   }
6572 
6573   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6574                             Results.data(), Results.size());
6575 }
6576 
6577 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,
6578                                            ArrayRef<IdentifierInfo *> SelIdents,
6579                                            bool AtArgumentExpression,
6580                                            ObjCInterfaceDecl *Super) {
6581   typedef CodeCompletionResult Result;
6582 
6583   Expr *RecExpr = static_cast<Expr *>(Receiver);
6584 
6585   // If necessary, apply function/array conversion to the receiver.
6586   // C99 6.7.5.3p[7,8].
6587   if (RecExpr) {
6588     ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr);
6589     if (Conv.isInvalid()) // conversion failed. bail.
6590       return;
6591     RecExpr = Conv.get();
6592   }
6593   QualType ReceiverType = RecExpr
6594                               ? RecExpr->getType()
6595                               : Super ? Context.getObjCObjectPointerType(
6596                                             Context.getObjCInterfaceType(Super))
6597                                       : Context.getObjCIdType();
6598 
6599   // If we're messaging an expression with type "id" or "Class", check
6600   // whether we know something special about the receiver that allows
6601   // us to assume a more-specific receiver type.
6602   if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) {
6603     if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
6604       if (ReceiverType->isObjCClassType())
6605         return CodeCompleteObjCClassMessage(
6606             S, ParsedType::make(Context.getObjCInterfaceType(IFace)), SelIdents,
6607             AtArgumentExpression, Super);
6608 
6609       ReceiverType =
6610           Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace));
6611     }
6612   } else if (RecExpr && getLangOpts().CPlusPlus) {
6613     ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr);
6614     if (Conv.isUsable()) {
6615       RecExpr = Conv.get();
6616       ReceiverType = RecExpr->getType();
6617     }
6618   }
6619 
6620   // Build the set of methods we can see.
6621   ResultBuilder Results(
6622       *this, CodeCompleter->getAllocator(),
6623       CodeCompleter->getCodeCompletionTUInfo(),
6624       CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
6625                             ReceiverType, SelIdents));
6626 
6627   Results.EnterNewScope();
6628 
6629   // If this is a send-to-super, try to add the special "super" send
6630   // completion.
6631   if (Super) {
6632     if (ObjCMethodDecl *SuperMethod =
6633             AddSuperSendCompletion(*this, false, SelIdents, Results))
6634       Results.Ignore(SuperMethod);
6635   }
6636 
6637   // If we're inside an Objective-C method definition, prefer its selector to
6638   // others.
6639   if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
6640     Results.setPreferredSelector(CurMethod->getSelector());
6641 
6642   // Keep track of the selectors we've already added.
6643   VisitedSelectorSet Selectors;
6644 
6645   // Handle messages to Class. This really isn't a message to an instance
6646   // method, so we treat it the same way we would treat a message send to a
6647   // class method.
6648   if (ReceiverType->isObjCClassType() ||
6649       ReceiverType->isObjCQualifiedClassType()) {
6650     if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {
6651       if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
6652         AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, CurContext,
6653                        Selectors, AtArgumentExpression, Results);
6654     }
6655   }
6656   // Handle messages to a qualified ID ("id<foo>").
6657   else if (const ObjCObjectPointerType *QualID =
6658                ReceiverType->getAsObjCQualifiedIdType()) {
6659     // Search protocols for instance methods.
6660     for (auto *I : QualID->quals())
6661       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors,
6662                      AtArgumentExpression, Results);
6663   }
6664   // Handle messages to a pointer to interface type.
6665   else if (const ObjCObjectPointerType *IFacePtr =
6666                ReceiverType->getAsObjCInterfacePointerType()) {
6667     // Search the class, its superclasses, etc., for instance methods.
6668     AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
6669                    CurContext, Selectors, AtArgumentExpression, Results);
6670 
6671     // Search protocols for instance methods.
6672     for (auto *I : IFacePtr->quals())
6673       AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors,
6674                      AtArgumentExpression, Results);
6675   }
6676   // Handle messages to "id".
6677   else if (ReceiverType->isObjCIdType()) {
6678     // We're messaging "id", so provide all instance methods we know
6679     // about as code-completion results.
6680 
6681     // If we have an external source, load the entire class method
6682     // pool from the AST file.
6683     if (ExternalSource) {
6684       for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors();
6685            I != N; ++I) {
6686         Selector Sel = ExternalSource->GetExternalSelector(I);
6687         if (Sel.isNull() || MethodPool.count(Sel))
6688           continue;
6689 
6690         ReadMethodPool(Sel);
6691       }
6692     }
6693 
6694     for (GlobalMethodPool::iterator M = MethodPool.begin(),
6695                                     MEnd = MethodPool.end();
6696          M != MEnd; ++M) {
6697       for (ObjCMethodList *MethList = &M->second.first;
6698            MethList && MethList->getMethod(); MethList = MethList->getNext()) {
6699         if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
6700           continue;
6701 
6702         if (!Selectors.insert(MethList->getMethod()->getSelector()).second)
6703           continue;
6704 
6705         Result R(MethList->getMethod(),
6706                  Results.getBasePriority(MethList->getMethod()), nullptr);
6707         R.StartParameter = SelIdents.size();
6708         R.AllParametersAreInformative = false;
6709         Results.MaybeAddResult(R, CurContext);
6710       }
6711     }
6712   }
6713   Results.ExitScope();
6714 
6715   // If we're actually at the argument expression (rather than prior to the
6716   // selector), we're actually performing code completion for an expression.
6717   // Determine whether we have a single, best method. If so, we can
6718   // code-complete the expression using the corresponding parameter type as
6719   // our preferred type, improving completion results.
6720   if (AtArgumentExpression) {
6721     QualType PreferredType =
6722         getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
6723     if (PreferredType.isNull())
6724       CodeCompleteOrdinaryName(S, PCC_Expression);
6725     else
6726       CodeCompleteExpression(S, PreferredType);
6727     return;
6728   }
6729 
6730   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6731                             Results.data(), Results.size());
6732 }
6733 
6734 void Sema::CodeCompleteObjCForCollection(Scope *S,
6735                                          DeclGroupPtrTy IterationVar) {
6736   CodeCompleteExpressionData Data;
6737   Data.ObjCCollection = true;
6738 
6739   if (IterationVar.getAsOpaquePtr()) {
6740     DeclGroupRef DG = IterationVar.get();
6741     for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
6742       if (*I)
6743         Data.IgnoreDecls.push_back(*I);
6744     }
6745   }
6746 
6747   CodeCompleteExpression(S, Data);
6748 }
6749 
6750 void Sema::CodeCompleteObjCSelector(Scope *S,
6751                                     ArrayRef<IdentifierInfo *> SelIdents) {
6752   // If we have an external source, load the entire class method
6753   // pool from the AST file.
6754   if (ExternalSource) {
6755     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N;
6756          ++I) {
6757       Selector Sel = ExternalSource->GetExternalSelector(I);
6758       if (Sel.isNull() || MethodPool.count(Sel))
6759         continue;
6760 
6761       ReadMethodPool(Sel);
6762     }
6763   }
6764 
6765   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6766                         CodeCompleter->getCodeCompletionTUInfo(),
6767                         CodeCompletionContext::CCC_SelectorName);
6768   Results.EnterNewScope();
6769   for (GlobalMethodPool::iterator M = MethodPool.begin(),
6770                                   MEnd = MethodPool.end();
6771        M != MEnd; ++M) {
6772 
6773     Selector Sel = M->first;
6774     if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents))
6775       continue;
6776 
6777     CodeCompletionBuilder Builder(Results.getAllocator(),
6778                                   Results.getCodeCompletionTUInfo());
6779     if (Sel.isUnarySelector()) {
6780       Builder.AddTypedTextChunk(
6781           Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
6782       Results.AddResult(Builder.TakeString());
6783       continue;
6784     }
6785 
6786     std::string Accumulator;
6787     for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
6788       if (I == SelIdents.size()) {
6789         if (!Accumulator.empty()) {
6790           Builder.AddInformativeChunk(
6791               Builder.getAllocator().CopyString(Accumulator));
6792           Accumulator.clear();
6793         }
6794       }
6795 
6796       Accumulator += Sel.getNameForSlot(I);
6797       Accumulator += ':';
6798     }
6799     Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator));
6800     Results.AddResult(Builder.TakeString());
6801   }
6802   Results.ExitScope();
6803 
6804   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6805                             Results.data(), Results.size());
6806 }
6807 
6808 /// Add all of the protocol declarations that we find in the given
6809 /// (translation unit) context.
6810 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
6811                                bool OnlyForwardDeclarations,
6812                                ResultBuilder &Results) {
6813   typedef CodeCompletionResult Result;
6814 
6815   for (const auto *D : Ctx->decls()) {
6816     // Record any protocols we find.
6817     if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D))
6818       if (!OnlyForwardDeclarations || !Proto->hasDefinition())
6819         Results.AddResult(
6820             Result(Proto, Results.getBasePriority(Proto), nullptr), CurContext,
6821             nullptr, false);
6822   }
6823 }
6824 
6825 void Sema::CodeCompleteObjCProtocolReferences(
6826     ArrayRef<IdentifierLocPair> Protocols) {
6827   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6828                         CodeCompleter->getCodeCompletionTUInfo(),
6829                         CodeCompletionContext::CCC_ObjCProtocolName);
6830 
6831   if (CodeCompleter->includeGlobals()) {
6832     Results.EnterNewScope();
6833 
6834     // Tell the result set to ignore all of the protocols we have
6835     // already seen.
6836     // FIXME: This doesn't work when caching code-completion results.
6837     for (const IdentifierLocPair &Pair : Protocols)
6838       if (ObjCProtocolDecl *Protocol = LookupProtocol(Pair.first, Pair.second))
6839         Results.Ignore(Protocol);
6840 
6841     // Add all protocols.
6842     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false,
6843                        Results);
6844 
6845     Results.ExitScope();
6846   }
6847 
6848   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6849                             Results.data(), Results.size());
6850 }
6851 
6852 void Sema::CodeCompleteObjCProtocolDecl(Scope *) {
6853   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6854                         CodeCompleter->getCodeCompletionTUInfo(),
6855                         CodeCompletionContext::CCC_ObjCProtocolName);
6856 
6857   if (CodeCompleter->includeGlobals()) {
6858     Results.EnterNewScope();
6859 
6860     // Add all protocols.
6861     AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true,
6862                        Results);
6863 
6864     Results.ExitScope();
6865   }
6866 
6867   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6868                             Results.data(), Results.size());
6869 }
6870 
6871 /// Add all of the Objective-C interface declarations that we find in
6872 /// the given (translation unit) context.
6873 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
6874                                 bool OnlyForwardDeclarations,
6875                                 bool OnlyUnimplemented,
6876                                 ResultBuilder &Results) {
6877   typedef CodeCompletionResult Result;
6878 
6879   for (const auto *D : Ctx->decls()) {
6880     // Record any interfaces we find.
6881     if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
6882       if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
6883           (!OnlyUnimplemented || !Class->getImplementation()))
6884         Results.AddResult(
6885             Result(Class, Results.getBasePriority(Class), nullptr), CurContext,
6886             nullptr, false);
6887   }
6888 }
6889 
6890 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
6891   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6892                         CodeCompleter->getCodeCompletionTUInfo(),
6893                         CodeCompletionContext::CCC_ObjCInterfaceName);
6894   Results.EnterNewScope();
6895 
6896   if (CodeCompleter->includeGlobals()) {
6897     // Add all classes.
6898     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
6899                         false, Results);
6900   }
6901 
6902   Results.ExitScope();
6903 
6904   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6905                             Results.data(), Results.size());
6906 }
6907 
6908 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
6909                                       SourceLocation ClassNameLoc) {
6910   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6911                         CodeCompleter->getCodeCompletionTUInfo(),
6912                         CodeCompletionContext::CCC_ObjCInterfaceName);
6913   Results.EnterNewScope();
6914 
6915   // Make sure that we ignore the class we're currently defining.
6916   NamedDecl *CurClass =
6917       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
6918   if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
6919     Results.Ignore(CurClass);
6920 
6921   if (CodeCompleter->includeGlobals()) {
6922     // Add all classes.
6923     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
6924                         false, Results);
6925   }
6926 
6927   Results.ExitScope();
6928 
6929   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6930                             Results.data(), Results.size());
6931 }
6932 
6933 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
6934   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6935                         CodeCompleter->getCodeCompletionTUInfo(),
6936                         CodeCompletionContext::CCC_ObjCImplementation);
6937   Results.EnterNewScope();
6938 
6939   if (CodeCompleter->includeGlobals()) {
6940     // Add all unimplemented classes.
6941     AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
6942                         true, Results);
6943   }
6944 
6945   Results.ExitScope();
6946 
6947   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6948                             Results.data(), Results.size());
6949 }
6950 
6951 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S,
6952                                              IdentifierInfo *ClassName,
6953                                              SourceLocation ClassNameLoc) {
6954   typedef CodeCompletionResult Result;
6955 
6956   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
6957                         CodeCompleter->getCodeCompletionTUInfo(),
6958                         CodeCompletionContext::CCC_ObjCCategoryName);
6959 
6960   // Ignore any categories we find that have already been implemented by this
6961   // interface.
6962   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
6963   NamedDecl *CurClass =
6964       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
6965   if (ObjCInterfaceDecl *Class =
6966           dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) {
6967     for (const auto *Cat : Class->visible_categories())
6968       CategoryNames.insert(Cat->getIdentifier());
6969   }
6970 
6971   // Add all of the categories we know about.
6972   Results.EnterNewScope();
6973   TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
6974   for (const auto *D : TU->decls())
6975     if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D))
6976       if (CategoryNames.insert(Category->getIdentifier()).second)
6977         Results.AddResult(
6978             Result(Category, Results.getBasePriority(Category), nullptr),
6979             CurContext, nullptr, false);
6980   Results.ExitScope();
6981 
6982   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
6983                             Results.data(), Results.size());
6984 }
6985 
6986 void Sema::CodeCompleteObjCImplementationCategory(Scope *S,
6987                                                   IdentifierInfo *ClassName,
6988                                                   SourceLocation ClassNameLoc) {
6989   typedef CodeCompletionResult Result;
6990 
6991   // Find the corresponding interface. If we couldn't find the interface, the
6992   // program itself is ill-formed. However, we'll try to be helpful still by
6993   // providing the list of all of the categories we know about.
6994   NamedDecl *CurClass =
6995       LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName);
6996   ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
6997   if (!Class)
6998     return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
6999 
7000   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7001                         CodeCompleter->getCodeCompletionTUInfo(),
7002                         CodeCompletionContext::CCC_ObjCCategoryName);
7003 
7004   // Add all of the categories that have have corresponding interface
7005   // declarations in this class and any of its superclasses, except for
7006   // already-implemented categories in the class itself.
7007   llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames;
7008   Results.EnterNewScope();
7009   bool IgnoreImplemented = true;
7010   while (Class) {
7011     for (const auto *Cat : Class->visible_categories()) {
7012       if ((!IgnoreImplemented || !Cat->getImplementation()) &&
7013           CategoryNames.insert(Cat->getIdentifier()).second)
7014         Results.AddResult(Result(Cat, Results.getBasePriority(Cat), nullptr),
7015                           CurContext, nullptr, false);
7016     }
7017 
7018     Class = Class->getSuperClass();
7019     IgnoreImplemented = false;
7020   }
7021   Results.ExitScope();
7022 
7023   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7024                             Results.data(), Results.size());
7025 }
7026 
7027 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) {
7028   CodeCompletionContext CCContext(CodeCompletionContext::CCC_Other);
7029   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7030                         CodeCompleter->getCodeCompletionTUInfo(), CCContext);
7031 
7032   // Figure out where this @synthesize lives.
7033   ObjCContainerDecl *Container =
7034       dyn_cast_or_null<ObjCContainerDecl>(CurContext);
7035   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
7036                      !isa<ObjCCategoryImplDecl>(Container)))
7037     return;
7038 
7039   // Ignore any properties that have already been implemented.
7040   Container = getContainerDef(Container);
7041   for (const auto *D : Container->decls())
7042     if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D))
7043       Results.Ignore(PropertyImpl->getPropertyDecl());
7044 
7045   // Add any properties that we find.
7046   AddedPropertiesSet AddedProperties;
7047   Results.EnterNewScope();
7048   if (ObjCImplementationDecl *ClassImpl =
7049           dyn_cast<ObjCImplementationDecl>(Container))
7050     AddObjCProperties(CCContext, ClassImpl->getClassInterface(), false,
7051                       /*AllowNullaryMethods=*/false, CurContext,
7052                       AddedProperties, Results);
7053   else
7054     AddObjCProperties(CCContext,
7055                       cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
7056                       false, /*AllowNullaryMethods=*/false, CurContext,
7057                       AddedProperties, Results);
7058   Results.ExitScope();
7059 
7060   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7061                             Results.data(), Results.size());
7062 }
7063 
7064 void Sema::CodeCompleteObjCPropertySynthesizeIvar(
7065     Scope *S, IdentifierInfo *PropertyName) {
7066   typedef CodeCompletionResult Result;
7067   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7068                         CodeCompleter->getCodeCompletionTUInfo(),
7069                         CodeCompletionContext::CCC_Other);
7070 
7071   // Figure out where this @synthesize lives.
7072   ObjCContainerDecl *Container =
7073       dyn_cast_or_null<ObjCContainerDecl>(CurContext);
7074   if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
7075                      !isa<ObjCCategoryImplDecl>(Container)))
7076     return;
7077 
7078   // Figure out which interface we're looking into.
7079   ObjCInterfaceDecl *Class = nullptr;
7080   if (ObjCImplementationDecl *ClassImpl =
7081           dyn_cast<ObjCImplementationDecl>(Container))
7082     Class = ClassImpl->getClassInterface();
7083   else
7084     Class = cast<ObjCCategoryImplDecl>(Container)
7085                 ->getCategoryDecl()
7086                 ->getClassInterface();
7087 
7088   // Determine the type of the property we're synthesizing.
7089   QualType PropertyType = Context.getObjCIdType();
7090   if (Class) {
7091     if (ObjCPropertyDecl *Property = Class->FindPropertyDeclaration(
7092             PropertyName, ObjCPropertyQueryKind::OBJC_PR_query_instance)) {
7093       PropertyType =
7094           Property->getType().getNonReferenceType().getUnqualifiedType();
7095 
7096       // Give preference to ivars
7097       Results.setPreferredType(PropertyType);
7098     }
7099   }
7100 
7101   // Add all of the instance variables in this class and its superclasses.
7102   Results.EnterNewScope();
7103   bool SawSimilarlyNamedIvar = false;
7104   std::string NameWithPrefix;
7105   NameWithPrefix += '_';
7106   NameWithPrefix += PropertyName->getName();
7107   std::string NameWithSuffix = PropertyName->getName().str();
7108   NameWithSuffix += '_';
7109   for (; Class; Class = Class->getSuperClass()) {
7110     for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
7111          Ivar = Ivar->getNextIvar()) {
7112       Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), nullptr),
7113                         CurContext, nullptr, false);
7114 
7115       // Determine whether we've seen an ivar with a name similar to the
7116       // property.
7117       if ((PropertyName == Ivar->getIdentifier() ||
7118            NameWithPrefix == Ivar->getName() ||
7119            NameWithSuffix == Ivar->getName())) {
7120         SawSimilarlyNamedIvar = true;
7121 
7122         // Reduce the priority of this result by one, to give it a slight
7123         // advantage over other results whose names don't match so closely.
7124         if (Results.size() &&
7125             Results.data()[Results.size() - 1].Kind ==
7126                 CodeCompletionResult::RK_Declaration &&
7127             Results.data()[Results.size() - 1].Declaration == Ivar)
7128           Results.data()[Results.size() - 1].Priority--;
7129       }
7130     }
7131   }
7132 
7133   if (!SawSimilarlyNamedIvar) {
7134     // Create ivar result _propName, that the user can use to synthesize
7135     // an ivar of the appropriate type.
7136     unsigned Priority = CCP_MemberDeclaration + 1;
7137     typedef CodeCompletionResult Result;
7138     CodeCompletionAllocator &Allocator = Results.getAllocator();
7139     CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(),
7140                                   Priority, CXAvailability_Available);
7141 
7142     PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
7143     Builder.AddResultTypeChunk(
7144         GetCompletionTypeString(PropertyType, Context, Policy, Allocator));
7145     Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
7146     Results.AddResult(
7147         Result(Builder.TakeString(), Priority, CXCursor_ObjCIvarDecl));
7148   }
7149 
7150   Results.ExitScope();
7151 
7152   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
7153                             Results.data(), Results.size());
7154 }
7155 
7156 // Mapping from selectors to the methods that implement that selector, along
7157 // with the "in original class" flag.
7158 typedef llvm::DenseMap<Selector,
7159                        llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>>
7160     KnownMethodsMap;
7161 
7162 /// Find all of the methods that reside in the given container
7163 /// (and its superclasses, protocols, etc.) that meet the given
7164 /// criteria. Insert those methods into the map of known methods,
7165 /// indexed by selector so they can be easily found.
7166 static void FindImplementableMethods(ASTContext &Context,
7167                                      ObjCContainerDecl *Container,
7168                                      Optional<bool> WantInstanceMethods,
7169                                      QualType ReturnType,
7170                                      KnownMethodsMap &KnownMethods,
7171                                      bool InOriginalClass = true) {
7172   if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
7173     // Make sure we have a definition; that's what we'll walk.
7174     if (!IFace->hasDefinition())
7175       return;
7176 
7177     IFace = IFace->getDefinition();
7178     Container = IFace;
7179 
7180     const ObjCList<ObjCProtocolDecl> &Protocols =
7181         IFace->getReferencedProtocols();
7182     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7183                                               E = Protocols.end();
7184          I != E; ++I)
7185       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
7186                                KnownMethods, InOriginalClass);
7187 
7188     // Add methods from any class extensions and categories.
7189     for (auto *Cat : IFace->visible_categories()) {
7190       FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType,
7191                                KnownMethods, false);
7192     }
7193 
7194     // Visit the superclass.
7195     if (IFace->getSuperClass())
7196       FindImplementableMethods(Context, IFace->getSuperClass(),
7197                                WantInstanceMethods, ReturnType, KnownMethods,
7198                                false);
7199   }
7200 
7201   if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
7202     // Recurse into protocols.
7203     const ObjCList<ObjCProtocolDecl> &Protocols =
7204         Category->getReferencedProtocols();
7205     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7206                                               E = Protocols.end();
7207          I != E; ++I)
7208       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
7209                                KnownMethods, InOriginalClass);
7210 
7211     // If this category is the original class, jump to the interface.
7212     if (InOriginalClass && Category->getClassInterface())
7213       FindImplementableMethods(Context, Category->getClassInterface(),
7214                                WantInstanceMethods, ReturnType, KnownMethods,
7215                                false);
7216   }
7217 
7218   if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
7219     // Make sure we have a definition; that's what we'll walk.
7220     if (!Protocol->hasDefinition())
7221       return;
7222     Protocol = Protocol->getDefinition();
7223     Container = Protocol;
7224 
7225     // Recurse into protocols.
7226     const ObjCList<ObjCProtocolDecl> &Protocols =
7227         Protocol->getReferencedProtocols();
7228     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
7229                                               E = Protocols.end();
7230          I != E; ++I)
7231       FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
7232                                KnownMethods, false);
7233   }
7234 
7235   // Add methods in this container. This operation occurs last because
7236   // we want the methods from this container to override any methods
7237   // we've previously seen with the same selector.
7238   for (auto *M : Container->methods()) {
7239     if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) {
7240       if (!ReturnType.isNull() &&
7241           !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType()))
7242         continue;
7243 
7244       KnownMethods[M->getSelector()] =
7245           KnownMethodsMap::mapped_type(M, InOriginalClass);
7246     }
7247   }
7248 }
7249 
7250 /// Add the parenthesized return or parameter type chunk to a code
7251 /// completion string.
7252 static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals,
7253                                     ASTContext &Context,
7254                                     const PrintingPolicy &Policy,
7255                                     CodeCompletionBuilder &Builder) {
7256   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7257   std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals, Type);
7258   if (!Quals.empty())
7259     Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
7260   Builder.AddTextChunk(
7261       GetCompletionTypeString(Type, Context, Policy, Builder.getAllocator()));
7262   Builder.AddChunk(CodeCompletionString::CK_RightParen);
7263 }
7264 
7265 /// Determine whether the given class is or inherits from a class by
7266 /// the given name.
7267 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name) {
7268   if (!Class)
7269     return false;
7270 
7271   if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
7272     return true;
7273 
7274   return InheritsFromClassNamed(Class->getSuperClass(), Name);
7275 }
7276 
7277 /// Add code completions for Objective-C Key-Value Coding (KVC) and
7278 /// Key-Value Observing (KVO).
7279 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property,
7280                                        bool IsInstanceMethod,
7281                                        QualType ReturnType, ASTContext &Context,
7282                                        VisitedSelectorSet &KnownSelectors,
7283                                        ResultBuilder &Results) {
7284   IdentifierInfo *PropName = Property->getIdentifier();
7285   if (!PropName || PropName->getLength() == 0)
7286     return;
7287 
7288   PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
7289 
7290   // Builder that will create each code completion.
7291   typedef CodeCompletionResult Result;
7292   CodeCompletionAllocator &Allocator = Results.getAllocator();
7293   CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
7294 
7295   // The selector table.
7296   SelectorTable &Selectors = Context.Selectors;
7297 
7298   // The property name, copied into the code completion allocation region
7299   // on demand.
7300   struct KeyHolder {
7301     CodeCompletionAllocator &Allocator;
7302     StringRef Key;
7303     const char *CopiedKey;
7304 
7305     KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key)
7306         : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {}
7307 
7308     operator const char *() {
7309       if (CopiedKey)
7310         return CopiedKey;
7311 
7312       return CopiedKey = Allocator.CopyString(Key);
7313     }
7314   } Key(Allocator, PropName->getName());
7315 
7316   // The uppercased name of the property name.
7317   std::string UpperKey = PropName->getName();
7318   if (!UpperKey.empty())
7319     UpperKey[0] = toUppercase(UpperKey[0]);
7320 
7321   bool ReturnTypeMatchesProperty =
7322       ReturnType.isNull() ||
7323       Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
7324                                      Property->getType());
7325   bool ReturnTypeMatchesVoid = ReturnType.isNull() || ReturnType->isVoidType();
7326 
7327   // Add the normal accessor -(type)key.
7328   if (IsInstanceMethod &&
7329       KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second &&
7330       ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
7331     if (ReturnType.isNull())
7332       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
7333                               Builder);
7334 
7335     Builder.AddTypedTextChunk(Key);
7336     Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
7337                              CXCursor_ObjCInstanceMethodDecl));
7338   }
7339 
7340   // If we have an integral or boolean property (or the user has provided
7341   // an integral or boolean return type), add the accessor -(type)isKey.
7342   if (IsInstanceMethod &&
7343       ((!ReturnType.isNull() &&
7344         (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
7345        (ReturnType.isNull() && (Property->getType()->isIntegerType() ||
7346                                 Property->getType()->isBooleanType())))) {
7347     std::string SelectorName = (Twine("is") + UpperKey).str();
7348     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7349     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
7350             .second) {
7351       if (ReturnType.isNull()) {
7352         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7353         Builder.AddTextChunk("BOOL");
7354         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7355       }
7356 
7357       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
7358       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
7359                                CXCursor_ObjCInstanceMethodDecl));
7360     }
7361   }
7362 
7363   // Add the normal mutator.
7364   if (IsInstanceMethod && ReturnTypeMatchesVoid &&
7365       !Property->getSetterMethodDecl()) {
7366     std::string SelectorName = (Twine("set") + UpperKey).str();
7367     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7368     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7369       if (ReturnType.isNull()) {
7370         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7371         Builder.AddTextChunk("void");
7372         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7373       }
7374 
7375       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
7376       Builder.AddTypedTextChunk(":");
7377       AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
7378                               Builder);
7379       Builder.AddTextChunk(Key);
7380       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
7381                                CXCursor_ObjCInstanceMethodDecl));
7382     }
7383   }
7384 
7385   // Indexed and unordered accessors
7386   unsigned IndexedGetterPriority = CCP_CodePattern;
7387   unsigned IndexedSetterPriority = CCP_CodePattern;
7388   unsigned UnorderedGetterPriority = CCP_CodePattern;
7389   unsigned UnorderedSetterPriority = CCP_CodePattern;
7390   if (const auto *ObjCPointer =
7391           Property->getType()->getAs<ObjCObjectPointerType>()) {
7392     if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
7393       // If this interface type is not provably derived from a known
7394       // collection, penalize the corresponding completions.
7395       if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
7396         IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
7397         if (!InheritsFromClassNamed(IFace, "NSArray"))
7398           IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
7399       }
7400 
7401       if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
7402         UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
7403         if (!InheritsFromClassNamed(IFace, "NSSet"))
7404           UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
7405       }
7406     }
7407   } else {
7408     IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
7409     IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
7410     UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
7411     UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
7412   }
7413 
7414   // Add -(NSUInteger)countOf<key>
7415   if (IsInstanceMethod &&
7416       (ReturnType.isNull() || ReturnType->isIntegerType())) {
7417     std::string SelectorName = (Twine("countOf") + UpperKey).str();
7418     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7419     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
7420             .second) {
7421       if (ReturnType.isNull()) {
7422         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7423         Builder.AddTextChunk("NSUInteger");
7424         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7425       }
7426 
7427       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
7428       Results.AddResult(
7429           Result(Builder.TakeString(),
7430                  std::min(IndexedGetterPriority, UnorderedGetterPriority),
7431                  CXCursor_ObjCInstanceMethodDecl));
7432     }
7433   }
7434 
7435   // Indexed getters
7436   // Add -(id)objectInKeyAtIndex:(NSUInteger)index
7437   if (IsInstanceMethod &&
7438       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
7439     std::string SelectorName = (Twine("objectIn") + UpperKey + "AtIndex").str();
7440     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7441     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7442       if (ReturnType.isNull()) {
7443         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7444         Builder.AddTextChunk("id");
7445         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7446       }
7447 
7448       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7449       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7450       Builder.AddTextChunk("NSUInteger");
7451       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7452       Builder.AddTextChunk("index");
7453       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
7454                                CXCursor_ObjCInstanceMethodDecl));
7455     }
7456   }
7457 
7458   // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
7459   if (IsInstanceMethod &&
7460       (ReturnType.isNull() ||
7461        (ReturnType->isObjCObjectPointerType() &&
7462         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
7463         ReturnType->getAs<ObjCObjectPointerType>()
7464                 ->getInterfaceDecl()
7465                 ->getName() == "NSArray"))) {
7466     std::string SelectorName = (Twine(Property->getName()) + "AtIndexes").str();
7467     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7468     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7469       if (ReturnType.isNull()) {
7470         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7471         Builder.AddTextChunk("NSArray *");
7472         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7473       }
7474 
7475       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7476       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7477       Builder.AddTextChunk("NSIndexSet *");
7478       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7479       Builder.AddTextChunk("indexes");
7480       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
7481                                CXCursor_ObjCInstanceMethodDecl));
7482     }
7483   }
7484 
7485   // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
7486   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7487     std::string SelectorName = (Twine("get") + UpperKey).str();
7488     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
7489                                       &Context.Idents.get("range")};
7490 
7491     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
7492       if (ReturnType.isNull()) {
7493         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7494         Builder.AddTextChunk("void");
7495         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7496       }
7497 
7498       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7499       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7500       Builder.AddPlaceholderChunk("object-type");
7501       Builder.AddTextChunk(" **");
7502       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7503       Builder.AddTextChunk("buffer");
7504       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7505       Builder.AddTypedTextChunk("range:");
7506       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7507       Builder.AddTextChunk("NSRange");
7508       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7509       Builder.AddTextChunk("inRange");
7510       Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
7511                                CXCursor_ObjCInstanceMethodDecl));
7512     }
7513   }
7514 
7515   // Mutable indexed accessors
7516 
7517   // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
7518   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7519     std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str();
7520     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get("insertObject"),
7521                                       &Context.Idents.get(SelectorName)};
7522 
7523     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
7524       if (ReturnType.isNull()) {
7525         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7526         Builder.AddTextChunk("void");
7527         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7528       }
7529 
7530       Builder.AddTypedTextChunk("insertObject:");
7531       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7532       Builder.AddPlaceholderChunk("object-type");
7533       Builder.AddTextChunk(" *");
7534       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7535       Builder.AddTextChunk("object");
7536       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7537       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7538       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7539       Builder.AddPlaceholderChunk("NSUInteger");
7540       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7541       Builder.AddTextChunk("index");
7542       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7543                                CXCursor_ObjCInstanceMethodDecl));
7544     }
7545   }
7546 
7547   // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
7548   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7549     std::string SelectorName = (Twine("insert") + UpperKey).str();
7550     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
7551                                       &Context.Idents.get("atIndexes")};
7552 
7553     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
7554       if (ReturnType.isNull()) {
7555         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7556         Builder.AddTextChunk("void");
7557         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7558       }
7559 
7560       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7561       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7562       Builder.AddTextChunk("NSArray *");
7563       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7564       Builder.AddTextChunk("array");
7565       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7566       Builder.AddTypedTextChunk("atIndexes:");
7567       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7568       Builder.AddPlaceholderChunk("NSIndexSet *");
7569       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7570       Builder.AddTextChunk("indexes");
7571       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7572                                CXCursor_ObjCInstanceMethodDecl));
7573     }
7574   }
7575 
7576   // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
7577   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7578     std::string SelectorName =
7579         (Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
7580     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7581     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7582       if (ReturnType.isNull()) {
7583         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7584         Builder.AddTextChunk("void");
7585         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7586       }
7587 
7588       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7589       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7590       Builder.AddTextChunk("NSUInteger");
7591       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7592       Builder.AddTextChunk("index");
7593       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7594                                CXCursor_ObjCInstanceMethodDecl));
7595     }
7596   }
7597 
7598   // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
7599   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7600     std::string SelectorName = (Twine("remove") + UpperKey + "AtIndexes").str();
7601     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7602     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7603       if (ReturnType.isNull()) {
7604         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7605         Builder.AddTextChunk("void");
7606         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7607       }
7608 
7609       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7610       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7611       Builder.AddTextChunk("NSIndexSet *");
7612       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7613       Builder.AddTextChunk("indexes");
7614       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7615                                CXCursor_ObjCInstanceMethodDecl));
7616     }
7617   }
7618 
7619   // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
7620   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7621     std::string SelectorName =
7622         (Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
7623     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
7624                                       &Context.Idents.get("withObject")};
7625 
7626     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
7627       if (ReturnType.isNull()) {
7628         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7629         Builder.AddTextChunk("void");
7630         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7631       }
7632 
7633       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7634       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7635       Builder.AddPlaceholderChunk("NSUInteger");
7636       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7637       Builder.AddTextChunk("index");
7638       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7639       Builder.AddTypedTextChunk("withObject:");
7640       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7641       Builder.AddTextChunk("id");
7642       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7643       Builder.AddTextChunk("object");
7644       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7645                                CXCursor_ObjCInstanceMethodDecl));
7646     }
7647   }
7648 
7649   // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
7650   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7651     std::string SelectorName1 =
7652         (Twine("replace") + UpperKey + "AtIndexes").str();
7653     std::string SelectorName2 = (Twine("with") + UpperKey).str();
7654     IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1),
7655                                       &Context.Idents.get(SelectorName2)};
7656 
7657     if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
7658       if (ReturnType.isNull()) {
7659         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7660         Builder.AddTextChunk("void");
7661         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7662       }
7663 
7664       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
7665       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7666       Builder.AddPlaceholderChunk("NSIndexSet *");
7667       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7668       Builder.AddTextChunk("indexes");
7669       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7670       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
7671       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7672       Builder.AddTextChunk("NSArray *");
7673       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7674       Builder.AddTextChunk("array");
7675       Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
7676                                CXCursor_ObjCInstanceMethodDecl));
7677     }
7678   }
7679 
7680   // Unordered getters
7681   // - (NSEnumerator *)enumeratorOfKey
7682   if (IsInstanceMethod &&
7683       (ReturnType.isNull() ||
7684        (ReturnType->isObjCObjectPointerType() &&
7685         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
7686         ReturnType->getAs<ObjCObjectPointerType>()
7687                 ->getInterfaceDecl()
7688                 ->getName() == "NSEnumerator"))) {
7689     std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str();
7690     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7691     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
7692             .second) {
7693       if (ReturnType.isNull()) {
7694         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7695         Builder.AddTextChunk("NSEnumerator *");
7696         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7697       }
7698 
7699       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
7700       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
7701                                CXCursor_ObjCInstanceMethodDecl));
7702     }
7703   }
7704 
7705   // - (type *)memberOfKey:(type *)object
7706   if (IsInstanceMethod &&
7707       (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
7708     std::string SelectorName = (Twine("memberOf") + UpperKey).str();
7709     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7710     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7711       if (ReturnType.isNull()) {
7712         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7713         Builder.AddPlaceholderChunk("object-type");
7714         Builder.AddTextChunk(" *");
7715         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7716       }
7717 
7718       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7719       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7720       if (ReturnType.isNull()) {
7721         Builder.AddPlaceholderChunk("object-type");
7722         Builder.AddTextChunk(" *");
7723       } else {
7724         Builder.AddTextChunk(GetCompletionTypeString(
7725             ReturnType, Context, Policy, Builder.getAllocator()));
7726       }
7727       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7728       Builder.AddTextChunk("object");
7729       Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
7730                                CXCursor_ObjCInstanceMethodDecl));
7731     }
7732   }
7733 
7734   // Mutable unordered accessors
7735   // - (void)addKeyObject:(type *)object
7736   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7737     std::string SelectorName =
7738         (Twine("add") + UpperKey + Twine("Object")).str();
7739     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7740     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7741       if (ReturnType.isNull()) {
7742         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7743         Builder.AddTextChunk("void");
7744         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7745       }
7746 
7747       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7748       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7749       Builder.AddPlaceholderChunk("object-type");
7750       Builder.AddTextChunk(" *");
7751       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7752       Builder.AddTextChunk("object");
7753       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
7754                                CXCursor_ObjCInstanceMethodDecl));
7755     }
7756   }
7757 
7758   // - (void)addKey:(NSSet *)objects
7759   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7760     std::string SelectorName = (Twine("add") + UpperKey).str();
7761     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7762     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7763       if (ReturnType.isNull()) {
7764         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7765         Builder.AddTextChunk("void");
7766         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7767       }
7768 
7769       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7770       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7771       Builder.AddTextChunk("NSSet *");
7772       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7773       Builder.AddTextChunk("objects");
7774       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
7775                                CXCursor_ObjCInstanceMethodDecl));
7776     }
7777   }
7778 
7779   // - (void)removeKeyObject:(type *)object
7780   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7781     std::string SelectorName =
7782         (Twine("remove") + UpperKey + Twine("Object")).str();
7783     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7784     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7785       if (ReturnType.isNull()) {
7786         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7787         Builder.AddTextChunk("void");
7788         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7789       }
7790 
7791       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7792       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7793       Builder.AddPlaceholderChunk("object-type");
7794       Builder.AddTextChunk(" *");
7795       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7796       Builder.AddTextChunk("object");
7797       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
7798                                CXCursor_ObjCInstanceMethodDecl));
7799     }
7800   }
7801 
7802   // - (void)removeKey:(NSSet *)objects
7803   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7804     std::string SelectorName = (Twine("remove") + UpperKey).str();
7805     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7806     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7807       if (ReturnType.isNull()) {
7808         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7809         Builder.AddTextChunk("void");
7810         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7811       }
7812 
7813       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7814       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7815       Builder.AddTextChunk("NSSet *");
7816       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7817       Builder.AddTextChunk("objects");
7818       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
7819                                CXCursor_ObjCInstanceMethodDecl));
7820     }
7821   }
7822 
7823   // - (void)intersectKey:(NSSet *)objects
7824   if (IsInstanceMethod && ReturnTypeMatchesVoid) {
7825     std::string SelectorName = (Twine("intersect") + UpperKey).str();
7826     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7827     if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
7828       if (ReturnType.isNull()) {
7829         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7830         Builder.AddTextChunk("void");
7831         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7832       }
7833 
7834       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
7835       Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7836       Builder.AddTextChunk("NSSet *");
7837       Builder.AddChunk(CodeCompletionString::CK_RightParen);
7838       Builder.AddTextChunk("objects");
7839       Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
7840                                CXCursor_ObjCInstanceMethodDecl));
7841     }
7842   }
7843 
7844   // Key-Value Observing
7845   // + (NSSet *)keyPathsForValuesAffectingKey
7846   if (!IsInstanceMethod &&
7847       (ReturnType.isNull() ||
7848        (ReturnType->isObjCObjectPointerType() &&
7849         ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
7850         ReturnType->getAs<ObjCObjectPointerType>()
7851                 ->getInterfaceDecl()
7852                 ->getName() == "NSSet"))) {
7853     std::string SelectorName =
7854         (Twine("keyPathsForValuesAffecting") + UpperKey).str();
7855     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7856     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
7857             .second) {
7858       if (ReturnType.isNull()) {
7859         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7860         Builder.AddTextChunk("NSSet<NSString *> *");
7861         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7862       }
7863 
7864       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
7865       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
7866                                CXCursor_ObjCClassMethodDecl));
7867     }
7868   }
7869 
7870   // + (BOOL)automaticallyNotifiesObserversForKey
7871   if (!IsInstanceMethod &&
7872       (ReturnType.isNull() || ReturnType->isIntegerType() ||
7873        ReturnType->isBooleanType())) {
7874     std::string SelectorName =
7875         (Twine("automaticallyNotifiesObserversOf") + UpperKey).str();
7876     IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
7877     if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
7878             .second) {
7879       if (ReturnType.isNull()) {
7880         Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7881         Builder.AddTextChunk("BOOL");
7882         Builder.AddChunk(CodeCompletionString::CK_RightParen);
7883       }
7884 
7885       Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
7886       Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
7887                                CXCursor_ObjCClassMethodDecl));
7888     }
7889   }
7890 }
7891 
7892 void Sema::CodeCompleteObjCMethodDecl(Scope *S, Optional<bool> IsInstanceMethod,
7893                                       ParsedType ReturnTy) {
7894   // Determine the return type of the method we're declaring, if
7895   // provided.
7896   QualType ReturnType = GetTypeFromParser(ReturnTy);
7897   Decl *IDecl = nullptr;
7898   if (CurContext->isObjCContainer()) {
7899     ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext);
7900     IDecl = OCD;
7901   }
7902   // Determine where we should start searching for methods.
7903   ObjCContainerDecl *SearchDecl = nullptr;
7904   bool IsInImplementation = false;
7905   if (Decl *D = IDecl) {
7906     if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
7907       SearchDecl = Impl->getClassInterface();
7908       IsInImplementation = true;
7909     } else if (ObjCCategoryImplDecl *CatImpl =
7910                    dyn_cast<ObjCCategoryImplDecl>(D)) {
7911       SearchDecl = CatImpl->getCategoryDecl();
7912       IsInImplementation = true;
7913     } else
7914       SearchDecl = dyn_cast<ObjCContainerDecl>(D);
7915   }
7916 
7917   if (!SearchDecl && S) {
7918     if (DeclContext *DC = S->getEntity())
7919       SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
7920   }
7921 
7922   if (!SearchDecl) {
7923     HandleCodeCompleteResults(this, CodeCompleter,
7924                               CodeCompletionContext::CCC_Other, nullptr, 0);
7925     return;
7926   }
7927 
7928   // Find all of the methods that we could declare/implement here.
7929   KnownMethodsMap KnownMethods;
7930   FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, ReturnType,
7931                            KnownMethods);
7932 
7933   // Add declarations or definitions for each of the known methods.
7934   typedef CodeCompletionResult Result;
7935   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
7936                         CodeCompleter->getCodeCompletionTUInfo(),
7937                         CodeCompletionContext::CCC_Other);
7938   Results.EnterNewScope();
7939   PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
7940   for (KnownMethodsMap::iterator M = KnownMethods.begin(),
7941                                  MEnd = KnownMethods.end();
7942        M != MEnd; ++M) {
7943     ObjCMethodDecl *Method = M->second.getPointer();
7944     CodeCompletionBuilder Builder(Results.getAllocator(),
7945                                   Results.getCodeCompletionTUInfo());
7946 
7947     // Add the '-'/'+' prefix if it wasn't provided yet.
7948     if (!IsInstanceMethod) {
7949       Builder.AddTextChunk(Method->isInstanceMethod() ? "-" : "+");
7950       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7951     }
7952 
7953     // If the result type was not already provided, add it to the
7954     // pattern as (type).
7955     if (ReturnType.isNull()) {
7956       QualType ResTy = Method->getSendResultType().stripObjCKindOfType(Context);
7957       AttributedType::stripOuterNullability(ResTy);
7958       AddObjCPassingTypeChunk(ResTy, Method->getObjCDeclQualifier(), Context,
7959                               Policy, Builder);
7960     }
7961 
7962     Selector Sel = Method->getSelector();
7963 
7964     // Add the first part of the selector to the pattern.
7965     Builder.AddTypedTextChunk(
7966         Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
7967 
7968     // Add parameters to the pattern.
7969     unsigned I = 0;
7970     for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
7971                                         PEnd = Method->param_end();
7972          P != PEnd; (void)++P, ++I) {
7973       // Add the part of the selector name.
7974       if (I == 0)
7975         Builder.AddTypedTextChunk(":");
7976       else if (I < Sel.getNumArgs()) {
7977         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
7978         Builder.AddTypedTextChunk(
7979             Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
7980       } else
7981         break;
7982 
7983       // Add the parameter type.
7984       QualType ParamType;
7985       if ((*P)->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability)
7986         ParamType = (*P)->getType();
7987       else
7988         ParamType = (*P)->getOriginalType();
7989       ParamType = ParamType.substObjCTypeArgs(
7990           Context, {}, ObjCSubstitutionContext::Parameter);
7991       AttributedType::stripOuterNullability(ParamType);
7992       AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(), Context,
7993                               Policy, Builder);
7994 
7995       if (IdentifierInfo *Id = (*P)->getIdentifier())
7996         Builder.AddTextChunk(Builder.getAllocator().CopyString(Id->getName()));
7997     }
7998 
7999     if (Method->isVariadic()) {
8000       if (Method->param_size() > 0)
8001         Builder.AddChunk(CodeCompletionString::CK_Comma);
8002       Builder.AddTextChunk("...");
8003     }
8004 
8005     if (IsInImplementation && Results.includeCodePatterns()) {
8006       // We will be defining the method here, so add a compound statement.
8007       Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8008       Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
8009       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
8010       if (!Method->getReturnType()->isVoidType()) {
8011         // If the result type is not void, add a return clause.
8012         Builder.AddTextChunk("return");
8013         Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8014         Builder.AddPlaceholderChunk("expression");
8015         Builder.AddChunk(CodeCompletionString::CK_SemiColon);
8016       } else
8017         Builder.AddPlaceholderChunk("statements");
8018 
8019       Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
8020       Builder.AddChunk(CodeCompletionString::CK_RightBrace);
8021     }
8022 
8023     unsigned Priority = CCP_CodePattern;
8024     auto R = Result(Builder.TakeString(), Method, Priority);
8025     if (!M->second.getInt())
8026       setInBaseClass(R);
8027     Results.AddResult(std::move(R));
8028   }
8029 
8030   // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
8031   // the properties in this class and its categories.
8032   if (Context.getLangOpts().ObjC) {
8033     SmallVector<ObjCContainerDecl *, 4> Containers;
8034     Containers.push_back(SearchDecl);
8035 
8036     VisitedSelectorSet KnownSelectors;
8037     for (KnownMethodsMap::iterator M = KnownMethods.begin(),
8038                                    MEnd = KnownMethods.end();
8039          M != MEnd; ++M)
8040       KnownSelectors.insert(M->first);
8041 
8042     ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
8043     if (!IFace)
8044       if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
8045         IFace = Category->getClassInterface();
8046 
8047     if (IFace)
8048       for (auto *Cat : IFace->visible_categories())
8049         Containers.push_back(Cat);
8050 
8051     if (IsInstanceMethod) {
8052       for (unsigned I = 0, N = Containers.size(); I != N; ++I)
8053         for (auto *P : Containers[I]->instance_properties())
8054           AddObjCKeyValueCompletions(P, *IsInstanceMethod, ReturnType, Context,
8055                                      KnownSelectors, Results);
8056     }
8057   }
8058 
8059   Results.ExitScope();
8060 
8061   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8062                             Results.data(), Results.size());
8063 }
8064 
8065 void Sema::CodeCompleteObjCMethodDeclSelector(
8066     Scope *S, bool IsInstanceMethod, bool AtParameterName, ParsedType ReturnTy,
8067     ArrayRef<IdentifierInfo *> SelIdents) {
8068   // If we have an external source, load the entire class method
8069   // pool from the AST file.
8070   if (ExternalSource) {
8071     for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N;
8072          ++I) {
8073       Selector Sel = ExternalSource->GetExternalSelector(I);
8074       if (Sel.isNull() || MethodPool.count(Sel))
8075         continue;
8076 
8077       ReadMethodPool(Sel);
8078     }
8079   }
8080 
8081   // Build the set of methods we can see.
8082   typedef CodeCompletionResult Result;
8083   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8084                         CodeCompleter->getCodeCompletionTUInfo(),
8085                         CodeCompletionContext::CCC_Other);
8086 
8087   if (ReturnTy)
8088     Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType());
8089 
8090   Results.EnterNewScope();
8091   for (GlobalMethodPool::iterator M = MethodPool.begin(),
8092                                   MEnd = MethodPool.end();
8093        M != MEnd; ++M) {
8094     for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first
8095                                                      : &M->second.second;
8096          MethList && MethList->getMethod(); MethList = MethList->getNext()) {
8097       if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
8098         continue;
8099 
8100       if (AtParameterName) {
8101         // Suggest parameter names we've seen before.
8102         unsigned NumSelIdents = SelIdents.size();
8103         if (NumSelIdents &&
8104             NumSelIdents <= MethList->getMethod()->param_size()) {
8105           ParmVarDecl *Param =
8106               MethList->getMethod()->parameters()[NumSelIdents - 1];
8107           if (Param->getIdentifier()) {
8108             CodeCompletionBuilder Builder(Results.getAllocator(),
8109                                           Results.getCodeCompletionTUInfo());
8110             Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
8111                 Param->getIdentifier()->getName()));
8112             Results.AddResult(Builder.TakeString());
8113           }
8114         }
8115 
8116         continue;
8117       }
8118 
8119       Result R(MethList->getMethod(),
8120                Results.getBasePriority(MethList->getMethod()), nullptr);
8121       R.StartParameter = SelIdents.size();
8122       R.AllParametersAreInformative = false;
8123       R.DeclaringEntity = true;
8124       Results.MaybeAddResult(R, CurContext);
8125     }
8126   }
8127 
8128   Results.ExitScope();
8129 
8130   if (!AtParameterName && !SelIdents.empty() &&
8131       SelIdents.front()->getName().startswith("init")) {
8132     for (const auto &M : PP.macros()) {
8133       if (M.first->getName() != "NS_DESIGNATED_INITIALIZER")
8134         continue;
8135       Results.EnterNewScope();
8136       CodeCompletionBuilder Builder(Results.getAllocator(),
8137                                     Results.getCodeCompletionTUInfo());
8138       Builder.AddTypedTextChunk(
8139           Builder.getAllocator().CopyString(M.first->getName()));
8140       Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_Macro,
8141                                              CXCursor_MacroDefinition));
8142       Results.ExitScope();
8143     }
8144   }
8145 
8146   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8147                             Results.data(), Results.size());
8148 }
8149 
8150 void Sema::CodeCompletePreprocessorDirective(bool InConditional) {
8151   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8152                         CodeCompleter->getCodeCompletionTUInfo(),
8153                         CodeCompletionContext::CCC_PreprocessorDirective);
8154   Results.EnterNewScope();
8155 
8156   // #if <condition>
8157   CodeCompletionBuilder Builder(Results.getAllocator(),
8158                                 Results.getCodeCompletionTUInfo());
8159   Builder.AddTypedTextChunk("if");
8160   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8161   Builder.AddPlaceholderChunk("condition");
8162   Results.AddResult(Builder.TakeString());
8163 
8164   // #ifdef <macro>
8165   Builder.AddTypedTextChunk("ifdef");
8166   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8167   Builder.AddPlaceholderChunk("macro");
8168   Results.AddResult(Builder.TakeString());
8169 
8170   // #ifndef <macro>
8171   Builder.AddTypedTextChunk("ifndef");
8172   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8173   Builder.AddPlaceholderChunk("macro");
8174   Results.AddResult(Builder.TakeString());
8175 
8176   if (InConditional) {
8177     // #elif <condition>
8178     Builder.AddTypedTextChunk("elif");
8179     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8180     Builder.AddPlaceholderChunk("condition");
8181     Results.AddResult(Builder.TakeString());
8182 
8183     // #else
8184     Builder.AddTypedTextChunk("else");
8185     Results.AddResult(Builder.TakeString());
8186 
8187     // #endif
8188     Builder.AddTypedTextChunk("endif");
8189     Results.AddResult(Builder.TakeString());
8190   }
8191 
8192   // #include "header"
8193   Builder.AddTypedTextChunk("include");
8194   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8195   Builder.AddTextChunk("\"");
8196   Builder.AddPlaceholderChunk("header");
8197   Builder.AddTextChunk("\"");
8198   Results.AddResult(Builder.TakeString());
8199 
8200   // #include <header>
8201   Builder.AddTypedTextChunk("include");
8202   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8203   Builder.AddTextChunk("<");
8204   Builder.AddPlaceholderChunk("header");
8205   Builder.AddTextChunk(">");
8206   Results.AddResult(Builder.TakeString());
8207 
8208   // #define <macro>
8209   Builder.AddTypedTextChunk("define");
8210   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8211   Builder.AddPlaceholderChunk("macro");
8212   Results.AddResult(Builder.TakeString());
8213 
8214   // #define <macro>(<args>)
8215   Builder.AddTypedTextChunk("define");
8216   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8217   Builder.AddPlaceholderChunk("macro");
8218   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8219   Builder.AddPlaceholderChunk("args");
8220   Builder.AddChunk(CodeCompletionString::CK_RightParen);
8221   Results.AddResult(Builder.TakeString());
8222 
8223   // #undef <macro>
8224   Builder.AddTypedTextChunk("undef");
8225   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8226   Builder.AddPlaceholderChunk("macro");
8227   Results.AddResult(Builder.TakeString());
8228 
8229   // #line <number>
8230   Builder.AddTypedTextChunk("line");
8231   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8232   Builder.AddPlaceholderChunk("number");
8233   Results.AddResult(Builder.TakeString());
8234 
8235   // #line <number> "filename"
8236   Builder.AddTypedTextChunk("line");
8237   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8238   Builder.AddPlaceholderChunk("number");
8239   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8240   Builder.AddTextChunk("\"");
8241   Builder.AddPlaceholderChunk("filename");
8242   Builder.AddTextChunk("\"");
8243   Results.AddResult(Builder.TakeString());
8244 
8245   // #error <message>
8246   Builder.AddTypedTextChunk("error");
8247   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8248   Builder.AddPlaceholderChunk("message");
8249   Results.AddResult(Builder.TakeString());
8250 
8251   // #pragma <arguments>
8252   Builder.AddTypedTextChunk("pragma");
8253   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8254   Builder.AddPlaceholderChunk("arguments");
8255   Results.AddResult(Builder.TakeString());
8256 
8257   if (getLangOpts().ObjC) {
8258     // #import "header"
8259     Builder.AddTypedTextChunk("import");
8260     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8261     Builder.AddTextChunk("\"");
8262     Builder.AddPlaceholderChunk("header");
8263     Builder.AddTextChunk("\"");
8264     Results.AddResult(Builder.TakeString());
8265 
8266     // #import <header>
8267     Builder.AddTypedTextChunk("import");
8268     Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8269     Builder.AddTextChunk("<");
8270     Builder.AddPlaceholderChunk("header");
8271     Builder.AddTextChunk(">");
8272     Results.AddResult(Builder.TakeString());
8273   }
8274 
8275   // #include_next "header"
8276   Builder.AddTypedTextChunk("include_next");
8277   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8278   Builder.AddTextChunk("\"");
8279   Builder.AddPlaceholderChunk("header");
8280   Builder.AddTextChunk("\"");
8281   Results.AddResult(Builder.TakeString());
8282 
8283   // #include_next <header>
8284   Builder.AddTypedTextChunk("include_next");
8285   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8286   Builder.AddTextChunk("<");
8287   Builder.AddPlaceholderChunk("header");
8288   Builder.AddTextChunk(">");
8289   Results.AddResult(Builder.TakeString());
8290 
8291   // #warning <message>
8292   Builder.AddTypedTextChunk("warning");
8293   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8294   Builder.AddPlaceholderChunk("message");
8295   Results.AddResult(Builder.TakeString());
8296 
8297   // Note: #ident and #sccs are such crazy anachronisms that we don't provide
8298   // completions for them. And __include_macros is a Clang-internal extension
8299   // that we don't want to encourage anyone to use.
8300 
8301   // FIXME: we don't support #assert or #unassert, so don't suggest them.
8302   Results.ExitScope();
8303 
8304   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8305                             Results.data(), Results.size());
8306 }
8307 
8308 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) {
8309   CodeCompleteOrdinaryName(S, S->getFnParent() ? Sema::PCC_RecoveryInFunction
8310                                                : Sema::PCC_Namespace);
8311 }
8312 
8313 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) {
8314   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8315                         CodeCompleter->getCodeCompletionTUInfo(),
8316                         IsDefinition ? CodeCompletionContext::CCC_MacroName
8317                                      : CodeCompletionContext::CCC_MacroNameUse);
8318   if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) {
8319     // Add just the names of macros, not their arguments.
8320     CodeCompletionBuilder Builder(Results.getAllocator(),
8321                                   Results.getCodeCompletionTUInfo());
8322     Results.EnterNewScope();
8323     for (Preprocessor::macro_iterator M = PP.macro_begin(),
8324                                       MEnd = PP.macro_end();
8325          M != MEnd; ++M) {
8326       Builder.AddTypedTextChunk(
8327           Builder.getAllocator().CopyString(M->first->getName()));
8328       Results.AddResult(CodeCompletionResult(
8329           Builder.TakeString(), CCP_CodePattern, CXCursor_MacroDefinition));
8330     }
8331     Results.ExitScope();
8332   } else if (IsDefinition) {
8333     // FIXME: Can we detect when the user just wrote an include guard above?
8334   }
8335 
8336   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8337                             Results.data(), Results.size());
8338 }
8339 
8340 void Sema::CodeCompletePreprocessorExpression() {
8341   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8342                         CodeCompleter->getCodeCompletionTUInfo(),
8343                         CodeCompletionContext::CCC_PreprocessorExpression);
8344 
8345   if (!CodeCompleter || CodeCompleter->includeMacros())
8346     AddMacroResults(PP, Results,
8347                     CodeCompleter ? CodeCompleter->loadExternal() : false,
8348                     true);
8349 
8350   // defined (<macro>)
8351   Results.EnterNewScope();
8352   CodeCompletionBuilder Builder(Results.getAllocator(),
8353                                 Results.getCodeCompletionTUInfo());
8354   Builder.AddTypedTextChunk("defined");
8355   Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
8356   Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8357   Builder.AddPlaceholderChunk("macro");
8358   Builder.AddChunk(CodeCompletionString::CK_RightParen);
8359   Results.AddResult(Builder.TakeString());
8360   Results.ExitScope();
8361 
8362   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8363                             Results.data(), Results.size());
8364 }
8365 
8366 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S,
8367                                                  IdentifierInfo *Macro,
8368                                                  MacroInfo *MacroInfo,
8369                                                  unsigned Argument) {
8370   // FIXME: In the future, we could provide "overload" results, much like we
8371   // do for function calls.
8372 
8373   // Now just ignore this. There will be another code-completion callback
8374   // for the expanded tokens.
8375 }
8376 
8377 // This handles completion inside an #include filename, e.g. #include <foo/ba
8378 // We look for the directory "foo" under each directory on the include path,
8379 // list its files, and reassemble the appropriate #include.
8380 void Sema::CodeCompleteIncludedFile(llvm::StringRef Dir, bool Angled) {
8381   // RelDir should use /, but unescaped \ is possible on windows!
8382   // Our completions will normalize to / for simplicity, this case is rare.
8383   std::string RelDir = llvm::sys::path::convert_to_slash(Dir);
8384   // We need the native slashes for the actual file system interactions.
8385   SmallString<128> NativeRelDir = StringRef(RelDir);
8386   llvm::sys::path::native(NativeRelDir);
8387   llvm::vfs::FileSystem &FS =
8388       getSourceManager().getFileManager().getVirtualFileSystem();
8389 
8390   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8391                         CodeCompleter->getCodeCompletionTUInfo(),
8392                         CodeCompletionContext::CCC_IncludedFile);
8393   llvm::DenseSet<StringRef> SeenResults; // To deduplicate results.
8394 
8395   // Helper: adds one file or directory completion result.
8396   auto AddCompletion = [&](StringRef Filename, bool IsDirectory) {
8397     SmallString<64> TypedChunk = Filename;
8398     // Directory completion is up to the slash, e.g. <sys/
8399     TypedChunk.push_back(IsDirectory ? '/' : Angled ? '>' : '"');
8400     auto R = SeenResults.insert(TypedChunk);
8401     if (R.second) { // New completion
8402       const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk);
8403       *R.first = InternedTyped; // Avoid dangling StringRef.
8404       CodeCompletionBuilder Builder(CodeCompleter->getAllocator(),
8405                                     CodeCompleter->getCodeCompletionTUInfo());
8406       Builder.AddTypedTextChunk(InternedTyped);
8407       // The result is a "Pattern", which is pretty opaque.
8408       // We may want to include the real filename to allow smart ranking.
8409       Results.AddResult(CodeCompletionResult(Builder.TakeString()));
8410     }
8411   };
8412 
8413   // Helper: scans IncludeDir for nice files, and adds results for each.
8414   auto AddFilesFromIncludeDir = [&](StringRef IncludeDir,
8415                                     bool IsSystem,
8416                                     DirectoryLookup::LookupType_t LookupType) {
8417     llvm::SmallString<128> Dir = IncludeDir;
8418     if (!NativeRelDir.empty()) {
8419       if (LookupType == DirectoryLookup::LT_Framework) {
8420         // For a framework dir, #include <Foo/Bar/> actually maps to
8421         // a path of Foo.framework/Headers/Bar/.
8422         auto Begin = llvm::sys::path::begin(NativeRelDir);
8423         auto End = llvm::sys::path::end(NativeRelDir);
8424 
8425         llvm::sys::path::append(Dir, *Begin + ".framework", "Headers");
8426         llvm::sys::path::append(Dir, ++Begin, End);
8427       } else {
8428         llvm::sys::path::append(Dir, NativeRelDir);
8429       }
8430     }
8431 
8432     std::error_code EC;
8433     unsigned Count = 0;
8434     for (auto It = FS.dir_begin(Dir, EC);
8435          !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) {
8436       if (++Count == 2500) // If we happen to hit a huge directory,
8437         break;             // bail out early so we're not too slow.
8438       StringRef Filename = llvm::sys::path::filename(It->path());
8439       switch (It->type()) {
8440       case llvm::sys::fs::file_type::directory_file:
8441         // All entries in a framework directory must have a ".framework" suffix,
8442         // but the suffix does not appear in the source code's include/import.
8443         if (LookupType == DirectoryLookup::LT_Framework &&
8444             NativeRelDir.empty() && !Filename.consume_back(".framework"))
8445           break;
8446 
8447         AddCompletion(Filename, /*IsDirectory=*/true);
8448         break;
8449       case llvm::sys::fs::file_type::regular_file:
8450         // Only files that really look like headers. (Except in system dirs).
8451         if (!IsSystem) {
8452           // Header extensions from Types.def, which we can't depend on here.
8453           if (!(Filename.endswith_lower(".h") ||
8454                 Filename.endswith_lower(".hh") ||
8455                 Filename.endswith_lower(".hpp") ||
8456                 Filename.endswith_lower(".inc")))
8457             break;
8458         }
8459         AddCompletion(Filename, /*IsDirectory=*/false);
8460         break;
8461       default:
8462         break;
8463       }
8464     }
8465   };
8466 
8467   // Helper: adds results relative to IncludeDir, if possible.
8468   auto AddFilesFromDirLookup = [&](const DirectoryLookup &IncludeDir,
8469                                    bool IsSystem) {
8470     switch (IncludeDir.getLookupType()) {
8471     case DirectoryLookup::LT_HeaderMap:
8472       // header maps are not (currently) enumerable.
8473       break;
8474     case DirectoryLookup::LT_NormalDir:
8475       AddFilesFromIncludeDir(IncludeDir.getDir()->getName(), IsSystem,
8476                              DirectoryLookup::LT_NormalDir);
8477       break;
8478     case DirectoryLookup::LT_Framework:
8479       AddFilesFromIncludeDir(IncludeDir.getFrameworkDir()->getName(), IsSystem,
8480                              DirectoryLookup::LT_Framework);
8481       break;
8482     }
8483   };
8484 
8485   // Finally with all our helpers, we can scan the include path.
8486   // Do this in standard order so deduplication keeps the right file.
8487   // (In case we decide to add more details to the results later).
8488   const auto &S = PP.getHeaderSearchInfo();
8489   using llvm::make_range;
8490   if (!Angled) {
8491     // The current directory is on the include path for "quoted" includes.
8492     auto *CurFile = PP.getCurrentFileLexer()->getFileEntry();
8493     if (CurFile && CurFile->getDir())
8494       AddFilesFromIncludeDir(CurFile->getDir()->getName(), false,
8495                              DirectoryLookup::LT_NormalDir);
8496     for (const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end()))
8497       AddFilesFromDirLookup(D, false);
8498   }
8499   for (const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end()))
8500     AddFilesFromDirLookup(D, false);
8501   for (const auto &D : make_range(S.system_dir_begin(), S.system_dir_end()))
8502     AddFilesFromDirLookup(D, true);
8503 
8504   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8505                             Results.data(), Results.size());
8506 }
8507 
8508 void Sema::CodeCompleteNaturalLanguage() {
8509   HandleCodeCompleteResults(this, CodeCompleter,
8510                             CodeCompletionContext::CCC_NaturalLanguage, nullptr,
8511                             0);
8512 }
8513 
8514 void Sema::CodeCompleteAvailabilityPlatformName() {
8515   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
8516                         CodeCompleter->getCodeCompletionTUInfo(),
8517                         CodeCompletionContext::CCC_Other);
8518   Results.EnterNewScope();
8519   static const char *Platforms[] = {"macOS", "iOS", "watchOS", "tvOS"};
8520   for (const char *Platform : llvm::makeArrayRef(Platforms)) {
8521     Results.AddResult(CodeCompletionResult(Platform));
8522     Results.AddResult(CodeCompletionResult(Results.getAllocator().CopyString(
8523         Twine(Platform) + "ApplicationExtension")));
8524   }
8525   Results.ExitScope();
8526   HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(),
8527                             Results.data(), Results.size());
8528 }
8529 
8530 void Sema::GatherGlobalCodeCompletions(
8531     CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
8532     SmallVectorImpl<CodeCompletionResult> &Results) {
8533   ResultBuilder Builder(*this, Allocator, CCTUInfo,
8534                         CodeCompletionContext::CCC_Recovery);
8535   if (!CodeCompleter || CodeCompleter->includeGlobals()) {
8536     CodeCompletionDeclConsumer Consumer(Builder,
8537                                         Context.getTranslationUnitDecl());
8538     LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName,
8539                        Consumer,
8540                        !CodeCompleter || CodeCompleter->loadExternal());
8541   }
8542 
8543   if (!CodeCompleter || CodeCompleter->includeMacros())
8544     AddMacroResults(PP, Builder,
8545                     CodeCompleter ? CodeCompleter->loadExternal() : false,
8546                     true);
8547 
8548   Results.clear();
8549   Results.insert(Results.end(), Builder.data(),
8550                  Builder.data() + Builder.size());
8551 }
8552