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