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