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