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