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