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