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