clang 24.0.0git
SemaCodeComplete.cpp
Go to the documentation of this file.
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//===----------------------------------------------------------------------===//
13#include "clang/AST/Decl.h"
14#include "clang/AST/DeclBase.h"
15#include "clang/AST/DeclCXX.h"
16#include "clang/AST/DeclObjC.h"
19#include "clang/AST/Expr.h"
20#include "clang/AST/ExprCXX.h"
22#include "clang/AST/ExprObjC.h"
26#include "clang/AST/Type.h"
34#include "clang/Lex/MacroInfo.h"
37#include "clang/Sema/DeclSpec.h"
40#include "clang/Sema/Lookup.h"
41#include "clang/Sema/Overload.h"
44#include "clang/Sema/Scope.h"
46#include "clang/Sema/Sema.h"
48#include "clang/Sema/SemaObjC.h"
49#include "llvm/ADT/ArrayRef.h"
50#include "llvm/ADT/DenseSet.h"
51#include "llvm/ADT/SmallBitVector.h"
52#include "llvm/ADT/SmallPtrSet.h"
53#include "llvm/ADT/SmallString.h"
54#include "llvm/ADT/StringSet.h"
55#include "llvm/ADT/StringSwitch.h"
56#include "llvm/ADT/Twine.h"
57#include "llvm/ADT/iterator_range.h"
58#include "llvm/Support/Casting.h"
59#include "llvm/Support/FileSystem.h"
60#include "llvm/Support/Path.h"
61#include "llvm/Support/VirtualFileSystem.h"
62#include "llvm/Support/raw_ostream.h"
63
64#include <list>
65#include <map>
66#include <optional>
67#include <string>
68#include <vector>
69
70using namespace clang;
71using namespace sema;
72
73namespace {
74/// A container of code-completion results.
75class ResultBuilder {
76public:
77 /// The type of a name-lookup filter, which can be provided to the
78 /// name-lookup routines to specify which declarations should be included in
79 /// the result set (when it returns true) and which declarations should be
80 /// filtered out (returns false).
81 typedef bool (ResultBuilder::*LookupFilter)(const NamedDecl *) const;
82
83 typedef CodeCompletionResult Result;
84
85private:
86 /// The actual results we have found.
87 std::vector<Result> Results;
88
89 /// A record of all of the declarations we have found and placed
90 /// into the result set, used to ensure that no declaration ever gets into
91 /// the result set twice.
92 llvm::SmallPtrSet<const Decl *, 16> AllDeclsFound;
93
94 typedef std::pair<const NamedDecl *, unsigned> DeclIndexPair;
95
96 /// An entry in the shadow map, which is optimized to store
97 /// a single (declaration, index) mapping (the common case) but
98 /// can also store a list of (declaration, index) mappings.
99 class ShadowMapEntry {
100 typedef SmallVector<DeclIndexPair, 4> DeclIndexPairVector;
101
102 /// Contains either the solitary NamedDecl * or a vector
103 /// of (declaration, index) pairs.
104 llvm::PointerUnion<const NamedDecl *, DeclIndexPairVector *> DeclOrVector;
105
106 /// When the entry contains a single declaration, this is
107 /// the index associated with that entry.
108 unsigned SingleDeclIndex = 0;
109
110 public:
111 ShadowMapEntry() = default;
112 ShadowMapEntry(const ShadowMapEntry &) = delete;
113 ShadowMapEntry(ShadowMapEntry &&Move) { *this = std::move(Move); }
114 ShadowMapEntry &operator=(const ShadowMapEntry &) = delete;
115 ShadowMapEntry &operator=(ShadowMapEntry &&Move) {
116 SingleDeclIndex = Move.SingleDeclIndex;
117 DeclOrVector = Move.DeclOrVector;
118 Move.DeclOrVector = nullptr;
119 return *this;
120 }
121
122 void Add(const NamedDecl *ND, unsigned Index) {
123 if (DeclOrVector.isNull()) {
124 // 0 - > 1 elements: just set the single element information.
125 DeclOrVector = ND;
126 SingleDeclIndex = Index;
127 return;
128 }
129
130 if (const NamedDecl *PrevND = dyn_cast<const NamedDecl *>(DeclOrVector)) {
131 // 1 -> 2 elements: create the vector of results and push in the
132 // existing declaration.
133 DeclIndexPairVector *Vec = new DeclIndexPairVector;
134 Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex));
135 DeclOrVector = Vec;
136 }
137
138 // Add the new element to the end of the vector.
139 cast<DeclIndexPairVector *>(DeclOrVector)
140 ->push_back(DeclIndexPair(ND, Index));
141 }
142
143 ~ShadowMapEntry() {
144 if (DeclIndexPairVector *Vec =
145 dyn_cast_if_present<DeclIndexPairVector *>(DeclOrVector)) {
146 delete Vec;
147 DeclOrVector = ((NamedDecl *)nullptr);
148 }
149 }
150
151 // Iteration.
152 class iterator;
153 iterator begin() const;
154 iterator end() const;
155 };
156
157 /// A mapping from declaration names to the declarations that have
158 /// this name within a particular scope and their index within the list of
159 /// results.
160 typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap;
161
162 /// The semantic analysis object for which results are being
163 /// produced.
164 Sema &SemaRef;
165
166 /// The allocator used to allocate new code-completion strings.
167 CodeCompletionAllocator &Allocator;
168
169 CodeCompletionTUInfo &CCTUInfo;
170
171 /// If non-NULL, a filter function used to remove any code-completion
172 /// results that are not desirable.
173 LookupFilter Filter;
174
175 /// Whether we should allow declarations as
176 /// nested-name-specifiers that would otherwise be filtered out.
177 bool AllowNestedNameSpecifiers;
178
179 /// If set, the type that we would prefer our resulting value
180 /// declarations to have.
181 ///
182 /// Closely matching the preferred type gives a boost to a result's
183 /// priority.
184 CanQualType PreferredType;
185
186 /// A list of shadow maps, which is used to model name hiding at
187 /// different levels of, e.g., the inheritance hierarchy.
188 std::list<ShadowMap> ShadowMaps;
189
190 /// Overloaded C++ member functions found by SemaLookup.
191 /// Used to determine when one overload is dominated by another.
192 llvm::DenseMap<std::pair<DeclContext *, /*Name*/uintptr_t>, ShadowMapEntry>
193 OverloadMap;
194
195 /// If we're potentially referring to a C++ member function, the set
196 /// of qualifiers applied to the object type.
197 Qualifiers ObjectTypeQualifiers;
198 /// The kind of the object expression, for rvalue/lvalue overloads.
199 ExprValueKind ObjectKind;
200
201 /// Whether the \p ObjectTypeQualifiers field is active.
202 bool HasObjectTypeQualifiers;
203
204 // Whether the member function is using an explicit object parameter
205 bool IsExplicitObjectMemberFunction;
206
207 /// The selector that we prefer.
208 Selector PreferredSelector;
209
210 /// The completion context in which we are gathering results.
211 CodeCompletionContext CompletionContext;
212
213 /// If we are in an instance method definition, the \@implementation
214 /// object.
215 ObjCImplementationDecl *ObjCImplementation;
216
217 void AdjustResultPriorityForDecl(Result &R);
218
219 void MaybeAddConstructorResults(Result R);
220
221public:
222 explicit ResultBuilder(Sema &SemaRef, CodeCompletionAllocator &Allocator,
223 CodeCompletionTUInfo &CCTUInfo,
224 const CodeCompletionContext &CompletionContext,
225 LookupFilter Filter = nullptr)
226 : SemaRef(SemaRef), Allocator(Allocator), CCTUInfo(CCTUInfo),
227 Filter(Filter), AllowNestedNameSpecifiers(false),
228 HasObjectTypeQualifiers(false), IsExplicitObjectMemberFunction(false),
229 CompletionContext(CompletionContext), ObjCImplementation(nullptr) {
230 // If this is an Objective-C instance method definition, dig out the
231 // corresponding implementation.
232 switch (CompletionContext.getKind()) {
233 case CodeCompletionContext::CCC_Expression:
234 case CodeCompletionContext::CCC_ObjCMessageReceiver:
235 case CodeCompletionContext::CCC_ParenthesizedExpression:
236 case CodeCompletionContext::CCC_Statement:
237 case CodeCompletionContext::CCC_TopLevelOrExpression:
238 case CodeCompletionContext::CCC_Recovery:
239 if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl())
240 if (Method->isInstanceMethod())
241 if (ObjCInterfaceDecl *Interface = Method->getClassInterface())
242 ObjCImplementation = Interface->getImplementation();
243 break;
244
245 default:
246 break;
247 }
248 }
249
250 /// Determine the priority for a reference to the given declaration.
251 unsigned getBasePriority(const NamedDecl *D);
252
253 /// Whether we should include code patterns in the completion
254 /// results.
255 bool includeCodePatterns() const {
256 return SemaRef.CodeCompletion().CodeCompleter &&
257 SemaRef.CodeCompletion().CodeCompleter->includeCodePatterns();
258 }
259
260 /// Set the filter used for code-completion results.
261 void setFilter(LookupFilter Filter) { this->Filter = Filter; }
262
263 Result *data() { return Results.empty() ? nullptr : &Results.front(); }
264 unsigned size() const { return Results.size(); }
265 bool empty() const { return Results.empty(); }
266
267 /// Specify the preferred type.
268 void setPreferredType(QualType T) {
269 PreferredType = SemaRef.Context.getCanonicalType(T);
270 }
271
272 /// Set the cv-qualifiers on the object type, for us in filtering
273 /// calls to member functions.
274 ///
275 /// When there are qualifiers in this set, they will be used to filter
276 /// out member functions that aren't available (because there will be a
277 /// cv-qualifier mismatch) or prefer functions with an exact qualifier
278 /// match.
279 void setObjectTypeQualifiers(Qualifiers Quals, ExprValueKind Kind) {
280 ObjectTypeQualifiers = Quals;
281 ObjectKind = Kind;
282 HasObjectTypeQualifiers = true;
283 }
284
285 void setExplicitObjectMemberFn(bool IsExplicitObjectFn) {
286 IsExplicitObjectMemberFunction = IsExplicitObjectFn;
287 }
288
289 /// Set the preferred selector.
290 ///
291 /// When an Objective-C method declaration result is added, and that
292 /// method's selector matches this preferred selector, we give that method
293 /// a slight priority boost.
294 void setPreferredSelector(Selector Sel) { PreferredSelector = Sel; }
295
296 /// Retrieve the code-completion context for which results are
297 /// being collected.
298 const CodeCompletionContext &getCompletionContext() const {
299 return CompletionContext;
300 }
301
302 /// Specify whether nested-name-specifiers are allowed.
303 void allowNestedNameSpecifiers(bool Allow = true) {
304 AllowNestedNameSpecifiers = Allow;
305 }
306
307 /// Return the semantic analysis object for which we are collecting
308 /// code completion results.
309 Sema &getSema() const { return SemaRef; }
310
311 /// Retrieve the allocator used to allocate code completion strings.
312 CodeCompletionAllocator &getAllocator() const { return Allocator; }
313
314 CodeCompletionTUInfo &getCodeCompletionTUInfo() const { return CCTUInfo; }
315
316 /// Determine whether the given declaration is at all interesting
317 /// as a code-completion result.
318 ///
319 /// \param ND the declaration that we are inspecting.
320 ///
321 /// \param AsNestedNameSpecifier will be set true if this declaration is
322 /// only interesting when it is a nested-name-specifier.
323 bool isInterestingDecl(const NamedDecl *ND,
324 bool &AsNestedNameSpecifier) const;
325
326 /// Decide whether or not a use of function Decl can be a call.
327 ///
328 /// \param ND the function declaration.
329 ///
330 /// \param BaseExprType the object type in a member access expression,
331 /// if any.
332 bool canFunctionBeCalled(const NamedDecl *ND, QualType BaseExprType) const;
333
334 /// Decide whether or not a use of member function Decl can be a call.
335 ///
336 /// \param Method the function declaration.
337 ///
338 /// \param BaseExprType the object type in a member access expression,
339 /// if any.
340 bool canCxxMethodBeCalled(const CXXMethodDecl *Method,
341 QualType BaseExprType) const;
342
343 /// Check whether the result is hidden by the Hiding declaration.
344 ///
345 /// \returns true if the result is hidden and cannot be found, false if
346 /// the hidden result could still be found. When false, \p R may be
347 /// modified to describe how the result can be found (e.g., via extra
348 /// qualification).
349 bool CheckHiddenResult(Result &R, DeclContext *CurContext,
350 const NamedDecl *Hiding);
351
352 /// Add a new result to this result set (if it isn't already in one
353 /// of the shadow maps), or replace an existing result (for, e.g., a
354 /// redeclaration).
355 ///
356 /// \param R the result to add (if it is unique).
357 ///
358 /// \param CurContext the context in which this result will be named.
359 void MaybeAddResult(Result R, DeclContext *CurContext = nullptr);
360
361 /// Add a new result to this result set, where we already know
362 /// the hiding declaration (if any).
363 ///
364 /// \param R the result to add (if it is unique).
365 ///
366 /// \param CurContext the context in which this result will be named.
367 ///
368 /// \param Hiding the declaration that hides the result.
369 ///
370 /// \param InBaseClass whether the result was found in a base
371 /// class of the searched context.
372 ///
373 /// \param BaseExprType the type of expression that precedes the "." or "->"
374 /// in a member access expression.
375 void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding,
376 bool InBaseClass, QualType BaseExprType,
377 bool IsInDeclarationContext, bool IsAddressOfOperand);
378
379 /// Add a new non-declaration result to this result set.
380 void AddResult(Result R);
381
382 /// Enter into a new scope.
383 void EnterNewScope();
384
385 /// Exit from the current scope.
386 void ExitScope();
387
388 /// Ignore this declaration, if it is seen again.
389 void Ignore(const Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); }
390
391 /// Add a visited context.
392 void addVisitedContext(DeclContext *Ctx) {
393 CompletionContext.addVisitedContext(Ctx);
394 }
395
396 /// \name Name lookup predicates
397 ///
398 /// These predicates can be passed to the name lookup functions to filter the
399 /// results of name lookup. All of the predicates have the same type, so that
400 ///
401 //@{
402 bool IsOrdinaryName(const NamedDecl *ND) const;
403 bool IsOrdinaryNonTypeName(const NamedDecl *ND) const;
404 bool IsIntegralConstantValue(const NamedDecl *ND) const;
405 bool IsOrdinaryNonValueName(const NamedDecl *ND) const;
406 bool IsNestedNameSpecifier(const NamedDecl *ND) const;
407 bool IsEnum(const NamedDecl *ND) const;
408 bool IsClassOrStruct(const NamedDecl *ND) const;
409 bool IsUnion(const NamedDecl *ND) const;
410 bool IsNamespace(const NamedDecl *ND) const;
411 bool IsNamespaceOrAlias(const NamedDecl *ND) const;
412 bool IsType(const NamedDecl *ND) const;
413 bool IsMember(const NamedDecl *ND) const;
414 bool IsOffsetofField(const NamedDecl *ND) const;
415 bool IsObjCIvar(const NamedDecl *ND) const;
416 bool IsObjCMessageReceiver(const NamedDecl *ND) const;
417 bool IsObjCMessageReceiverOrLambdaCapture(const NamedDecl *ND) const;
418 bool IsObjCCollection(const NamedDecl *ND) const;
419 bool IsImpossibleToSatisfy(const NamedDecl *ND) const;
420 //@}
421};
422
423// Traverse declarations of the function (in a deterministic order,
424// for consistency) to find one which has parameter names.
425// For simplicity, consider a redecl to have parameter names
426// if at least one parameter has a name.
427const FunctionDecl *BetterSignature(const FunctionDecl *Function,
428 unsigned Start) {
429 auto ParaCount = Function->getNumParams();
430 // Note that `redecls()` traverses in a circular order from the current decl,
431 // so for consistency we have to first get the first declaration.
432 for (auto *Redecl : Function->getFirstDecl()->redecls()) {
433 // The callers will expect to be able to use the same index from the initial
434 // function on the redeclaration. While we do not expect this to happen,
435 // this is a failsafe.
436 if (Redecl->getNumParams() < ParaCount)
437 continue;
438 for (unsigned P = Start, N = Redecl->getNumParams(); P != N; ++P)
439 if (Redecl->getParamDecl(P)->getIdentifier())
440 return Redecl;
441 }
442 return Function;
443}
444} // namespace
445
447 if (!Enabled)
448 return;
449 if (isa<BlockDecl>(S.CurContext)) {
450 if (sema::BlockScopeInfo *BSI = S.getCurBlock()) {
451 ComputeType = nullptr;
452 Type = BSI->ReturnType;
453 ExpectedLoc = Tok;
454 }
455 } else if (const auto *Function = dyn_cast<FunctionDecl>(S.CurContext)) {
456 ComputeType = nullptr;
457 Type = Function->getReturnType();
458 ExpectedLoc = Tok;
459 } else if (const auto *Method = dyn_cast<ObjCMethodDecl>(S.CurContext)) {
460 ComputeType = nullptr;
461 Type = Method->getReturnType();
462 ExpectedLoc = Tok;
463 }
464}
465
467 if (!Enabled)
468 return;
469 auto *VD = llvm::dyn_cast_or_null<ValueDecl>(D);
470 ComputeType = nullptr;
471 Type = VD ? VD->getType() : QualType();
472 ExpectedLoc = Tok;
473}
474
475static const FieldDecl *lookupDirectField(RecordDecl *RD, const Designator &D);
477 ASTContext &Context, QualType BaseType, const Designation &Desig,
478 HeuristicResolver &Resolver,
479 llvm::function_ref<const FieldDecl *(RecordDecl *, const Designator &)>
480 LookupField);
481
483 QualType BaseType,
484 const Designation &D) {
485 if (!Enabled)
486 return;
487 ComputeType = nullptr;
488 HeuristicResolver Resolver(*Ctx);
489 Type = getDesignatedType(*Ctx, BaseType, D, Resolver, lookupDirectField);
490 ExpectedLoc = Tok;
491}
492
494 SourceLocation Tok, llvm::function_ref<QualType()> ComputeType) {
495 if (!Enabled)
496 return;
497 this->ComputeType = ComputeType;
498 Type = QualType();
499 ExpectedLoc = Tok;
500}
501
503 SourceLocation LParLoc) {
504 if (!Enabled)
505 return;
506 // expected type for parenthesized expression does not change.
507 if (ExpectedLoc == LParLoc)
508 ExpectedLoc = Tok;
509}
510
512 tok::TokenKind Op) {
513 if (!LHS)
514 return QualType();
515
516 QualType LHSType = LHS->getType();
517 if (LHSType->isPointerType()) {
518 if (Op == tok::plus || Op == tok::plusequal || Op == tok::minusequal)
520 // Pointer difference is more common than subtracting an int from a pointer.
521 if (Op == tok::minus)
522 return LHSType;
523 }
524
525 switch (Op) {
526 // No way to infer the type of RHS from LHS.
527 case tok::comma:
528 return QualType();
529 // Prefer the type of the left operand for all of these.
530 // Arithmetic operations.
531 case tok::plus:
532 case tok::plusequal:
533 case tok::minus:
534 case tok::minusequal:
535 case tok::percent:
536 case tok::percentequal:
537 case tok::slash:
538 case tok::slashequal:
539 case tok::star:
540 case tok::starequal:
541 // Assignment.
542 case tok::equal:
543 // Comparison operators.
544 case tok::equalequal:
545 case tok::exclaimequal:
546 case tok::less:
547 case tok::lessequal:
548 case tok::greater:
549 case tok::greaterequal:
550 case tok::spaceship:
551 return LHS->getType();
552 // Binary shifts are often overloaded, so don't try to guess those.
553 case tok::greatergreater:
554 case tok::greatergreaterequal:
555 case tok::lessless:
556 case tok::lesslessequal:
557 if (LHSType->isIntegralOrEnumerationType())
558 return S.getASTContext().IntTy;
559 return QualType();
560 // Logical operators, assume we want bool.
561 case tok::ampamp:
562 case tok::pipepipe:
563 return S.getASTContext().BoolTy;
564 // Operators often used for bit manipulation are typically used with the type
565 // of the left argument.
566 case tok::pipe:
567 case tok::pipeequal:
568 case tok::caret:
569 case tok::caretequal:
570 case tok::amp:
571 case tok::ampequal:
572 if (LHSType->isIntegralOrEnumerationType())
573 return LHSType;
574 return QualType();
575 // RHS should be a pointer to a member of the 'LHS' type, but we can't give
576 // any particular type here.
577 case tok::periodstar:
578 case tok::arrowstar:
579 return QualType();
580 default:
581 // FIXME(ibiryukov): handle the missing op, re-add the assertion.
582 // assert(false && "unhandled binary op");
583 return QualType();
584 }
585}
586
587/// Get preferred type for an argument of an unary expression. \p ContextType is
588/// preferred type of the whole unary expression.
590 tok::TokenKind Op) {
591 switch (Op) {
592 case tok::exclaim:
593 return S.getASTContext().BoolTy;
594 case tok::amp:
595 if (!ContextType.isNull() && ContextType->isPointerType())
596 return ContextType->getPointeeType();
597 return QualType();
598 case tok::star:
599 if (ContextType.isNull())
600 return QualType();
601 return S.getASTContext().getPointerType(ContextType.getNonReferenceType());
602 case tok::plus:
603 case tok::minus:
604 case tok::tilde:
605 case tok::minusminus:
606 case tok::plusplus:
607 if (ContextType.isNull())
608 return S.getASTContext().IntTy;
609 // leave as is, these operators typically return the same type.
610 return ContextType;
611 case tok::kw___real:
612 case tok::kw___imag:
613 return QualType();
614 default:
615 assert(false && "unhandled unary op");
616 return QualType();
617 }
618}
619
621 tok::TokenKind Op) {
622 if (!Enabled)
623 return;
624 ComputeType = nullptr;
625 Type = getPreferredTypeOfBinaryRHS(S, LHS, Op);
626 ExpectedLoc = Tok;
627}
628
630 Expr *Base) {
631 if (!Enabled || !Base)
632 return;
633 // Do we have expected type for Base?
634 if (ExpectedLoc != Base->getBeginLoc())
635 return;
636 // Keep the expected type, only update the location.
637 ExpectedLoc = Tok;
638}
639
641 tok::TokenKind OpKind,
642 SourceLocation OpLoc) {
643 if (!Enabled)
644 return;
645 ComputeType = nullptr;
646 Type = getPreferredTypeOfUnaryArg(S, this->get(OpLoc), OpKind);
647 ExpectedLoc = Tok;
648}
649
651 Expr *LHS) {
652 if (!Enabled)
653 return;
654 ComputeType = nullptr;
655 Type = S.getASTContext().IntTy;
656 ExpectedLoc = Tok;
657}
658
661 if (!Enabled)
662 return;
663 ComputeType = nullptr;
664 Type = !CastType.isNull() ? CastType.getCanonicalType() : QualType();
665 ExpectedLoc = Tok;
666}
667
669 if (!Enabled)
670 return;
671 ComputeType = nullptr;
672 Type = S.getASTContext().BoolTy;
673 ExpectedLoc = Tok;
674}
675
677 llvm::PointerUnion<const NamedDecl *, const DeclIndexPair *> DeclOrIterator;
678 unsigned SingleDeclIndex;
679
680public:
681 typedef DeclIndexPair value_type;
683 typedef std::ptrdiff_t difference_type;
684 typedef std::input_iterator_tag iterator_category;
685
686 class pointer {
687 DeclIndexPair Value;
688
689 public:
690 pointer(const DeclIndexPair &Value) : Value(Value) {}
691
692 const DeclIndexPair *operator->() const { return &Value; }
693 };
694
695 iterator() : DeclOrIterator((NamedDecl *)nullptr), SingleDeclIndex(0) {}
696
697 iterator(const NamedDecl *SingleDecl, unsigned Index)
698 : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) {}
699
700 iterator(const DeclIndexPair *Iterator)
701 : DeclOrIterator(Iterator), SingleDeclIndex(0) {}
702
704 if (isa<const NamedDecl *>(DeclOrIterator)) {
705 DeclOrIterator = (NamedDecl *)nullptr;
706 SingleDeclIndex = 0;
707 return *this;
708 }
709
710 const DeclIndexPair *I = cast<const DeclIndexPair *>(DeclOrIterator);
711 ++I;
712 DeclOrIterator = I;
713 return *this;
714 }
715
716 /*iterator operator++(int) {
717 iterator tmp(*this);
718 ++(*this);
719 return tmp;
720 }*/
721
723 if (const NamedDecl *ND = dyn_cast<const NamedDecl *>(DeclOrIterator))
724 return reference(ND, SingleDeclIndex);
725
726 return *cast<const DeclIndexPair *>(DeclOrIterator);
727 }
728
729 pointer operator->() const { return pointer(**this); }
730
731 friend bool operator==(const iterator &X, const iterator &Y) {
732 return X.DeclOrIterator.getOpaqueValue() ==
733 Y.DeclOrIterator.getOpaqueValue() &&
734 X.SingleDeclIndex == Y.SingleDeclIndex;
735 }
736
737 friend bool operator!=(const iterator &X, const iterator &Y) {
738 return !(X == Y);
739 }
740};
741
743ResultBuilder::ShadowMapEntry::begin() const {
744 if (DeclOrVector.isNull())
745 return iterator();
746
747 if (const NamedDecl *ND = dyn_cast<const NamedDecl *>(DeclOrVector))
748 return iterator(ND, SingleDeclIndex);
749
750 return iterator(cast<DeclIndexPairVector *>(DeclOrVector)->begin());
751}
752
754ResultBuilder::ShadowMapEntry::end() const {
755 if (isa<const NamedDecl *>(DeclOrVector) || DeclOrVector.isNull())
756 return iterator();
757
758 return iterator(cast<DeclIndexPairVector *>(DeclOrVector)->end());
759}
760
761/// Compute the qualification required to get from the current context
762/// (\p CurContext) to the target context (\p TargetContext).
763///
764/// \param Context the AST context in which the qualification will be used.
765///
766/// \param CurContext the context where an entity is being named, which is
767/// typically based on the current scope.
768///
769/// \param TargetContext the context in which the named entity actually
770/// resides.
771///
772/// \returns a nested name specifier that refers into the target context, or
773/// NULL if no qualification is needed.
776 const DeclContext *TargetContext) {
778
779 for (const DeclContext *CommonAncestor = TargetContext;
780 CommonAncestor && !CommonAncestor->Encloses(CurContext);
781 CommonAncestor = CommonAncestor->getLookupParent()) {
782 if (CommonAncestor->isTransparentContext() ||
783 CommonAncestor->isFunctionOrMethod())
784 continue;
785
786 TargetParents.push_back(CommonAncestor);
787 }
788
789 NestedNameSpecifier Result = std::nullopt;
790 while (!TargetParents.empty()) {
791 const DeclContext *Parent = TargetParents.pop_back_val();
792
793 if (const auto *Namespace = dyn_cast<NamespaceDecl>(Parent)) {
794 if (!Namespace->getIdentifier())
795 continue;
796
797 Result = NestedNameSpecifier(Context, Namespace, Result);
798 } else if (const auto *TD = dyn_cast<TagDecl>(Parent)) {
799 QualType TT = Context.getTagType(ElaboratedTypeKeyword::None, Result, TD,
800 /*OwnsTag=*/false);
802 }
803 }
804 return Result;
805}
806
807// Some declarations have reserved names that we don't want to ever show.
808// Filter out names reserved for the implementation if they come from a
809// system header.
810static bool shouldIgnoreDueToReservedName(const NamedDecl *ND, Sema &SemaRef) {
811 // Debuggers want access to all identifiers, including reserved ones.
812 if (SemaRef.getLangOpts().DebuggerSupport)
813 return false;
814
815 ReservedIdentifierStatus Status = ND->isReserved(SemaRef.getLangOpts());
816 // Ignore reserved names for compiler provided decls.
817 if (isReservedInAllContexts(Status) && ND->getLocation().isInvalid())
818 return true;
819
820 // For system headers ignore only double-underscore names.
821 // This allows for system headers providing private symbols with a single
822 // underscore.
825 SemaRef.SourceMgr.getSpellingLoc(ND->getLocation())))
826 return true;
827
828 return false;
829}
830
831bool ResultBuilder::isInterestingDecl(const NamedDecl *ND,
832 bool &AsNestedNameSpecifier) const {
833 AsNestedNameSpecifier = false;
834
835 auto *Named = ND;
836 ND = ND->getUnderlyingDecl();
837
838 // Skip unnamed entities.
839 if (!ND->getDeclName())
840 return false;
841
842 // Friend declarations and declarations introduced due to friends are never
843 // added as results.
845 return false;
846
847 // Class template (partial) specializations are never added as results.
850 return false;
851
852 // Using declarations themselves are never added as results.
853 if (isa<UsingDecl>(ND))
854 return false;
855
856 if (shouldIgnoreDueToReservedName(ND, SemaRef))
857 return false;
858
859 if (Filter == &ResultBuilder::IsNestedNameSpecifier ||
860 (isa<NamespaceDecl>(ND) && Filter != &ResultBuilder::IsNamespace &&
861 Filter != &ResultBuilder::IsNamespaceOrAlias && Filter != nullptr))
862 AsNestedNameSpecifier = true;
863
864 // Filter out any unwanted results.
865 if (Filter && !(this->*Filter)(Named)) {
866 // Check whether it is interesting as a nested-name-specifier.
867 if (AllowNestedNameSpecifiers && SemaRef.getLangOpts().CPlusPlus &&
868 IsNestedNameSpecifier(ND) &&
869 (Filter != &ResultBuilder::IsMember ||
870 (isa<CXXRecordDecl>(ND) &&
871 cast<CXXRecordDecl>(ND)->isInjectedClassName()))) {
872 AsNestedNameSpecifier = true;
873 return true;
874 }
875
876 return false;
877 }
878 // ... then it must be interesting!
879 return true;
880}
881
882bool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext,
883 const NamedDecl *Hiding) {
884 // In C, there is no way to refer to a hidden name.
885 // FIXME: This isn't true; we can find a tag name hidden by an ordinary
886 // name if we introduce the tag type.
887 if (!SemaRef.getLangOpts().CPlusPlus)
888 return true;
889
890 const DeclContext *HiddenCtx =
891 R.Declaration->getDeclContext()->getRedeclContext();
892
893 // There is no way to qualify a name declared in a function or method.
894 if (HiddenCtx->isFunctionOrMethod())
895 return true;
896
897 if (HiddenCtx == Hiding->getDeclContext()->getRedeclContext())
898 return true;
899
900 // We can refer to the result with the appropriate qualification. Do it.
901 R.Hidden = true;
902 R.QualifierIsInformative = false;
903
904 if (!R.Qualifier)
905 R.Qualifier = getRequiredQualification(SemaRef.Context, CurContext,
906 R.Declaration->getDeclContext());
907 return false;
908}
909
910/// A simplified classification of types used to determine whether two
911/// types are "similar enough" when adjusting priorities.
913 switch (T->getTypeClass()) {
914 case Type::Builtin:
915 switch (cast<BuiltinType>(T)->getKind()) {
916 case BuiltinType::Void:
917 return STC_Void;
918
919 case BuiltinType::NullPtr:
920 return STC_Pointer;
921
922 case BuiltinType::Overload:
923 case BuiltinType::Dependent:
924 return STC_Other;
925
926 case BuiltinType::ObjCId:
927 case BuiltinType::ObjCClass:
928 case BuiltinType::ObjCSel:
929 return STC_ObjectiveC;
930
931 default:
932 return STC_Arithmetic;
933 }
934
935 case Type::Complex:
936 return STC_Arithmetic;
937
938 case Type::Pointer:
939 return STC_Pointer;
940
941 case Type::BlockPointer:
942 return STC_Block;
943
944 case Type::LValueReference:
945 case Type::RValueReference:
947
948 case Type::ConstantArray:
949 case Type::IncompleteArray:
950 case Type::VariableArray:
951 case Type::DependentSizedArray:
952 return STC_Array;
953
954 case Type::DependentSizedExtVector:
955 case Type::Vector:
956 case Type::ExtVector:
957 return STC_Arithmetic;
958
959 case Type::FunctionProto:
960 case Type::FunctionNoProto:
961 return STC_Function;
962
963 case Type::Record:
964 return STC_Record;
965
966 case Type::Enum:
967 return STC_Arithmetic;
968
969 case Type::ObjCObject:
970 case Type::ObjCInterface:
971 case Type::ObjCObjectPointer:
972 return STC_ObjectiveC;
973
974 default:
975 return STC_Other;
976 }
977}
978
979/// Get the type that a given expression will have if this declaration
980/// is used as an expression in its "typical" code-completion form.
982 const NamedDecl *ND) {
983 ND = ND->getUnderlyingDecl();
984
985 if (const auto *Type = dyn_cast<TypeDecl>(ND))
986 return C.getTypeDeclType(ElaboratedTypeKeyword::None, Qualifier, Type);
987 if (const auto *Iface = dyn_cast<ObjCInterfaceDecl>(ND))
988 return C.getObjCInterfaceType(Iface);
989
990 QualType T;
991 if (const FunctionDecl *Function = ND->getAsFunction())
992 T = Function->getCallResultType();
993 else if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND))
994 T = Method->getSendResultType();
995 else if (const auto *Enumerator = dyn_cast<EnumConstantDecl>(ND))
996 T = C.getTagType(ElaboratedTypeKeyword::None, Qualifier,
997 cast<EnumDecl>(Enumerator->getDeclContext()),
998 /*OwnsTag=*/false);
999 else if (const auto *Property = dyn_cast<ObjCPropertyDecl>(ND))
1000 T = Property->getType();
1001 else if (const auto *Value = dyn_cast<ValueDecl>(ND))
1002 T = Value->getType();
1003
1004 if (T.isNull())
1005 return QualType();
1006
1007 // Dig through references, function pointers, and block pointers to
1008 // get down to the likely type of an expression when the entity is
1009 // used.
1010 do {
1011 if (const auto *Ref = T->getAs<ReferenceType>()) {
1012 T = Ref->getPointeeType();
1013 continue;
1014 }
1015
1016 if (const auto *Pointer = T->getAs<PointerType>()) {
1017 if (Pointer->getPointeeType()->isFunctionType()) {
1018 T = Pointer->getPointeeType();
1019 continue;
1020 }
1021
1022 break;
1023 }
1024
1025 if (const auto *Block = T->getAs<BlockPointerType>()) {
1026 T = Block->getPointeeType();
1027 continue;
1028 }
1029
1030 if (const auto *Function = T->getAs<FunctionType>()) {
1031 T = Function->getReturnType();
1032 continue;
1033 }
1034
1035 break;
1036 } while (true);
1037
1038 return T;
1039}
1040
1041unsigned ResultBuilder::getBasePriority(const NamedDecl *ND) {
1042 if (!ND)
1043 return CCP_Unlikely;
1044
1045 // Context-based decisions.
1046 const DeclContext *LexicalDC = ND->getLexicalDeclContext();
1047 if (LexicalDC->isFunctionOrMethod()) {
1048 // _cmd is relatively rare
1049 if (const auto *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
1050 if (ImplicitParam->getIdentifier() &&
1051 ImplicitParam->getIdentifier()->isStr("_cmd"))
1052 return CCP_ObjC_cmd;
1053
1054 return CCP_LocalDeclaration;
1055 }
1056
1057 const DeclContext *DC = ND->getDeclContext()->getRedeclContext();
1058 if (DC->isRecord() || isa<ObjCContainerDecl>(DC)) {
1059 // Explicit destructor calls are very rare.
1060 if (isa<CXXDestructorDecl>(ND))
1061 return CCP_Unlikely;
1062 // Explicit operator and conversion function calls are also very rare.
1063 auto DeclNameKind = ND->getDeclName().getNameKind();
1064 if (DeclNameKind == DeclarationName::CXXOperatorName ||
1067 return CCP_Unlikely;
1068 return CCP_MemberDeclaration;
1069 }
1070
1071 // Content-based decisions.
1072 if (isa<EnumConstantDecl>(ND))
1073 return CCP_Constant;
1074
1075 // Use CCP_Type for type declarations unless we're in a statement, Objective-C
1076 // message receiver, or parenthesized expression context. There, it's as
1077 // likely that the user will want to write a type as other declarations.
1078 if ((isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) &&
1079 !(CompletionContext.getKind() == CodeCompletionContext::CCC_Statement ||
1080 CompletionContext.getKind() ==
1082 CompletionContext.getKind() ==
1084 return CCP_Type;
1085
1086 return CCP_Declaration;
1087}
1088
1089void ResultBuilder::AdjustResultPriorityForDecl(Result &R) {
1090 // If this is an Objective-C method declaration whose selector matches our
1091 // preferred selector, give it a priority boost.
1092 if (!PreferredSelector.isNull())
1093 if (const auto *Method = dyn_cast<ObjCMethodDecl>(R.Declaration))
1094 if (PreferredSelector == Method->getSelector())
1095 R.Priority += CCD_SelectorMatch;
1096
1097 // If we have a preferred type, adjust the priority for results with exactly-
1098 // matching or nearly-matching types.
1099 if (!PreferredType.isNull()) {
1100 QualType T = getDeclUsageType(SemaRef.Context, R.Qualifier, R.Declaration);
1101 if (!T.isNull()) {
1102 CanQualType TC = SemaRef.Context.getCanonicalType(T);
1103 // Check for exactly-matching types (modulo qualifiers).
1104 if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC))
1105 R.Priority /= CCF_ExactTypeMatch;
1106 // Check for nearly-matching types, based on classification of each.
1107 else if ((getSimplifiedTypeClass(PreferredType) ==
1109 !(PreferredType->isEnumeralType() && TC->isEnumeralType()))
1110 R.Priority /= CCF_SimilarTypeMatch;
1111 }
1112 }
1113}
1114
1116 const CXXRecordDecl *Record) {
1117 CanQualType RecordTy = Context.getCanonicalTagType(Record);
1118 DeclarationName ConstructorName =
1119 Context.DeclarationNames.getCXXConstructorName(RecordTy);
1120 return Record->lookup(ConstructorName);
1121}
1122
1123void ResultBuilder::MaybeAddConstructorResults(Result R) {
1124 if (!SemaRef.getLangOpts().CPlusPlus || !R.Declaration ||
1125 !CompletionContext.wantConstructorResults())
1126 return;
1127
1128 const NamedDecl *D = R.Declaration;
1129 const CXXRecordDecl *Record = nullptr;
1130 if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D))
1131 Record = ClassTemplate->getTemplatedDecl();
1132 else if ((Record = dyn_cast<CXXRecordDecl>(D))) {
1133 // Skip specializations and partial specializations.
1135 return;
1136 } else {
1137 // There are no constructors here.
1138 return;
1139 }
1140
1142 if (!Record)
1143 return;
1144
1145 for (NamedDecl *Ctor : getConstructors(SemaRef.Context, Record)) {
1146 R.Declaration = Ctor;
1147 R.CursorKind = getCursorKindForDecl(R.Declaration);
1148 Results.push_back(R);
1149 }
1150}
1151
1152static bool isConstructor(const Decl *ND) {
1153 if (const auto *Tmpl = dyn_cast<FunctionTemplateDecl>(ND))
1154 ND = Tmpl->getTemplatedDecl();
1155 return isa<CXXConstructorDecl>(ND);
1156}
1157
1158void ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) {
1159 assert(!ShadowMaps.empty() && "Must enter into a results scope");
1160
1161 if (R.Kind != Result::RK_Declaration) {
1162 // For non-declaration results, just add the result.
1163 Results.push_back(R);
1164 return;
1165 }
1166
1167 // Look through using declarations.
1168 if (const UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) {
1169 CodeCompletionResult Result(Using->getTargetDecl(),
1170 getBasePriority(Using->getTargetDecl()),
1171 R.Qualifier, false,
1172 (R.Availability == CXAvailability_Available ||
1173 R.Availability == CXAvailability_Deprecated),
1174 std::move(R.FixIts));
1175 Result.ShadowDecl = Using;
1176 MaybeAddResult(Result, CurContext);
1177 return;
1178 }
1179
1180 const Decl *CanonDecl = R.Declaration->getCanonicalDecl();
1181 unsigned IDNS = CanonDecl->getIdentifierNamespace();
1182
1183 bool AsNestedNameSpecifier = false;
1184 if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
1185 return;
1186
1187 // C++ constructors are never found by name lookup.
1188 if (isConstructor(R.Declaration))
1189 return;
1190
1191 ShadowMap &SMap = ShadowMaps.back();
1192 ShadowMapEntry::iterator I, IEnd;
1193 ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName());
1194 if (NamePos != SMap.end()) {
1195 I = NamePos->second.begin();
1196 IEnd = NamePos->second.end();
1197 }
1198
1199 for (; I != IEnd; ++I) {
1200 const NamedDecl *ND = I->first;
1201 unsigned Index = I->second;
1202 if (ND->getCanonicalDecl() == CanonDecl) {
1203 // This is a redeclaration. Always pick the newer declaration.
1204 Results[Index].Declaration = R.Declaration;
1205
1206 // We're done.
1207 return;
1208 }
1209 }
1210
1211 // This is a new declaration in this scope. However, check whether this
1212 // declaration name is hidden by a similarly-named declaration in an outer
1213 // scope.
1214 std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end();
1215 --SMEnd;
1216 for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) {
1217 ShadowMapEntry::iterator I, IEnd;
1218 ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName());
1219 if (NamePos != SM->end()) {
1220 I = NamePos->second.begin();
1221 IEnd = NamePos->second.end();
1222 }
1223 for (; I != IEnd; ++I) {
1224 // A tag declaration does not hide a non-tag declaration.
1225 if (I->first->hasTagIdentifierNamespace() &&
1228 continue;
1229
1230 // Protocols are in distinct namespaces from everything else.
1231 if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) ||
1232 (IDNS & Decl::IDNS_ObjCProtocol)) &&
1233 I->first->getIdentifierNamespace() != IDNS)
1234 continue;
1235
1236 // The newly-added result is hidden by an entry in the shadow map.
1237 if (CheckHiddenResult(R, CurContext, I->first))
1238 return;
1239
1240 break;
1241 }
1242 }
1243
1244 // Make sure that any given declaration only shows up in the result set once.
1245 if (!AllDeclsFound.insert(CanonDecl).second)
1246 return;
1247
1248 // If the filter is for nested-name-specifiers, then this result starts a
1249 // nested-name-specifier.
1250 if (AsNestedNameSpecifier) {
1251 R.StartsNestedNameSpecifier = true;
1252 R.Priority = CCP_NestedNameSpecifier;
1253 } else
1254 AdjustResultPriorityForDecl(R);
1255
1256 // If this result is supposed to have an informative qualifier, add one.
1257 if (R.QualifierIsInformative && !R.Qualifier &&
1258 !R.StartsNestedNameSpecifier) {
1259 const DeclContext *Ctx = R.Declaration->getDeclContext();
1260 if (const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx))
1261 R.Qualifier =
1262 NestedNameSpecifier(SemaRef.Context, Namespace, std::nullopt);
1263 else if (const TagDecl *Tag = dyn_cast<TagDecl>(Ctx))
1264 R.Qualifier = NestedNameSpecifier(
1265 SemaRef.Context
1267 /*Qualifier=*/std::nullopt, Tag, /*OwnsTag=*/false)
1268 .getTypePtr());
1269 else
1270 R.QualifierIsInformative = false;
1271 }
1272
1273 // Insert this result into the set of results and into the current shadow
1274 // map.
1275 SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size());
1276 Results.push_back(R);
1277
1278 if (!AsNestedNameSpecifier)
1279 MaybeAddConstructorResults(R);
1280}
1281
1282static void setInBaseClass(ResultBuilder::Result &R) {
1283 R.Priority += CCD_InBaseClass;
1284 R.InBaseClass = true;
1285}
1286
1288// Will Candidate ever be called on the object, when overloaded with Incumbent?
1289// Returns Dominates if Candidate is always called, Dominated if Incumbent is
1290// always called, BothViable if either may be called depending on arguments.
1291// Precondition: must actually be overloads!
1293 const CXXMethodDecl &Incumbent,
1294 const Qualifiers &ObjectQuals,
1295 ExprValueKind ObjectKind,
1296 const ASTContext &Ctx) {
1297 // Base/derived shadowing is handled elsewhere.
1298 if (Candidate.getDeclContext() != Incumbent.getDeclContext())
1300 if (Candidate.isVariadic() != Incumbent.isVariadic() ||
1301 Candidate.getNumParams() != Incumbent.getNumParams() ||
1302 Candidate.getMinRequiredArguments() !=
1303 Incumbent.getMinRequiredArguments())
1305 for (unsigned I = 0, E = Candidate.getNumParams(); I != E; ++I)
1306 if (Candidate.parameters()[I]->getType().getCanonicalType() !=
1307 Incumbent.parameters()[I]->getType().getCanonicalType())
1309 if (!Candidate.specific_attrs<EnableIfAttr>().empty() ||
1310 !Incumbent.specific_attrs<EnableIfAttr>().empty())
1312 // At this point, we know calls can't pick one or the other based on
1313 // arguments, so one of the two must win. (Or both fail, handled elsewhere).
1314 RefQualifierKind CandidateRef = Candidate.getRefQualifier();
1315 RefQualifierKind IncumbentRef = Incumbent.getRefQualifier();
1316 if (CandidateRef != IncumbentRef) {
1317 // If the object kind is LValue/RValue, there's one acceptable ref-qualifier
1318 // and it can't be mixed with ref-unqualified overloads (in valid code).
1319
1320 // For xvalue objects, we prefer the rvalue overload even if we have to
1321 // add qualifiers (which is rare, because const&& is rare).
1322 if (ObjectKind == clang::VK_XValue)
1323 return CandidateRef == RQ_RValue ? OverloadCompare::Dominates
1325 }
1326 // Now the ref qualifiers are the same (or we're in some invalid state).
1327 // So make some decision based on the qualifiers.
1328 Qualifiers CandidateQual = Candidate.getMethodQualifiers();
1329 Qualifiers IncumbentQual = Incumbent.getMethodQualifiers();
1330 bool CandidateSuperset = CandidateQual.compatiblyIncludes(IncumbentQual, Ctx);
1331 bool IncumbentSuperset = IncumbentQual.compatiblyIncludes(CandidateQual, Ctx);
1332 if (CandidateSuperset == IncumbentSuperset)
1334 return IncumbentSuperset ? OverloadCompare::Dominates
1336}
1337
1338bool ResultBuilder::canCxxMethodBeCalled(const CXXMethodDecl *Method,
1339 QualType BaseExprType) const {
1340 // Find the class scope that we're currently in.
1341 // We could e.g. be inside a lambda, so walk up the DeclContext until we
1342 // find a CXXMethodDecl.
1343 DeclContext *CurContext = SemaRef.CurContext;
1344 const auto *CurrentClassScope = [&]() -> const CXXRecordDecl * {
1345 for (DeclContext *Ctx = CurContext; Ctx; Ctx = Ctx->getParent()) {
1346 const auto *CtxMethod = llvm::dyn_cast<CXXMethodDecl>(Ctx);
1347 if (CtxMethod && !CtxMethod->getParent()->isLambda()) {
1348 return CtxMethod->getParent();
1349 }
1350 }
1351 return nullptr;
1352 }();
1353
1354 // If we're not inside the scope of the method's class, it can't be a call.
1355 bool FunctionCanBeCall =
1356 CurrentClassScope &&
1357 (CurrentClassScope == Method->getParent() ||
1358 CurrentClassScope->isDerivedFrom(Method->getParent()));
1359
1360 // We skip the following calculation for exceptions if it's already true.
1361 if (FunctionCanBeCall)
1362 return true;
1363
1364 // Exception: foo->FooBase::bar() or foo->Foo::bar() *is* a call.
1365 if (const CXXRecordDecl *MaybeDerived =
1366 BaseExprType.isNull() ? nullptr
1367 : BaseExprType->getAsCXXRecordDecl()) {
1368 auto *MaybeBase = Method->getParent();
1369 FunctionCanBeCall =
1370 MaybeDerived == MaybeBase || MaybeDerived->isDerivedFrom(MaybeBase);
1371 }
1372
1373 return FunctionCanBeCall;
1374}
1375
1376bool ResultBuilder::canFunctionBeCalled(const NamedDecl *ND,
1377 QualType BaseExprType) const {
1378 // We apply heuristics only to CCC_Symbol:
1379 // * CCC_{Arrow,Dot}MemberAccess reflect member access expressions:
1380 // f.method() and f->method(). These are always calls.
1381 // * A qualified name to a member function may *not* be a call. We have to
1382 // subdivide the cases: For example, f.Base::method(), which is regarded as
1383 // CCC_Symbol, should be a call.
1384 // * Non-member functions and static member functions are always considered
1385 // calls.
1386 if (CompletionContext.getKind() == clang::CodeCompletionContext::CCC_Symbol) {
1387 if (const auto *FuncTmpl = dyn_cast<FunctionTemplateDecl>(ND)) {
1388 ND = FuncTmpl->getTemplatedDecl();
1389 }
1390 const auto *Method = dyn_cast<CXXMethodDecl>(ND);
1391 if (Method && !Method->isStatic()) {
1392 return canCxxMethodBeCalled(Method, BaseExprType);
1393 }
1394 }
1395 return true;
1396}
1397
1398void ResultBuilder::AddResult(Result R, DeclContext *CurContext,
1399 NamedDecl *Hiding, bool InBaseClass = false,
1400 QualType BaseExprType = QualType(),
1401 bool IsInDeclarationContext = false,
1402 bool IsAddressOfOperand = false) {
1403 if (R.Kind != Result::RK_Declaration) {
1404 // For non-declaration results, just add the result.
1405 Results.push_back(R);
1406 return;
1407 }
1408
1409 // Look through using declarations.
1410 if (const auto *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) {
1411 CodeCompletionResult Result(Using->getTargetDecl(),
1412 getBasePriority(Using->getTargetDecl()),
1413 R.Qualifier, false,
1414 (R.Availability == CXAvailability_Available ||
1415 R.Availability == CXAvailability_Deprecated),
1416 std::move(R.FixIts));
1417 Result.ShadowDecl = Using;
1418 AddResult(Result, CurContext, Hiding, /*InBaseClass=*/false,
1419 /*BaseExprType=*/BaseExprType);
1420 return;
1421 }
1422
1423 bool AsNestedNameSpecifier = false;
1424 if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
1425 return;
1426
1427 // C++ constructors are never found by name lookup.
1428 if (isConstructor(R.Declaration))
1429 return;
1430
1431 if (Hiding && CheckHiddenResult(R, CurContext, Hiding))
1432 return;
1433
1434 // Make sure that any given declaration only shows up in the result set once.
1435 if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl()).second)
1436 return;
1437
1438 // If the filter is for nested-name-specifiers, then this result starts a
1439 // nested-name-specifier.
1440 if (AsNestedNameSpecifier) {
1441 R.StartsNestedNameSpecifier = true;
1442 R.Priority = CCP_NestedNameSpecifier;
1443 } else if (Filter == &ResultBuilder::IsMember && !R.Qualifier &&
1444 InBaseClass &&
1446 R.Declaration->getDeclContext()->getRedeclContext()))
1447 R.QualifierIsInformative = true;
1448
1449 // If this result is supposed to have an informative qualifier, add one.
1450 if (R.QualifierIsInformative && !R.Qualifier &&
1451 !R.StartsNestedNameSpecifier) {
1452 const DeclContext *Ctx = R.Declaration->getDeclContext();
1453 if (const auto *Namespace = dyn_cast<NamespaceDecl>(Ctx))
1454 R.Qualifier =
1455 NestedNameSpecifier(SemaRef.Context, Namespace, std::nullopt);
1456 else if (const auto *Tag = dyn_cast<TagDecl>(Ctx))
1457 R.Qualifier = NestedNameSpecifier(
1458 SemaRef.Context
1460 /*Qualifier=*/std::nullopt, Tag, /*OwnsTag=*/false)
1461 .getTypePtr());
1462 else
1463 R.QualifierIsInformative = false;
1464 }
1465
1466 // Adjust the priority if this result comes from a base class.
1467 if (InBaseClass)
1468 setInBaseClass(R);
1469
1470 AdjustResultPriorityForDecl(R);
1471
1472 // Account for explicit object parameter
1473 const auto GetQualifiers = [&](const CXXMethodDecl *MethodDecl) {
1474 if (MethodDecl->isExplicitObjectMemberFunction())
1475 return MethodDecl->getFunctionObjectParameterType().getQualifiers();
1476 else
1477 return MethodDecl->getMethodQualifiers();
1478 };
1479
1480 if (IsExplicitObjectMemberFunction &&
1482 (isa<CXXMethodDecl>(R.Declaration) || isa<FieldDecl>(R.Declaration))) {
1483 // If result is a member in the context of an explicit-object member
1484 // function, drop it because it must be accessed through the object
1485 // parameter
1486 return;
1487 }
1488
1489 if (HasObjectTypeQualifiers)
1490 if (const auto *Method = dyn_cast<CXXMethodDecl>(R.Declaration))
1491 if (Method->isInstance()) {
1492 Qualifiers MethodQuals = GetQualifiers(Method);
1493 if (ObjectTypeQualifiers == MethodQuals)
1494 R.Priority += CCD_ObjectQualifierMatch;
1495 else if (ObjectTypeQualifiers - MethodQuals) {
1496 // The method cannot be invoked, because doing so would drop
1497 // qualifiers.
1498 return;
1499 }
1500 // Detect cases where a ref-qualified method cannot be invoked.
1501 switch (Method->getRefQualifier()) {
1502 case RQ_LValue:
1503 if (ObjectKind != VK_LValue && !MethodQuals.hasConst())
1504 return;
1505 break;
1506 case RQ_RValue:
1507 if (ObjectKind == VK_LValue)
1508 return;
1509 break;
1510 case RQ_None:
1511 break;
1512 }
1513
1514 /// Check whether this dominates another overloaded method, which should
1515 /// be suppressed (or vice versa).
1516 /// Motivating case is const_iterator begin() const vs iterator begin().
1517 auto &OverloadSet = OverloadMap[std::make_pair(
1518 CurContext, Method->getDeclName().getAsOpaqueInteger())];
1519 for (const DeclIndexPair Entry : OverloadSet) {
1520 Result &Incumbent = Results[Entry.second];
1521 switch (compareOverloads(*Method,
1522 *cast<CXXMethodDecl>(Incumbent.Declaration),
1523 ObjectTypeQualifiers, ObjectKind,
1524 CurContext->getParentASTContext())) {
1526 // Replace the dominated overload with this one.
1527 // FIXME: if the overload dominates multiple incumbents then we
1528 // should remove all. But two overloads is by far the common case.
1529 Incumbent = std::move(R);
1530 return;
1532 // This overload can't be called, drop it.
1533 return;
1535 break;
1536 }
1537 }
1538 OverloadSet.Add(Method, Results.size());
1539 }
1540 R.DeclaringEntity = IsInDeclarationContext;
1541 R.FunctionCanBeCall =
1542 canFunctionBeCalled(R.getDeclaration(), BaseExprType) &&
1543 // If the user wrote `&` before the function name, assume the
1544 // user is more likely to take the address of the function rather
1545 // than call it and take the address of the result.
1546 !IsAddressOfOperand;
1547
1548 // Insert this result into the set of results.
1549 Results.push_back(R);
1550
1551 if (!AsNestedNameSpecifier)
1552 MaybeAddConstructorResults(R);
1553}
1554
1555void ResultBuilder::AddResult(Result R) {
1556 assert(R.Kind != Result::RK_Declaration &&
1557 "Declaration results need more context");
1558 Results.push_back(R);
1559}
1560
1561/// Enter into a new scope.
1562void ResultBuilder::EnterNewScope() { ShadowMaps.emplace_back(); }
1563
1564/// Exit from the current scope.
1565void ResultBuilder::ExitScope() {
1566 ShadowMaps.pop_back();
1567}
1568
1569/// Determines whether this given declaration will be found by
1570/// ordinary name lookup.
1571bool ResultBuilder::IsOrdinaryName(const NamedDecl *ND) const {
1572 ND = ND->getUnderlyingDecl();
1573
1574 // If name lookup finds a local extern declaration, then we are in a
1575 // context where it behaves like an ordinary name.
1577 if (SemaRef.getLangOpts().CPlusPlus)
1579 else if (SemaRef.getLangOpts().ObjC) {
1580 if (isa<ObjCIvarDecl>(ND))
1581 return true;
1582 }
1583
1584 return ND->getIdentifierNamespace() & IDNS;
1585}
1586
1587/// Determines whether this given declaration will be found by
1588/// ordinary name lookup but is not a type name.
1589bool ResultBuilder::IsOrdinaryNonTypeName(const NamedDecl *ND) const {
1590 ND = ND->getUnderlyingDecl();
1591 if (isa<TypeDecl>(ND))
1592 return false;
1593 // Objective-C interfaces names are not filtered by this method because they
1594 // can be used in a class property expression. We can still filter out
1595 // @class declarations though.
1596 if (const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND)) {
1597 if (!ID->getDefinition())
1598 return false;
1599 }
1600
1602 if (SemaRef.getLangOpts().CPlusPlus)
1604 else if (SemaRef.getLangOpts().ObjC) {
1605 if (isa<ObjCIvarDecl>(ND))
1606 return true;
1607 }
1608
1609 return ND->getIdentifierNamespace() & IDNS;
1610}
1611
1612bool ResultBuilder::IsIntegralConstantValue(const NamedDecl *ND) const {
1613 if (!IsOrdinaryNonTypeName(ND))
1614 return false;
1615
1616 if (const auto *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl()))
1617 if (VD->getType()->isIntegralOrEnumerationType())
1618 return true;
1619
1620 return false;
1621}
1622
1623/// Determines whether this given declaration will be found by
1624/// ordinary name lookup.
1625bool ResultBuilder::IsOrdinaryNonValueName(const NamedDecl *ND) const {
1626 ND = ND->getUnderlyingDecl();
1627
1629 if (SemaRef.getLangOpts().CPlusPlus)
1631
1632 return (ND->getIdentifierNamespace() & IDNS) && !isa<ValueDecl>(ND) &&
1634}
1635
1636/// Determines whether the given declaration is suitable as the
1637/// start of a C++ nested-name-specifier, e.g., a class or namespace.
1638bool ResultBuilder::IsNestedNameSpecifier(const NamedDecl *ND) const {
1639 // Allow us to find class templates, too.
1640 if (const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1641 ND = ClassTemplate->getTemplatedDecl();
1642
1643 return SemaRef.isAcceptableNestedNameSpecifier(ND);
1644}
1645
1646/// Determines whether the given declaration is an enumeration.
1647bool ResultBuilder::IsEnum(const NamedDecl *ND) const {
1648 return isa<EnumDecl>(ND);
1649}
1650
1651/// Determines whether the given declaration is a class or struct.
1652bool ResultBuilder::IsClassOrStruct(const NamedDecl *ND) const {
1653 // Allow us to find class templates, too.
1654 if (const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1655 ND = ClassTemplate->getTemplatedDecl();
1656
1657 // For purposes of this check, interfaces match too.
1658 if (const auto *RD = dyn_cast<RecordDecl>(ND))
1659 return RD->getTagKind() == TagTypeKind::Class ||
1660 RD->getTagKind() == TagTypeKind::Struct ||
1661 RD->getTagKind() == TagTypeKind::Interface;
1662
1663 return false;
1664}
1665
1666/// Determines whether the given declaration is a union.
1667bool ResultBuilder::IsUnion(const NamedDecl *ND) const {
1668 // Allow us to find class templates, too.
1669 if (const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1670 ND = ClassTemplate->getTemplatedDecl();
1671
1672 if (const auto *RD = dyn_cast<RecordDecl>(ND))
1673 return RD->getTagKind() == TagTypeKind::Union;
1674
1675 return false;
1676}
1677
1678/// Determines whether the given declaration is a namespace.
1679bool ResultBuilder::IsNamespace(const NamedDecl *ND) const {
1680 return isa<NamespaceDecl>(ND);
1681}
1682
1683/// Determines whether the given declaration is a namespace or
1684/// namespace alias.
1685bool ResultBuilder::IsNamespaceOrAlias(const NamedDecl *ND) const {
1687}
1688
1689/// Determines whether the given declaration is a type.
1690bool ResultBuilder::IsType(const NamedDecl *ND) const {
1691 ND = ND->getUnderlyingDecl();
1692 return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND);
1693}
1694
1695/// Determines which members of a class should be visible via
1696/// "." or "->". Only value declarations, nested name specifiers, and
1697/// using declarations thereof should show up.
1698bool ResultBuilder::IsMember(const NamedDecl *ND) const {
1699 ND = ND->getUnderlyingDecl();
1700 return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) ||
1702}
1703
1704/// Determines whether the given declaration is a member that
1705/// __builtin_offsetof can name: a (direct or indirect) non-bit-field.
1706bool ResultBuilder::IsOffsetofField(const NamedDecl *ND) const {
1707 ND = ND->getUnderlyingDecl();
1708 if (const auto *FD = dyn_cast<FieldDecl>(ND))
1709 return !FD->isBitField();
1710 if (const auto *IFD = dyn_cast<IndirectFieldDecl>(ND))
1711 return !IFD->getAnonField()->isBitField();
1712 return false;
1713}
1714
1716 T = C.getCanonicalType(T);
1717 switch (T->getTypeClass()) {
1718 case Type::ObjCObject:
1719 case Type::ObjCInterface:
1720 case Type::ObjCObjectPointer:
1721 return true;
1722
1723 case Type::Builtin:
1724 switch (cast<BuiltinType>(T)->getKind()) {
1725 case BuiltinType::ObjCId:
1726 case BuiltinType::ObjCClass:
1727 case BuiltinType::ObjCSel:
1728 return true;
1729
1730 default:
1731 break;
1732 }
1733 return false;
1734
1735 default:
1736 break;
1737 }
1738
1739 if (!C.getLangOpts().CPlusPlus)
1740 return false;
1741
1742 // FIXME: We could perform more analysis here to determine whether a
1743 // particular class type has any conversions to Objective-C types. For now,
1744 // just accept all class types.
1745 return T->isDependentType() || T->isRecordType();
1746}
1747
1748bool ResultBuilder::IsObjCMessageReceiver(const NamedDecl *ND) const {
1749 QualType T =
1750 getDeclUsageType(SemaRef.Context, /*Qualifier=*/std::nullopt, ND);
1751 if (T.isNull())
1752 return false;
1753
1754 T = SemaRef.Context.getBaseElementType(T);
1755 return isObjCReceiverType(SemaRef.Context, T);
1756}
1757
1758bool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(
1759 const NamedDecl *ND) const {
1760 if (IsObjCMessageReceiver(ND))
1761 return true;
1762
1763 const auto *Var = dyn_cast<VarDecl>(ND);
1764 if (!Var)
1765 return false;
1766
1767 return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>();
1768}
1769
1770bool ResultBuilder::IsObjCCollection(const NamedDecl *ND) const {
1771 if ((SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryName(ND)) ||
1772 (!SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryNonTypeName(ND)))
1773 return false;
1774
1775 QualType T =
1776 getDeclUsageType(SemaRef.Context, /*Qualifier=*/std::nullopt, ND);
1777 if (T.isNull())
1778 return false;
1779
1780 T = SemaRef.Context.getBaseElementType(T);
1781 return T->isObjCObjectType() || T->isObjCObjectPointerType() ||
1782 T->isObjCIdType() ||
1783 (SemaRef.getLangOpts().CPlusPlus && T->isRecordType());
1784}
1785
1786bool ResultBuilder::IsImpossibleToSatisfy(const NamedDecl *ND) const {
1787 return false;
1788}
1789
1790/// Determines whether the given declaration is an Objective-C
1791/// instance variable.
1792bool ResultBuilder::IsObjCIvar(const NamedDecl *ND) const {
1793 return isa<ObjCIvarDecl>(ND);
1794}
1795
1796namespace {
1797
1798/// Visible declaration consumer that adds a code-completion result
1799/// for each visible declaration.
1800class CodeCompletionDeclConsumer : public VisibleDeclConsumer {
1801 ResultBuilder &Results;
1802 DeclContext *InitialLookupCtx;
1803 // NamingClass and BaseType are used for access-checking. See
1804 // Sema::IsSimplyAccessible for details.
1805 CXXRecordDecl *NamingClass;
1806 QualType BaseType;
1807 std::vector<FixItHint> FixIts;
1808 bool IsInDeclarationContext;
1809 // Completion is invoked after an identifier preceded by '&'.
1810 bool IsAddressOfOperand;
1811
1812public:
1813 CodeCompletionDeclConsumer(
1814 ResultBuilder &Results, DeclContext *InitialLookupCtx,
1815 QualType BaseType = QualType(),
1816 std::vector<FixItHint> FixIts = std::vector<FixItHint>())
1817 : Results(Results), InitialLookupCtx(InitialLookupCtx),
1818 FixIts(std::move(FixIts)), IsInDeclarationContext(false),
1819 IsAddressOfOperand(false) {
1820 NamingClass = llvm::dyn_cast<CXXRecordDecl>(InitialLookupCtx);
1821 // If BaseType was not provided explicitly, emulate implicit 'this->'.
1822 if (BaseType.isNull()) {
1823 auto ThisType = Results.getSema().getCurrentThisType();
1824 if (!ThisType.isNull()) {
1825 assert(ThisType->isPointerType());
1826 BaseType = ThisType->getPointeeType();
1827 if (!NamingClass)
1828 NamingClass = BaseType->getAsCXXRecordDecl();
1829 }
1830 }
1831 this->BaseType = BaseType;
1832 }
1833
1834 void setIsInDeclarationContext(bool IsInDeclarationContext) {
1835 this->IsInDeclarationContext = IsInDeclarationContext;
1836 }
1837
1838 void setIsAddressOfOperand(bool IsAddressOfOperand) {
1839 this->IsAddressOfOperand = IsAddressOfOperand;
1840 }
1841
1842 void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx,
1843 bool InBaseClass) override {
1844 ResultBuilder::Result Result(ND, Results.getBasePriority(ND),
1845 /*Qualifier=*/std::nullopt,
1846 /*QualifierIsInformative=*/false,
1847 IsAccessible(ND, Ctx), FixIts);
1848 Results.AddResult(Result, InitialLookupCtx, Hiding, InBaseClass, BaseType,
1849 IsInDeclarationContext, IsAddressOfOperand);
1850 }
1851
1852 void EnteredContext(DeclContext *Ctx) override {
1853 Results.addVisitedContext(Ctx);
1854 }
1855
1856private:
1857 bool IsAccessible(NamedDecl *ND, DeclContext *Ctx) {
1858 // Naming class to use for access check. In most cases it was provided
1859 // explicitly (e.g. member access (lhs.foo) or qualified lookup (X::)),
1860 // for unqualified lookup we fallback to the \p Ctx in which we found the
1861 // member.
1862 auto *NamingClass = this->NamingClass;
1863 QualType BaseType = this->BaseType;
1864 if (auto *Cls = llvm::dyn_cast_or_null<CXXRecordDecl>(Ctx)) {
1865 if (!NamingClass)
1866 NamingClass = Cls;
1867 // When we emulate implicit 'this->' in an unqualified lookup, we might
1868 // end up with an invalid naming class. In that case, we avoid emulating
1869 // 'this->' qualifier to satisfy preconditions of the access checking.
1870 if (NamingClass->getCanonicalDecl() != Cls->getCanonicalDecl() &&
1871 !NamingClass->isDerivedFrom(Cls)) {
1872 NamingClass = Cls;
1873 BaseType = QualType();
1874 }
1875 } else {
1876 // The decl was found outside the C++ class, so only ObjC access checks
1877 // apply. Those do not rely on NamingClass and BaseType, so we clear them
1878 // out.
1879 NamingClass = nullptr;
1880 BaseType = QualType();
1881 }
1882 return Results.getSema().IsSimplyAccessible(ND, NamingClass, BaseType);
1883 }
1884};
1885} // namespace
1886
1887/// Add type specifiers for the current language as keyword results.
1888static void AddTypeSpecifierResults(const LangOptions &LangOpts,
1889 ResultBuilder &Results) {
1891 Results.AddResult(Result("short", CCP_Type));
1892 Results.AddResult(Result("long", CCP_Type));
1893 Results.AddResult(Result("signed", CCP_Type));
1894 Results.AddResult(Result("unsigned", CCP_Type));
1895 Results.AddResult(Result("void", CCP_Type));
1896 Results.AddResult(Result("char", CCP_Type));
1897 Results.AddResult(Result("int", CCP_Type));
1898 Results.AddResult(Result("float", CCP_Type));
1899 Results.AddResult(Result("double", CCP_Type));
1900 Results.AddResult(Result("enum", CCP_Type));
1901 Results.AddResult(Result("struct", CCP_Type));
1902 Results.AddResult(Result("union", CCP_Type));
1903 Results.AddResult(Result("const", CCP_Type));
1904 Results.AddResult(Result("volatile", CCP_Type));
1905
1906 if (LangOpts.C99) {
1907 // C99-specific
1908 Results.AddResult(Result("_Complex", CCP_Type));
1909 if (!LangOpts.C2y)
1910 Results.AddResult(Result("_Imaginary", CCP_Type));
1911 Results.AddResult(Result("_Bool", CCP_Type));
1912 Results.AddResult(Result("restrict", CCP_Type));
1913 }
1914
1915 CodeCompletionBuilder Builder(Results.getAllocator(),
1916 Results.getCodeCompletionTUInfo());
1917 if (LangOpts.CPlusPlus) {
1918 // C++-specific
1919 Results.AddResult(
1920 Result("bool", CCP_Type + (LangOpts.ObjC ? CCD_bool_in_ObjC : 0)));
1921 Results.AddResult(Result("class", CCP_Type));
1922 Results.AddResult(Result("wchar_t", CCP_Type));
1923
1924 // typename name
1925 Builder.AddTypedTextChunk("typename");
1927 Builder.AddPlaceholderChunk("name");
1928 Results.AddResult(Result(Builder.TakeString()));
1929
1930 if (LangOpts.CPlusPlus11) {
1931 Results.AddResult(Result("auto", CCP_Type));
1932 Results.AddResult(Result("char16_t", CCP_Type));
1933 Results.AddResult(Result("char32_t", CCP_Type));
1934
1935 Builder.AddTypedTextChunk("decltype");
1936 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1937 Builder.AddPlaceholderChunk("expression");
1938 Builder.AddChunk(CodeCompletionString::CK_RightParen);
1939 Results.AddResult(Result(Builder.TakeString()));
1940 }
1941
1942 if (LangOpts.Char8 || LangOpts.CPlusPlus20)
1943 Results.AddResult(Result("char8_t", CCP_Type));
1944 } else
1945 Results.AddResult(Result("__auto_type", CCP_Type));
1946
1947 // GNU keywords
1948 if (LangOpts.GNUKeywords) {
1949 // FIXME: Enable when we actually support decimal floating point.
1950 // Results.AddResult(Result("_Decimal32"));
1951 // Results.AddResult(Result("_Decimal64"));
1952 // Results.AddResult(Result("_Decimal128"));
1953
1954 Builder.AddTypedTextChunk("typeof");
1956 Builder.AddPlaceholderChunk("expression");
1957 Results.AddResult(Result(Builder.TakeString()));
1958
1959 Builder.AddTypedTextChunk("typeof");
1960 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1961 Builder.AddPlaceholderChunk("type");
1962 Builder.AddChunk(CodeCompletionString::CK_RightParen);
1963 Results.AddResult(Result(Builder.TakeString()));
1964 }
1965
1966 // Nullability
1967 Results.AddResult(Result("_Nonnull", CCP_Type));
1968 Results.AddResult(Result("_Null_unspecified", CCP_Type));
1969 Results.AddResult(Result("_Nullable", CCP_Type));
1970}
1971
1972static void
1974 const LangOptions &LangOpts, ResultBuilder &Results) {
1976 // Note: we don't suggest either "auto" or "register", because both
1977 // are pointless as storage specifiers. Elsewhere, we suggest "auto"
1978 // in C++0x as a type specifier.
1979 Results.AddResult(Result("extern"));
1980 Results.AddResult(Result("static"));
1981
1982 if (LangOpts.CPlusPlus11) {
1983 CodeCompletionAllocator &Allocator = Results.getAllocator();
1984 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
1985
1986 // alignas
1987 Builder.AddTypedTextChunk("alignas");
1988 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
1989 Builder.AddPlaceholderChunk("expression");
1990 Builder.AddChunk(CodeCompletionString::CK_RightParen);
1991 Results.AddResult(Result(Builder.TakeString()));
1992
1993 Results.AddResult(Result("constexpr"));
1994 Results.AddResult(Result("thread_local"));
1995 }
1996
1997 if (LangOpts.CPlusPlus20)
1998 Results.AddResult(Result("constinit"));
1999}
2000
2001static void
2003 const LangOptions &LangOpts, ResultBuilder &Results) {
2005 switch (CCC) {
2008 if (LangOpts.CPlusPlus) {
2009 Results.AddResult(Result("explicit"));
2010 Results.AddResult(Result("friend"));
2011 Results.AddResult(Result("mutable"));
2012 Results.AddResult(Result("virtual"));
2013 }
2014 [[fallthrough]];
2015
2020 if (LangOpts.CPlusPlus || LangOpts.C99)
2021 Results.AddResult(Result("inline"));
2022
2023 if (LangOpts.CPlusPlus20)
2024 Results.AddResult(Result("consteval"));
2025 break;
2026
2037 break;
2038 }
2039}
2040
2041static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt);
2042static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt);
2043static void AddObjCVisibilityResults(const LangOptions &LangOpts,
2044 ResultBuilder &Results, bool NeedAt);
2045static void AddObjCImplementationResults(const LangOptions &LangOpts,
2046 ResultBuilder &Results, bool NeedAt);
2047static void AddObjCInterfaceResults(const LangOptions &LangOpts,
2048 ResultBuilder &Results, bool NeedAt);
2049static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt);
2050
2051static void AddTypedefResult(ResultBuilder &Results) {
2052 CodeCompletionBuilder Builder(Results.getAllocator(),
2053 Results.getCodeCompletionTUInfo());
2054 Builder.AddTypedTextChunk("typedef");
2056 Builder.AddPlaceholderChunk("type");
2058 Builder.AddPlaceholderChunk("name");
2059 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2060 Results.AddResult(CodeCompletionResult(Builder.TakeString()));
2061}
2062
2063// using name = type
2065 ResultBuilder &Results) {
2066 Builder.AddTypedTextChunk("using");
2068 Builder.AddPlaceholderChunk("name");
2069 Builder.AddChunk(CodeCompletionString::CK_Equal);
2070 Builder.AddPlaceholderChunk("type");
2071 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2072 Results.AddResult(CodeCompletionResult(Builder.TakeString()));
2073}
2074
2076 const LangOptions &LangOpts) {
2077 switch (CCC) {
2089 return true;
2090
2093 return LangOpts.CPlusPlus;
2094
2097 return false;
2098
2100 return LangOpts.CPlusPlus || LangOpts.ObjC || LangOpts.C99;
2101 }
2102
2103 llvm_unreachable("Invalid ParserCompletionContext!");
2104}
2105
2107 const Preprocessor &PP) {
2108 PrintingPolicy Policy = Sema::getPrintingPolicy(Context, PP);
2109 Policy.AnonymousTagNameStyle =
2110 llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
2111 Policy.SuppressStrongLifetime = true;
2112 Policy.SuppressUnwrittenScope = true;
2113 Policy.CleanUglifiedParameters = true;
2114 Policy.ResolveDecltype = true;
2115 return Policy;
2116}
2117
2118/// Retrieve a printing policy suitable for code completion.
2122
2123/// Retrieve the string representation of the given type as a string
2124/// that has the appropriate lifetime for code completion.
2125///
2126/// This routine provides a fast path where we provide constant strings for
2127/// common type names.
2128static const char *GetCompletionTypeString(QualType T, ASTContext &Context,
2129 const PrintingPolicy &Policy,
2130 CodeCompletionAllocator &Allocator) {
2131 if (!T.getLocalQualifiers()) {
2132 // Built-in type names are constant strings.
2133 if (const BuiltinType *BT = dyn_cast<BuiltinType>(T))
2134 return BT->getNameAsCString(Policy);
2135
2136 // Anonymous tag types are constant strings.
2137 if (const TagType *TagT = dyn_cast<TagType>(T))
2138 if (TagDecl *Tag = TagT->getDecl())
2139 if (!Tag->hasNameForLinkage()) {
2140 switch (Tag->getTagKind()) {
2142 return "struct <anonymous>";
2144 return "__interface <anonymous>";
2145 case TagTypeKind::Class:
2146 return "class <anonymous>";
2147 case TagTypeKind::Union:
2148 return "union <anonymous>";
2149 case TagTypeKind::Enum:
2150 return "enum <anonymous>";
2151 }
2152 }
2153 }
2154
2155 // Slow path: format the type as a string.
2156 std::string Result;
2157 T.getAsStringInternal(Result, Policy);
2158 return Allocator.CopyString(Result);
2159}
2160
2161/// Add a completion for "this", if we're in a member function.
2162static void addThisCompletion(Sema &S, ResultBuilder &Results) {
2163 QualType ThisTy = S.getCurrentThisType();
2164 if (ThisTy.isNull())
2165 return;
2166
2167 CodeCompletionAllocator &Allocator = Results.getAllocator();
2168 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
2170 Builder.AddResultTypeChunk(
2171 GetCompletionTypeString(ThisTy, S.Context, Policy, Allocator));
2172 Builder.AddTypedTextChunk("this");
2173 Results.AddResult(CodeCompletionResult(Builder.TakeString()));
2174}
2175
2177 ResultBuilder &Results,
2178 const LangOptions &LangOpts) {
2179 if (!LangOpts.CPlusPlus11)
2180 return;
2181
2182 Builder.AddTypedTextChunk("static_assert");
2183 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2184 Builder.AddPlaceholderChunk("expression");
2185 Builder.AddChunk(CodeCompletionString::CK_Comma);
2186 Builder.AddPlaceholderChunk("message");
2187 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2188 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2189 Results.AddResult(CodeCompletionResult(Builder.TakeString()));
2190}
2191
2192static void AddOverrideResults(ResultBuilder &Results,
2193 const CodeCompletionContext &CCContext,
2194 CodeCompletionBuilder &Builder) {
2195 Sema &S = Results.getSema();
2196 const auto *CR = llvm::dyn_cast<CXXRecordDecl>(S.CurContext);
2197 // If not inside a class/struct/union return empty.
2198 if (!CR)
2199 return;
2200 // First store overrides within current class.
2201 // These are stored by name to make querying fast in the later step.
2202 llvm::StringMap<std::vector<FunctionDecl *>> Overrides;
2203 for (auto *Method : CR->methods()) {
2204 if (!Method->isVirtual() || !Method->getIdentifier())
2205 continue;
2206 Overrides[Method->getName()].push_back(Method);
2207 }
2208
2209 for (const auto &Base : CR->bases()) {
2210 const auto *BR = Base.getType().getTypePtr()->getAsCXXRecordDecl();
2211 if (!BR)
2212 continue;
2213 for (auto *Method : BR->methods()) {
2214 if (!Method->isVirtual() || !Method->getIdentifier())
2215 continue;
2216 const auto it = Overrides.find(Method->getName());
2217 bool IsOverriden = false;
2218 if (it != Overrides.end()) {
2219 for (auto *MD : it->second) {
2220 // If the method in current body is not an overload of this virtual
2221 // function, then it overrides this one.
2222 if (!S.IsOverload(MD, Method, false)) {
2223 IsOverriden = true;
2224 break;
2225 }
2226 }
2227 }
2228 if (!IsOverriden) {
2229 // Generates a new CodeCompletionResult by taking this function and
2230 // converting it into an override declaration with only one chunk in the
2231 // final CodeCompletionString as a TypedTextChunk.
2232 CodeCompletionResult CCR(Method, 0);
2233 PrintingPolicy Policy =
2236 S.getPreprocessor(), S.getASTContext(), Builder,
2237 /*IncludeBriefComments=*/false, CCContext, Policy);
2238 Results.AddResult(CodeCompletionResult(CCS, Method, CCP_CodePattern));
2239 }
2240 }
2241 }
2242}
2243
2244/// Add language constructs that show up for "ordinary" names.
2245static void
2247 Scope *S, Sema &SemaRef, ResultBuilder &Results) {
2248 CodeCompletionAllocator &Allocator = Results.getAllocator();
2249 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
2250
2252 switch (CCC) {
2254 if (SemaRef.getLangOpts().CPlusPlus) {
2255 if (Results.includeCodePatterns()) {
2256 // namespace <identifier> { declarations }
2257 Builder.AddTypedTextChunk("namespace");
2259 Builder.AddPlaceholderChunk("identifier");
2261 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2263 Builder.AddPlaceholderChunk("declarations");
2265 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2266 Results.AddResult(Result(Builder.TakeString()));
2267 }
2268
2269 // namespace identifier = identifier ;
2270 Builder.AddTypedTextChunk("namespace");
2272 Builder.AddPlaceholderChunk("name");
2273 Builder.AddChunk(CodeCompletionString::CK_Equal);
2274 Builder.AddPlaceholderChunk("namespace");
2275 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2276 Results.AddResult(Result(Builder.TakeString()));
2277
2278 // Using directives
2279 Builder.AddTypedTextChunk("using namespace");
2281 Builder.AddPlaceholderChunk("identifier");
2282 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2283 Results.AddResult(Result(Builder.TakeString()));
2284
2285 // asm(string-literal)
2286 Builder.AddTypedTextChunk("asm");
2287 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2288 Builder.AddPlaceholderChunk("string-literal");
2289 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2290 Results.AddResult(Result(Builder.TakeString()));
2291
2292 if (Results.includeCodePatterns()) {
2293 // Explicit template instantiation
2294 Builder.AddTypedTextChunk("template");
2296 Builder.AddPlaceholderChunk("declaration");
2297 Results.AddResult(Result(Builder.TakeString()));
2298 } else {
2299 Results.AddResult(Result("template", CodeCompletionResult::RK_Keyword));
2300 }
2301
2302 if (SemaRef.getLangOpts().CPlusPlus20 &&
2303 SemaRef.getLangOpts().CPlusPlusModules) {
2304 clang::Module *CurrentModule = SemaRef.getCurrentModule();
2305 if (SemaRef.CurContext->isTranslationUnit()) {
2306 /// Global module fragment can only be declared in the beginning of
2307 /// the file. CurrentModule should be null in this case.
2308 if (!CurrentModule) {
2309 // module;
2310 Builder.AddTypedTextChunk("module");
2311 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2313 Results.AddResult(Result(Builder.TakeString()));
2314 }
2315
2316 /// Named module should be declared in the beginning of the file,
2317 /// or after the global module fragment.
2318 if (!CurrentModule ||
2319 CurrentModule->Kind == Module::ExplicitGlobalModuleFragment ||
2320 CurrentModule->Kind == Module::ImplicitGlobalModuleFragment) {
2321 // export module;
2322 // module name;
2323 Builder.AddTypedTextChunk("module");
2325 Builder.AddPlaceholderChunk("name");
2326 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2328 Results.AddResult(Result(Builder.TakeString()));
2329 }
2330
2331 /// Import can occur in non module file or after the named module
2332 /// declaration.
2333 if (!CurrentModule ||
2334 CurrentModule->Kind == Module::ModuleInterfaceUnit ||
2335 CurrentModule->Kind == Module::ModulePartitionInterface) {
2336 // import name;
2337 Builder.AddTypedTextChunk("import");
2339 Builder.AddPlaceholderChunk("name");
2340 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2342 Results.AddResult(Result(Builder.TakeString()));
2343 }
2344
2345 if (CurrentModule &&
2346 (CurrentModule->Kind == Module::ModuleInterfaceUnit ||
2347 CurrentModule->Kind == Module::ModulePartitionInterface)) {
2348 // module: private;
2349 Builder.AddTypedTextChunk("module");
2350 Builder.AddChunk(CodeCompletionString::CK_Colon);
2352 Builder.AddTypedTextChunk("private");
2353 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2355 Results.AddResult(Result(Builder.TakeString()));
2356 }
2357 }
2358
2359 // export
2360 if (!CurrentModule ||
2362 Results.AddResult(Result("export", CodeCompletionResult::RK_Keyword));
2363 }
2364 }
2365
2366 if (SemaRef.getLangOpts().ObjC)
2367 AddObjCTopLevelResults(Results, true);
2368
2369 AddTypedefResult(Results);
2370 [[fallthrough]];
2371
2373 if (SemaRef.getLangOpts().CPlusPlus) {
2374 // Using declaration
2375 Builder.AddTypedTextChunk("using");
2377 Builder.AddPlaceholderChunk("qualifier");
2378 Builder.AddTextChunk("::");
2379 Builder.AddPlaceholderChunk("name");
2380 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2381 Results.AddResult(Result(Builder.TakeString()));
2382
2383 if (SemaRef.getLangOpts().CPlusPlus11)
2384 AddUsingAliasResult(Builder, Results);
2385
2386 // using typename qualifier::name (only in a dependent context)
2387 if (SemaRef.CurContext->isDependentContext()) {
2388 Builder.AddTypedTextChunk("using typename");
2390 Builder.AddPlaceholderChunk("qualifier");
2391 Builder.AddTextChunk("::");
2392 Builder.AddPlaceholderChunk("name");
2393 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2394 Results.AddResult(Result(Builder.TakeString()));
2395 }
2396
2397 AddStaticAssertResult(Builder, Results, SemaRef.getLangOpts());
2398
2399 if (CCC == SemaCodeCompletion::PCC_Class) {
2400 AddTypedefResult(Results);
2401
2402 bool IsNotInheritanceScope = !S->isClassInheritanceScope();
2403 // public:
2404 Builder.AddTypedTextChunk("public");
2405 if (IsNotInheritanceScope && Results.includeCodePatterns())
2406 Builder.AddChunk(CodeCompletionString::CK_Colon);
2407 Results.AddResult(Result(Builder.TakeString()));
2408
2409 // protected:
2410 Builder.AddTypedTextChunk("protected");
2411 if (IsNotInheritanceScope && Results.includeCodePatterns())
2412 Builder.AddChunk(CodeCompletionString::CK_Colon);
2413 Results.AddResult(Result(Builder.TakeString()));
2414
2415 // private:
2416 Builder.AddTypedTextChunk("private");
2417 if (IsNotInheritanceScope && Results.includeCodePatterns())
2418 Builder.AddChunk(CodeCompletionString::CK_Colon);
2419 Results.AddResult(Result(Builder.TakeString()));
2420
2421 // FIXME: This adds override results only if we are at the first word of
2422 // the declaration/definition. Also call this from other sides to have
2423 // more use-cases.
2425 Builder);
2426 }
2427 }
2428 [[fallthrough]];
2429
2431 if (SemaRef.getLangOpts().CPlusPlus20 &&
2433 Results.AddResult(Result("concept", CCP_Keyword));
2434 [[fallthrough]];
2435
2437 if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns()) {
2438 // template < parameters >
2439 Builder.AddTypedTextChunk("template");
2440 Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2441 Builder.AddPlaceholderChunk("parameters");
2442 Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2443 Results.AddResult(Result(Builder.TakeString()));
2444 } else {
2445 Results.AddResult(Result("template", CodeCompletionResult::RK_Keyword));
2446 }
2447
2448 if (SemaRef.getLangOpts().CPlusPlus20 &&
2451 Results.AddResult(Result("requires", CCP_Keyword));
2452
2453 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2454 AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2455 break;
2456
2458 AddObjCInterfaceResults(SemaRef.getLangOpts(), Results, true);
2459 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2460 AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2461 break;
2462
2464 AddObjCImplementationResults(SemaRef.getLangOpts(), Results, true);
2465 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2466 AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2467 break;
2468
2470 AddObjCVisibilityResults(SemaRef.getLangOpts(), Results, true);
2471 break;
2472
2476 if (SemaRef.getLangOpts().CPlusPlus11)
2477 AddUsingAliasResult(Builder, Results);
2478
2479 AddTypedefResult(Results);
2480
2481 if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns() &&
2482 SemaRef.getLangOpts().CXXExceptions) {
2483 Builder.AddTypedTextChunk("try");
2485 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2487 Builder.AddPlaceholderChunk("statements");
2489 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2491 Builder.AddTextChunk("catch");
2493 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2494 Builder.AddPlaceholderChunk("declaration");
2495 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2497 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2499 Builder.AddPlaceholderChunk("statements");
2501 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2502 Results.AddResult(Result(Builder.TakeString()));
2503 }
2504 if (SemaRef.getLangOpts().ObjC)
2505 AddObjCStatementResults(Results, true);
2506
2507 if (Results.includeCodePatterns()) {
2508 // if (condition) { statements }
2509 Builder.AddTypedTextChunk("if");
2511 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2512 if (SemaRef.getLangOpts().CPlusPlus)
2513 Builder.AddPlaceholderChunk("condition");
2514 else
2515 Builder.AddPlaceholderChunk("expression");
2516 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2518 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2520 Builder.AddPlaceholderChunk("statements");
2522 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2523 Results.AddResult(Result(Builder.TakeString()));
2524
2525 // switch (condition) { }
2526 Builder.AddTypedTextChunk("switch");
2528 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2529 if (SemaRef.getLangOpts().CPlusPlus)
2530 Builder.AddPlaceholderChunk("condition");
2531 else
2532 Builder.AddPlaceholderChunk("expression");
2533 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2535 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2537 Builder.AddPlaceholderChunk("cases");
2539 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2540 Results.AddResult(Result(Builder.TakeString()));
2541 }
2542
2543 // Switch-specific statements.
2544 if (SemaRef.getCurFunction() &&
2545 !SemaRef.getCurFunction()->SwitchStack.empty()) {
2546 // case expression:
2547 Builder.AddTypedTextChunk("case");
2549 Builder.AddPlaceholderChunk("expression");
2550 Builder.AddChunk(CodeCompletionString::CK_Colon);
2551 Results.AddResult(Result(Builder.TakeString()));
2552
2553 // default:
2554 Builder.AddTypedTextChunk("default");
2555 Builder.AddChunk(CodeCompletionString::CK_Colon);
2556 Results.AddResult(Result(Builder.TakeString()));
2557 }
2558
2559 if (Results.includeCodePatterns()) {
2560 /// while (condition) { statements }
2561 Builder.AddTypedTextChunk("while");
2563 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2564 if (SemaRef.getLangOpts().CPlusPlus)
2565 Builder.AddPlaceholderChunk("condition");
2566 else
2567 Builder.AddPlaceholderChunk("expression");
2568 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2570 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2572 Builder.AddPlaceholderChunk("statements");
2574 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2575 Results.AddResult(Result(Builder.TakeString()));
2576
2577 // do { statements } while ( expression );
2578 Builder.AddTypedTextChunk("do");
2580 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2582 Builder.AddPlaceholderChunk("statements");
2584 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2585 Builder.AddTextChunk("while");
2587 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2588 Builder.AddPlaceholderChunk("expression");
2589 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2590 Results.AddResult(Result(Builder.TakeString()));
2591
2592 // for ( for-init-statement ; condition ; expression ) { statements }
2593 Builder.AddTypedTextChunk("for");
2595 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2596 if (SemaRef.getLangOpts().CPlusPlus || SemaRef.getLangOpts().C99)
2597 Builder.AddPlaceholderChunk("init-statement");
2598 else
2599 Builder.AddPlaceholderChunk("init-expression");
2600 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2602 Builder.AddPlaceholderChunk("condition");
2603 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2605 Builder.AddPlaceholderChunk("inc-expression");
2606 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2608 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2610 Builder.AddPlaceholderChunk("statements");
2612 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2613 Results.AddResult(Result(Builder.TakeString()));
2614
2615 if (SemaRef.getLangOpts().CPlusPlus11 || SemaRef.getLangOpts().ObjC) {
2616 // for ( range_declaration (:|in) range_expression ) { statements }
2617 Builder.AddTypedTextChunk("for");
2619 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2620 Builder.AddPlaceholderChunk("range-declaration");
2622 if (SemaRef.getLangOpts().ObjC)
2623 Builder.AddTextChunk("in");
2624 else
2625 Builder.AddChunk(CodeCompletionString::CK_Colon);
2627 Builder.AddPlaceholderChunk("range-expression");
2628 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2630 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2632 Builder.AddPlaceholderChunk("statements");
2634 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2635 Results.AddResult(Result(Builder.TakeString()));
2636 }
2637 }
2638
2639 if (S->getContinueParent()) {
2640 // continue ;
2641 Builder.AddTypedTextChunk("continue");
2642 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2643 Results.AddResult(Result(Builder.TakeString()));
2644 }
2645
2646 if (S->getBreakParent()) {
2647 // break ;
2648 Builder.AddTypedTextChunk("break");
2649 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2650 Results.AddResult(Result(Builder.TakeString()));
2651 }
2652
2653 // "return expression ;" or "return ;", depending on the return type.
2654 QualType ReturnType;
2655 if (const auto *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) {
2656 if (!Function->getType().isNull())
2657 ReturnType = Function->getReturnType();
2658 } else if (const auto *Method =
2659 dyn_cast<ObjCMethodDecl>(SemaRef.CurContext))
2660 ReturnType = Method->getReturnType();
2661 else if (SemaRef.getCurBlock() &&
2662 !SemaRef.getCurBlock()->ReturnType.isNull())
2663 ReturnType = SemaRef.getCurBlock()->ReturnType;;
2664 if (ReturnType.isNull() || ReturnType->isVoidType()) {
2665 Builder.AddTypedTextChunk("return");
2666 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2667 Results.AddResult(Result(Builder.TakeString()));
2668 } else {
2669 assert(!ReturnType.isNull());
2670 // "return expression ;"
2671 Builder.AddTypedTextChunk("return");
2673 Builder.AddPlaceholderChunk("expression");
2674 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2675 Results.AddResult(Result(Builder.TakeString()));
2676 // "co_return expression ;" for coroutines(C++20).
2677 if (SemaRef.getLangOpts().CPlusPlus20) {
2678 Builder.AddTypedTextChunk("co_return");
2680 Builder.AddPlaceholderChunk("expression");
2681 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2682 Results.AddResult(Result(Builder.TakeString()));
2683 }
2684 // When boolean, also add 'return true;' and 'return false;'.
2685 if (ReturnType->isBooleanType()) {
2686 Builder.AddTypedTextChunk("return true");
2687 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2688 Results.AddResult(Result(Builder.TakeString()));
2689
2690 Builder.AddTypedTextChunk("return false");
2691 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2692 Results.AddResult(Result(Builder.TakeString()));
2693 }
2694 // For pointers, suggest 'return nullptr' in C++.
2695 if (SemaRef.getLangOpts().CPlusPlus11 &&
2696 (ReturnType->isPointerType() || ReturnType->isMemberPointerType())) {
2697 Builder.AddTypedTextChunk("return nullptr");
2698 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2699 Results.AddResult(Result(Builder.TakeString()));
2700 }
2701 }
2702
2703 // goto identifier ;
2704 Builder.AddTypedTextChunk("goto");
2706 Builder.AddPlaceholderChunk("label");
2707 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2708 Results.AddResult(Result(Builder.TakeString()));
2709
2710 // Using directives
2711 Builder.AddTypedTextChunk("using namespace");
2713 Builder.AddPlaceholderChunk("identifier");
2714 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2715 Results.AddResult(Result(Builder.TakeString()));
2716
2717 AddStaticAssertResult(Builder, Results, SemaRef.getLangOpts());
2718 }
2719 [[fallthrough]];
2720
2721 // Fall through (for statement expressions).
2724 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results);
2725 // Fall through: conditions and statements can have expressions.
2726 [[fallthrough]];
2727
2729 if (SemaRef.getLangOpts().ObjCAutoRefCount &&
2731 // (__bridge <type>)<expression>
2732 Builder.AddTypedTextChunk("__bridge");
2734 Builder.AddPlaceholderChunk("type");
2735 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2736 Builder.AddPlaceholderChunk("expression");
2737 Results.AddResult(Result(Builder.TakeString()));
2738
2739 // (__bridge_transfer <Objective-C type>)<expression>
2740 Builder.AddTypedTextChunk("__bridge_transfer");
2742 Builder.AddPlaceholderChunk("Objective-C type");
2743 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2744 Builder.AddPlaceholderChunk("expression");
2745 Results.AddResult(Result(Builder.TakeString()));
2746
2747 // (__bridge_retained <CF type>)<expression>
2748 Builder.AddTypedTextChunk("__bridge_retained");
2750 Builder.AddPlaceholderChunk("CF type");
2751 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2752 Builder.AddPlaceholderChunk("expression");
2753 Results.AddResult(Result(Builder.TakeString()));
2754 }
2755 // Fall through
2756 [[fallthrough]];
2757
2759 if (SemaRef.getLangOpts().CPlusPlus) {
2760 // 'this', if we're in a non-static member function.
2761 addThisCompletion(SemaRef, Results);
2762
2763 // true
2764 Builder.AddResultTypeChunk("bool");
2765 Builder.AddTypedTextChunk("true");
2766 Results.AddResult(Result(Builder.TakeString()));
2767
2768 // false
2769 Builder.AddResultTypeChunk("bool");
2770 Builder.AddTypedTextChunk("false");
2771 Results.AddResult(Result(Builder.TakeString()));
2772
2773 if (SemaRef.getLangOpts().RTTI) {
2774 // dynamic_cast < type-id > ( expression )
2775 Builder.AddTypedTextChunk("dynamic_cast");
2776 Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2777 Builder.AddPlaceholderChunk("type");
2778 Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2779 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2780 Builder.AddPlaceholderChunk("expression");
2781 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2782 Results.AddResult(Result(Builder.TakeString()));
2783 }
2784
2785 // static_cast < type-id > ( expression )
2786 Builder.AddTypedTextChunk("static_cast");
2787 Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2788 Builder.AddPlaceholderChunk("type");
2789 Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2790 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2791 Builder.AddPlaceholderChunk("expression");
2792 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2793 Results.AddResult(Result(Builder.TakeString()));
2794
2795 // reinterpret_cast < type-id > ( expression )
2796 Builder.AddTypedTextChunk("reinterpret_cast");
2797 Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2798 Builder.AddPlaceholderChunk("type");
2799 Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2800 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2801 Builder.AddPlaceholderChunk("expression");
2802 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2803 Results.AddResult(Result(Builder.TakeString()));
2804
2805 // const_cast < type-id > ( expression )
2806 Builder.AddTypedTextChunk("const_cast");
2807 Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
2808 Builder.AddPlaceholderChunk("type");
2809 Builder.AddChunk(CodeCompletionString::CK_RightAngle);
2810 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2811 Builder.AddPlaceholderChunk("expression");
2812 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2813 Results.AddResult(Result(Builder.TakeString()));
2814
2815 if (SemaRef.getLangOpts().RTTI) {
2816 // typeid ( expression-or-type )
2817 Builder.AddResultTypeChunk("std::type_info");
2818 Builder.AddTypedTextChunk("typeid");
2819 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2820 Builder.AddPlaceholderChunk("expression-or-type");
2821 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2822 Results.AddResult(Result(Builder.TakeString()));
2823 }
2824
2825 // new T ( ... )
2826 Builder.AddTypedTextChunk("new");
2828 Builder.AddPlaceholderChunk("type");
2829 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2830 Builder.AddPlaceholderChunk("expressions");
2831 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2832 Results.AddResult(Result(Builder.TakeString()));
2833
2834 // new T [ ] ( ... )
2835 Builder.AddTypedTextChunk("new");
2837 Builder.AddPlaceholderChunk("type");
2838 Builder.AddChunk(CodeCompletionString::CK_LeftBracket);
2839 Builder.AddPlaceholderChunk("size");
2840 Builder.AddChunk(CodeCompletionString::CK_RightBracket);
2841 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2842 Builder.AddPlaceholderChunk("expressions");
2843 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2844 Results.AddResult(Result(Builder.TakeString()));
2845
2846 // delete expression
2847 Builder.AddResultTypeChunk("void");
2848 Builder.AddTypedTextChunk("delete");
2850 Builder.AddPlaceholderChunk("expression");
2851 Results.AddResult(Result(Builder.TakeString()));
2852
2853 // delete [] expression
2854 Builder.AddResultTypeChunk("void");
2855 Builder.AddTypedTextChunk("delete");
2857 Builder.AddChunk(CodeCompletionString::CK_LeftBracket);
2858 Builder.AddChunk(CodeCompletionString::CK_RightBracket);
2860 Builder.AddPlaceholderChunk("expression");
2861 Results.AddResult(Result(Builder.TakeString()));
2862
2863 if (SemaRef.getLangOpts().CXXExceptions) {
2864 // throw expression
2865 Builder.AddResultTypeChunk("void");
2866 Builder.AddTypedTextChunk("throw");
2868 Builder.AddPlaceholderChunk("expression");
2869 Results.AddResult(Result(Builder.TakeString()));
2870 }
2871
2872 // FIXME: Rethrow?
2873
2874 if (SemaRef.getLangOpts().CPlusPlus11) {
2875 // nullptr
2876 Builder.AddResultTypeChunk("std::nullptr_t");
2877 Builder.AddTypedTextChunk("nullptr");
2878 Results.AddResult(Result(Builder.TakeString()));
2879
2880 // alignof
2881 Builder.AddResultTypeChunk("size_t");
2882 Builder.AddTypedTextChunk("alignof");
2883 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2884 Builder.AddPlaceholderChunk("type");
2885 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2886 Results.AddResult(Result(Builder.TakeString()));
2887
2888 // noexcept
2889 Builder.AddResultTypeChunk("bool");
2890 Builder.AddTypedTextChunk("noexcept");
2891 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2892 Builder.AddPlaceholderChunk("expression");
2893 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2894 Results.AddResult(Result(Builder.TakeString()));
2895
2896 // sizeof... expression
2897 Builder.AddResultTypeChunk("size_t");
2898 Builder.AddTypedTextChunk("sizeof...");
2899 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2900 Builder.AddPlaceholderChunk("parameter-pack");
2901 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2902 Results.AddResult(Result(Builder.TakeString()));
2903 }
2904
2905 if (SemaRef.getLangOpts().CPlusPlus20) {
2906 // co_await expression
2907 Builder.AddTypedTextChunk("co_await");
2909 Builder.AddPlaceholderChunk("expression");
2910 Results.AddResult(Result(Builder.TakeString()));
2911
2912 // co_yield expression
2913 Builder.AddTypedTextChunk("co_yield");
2915 Builder.AddPlaceholderChunk("expression");
2916 Results.AddResult(Result(Builder.TakeString()));
2917
2918 // requires (parameters) { requirements }
2919 Builder.AddResultTypeChunk("bool");
2920 Builder.AddTypedTextChunk("requires");
2922 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2923 Builder.AddPlaceholderChunk("parameters");
2924 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2926 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
2928 Builder.AddPlaceholderChunk("requirements");
2930 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
2931 Results.AddResult(Result(Builder.TakeString()));
2932
2933 if (SemaRef.CurContext->isRequiresExprBody()) {
2934 // requires expression ;
2935 Builder.AddTypedTextChunk("requires");
2937 Builder.AddPlaceholderChunk("expression");
2938 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
2939 Results.AddResult(Result(Builder.TakeString()));
2940 }
2941 }
2942 }
2943
2944 if (SemaRef.getLangOpts().ObjC) {
2945 // Add "super", if we're in an Objective-C class with a superclass.
2946 if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) {
2947 // The interface can be NULL.
2948 if (ObjCInterfaceDecl *ID = Method->getClassInterface())
2949 if (ID->getSuperClass()) {
2950 std::string SuperType;
2951 SuperType = ID->getSuperClass()->getNameAsString();
2952 if (Method->isInstanceMethod())
2953 SuperType += " *";
2954
2955 Builder.AddResultTypeChunk(Allocator.CopyString(SuperType));
2956 Builder.AddTypedTextChunk("super");
2957 Results.AddResult(Result(Builder.TakeString()));
2958 }
2959 }
2960
2961 AddObjCExpressionResults(Results, true);
2962 }
2963
2964 if (SemaRef.getLangOpts().C11) {
2965 // _Alignof
2966 Builder.AddResultTypeChunk("size_t");
2967 if (SemaRef.PP.isMacroDefined("alignof"))
2968 Builder.AddTypedTextChunk("alignof");
2969 else
2970 Builder.AddTypedTextChunk("_Alignof");
2971 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2972 Builder.AddPlaceholderChunk("type");
2973 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2974 Results.AddResult(Result(Builder.TakeString()));
2975 }
2976
2977 if (SemaRef.getLangOpts().C23) {
2978 // nullptr
2979 Builder.AddResultTypeChunk("nullptr_t");
2980 Builder.AddTypedTextChunk("nullptr");
2981 Results.AddResult(Result(Builder.TakeString()));
2982 }
2983
2984 // sizeof expression
2985 Builder.AddResultTypeChunk("size_t");
2986 Builder.AddTypedTextChunk("sizeof");
2987 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
2988 Builder.AddPlaceholderChunk("expression-or-type");
2989 Builder.AddChunk(CodeCompletionString::CK_RightParen);
2990 Results.AddResult(Result(Builder.TakeString()));
2991 break;
2992 }
2993
2996 break;
2997 }
2998
2999 if (WantTypesInContext(CCC, SemaRef.getLangOpts()))
3000 AddTypeSpecifierResults(SemaRef.getLangOpts(), Results);
3001
3002 if (SemaRef.getLangOpts().CPlusPlus && CCC != SemaCodeCompletion::PCC_Type)
3003 Results.AddResult(Result("operator"));
3004}
3005
3006/// If the given declaration has an associated type, add it as a result
3007/// type chunk.
3008static void AddResultTypeChunk(ASTContext &Context,
3009 const PrintingPolicy &Policy,
3010 const NamedDecl *ND, QualType BaseType,
3012 if (!ND)
3013 return;
3014
3015 // Skip constructors and conversion functions, which have their return types
3016 // built into their names.
3018 return;
3019
3020 // Determine the type of the declaration (if it has a type).
3021 QualType T;
3022 if (const FunctionDecl *Function = ND->getAsFunction())
3023 T = Function->getReturnType();
3024 else if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) {
3025 if (!BaseType.isNull())
3026 T = Method->getSendResultType(BaseType);
3027 else
3028 T = Method->getReturnType();
3029 } else if (const auto *Enumerator = dyn_cast<EnumConstantDecl>(ND)) {
3030 T = Context.getCanonicalTagType(
3031 cast<EnumDecl>(Enumerator->getDeclContext()));
3032 } else if (isa<UnresolvedUsingValueDecl>(ND)) {
3033 /* Do nothing: ignore unresolved using declarations*/
3034 } else if (const auto *Ivar = dyn_cast<ObjCIvarDecl>(ND)) {
3035 if (!BaseType.isNull())
3036 T = Ivar->getUsageType(BaseType);
3037 else
3038 T = Ivar->getType();
3039 } else if (const auto *Value = dyn_cast<ValueDecl>(ND)) {
3040 T = Value->getType();
3041 } else if (const auto *Property = dyn_cast<ObjCPropertyDecl>(ND)) {
3042 if (!BaseType.isNull())
3043 T = Property->getUsageType(BaseType);
3044 else
3045 T = Property->getType();
3046 }
3047
3048 if (T.isNull() || Context.hasSameType(T, Context.DependentTy))
3049 return;
3050
3051 Result.AddResultTypeChunk(
3052 GetCompletionTypeString(T, Context, Policy, Result.getAllocator()));
3053}
3054
3056 const NamedDecl *FunctionOrMethod,
3058 if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>())
3059 if (Sentinel->getSentinel() == 0) {
3060 if (PP.getLangOpts().ObjC && PP.isMacroDefined("nil"))
3061 Result.AddTextChunk(", nil");
3062 else if (PP.isMacroDefined("NULL"))
3063 Result.AddTextChunk(", NULL");
3064 else
3065 Result.AddTextChunk(", (void*)0");
3066 }
3067}
3068
3069static std::string formatObjCParamQualifiers(unsigned ObjCQuals,
3070 QualType &Type) {
3071 std::string Result;
3072 if (ObjCQuals & Decl::OBJC_TQ_In)
3073 Result += "in ";
3074 else if (ObjCQuals & Decl::OBJC_TQ_Inout)
3075 Result += "inout ";
3076 else if (ObjCQuals & Decl::OBJC_TQ_Out)
3077 Result += "out ";
3078 if (ObjCQuals & Decl::OBJC_TQ_Bycopy)
3079 Result += "bycopy ";
3080 else if (ObjCQuals & Decl::OBJC_TQ_Byref)
3081 Result += "byref ";
3082 if (ObjCQuals & Decl::OBJC_TQ_Oneway)
3083 Result += "oneway ";
3084 if (ObjCQuals & Decl::OBJC_TQ_CSNullability) {
3085 if (auto nullability = AttributedType::stripOuterNullability(Type)) {
3086 switch (*nullability) {
3088 Result += "nonnull ";
3089 break;
3090
3092 Result += "nullable ";
3093 break;
3094
3096 Result += "null_unspecified ";
3097 break;
3098
3100 llvm_unreachable("Not supported as a context-sensitive keyword!");
3101 break;
3102 }
3103 }
3104 }
3105 return Result;
3106}
3107
3108/// Tries to find the most appropriate type location for an Objective-C
3109/// block placeholder.
3110///
3111/// This function ignores things like typedefs and qualifiers in order to
3112/// present the most relevant and accurate block placeholders in code completion
3113/// results.
3116 FunctionProtoTypeLoc &BlockProto,
3117 bool SuppressBlock = false) {
3118 if (!TSInfo)
3119 return;
3120 TypeLoc TL = TSInfo->getTypeLoc().getUnqualifiedLoc();
3121 while (true) {
3122 // Look through typedefs.
3123 if (!SuppressBlock) {
3124 if (TypedefTypeLoc TypedefTL = TL.getAsAdjusted<TypedefTypeLoc>()) {
3125 if (TypeSourceInfo *InnerTSInfo =
3126 TypedefTL.getDecl()->getTypeSourceInfo()) {
3127 TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc();
3128 continue;
3129 }
3130 }
3131
3132 // Look through qualified types
3133 if (QualifiedTypeLoc QualifiedTL = TL.getAs<QualifiedTypeLoc>()) {
3134 TL = QualifiedTL.getUnqualifiedLoc();
3135 continue;
3136 }
3137
3138 if (AttributedTypeLoc AttrTL = TL.getAs<AttributedTypeLoc>()) {
3139 TL = AttrTL.getModifiedLoc();
3140 continue;
3141 }
3142 }
3143
3144 // Try to get the function prototype behind the block pointer type,
3145 // then we're done.
3146 if (BlockPointerTypeLoc BlockPtr = TL.getAs<BlockPointerTypeLoc>()) {
3147 TL = BlockPtr.getPointeeLoc().IgnoreParens();
3148 Block = TL.getAs<FunctionTypeLoc>();
3149 BlockProto = TL.getAs<FunctionProtoTypeLoc>();
3150 }
3151 break;
3152 }
3153}
3154
3155static std::string formatBlockPlaceholder(
3156 const PrintingPolicy &Policy, const NamedDecl *BlockDecl,
3158 bool SuppressBlockName = false, bool SuppressBlock = false,
3159 std::optional<ArrayRef<QualType>> ObjCSubsts = std::nullopt);
3160
3161static std::string FormatFunctionParameter(
3162 const PrintingPolicy &Policy, const DeclaratorDecl *Param,
3163 bool SuppressName = false, bool SuppressBlock = false,
3164 std::optional<ArrayRef<QualType>> ObjCSubsts = std::nullopt) {
3165 // Params are unavailable in FunctionTypeLoc if the FunctionType is invalid.
3166 // It would be better to pass in the param Type, which is usually available.
3167 // But this case is rare, so just pretend we fell back to int as elsewhere.
3168 if (!Param)
3169 return "int";
3171 if (const auto *PVD = dyn_cast<ParmVarDecl>(Param))
3172 ObjCQual = PVD->getObjCDeclQualifier();
3173 bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext());
3174 if (Param->getType()->isDependentType() ||
3175 !Param->getType()->isBlockPointerType()) {
3176 // The argument for a dependent or non-block parameter is a placeholder
3177 // containing that parameter's type.
3178 std::string Result;
3179
3180 if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName)
3181 Result = std::string(Param->getIdentifier()->deuglifiedName());
3182
3183 QualType Type = Param->getType();
3184 if (ObjCSubsts)
3185 Type = Type.substObjCTypeArgs(Param->getASTContext(), *ObjCSubsts,
3187 if (ObjCMethodParam) {
3188 Result = "(" + formatObjCParamQualifiers(ObjCQual, Type);
3189 Result += Type.getAsString(Policy) + ")";
3190 if (Param->getIdentifier() && !SuppressName)
3191 Result += Param->getIdentifier()->deuglifiedName();
3192 } else {
3193 Type.getAsStringInternal(Result, Policy);
3194 }
3195 return Result;
3196 }
3197
3198 // The argument for a block pointer parameter is a block literal with
3199 // the appropriate type.
3201 FunctionProtoTypeLoc BlockProto;
3202 findTypeLocationForBlockDecl(Param->getTypeSourceInfo(), Block, BlockProto,
3203 SuppressBlock);
3204 // Try to retrieve the block type information from the property if this is a
3205 // parameter in a setter.
3206 if (!Block && ObjCMethodParam &&
3207 cast<ObjCMethodDecl>(Param->getDeclContext())->isPropertyAccessor()) {
3208 if (const auto *PD = cast<ObjCMethodDecl>(Param->getDeclContext())
3209 ->findPropertyDecl(/*CheckOverrides=*/false))
3210 findTypeLocationForBlockDecl(PD->getTypeSourceInfo(), Block, BlockProto,
3211 SuppressBlock);
3212 }
3213
3214 if (!Block) {
3215 // We were unable to find a FunctionProtoTypeLoc with parameter names
3216 // for the block; just use the parameter type as a placeholder.
3217 std::string Result;
3218 if (!ObjCMethodParam && Param->getIdentifier())
3219 Result = std::string(Param->getIdentifier()->deuglifiedName());
3220
3221 QualType Type = Param->getType().getUnqualifiedType();
3222
3223 if (ObjCMethodParam) {
3224 Result = Type.getAsString(Policy);
3225 std::string Quals = formatObjCParamQualifiers(ObjCQual, Type);
3226 if (!Quals.empty())
3227 Result = "(" + Quals + " " + Result + ")";
3228 if (Result.back() != ')')
3229 Result += " ";
3230 if (Param->getIdentifier())
3231 Result += Param->getIdentifier()->deuglifiedName();
3232 } else {
3233 Type.getAsStringInternal(Result, Policy);
3234 }
3235
3236 return Result;
3237 }
3238
3239 // We have the function prototype behind the block pointer type, as it was
3240 // written in the source.
3241 return formatBlockPlaceholder(Policy, Param, Block, BlockProto,
3242 /*SuppressBlockName=*/false, SuppressBlock,
3243 ObjCSubsts);
3244}
3245
3246/// Returns a placeholder string that corresponds to an Objective-C block
3247/// declaration.
3248///
3249/// \param BlockDecl A declaration with an Objective-C block type.
3250///
3251/// \param Block The most relevant type location for that block type.
3252///
3253/// \param SuppressBlockName Determines whether or not the name of the block
3254/// declaration is included in the resulting string.
3255static std::string
3258 bool SuppressBlockName, bool SuppressBlock,
3259 std::optional<ArrayRef<QualType>> ObjCSubsts) {
3260 std::string Result;
3261 QualType ResultType = Block.getTypePtr()->getReturnType();
3262 if (ObjCSubsts)
3263 ResultType =
3264 ResultType.substObjCTypeArgs(BlockDecl->getASTContext(), *ObjCSubsts,
3266 if (!ResultType->isVoidType() || SuppressBlock)
3267 ResultType.getAsStringInternal(Result, Policy);
3268
3269 // Format the parameter list.
3270 std::string Params;
3271 if (!BlockProto || Block.getNumParams() == 0) {
3272 if (BlockProto && BlockProto.getTypePtr()->isVariadic())
3273 Params = "(...)";
3274 else
3275 Params = "(void)";
3276 } else {
3277 Params += "(";
3278 for (unsigned I = 0, N = Block.getNumParams(); I != N; ++I) {
3279 if (I)
3280 Params += ", ";
3281 Params += FormatFunctionParameter(Policy, Block.getParam(I),
3282 /*SuppressName=*/false,
3283 /*SuppressBlock=*/true, ObjCSubsts);
3284
3285 if (I == N - 1 && BlockProto.getTypePtr()->isVariadic())
3286 Params += ", ...";
3287 }
3288 Params += ")";
3289 }
3290
3291 if (SuppressBlock) {
3292 // Format as a parameter.
3293 Result = Result + " (^";
3294 if (!SuppressBlockName && BlockDecl->getIdentifier())
3295 Result += BlockDecl->getIdentifier()->getName();
3296 Result += ")";
3297 Result += Params;
3298 } else {
3299 // Format as a block literal argument.
3300 Result = '^' + Result;
3301 Result += Params;
3302
3303 if (!SuppressBlockName && BlockDecl->getIdentifier())
3304 Result += BlockDecl->getIdentifier()->getName();
3305 }
3306
3307 return Result;
3308}
3309
3310static std::string GetDefaultValueString(const ParmVarDecl *Param,
3311 const SourceManager &SM,
3312 const LangOptions &LangOpts) {
3313 const SourceRange SrcRange = Param->getDefaultArgRange();
3314 CharSourceRange CharSrcRange = CharSourceRange::getTokenRange(SrcRange);
3315 bool Invalid = CharSrcRange.isInvalid();
3316 if (Invalid)
3317 return "";
3318 StringRef srcText =
3319 Lexer::getSourceText(CharSrcRange, SM, LangOpts, &Invalid);
3320 if (Invalid)
3321 return "";
3322
3323 if (srcText.empty() || srcText == "=") {
3324 // Lexer can't determine the value.
3325 // This happens if the code is incorrect (for example class is forward
3326 // declared).
3327 return "";
3328 }
3329 std::string DefValue(srcText.str());
3330 // FIXME: remove this check if the Lexer::getSourceText value is fixed and
3331 // this value always has (or always does not have) '=' in front of it
3332 if (DefValue.at(0) != '=') {
3333 // If we don't have '=' in front of value.
3334 // Lexer returns built-in types values without '=' and user-defined types
3335 // values with it.
3336 return " = " + DefValue;
3337 }
3338 return " " + DefValue;
3339}
3340
3341/// Add function parameter chunks to the given code completion string.
3343 Preprocessor &PP, const PrintingPolicy &Policy,
3344 const FunctionDecl *Function, CodeCompletionBuilder &Result,
3345 unsigned Start = 0, bool InOptional = false, bool FunctionCanBeCall = true,
3346 bool IsInDeclarationContext = false) {
3347 bool FirstParameter = true;
3348 bool AsInformativeChunk = !(FunctionCanBeCall || IsInDeclarationContext);
3349
3350 const FunctionDecl *BetterSignatureDecl = BetterSignature(Function, Start);
3351
3352 for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) {
3353 const ParmVarDecl *Param = BetterSignatureDecl->getParamDecl(P);
3354
3355 if (Param->hasDefaultArg() && !InOptional && !IsInDeclarationContext &&
3356 !AsInformativeChunk) {
3357 // When we see an optional default argument, put that argument and
3358 // the remaining default arguments into a new, optional string.
3359 CodeCompletionBuilder Opt(Result.getAllocator(),
3360 Result.getCodeCompletionTUInfo());
3361 if (!FirstParameter)
3363 AddFunctionParameterChunks(PP, Policy, Function, Opt, P, true);
3364 Result.AddOptionalChunk(Opt.TakeString());
3365 break;
3366 }
3367
3368 // C++23 introduces an explicit object parameter, a.k.a. "deducing this"
3369 // Skip it for autocomplete and treat the next parameter as the first
3370 // parameter
3371 if (FirstParameter && Param->isExplicitObjectParameter()) {
3372 continue;
3373 }
3374
3375 if (FirstParameter)
3376 FirstParameter = false;
3377 else {
3378 if (AsInformativeChunk)
3379 Result.AddInformativeChunk(", ");
3380 else
3382 }
3383
3384 InOptional = false;
3385
3386 // Format the placeholder string.
3387 std::string PlaceholderStr = FormatFunctionParameter(Policy, Param);
3388 std::string DefaultValue;
3389 if (Param->hasDefaultArg()) {
3390 if (IsInDeclarationContext)
3391 DefaultValue = GetDefaultValueString(Param, PP.getSourceManager(),
3392 PP.getLangOpts());
3393 else
3394 PlaceholderStr += GetDefaultValueString(Param, PP.getSourceManager(),
3395 PP.getLangOpts());
3396 }
3397
3398 if (Function->isVariadic() && P == N - 1)
3399 PlaceholderStr += ", ...";
3400
3401 // Add the placeholder string.
3402 if (AsInformativeChunk)
3403 Result.AddInformativeChunk(
3404 Result.getAllocator().CopyString(PlaceholderStr));
3405 else if (IsInDeclarationContext) { // No placeholders in declaration context
3406 Result.AddTextChunk(Result.getAllocator().CopyString(PlaceholderStr));
3407 if (DefaultValue.length() != 0)
3408 Result.AddInformativeChunk(
3409 Result.getAllocator().CopyString(DefaultValue));
3410 } else
3411 Result.AddPlaceholderChunk(
3412 Result.getAllocator().CopyString(PlaceholderStr));
3413 }
3414
3415 if (const auto *Proto = Function->getType()->getAs<FunctionProtoType>())
3416 if (Proto->isVariadic()) {
3417 if (Proto->getNumParams() == 0)
3418 Result.AddPlaceholderChunk("...");
3419
3420 MaybeAddSentinel(PP, Function, Result);
3421 }
3422}
3423
3424/// Add template parameter chunks to the given code completion string.
3426 ASTContext &Context, const PrintingPolicy &Policy,
3428 unsigned MaxParameters = 0, unsigned Start = 0, bool InDefaultArg = false,
3429 bool AsInformativeChunk = false) {
3430 bool FirstParameter = true;
3431
3432 // Prefer to take the template parameter names from the first declaration of
3433 // the template.
3434 Template = cast<TemplateDecl>(Template->getCanonicalDecl());
3435
3436 TemplateParameterList *Params = Template->getTemplateParameters();
3437 TemplateParameterList::iterator PEnd = Params->end();
3438 if (MaxParameters)
3439 PEnd = Params->begin() + MaxParameters;
3440 for (TemplateParameterList::iterator P = Params->begin() + Start; P != PEnd;
3441 ++P) {
3442 bool HasDefaultArg = false;
3443 std::string PlaceholderStr;
3444 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
3445 if (TTP->wasDeclaredWithTypename())
3446 PlaceholderStr = "typename";
3447 else if (const auto *TC = TTP->getTypeConstraint()) {
3448 llvm::raw_string_ostream OS(PlaceholderStr);
3449 TC->print(OS, Policy);
3450 } else
3451 PlaceholderStr = "class";
3452
3453 if (TTP->getIdentifier()) {
3454 PlaceholderStr += ' ';
3455 PlaceholderStr += TTP->getIdentifier()->deuglifiedName();
3456 }
3457
3458 HasDefaultArg = TTP->hasDefaultArgument();
3459 } else if (NonTypeTemplateParmDecl *NTTP =
3460 dyn_cast<NonTypeTemplateParmDecl>(*P)) {
3461 if (NTTP->getIdentifier())
3462 PlaceholderStr = std::string(NTTP->getIdentifier()->deuglifiedName());
3463 NTTP->getType().getAsStringInternal(PlaceholderStr, Policy);
3464 HasDefaultArg = NTTP->hasDefaultArgument();
3465 } else {
3468
3469 // Since putting the template argument list into the placeholder would
3470 // be very, very long, we just use an abbreviation.
3471 PlaceholderStr = "template<...> class";
3472 if (TTP->getIdentifier()) {
3473 PlaceholderStr += ' ';
3474 PlaceholderStr += TTP->getIdentifier()->deuglifiedName();
3475 }
3476
3477 HasDefaultArg = TTP->hasDefaultArgument();
3478 }
3479
3480 if (HasDefaultArg && !InDefaultArg && !AsInformativeChunk) {
3481 // When we see an optional default argument, put that argument and
3482 // the remaining default arguments into a new, optional string.
3483 CodeCompletionBuilder Opt(Result.getAllocator(),
3484 Result.getCodeCompletionTUInfo());
3485 if (!FirstParameter)
3487 AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters,
3488 P - Params->begin(), true);
3489 Result.AddOptionalChunk(Opt.TakeString());
3490 break;
3491 }
3492
3493 InDefaultArg = false;
3494
3495 if (FirstParameter)
3496 FirstParameter = false;
3497 else {
3498 if (AsInformativeChunk)
3499 Result.AddInformativeChunk(", ");
3500 else
3502 }
3503
3504 if (AsInformativeChunk)
3505 Result.AddInformativeChunk(
3506 Result.getAllocator().CopyString(PlaceholderStr));
3507 else // Add the placeholder string.
3508 Result.AddPlaceholderChunk(
3509 Result.getAllocator().CopyString(PlaceholderStr));
3510 }
3511}
3512
3513/// Add a qualifier to the given code-completion string, if the
3514/// provided nested-name-specifier is non-NULL.
3516 NestedNameSpecifier Qualifier,
3517 bool QualifierIsInformative,
3518 ASTContext &Context,
3519 const PrintingPolicy &Policy) {
3520 if (!Qualifier)
3521 return;
3522
3523 std::string PrintedNNS;
3524 {
3525 llvm::raw_string_ostream OS(PrintedNNS);
3526 Qualifier.print(OS, Policy);
3527 }
3528 if (QualifierIsInformative)
3529 Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS));
3530 else
3531 Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS));
3532}
3533
3535 const Qualifiers Quals,
3536 bool AsInformativeChunk = true) {
3537 // FIXME: Add ref-qualifier!
3538
3539 // Handle single qualifiers without copying
3540 if (Quals.hasOnlyConst()) {
3541 if (AsInformativeChunk)
3542 Result.AddInformativeChunk(" const");
3543 else
3544 Result.AddTextChunk(" const");
3545 return;
3546 }
3547
3548 if (Quals.hasOnlyVolatile()) {
3549 if (AsInformativeChunk)
3550 Result.AddInformativeChunk(" volatile");
3551 else
3552 Result.AddTextChunk(" volatile");
3553 return;
3554 }
3555
3556 if (Quals.hasOnlyRestrict()) {
3557 if (AsInformativeChunk)
3558 Result.AddInformativeChunk(" restrict");
3559 else
3560 Result.AddTextChunk(" restrict");
3561 return;
3562 }
3563
3564 // Handle multiple qualifiers.
3565 std::string QualsStr;
3566 if (Quals.hasConst())
3567 QualsStr += " const";
3568 if (Quals.hasVolatile())
3569 QualsStr += " volatile";
3570 if (Quals.hasRestrict())
3571 QualsStr += " restrict";
3572
3573 if (AsInformativeChunk)
3574 Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr));
3575 else
3576 Result.AddTextChunk(Result.getAllocator().CopyString(QualsStr));
3577}
3578
3579static void
3581 const FunctionDecl *Function,
3582 bool AsInformativeChunks = true) {
3583 if (auto *CxxMethodDecl = llvm::dyn_cast_if_present<CXXMethodDecl>(Function);
3584 CxxMethodDecl && CxxMethodDecl->hasCXXExplicitFunctionObjectParameter()) {
3585 // if explicit object method, infer quals from the object parameter
3586 const auto Quals = CxxMethodDecl->getFunctionObjectParameterType();
3587 if (!Quals.hasQualifiers())
3588 return;
3589
3590 AddFunctionTypeQuals(Result, Quals.getQualifiers(), AsInformativeChunks);
3591 } else {
3592 const auto *Proto = Function->getType()->getAs<FunctionProtoType>();
3593 if (!Proto || !Proto->getMethodQuals())
3594 return;
3595
3596 AddFunctionTypeQuals(Result, Proto->getMethodQuals(), AsInformativeChunks);
3597 }
3598}
3599
3600static void
3601AddFunctionExceptSpecToCompletionString(std::string &NameAndSignature,
3602 const FunctionDecl *Function) {
3603 const auto *Proto = Function->getType()->getAs<FunctionProtoType>();
3604 if (!Proto)
3605 return;
3606
3607 auto ExceptInfo = Proto->getExceptionSpecInfo();
3608 switch (ExceptInfo.Type) {
3609 case EST_BasicNoexcept:
3610 case EST_NoexceptTrue:
3611 NameAndSignature += " noexcept";
3612 break;
3613
3614 default:
3615 break;
3616 }
3617}
3618
3619/// Add the name of the given declaration
3620static void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy,
3621 const NamedDecl *ND,
3623 DeclarationName Name = ND->getDeclName();
3624 if (!Name)
3625 return;
3626
3627 switch (Name.getNameKind()) {
3629 const char *OperatorName = nullptr;
3630 switch (Name.getCXXOverloadedOperator()) {
3631 case OO_None:
3632 case OO_Conditional:
3634 OperatorName = "operator";
3635 break;
3636
3637#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \
3638 case OO_##Name: \
3639 OperatorName = "operator" Spelling; \
3640 break;
3641#define OVERLOADED_OPERATOR_MULTI(Name, Spelling, Unary, Binary, MemberOnly)
3642#include "clang/Basic/OperatorKinds.def"
3643
3644 case OO_New:
3645 OperatorName = "operator new";
3646 break;
3647 case OO_Delete:
3648 OperatorName = "operator delete";
3649 break;
3650 case OO_Array_New:
3651 OperatorName = "operator new[]";
3652 break;
3653 case OO_Array_Delete:
3654 OperatorName = "operator delete[]";
3655 break;
3656 case OO_Call:
3657 OperatorName = "operator()";
3658 break;
3659 case OO_Subscript:
3660 OperatorName = "operator[]";
3661 break;
3662 }
3663 Result.AddTypedTextChunk(OperatorName);
3664 break;
3665 }
3666
3671 Result.AddTypedTextChunk(
3672 Result.getAllocator().CopyString(ND->getNameAsString()));
3673 break;
3674
3680 break;
3681
3683 CXXRecordDecl *Record = nullptr;
3684 QualType Ty = Name.getCXXNameType();
3685 if (auto *RD = Ty->getAsCXXRecordDecl()) {
3686 Record = RD;
3687 } else {
3688 Result.AddTypedTextChunk(
3689 Result.getAllocator().CopyString(ND->getNameAsString()));
3690 break;
3691 }
3692
3693 Result.AddTypedTextChunk(
3694 Result.getAllocator().CopyString(Record->getNameAsString()));
3695 if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) {
3697 AddTemplateParameterChunks(Context, Policy, Template, Result);
3699 }
3700 break;
3701 }
3702 }
3703}
3704
3706 Sema &S, const CodeCompletionContext &CCContext,
3707 CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
3708 bool IncludeBriefComments) {
3709 return CreateCodeCompletionString(S.Context, S.PP, CCContext, Allocator,
3710 CCTUInfo, IncludeBriefComments);
3711}
3712
3714 Preprocessor &PP, CodeCompletionAllocator &Allocator,
3715 CodeCompletionTUInfo &CCTUInfo) {
3716 assert(Kind == RK_Macro);
3717 CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability);
3718 const MacroInfo *MI = PP.getMacroInfo(Macro);
3719 Result.AddTypedTextChunk(Result.getAllocator().CopyString(Macro->getName()));
3720
3721 if (!MI || !MI->isFunctionLike())
3722 return Result.TakeString();
3723
3724 // Format a function-like macro with placeholders for the arguments.
3726 MacroInfo::param_iterator A = MI->param_begin(), AEnd = MI->param_end();
3727
3728 // C99 variadic macros add __VA_ARGS__ at the end. Skip it.
3729 if (MI->isC99Varargs()) {
3730 --AEnd;
3731
3732 if (A == AEnd) {
3733 Result.AddPlaceholderChunk("...");
3734 }
3735 }
3736
3737 for (MacroInfo::param_iterator A = MI->param_begin(); A != AEnd; ++A) {
3738 if (A != MI->param_begin())
3740
3741 if (MI->isVariadic() && (A + 1) == AEnd) {
3742 SmallString<32> Arg = (*A)->getName();
3743 if (MI->isC99Varargs())
3744 Arg += ", ...";
3745 else
3746 Arg += "...";
3747 Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg));
3748 break;
3749 }
3750
3751 // Non-variadic macros are simple.
3752 Result.AddPlaceholderChunk(
3753 Result.getAllocator().CopyString((*A)->getName()));
3754 }
3756 return Result.TakeString();
3757}
3758
3759/// If possible, create a new code completion string for the given
3760/// result.
3761///
3762/// \returns Either a new, heap-allocated code completion string describing
3763/// how to use this result, or NULL to indicate that the string or name of the
3764/// result is all that is needed.
3766 ASTContext &Ctx, Preprocessor &PP, const CodeCompletionContext &CCContext,
3767 CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
3768 bool IncludeBriefComments) {
3769 if (Kind == RK_Macro)
3770 return CreateCodeCompletionStringForMacro(PP, Allocator, CCTUInfo);
3771
3772 CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability);
3773
3775 if (Kind == RK_Pattern) {
3776 Pattern->Priority = Priority;
3777 Pattern->Availability = Availability;
3778
3779 if (Declaration) {
3780 Result.addParentContext(Declaration->getDeclContext());
3781 Pattern->ParentName = Result.getParentName();
3782 if (const RawComment *RC =
3784 Result.addBriefComment(RC->getBriefText(Ctx));
3785 Pattern->BriefComment = Result.getBriefComment();
3786 }
3787 }
3788
3789 return Pattern;
3790 }
3791
3792 if (Kind == RK_Keyword) {
3793 Result.AddTypedTextChunk(Keyword);
3794 return Result.TakeString();
3795 }
3796 assert(Kind == RK_Declaration && "Missed a result kind?");
3798 PP, Ctx, Result, IncludeBriefComments, CCContext, Policy);
3799}
3800
3802 std::string &BeforeName,
3803 std::string &NameAndSignature) {
3804 bool SeenTypedChunk = false;
3805 for (auto &Chunk : CCS) {
3806 if (Chunk.Kind == CodeCompletionString::CK_Optional) {
3807 assert(SeenTypedChunk && "optional parameter before name");
3808 // Note that we put all chunks inside into NameAndSignature.
3809 printOverrideString(*Chunk.Optional, NameAndSignature, NameAndSignature);
3810 continue;
3811 }
3812 SeenTypedChunk |= Chunk.Kind == CodeCompletionString::CK_TypedText;
3813 if (SeenTypedChunk)
3814 NameAndSignature += Chunk.Text;
3815 else
3816 BeforeName += Chunk.Text;
3817 }
3818}
3819
3823 bool IncludeBriefComments, const CodeCompletionContext &CCContext,
3824 PrintingPolicy &Policy) {
3825 auto *CCS = createCodeCompletionStringForDecl(PP, Ctx, Result,
3826 /*IncludeBriefComments=*/false,
3827 CCContext, Policy);
3828 std::string BeforeName;
3829 std::string NameAndSignature;
3830 // For overrides all chunks go into the result, none are informative.
3831 printOverrideString(*CCS, BeforeName, NameAndSignature);
3832
3833 // If the virtual function is declared with "noexcept", add it in the result
3834 // code completion string.
3835 const auto *VirtualFunc = dyn_cast<FunctionDecl>(Declaration);
3836 assert(VirtualFunc && "overridden decl must be a function");
3837 AddFunctionExceptSpecToCompletionString(NameAndSignature, VirtualFunc);
3838
3839 NameAndSignature += " override";
3840
3841 Result.AddTextChunk(Result.getAllocator().CopyString(BeforeName));
3843 Result.AddTypedTextChunk(Result.getAllocator().CopyString(NameAndSignature));
3844 return Result.TakeString();
3845}
3846
3847// FIXME: Right now this works well with lambdas. Add support for other functor
3848// types like std::function.
3850 const auto *VD = dyn_cast<VarDecl>(ND);
3851 if (!VD)
3852 return nullptr;
3853 const auto *RecordDecl = VD->getType()->getAsCXXRecordDecl();
3854 if (!RecordDecl || !RecordDecl->isLambda())
3855 return nullptr;
3856 return RecordDecl->getLambdaCallOperator();
3857}
3858
3861 bool IncludeBriefComments, const CodeCompletionContext &CCContext,
3862 PrintingPolicy &Policy) {
3863 const NamedDecl *ND = Declaration;
3864 Result.addParentContext(ND->getDeclContext());
3865
3866 if (IncludeBriefComments) {
3867 // Add documentation comment, if it exists.
3868 if (const RawComment *RC = getCompletionComment(Ctx, Declaration)) {
3869 Result.addBriefComment(RC->getBriefText(Ctx));
3870 }
3871 }
3872
3874 Result.AddTypedTextChunk(
3875 Result.getAllocator().CopyString(ND->getNameAsString()));
3876 Result.AddTextChunk("::");
3877 return Result.TakeString();
3878 }
3879
3880 for (const auto *I : ND->specific_attrs<AnnotateAttr>())
3881 Result.AddAnnotation(Result.getAllocator().CopyString(I->getAnnotation()));
3882
3883 auto AddFunctionTypeAndResult = [&](const FunctionDecl *Function) {
3884 AddResultTypeChunk(Ctx, Policy, Function, CCContext.getBaseType(), Result);
3886 Ctx, Policy);
3887 AddTypedNameChunk(Ctx, Policy, ND, Result);
3888 bool InsertParameters = FunctionCanBeCall || DeclaringEntity;
3889 if (InsertParameters)
3891 else
3892 Result.AddInformativeChunk("(");
3893 AddFunctionParameterChunks(PP, Policy, Function, Result, /*Start=*/0,
3894 /*InOptional=*/false,
3895 /*FunctionCanBeCall=*/FunctionCanBeCall,
3896 /*IsInDeclarationContext=*/DeclaringEntity);
3897 if (InsertParameters)
3899 else
3900 Result.AddInformativeChunk(")");
3902 Result, Function, /*AsInformativeChunks=*/!DeclaringEntity);
3903 };
3904
3905 if (const auto *Function = dyn_cast<FunctionDecl>(ND)) {
3906 AddFunctionTypeAndResult(Function);
3907 return Result.TakeString();
3908 }
3909
3910 if (const auto *CallOperator =
3911 dyn_cast_or_null<FunctionDecl>(extractFunctorCallOperator(ND))) {
3912 AddFunctionTypeAndResult(CallOperator);
3913 return Result.TakeString();
3914 }
3915
3916 AddResultTypeChunk(Ctx, Policy, ND, CCContext.getBaseType(), Result);
3917
3918 if (const FunctionTemplateDecl *FunTmpl =
3919 dyn_cast<FunctionTemplateDecl>(ND)) {
3921 Ctx, Policy);
3922 FunctionDecl *Function = FunTmpl->getTemplatedDecl();
3923 AddTypedNameChunk(Ctx, Policy, Function, Result);
3924
3925 // Figure out which template parameters are deduced (or have default
3926 // arguments).
3927 // Note that we're creating a non-empty bit vector so that we can go
3928 // through the loop below to omit default template parameters for non-call
3929 // cases.
3930 llvm::SmallBitVector Deduced(FunTmpl->getTemplateParameters()->size());
3931 // Avoid running it if this is not a call: We should emit *all* template
3932 // parameters.
3935 unsigned LastDeducibleArgument;
3936 for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0;
3937 --LastDeducibleArgument) {
3938 if (!Deduced[LastDeducibleArgument - 1]) {
3939 // C++0x: Figure out if the template argument has a default. If so,
3940 // the user doesn't need to type this argument.
3941 // FIXME: We need to abstract template parameters better!
3942 bool HasDefaultArg = false;
3943 NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam(
3944 LastDeducibleArgument - 1);
3945 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
3946 HasDefaultArg = TTP->hasDefaultArgument();
3947 else if (NonTypeTemplateParmDecl *NTTP =
3948 dyn_cast<NonTypeTemplateParmDecl>(Param))
3949 HasDefaultArg = NTTP->hasDefaultArgument();
3950 else {
3951 assert(isa<TemplateTemplateParmDecl>(Param));
3952 HasDefaultArg =
3953 cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument();
3954 }
3955
3956 if (!HasDefaultArg)
3957 break;
3958 }
3959 }
3960
3961 if (LastDeducibleArgument || !FunctionCanBeCall) {
3962 // Some of the function template arguments cannot be deduced from a
3963 // function call, so we introduce an explicit template argument list
3964 // containing all of the arguments up to the first deducible argument.
3965 //
3966 // Or, if this isn't a call, emit all the template arguments
3967 // to disambiguate the (potential) overloads.
3968 //
3969 // FIXME: Detect cases where the function parameters can be deduced from
3970 // the surrounding context, as per [temp.deduct.funcaddr].
3971 // e.g.,
3972 // template <class T> void foo(T);
3973 // void (*f)(int) = foo;
3974 if (!DeclaringEntity)
3976 else
3977 Result.AddInformativeChunk("<");
3979 Ctx, Policy, FunTmpl, Result, LastDeducibleArgument, /*Start=*/0,
3980 /*InDefaultArg=*/false, /*AsInformativeChunk=*/DeclaringEntity);
3981 // Only adds template arguments as informative chunks in declaration
3982 // context.
3983 if (!DeclaringEntity)
3985 else
3986 Result.AddInformativeChunk(">");
3987 }
3988
3989 // Add the function parameters
3990 bool InsertParameters = FunctionCanBeCall || DeclaringEntity;
3991 if (InsertParameters)
3993 else
3994 Result.AddInformativeChunk("(");
3995 AddFunctionParameterChunks(PP, Policy, Function, Result, /*Start=*/0,
3996 /*InOptional=*/false,
3997 /*FunctionCanBeCall=*/FunctionCanBeCall,
3998 /*IsInDeclarationContext=*/DeclaringEntity);
3999 if (InsertParameters)
4001 else
4002 Result.AddInformativeChunk(")");
4004 return Result.TakeString();
4005 }
4006
4007 if (const auto *Template = dyn_cast<TemplateDecl>(ND)) {
4009 Ctx, Policy);
4010 Result.AddTypedTextChunk(
4011 Result.getAllocator().CopyString(Template->getNameAsString()));
4015 return Result.TakeString();
4016 }
4017
4018 if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) {
4019 Selector Sel = Method->getSelector();
4020 if (Sel.isUnarySelector()) {
4021 Result.AddTypedTextChunk(
4022 Result.getAllocator().CopyString(Sel.getNameForSlot(0)));
4023 return Result.TakeString();
4024 }
4025
4026 std::string SelName = Sel.getNameForSlot(0).str();
4027 SelName += ':';
4028 if (StartParameter == 0)
4029 Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName));
4030 else {
4031 Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName));
4032
4033 // If there is only one parameter, and we're past it, add an empty
4034 // typed-text chunk since there is nothing to type.
4035 if (Method->param_size() == 1)
4036 Result.AddTypedTextChunk("");
4037 }
4038 unsigned Idx = 0;
4039 // The extra Idx < Sel.getNumArgs() check is needed due to legacy C-style
4040 // method parameters.
4041 for (ObjCMethodDecl::param_const_iterator P = Method->param_begin(),
4042 PEnd = Method->param_end();
4043 P != PEnd && Idx < Sel.getNumArgs(); (void)++P, ++Idx) {
4044 if (Idx > 0) {
4045 std::string Keyword;
4046 if (Idx > StartParameter)
4048 if (const IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx))
4049 Keyword += II->getName();
4050 Keyword += ":";
4052 Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword));
4053 else
4054 Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword));
4055 }
4056
4057 // If we're before the starting parameter, skip the placeholder.
4058 if (Idx < StartParameter)
4059 continue;
4060
4061 std::string Arg;
4062 QualType ParamType = (*P)->getType();
4063 std::optional<ArrayRef<QualType>> ObjCSubsts;
4064 if (!CCContext.getBaseType().isNull())
4065 ObjCSubsts = CCContext.getBaseType()->getObjCSubstitutions(Method);
4066
4067 if (ParamType->isBlockPointerType() && !DeclaringEntity)
4068 Arg = FormatFunctionParameter(Policy, *P, true,
4069 /*SuppressBlock=*/false, ObjCSubsts);
4070 else {
4071 if (ObjCSubsts)
4072 ParamType = ParamType.substObjCTypeArgs(
4073 Ctx, *ObjCSubsts, ObjCSubstitutionContext::Parameter);
4074 Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier(),
4075 ParamType);
4076 Arg += ParamType.getAsString(Policy) + ")";
4077 if (const IdentifierInfo *II = (*P)->getIdentifier())
4079 Arg += II->getName();
4080 }
4081
4082 if (Method->isVariadic() && (P + 1) == PEnd)
4083 Arg += ", ...";
4084
4085 if (DeclaringEntity)
4086 Result.AddTextChunk(Result.getAllocator().CopyString(Arg));
4088 Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg));
4089 else
4090 Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg));
4091 }
4092
4093 if (Method->isVariadic()) {
4094 if (Method->param_size() == 0) {
4095 if (DeclaringEntity)
4096 Result.AddTextChunk(", ...");
4098 Result.AddInformativeChunk(", ...");
4099 else
4100 Result.AddPlaceholderChunk(", ...");
4101 }
4102
4104 }
4105
4106 return Result.TakeString();
4107 }
4108
4109 if (Qualifier)
4111 Ctx, Policy);
4112
4113 Result.AddTypedTextChunk(
4114 Result.getAllocator().CopyString(ND->getNameAsString()));
4115 return Result.TakeString();
4116}
4117
4119 const NamedDecl *ND) {
4120 if (!ND)
4121 return nullptr;
4122 if (auto *RC = Ctx.getRawCommentForAnyRedecl(ND))
4123 return RC;
4124
4125 // Try to find comment from a property for ObjC methods.
4126 const auto *M = dyn_cast<ObjCMethodDecl>(ND);
4127 if (!M)
4128 return nullptr;
4129 const ObjCPropertyDecl *PDecl = M->findPropertyDecl();
4130 if (!PDecl)
4131 return nullptr;
4132
4133 return Ctx.getRawCommentForAnyRedecl(PDecl);
4134}
4135
4137 const NamedDecl *ND) {
4138 const auto *M = dyn_cast_or_null<ObjCMethodDecl>(ND);
4139 if (!M || !M->isPropertyAccessor())
4140 return nullptr;
4141
4142 // Provide code completion comment for self.GetterName where
4143 // GetterName is the getter method for a property with name
4144 // different from the property name (declared via a property
4145 // getter attribute.
4146 const ObjCPropertyDecl *PDecl = M->findPropertyDecl();
4147 if (!PDecl)
4148 return nullptr;
4149 if (PDecl->getGetterName() == M->getSelector() &&
4150 PDecl->getIdentifier() != M->getIdentifier()) {
4151 if (auto *RC = Ctx.getRawCommentForAnyRedecl(M))
4152 return RC;
4153 if (auto *RC = Ctx.getRawCommentForAnyRedecl(PDecl))
4154 return RC;
4155 }
4156 return nullptr;
4157}
4158
4160 const ASTContext &Ctx,
4161 const CodeCompleteConsumer::OverloadCandidate &Result, unsigned ArgIndex) {
4162 auto FDecl = Result.getFunction();
4163 if (!FDecl)
4164 return nullptr;
4165 if (ArgIndex < FDecl->getNumParams())
4166 return Ctx.getRawCommentForAnyRedecl(FDecl->getParamDecl(ArgIndex));
4167 return nullptr;
4168}
4169
4171 const PrintingPolicy &Policy,
4173 unsigned CurrentArg) {
4174 unsigned ChunkIndex = 0;
4175 auto AddChunk = [&](llvm::StringRef Placeholder) {
4176 if (ChunkIndex > 0)
4178 const char *Copy = Result.getAllocator().CopyString(Placeholder);
4179 if (ChunkIndex == CurrentArg)
4180 Result.AddCurrentParameterChunk(Copy);
4181 else
4182 Result.AddPlaceholderChunk(Copy);
4183 ++ChunkIndex;
4184 };
4185 // Aggregate initialization has all bases followed by all fields.
4186 // (Bases are not legal in C++11 but in that case we never get here).
4187 if (auto *CRD = llvm::dyn_cast<CXXRecordDecl>(RD)) {
4188 for (const auto &Base : CRD->bases())
4189 AddChunk(Base.getType().getAsString(Policy));
4190 }
4191 for (const auto &Field : RD->fields())
4192 AddChunk(FormatFunctionParameter(Policy, Field));
4193}
4194
4195/// Add function overload parameter chunks to the given code completion
4196/// string.
4198 ASTContext &Context, const PrintingPolicy &Policy,
4199 const FunctionDecl *Function, const FunctionProtoType *Prototype,
4201 unsigned CurrentArg, unsigned Start = 0, bool InOptional = false) {
4202 if (!Function && !Prototype) {
4204 return;
4205 }
4206
4207 bool FirstParameter = true;
4208 unsigned NumParams =
4209 Function ? Function->getNumParams() : Prototype->getNumParams();
4210 const FunctionDecl *BetterSignatureDecl =
4211 Function ? BetterSignature(Function, Start) : nullptr;
4212
4213 for (unsigned P = Start; P != NumParams; ++P) {
4214 if (Function && Function->getParamDecl(P)->hasDefaultArg() && !InOptional) {
4215 // When we see an optional default argument, put that argument and
4216 // the remaining default arguments into a new, optional string.
4217 CodeCompletionBuilder Opt(Result.getAllocator(),
4218 Result.getCodeCompletionTUInfo());
4219 if (!FirstParameter)
4221 // Optional sections are nested.
4222 AddOverloadParameterChunks(Context, Policy, Function, Prototype,
4223 PrototypeLoc, Opt, CurrentArg, P,
4224 /*InOptional=*/true);
4225 Result.AddOptionalChunk(Opt.TakeString());
4226 return;
4227 }
4228
4229 // C++23 introduces an explicit object parameter, a.k.a. "deducing this"
4230 // Skip it for autocomplete and treat the next parameter as the first
4231 // parameter
4232 if (Function && FirstParameter &&
4233 Function->getParamDecl(P)->isExplicitObjectParameter()) {
4234 continue;
4235 }
4236
4237 if (FirstParameter)
4238 FirstParameter = false;
4239 else
4241
4242 InOptional = false;
4243
4244 // Format the placeholder string.
4245 std::string Placeholder;
4246 assert(P < Prototype->getNumParams());
4247 if (Function || PrototypeLoc) {
4248 const ParmVarDecl *Param = Function ? BetterSignatureDecl->getParamDecl(P)
4249 : PrototypeLoc.getParam(P);
4250 Placeholder = FormatFunctionParameter(Policy, Param);
4251 if (Param->hasDefaultArg())
4252 Placeholder += GetDefaultValueString(Param, Context.getSourceManager(),
4253 Context.getLangOpts());
4254 } else {
4255 Placeholder = Prototype->getParamType(P).getAsString(Policy);
4256 }
4257
4258 if (P == CurrentArg)
4259 Result.AddCurrentParameterChunk(
4260 Result.getAllocator().CopyString(Placeholder));
4261 else
4262 Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Placeholder));
4263 }
4264
4265 if (Prototype && Prototype->isVariadic()) {
4266 CodeCompletionBuilder Opt(Result.getAllocator(),
4267 Result.getCodeCompletionTUInfo());
4268 if (!FirstParameter)
4270
4271 if (CurrentArg < NumParams)
4272 Opt.AddPlaceholderChunk("...");
4273 else
4274 Opt.AddCurrentParameterChunk("...");
4275
4276 Result.AddOptionalChunk(Opt.TakeString());
4277 }
4278}
4279
4280static std::string
4282 const PrintingPolicy &Policy) {
4283 if (const auto *Type = dyn_cast<TemplateTypeParmDecl>(Param)) {
4284 Optional = Type->hasDefaultArgument();
4285 } else if (const auto *NonType = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
4286 Optional = NonType->hasDefaultArgument();
4287 } else if (const auto *Template = dyn_cast<TemplateTemplateParmDecl>(Param)) {
4288 Optional = Template->hasDefaultArgument();
4289 }
4290 std::string Result;
4291 llvm::raw_string_ostream OS(Result);
4292 Param->print(OS, Policy);
4293 return Result;
4294}
4295
4296static std::string templateResultType(const TemplateDecl *TD,
4297 const PrintingPolicy &Policy) {
4298 if (const auto *CTD = dyn_cast<ClassTemplateDecl>(TD))
4299 return CTD->getTemplatedDecl()->getKindName().str();
4300 if (const auto *VTD = dyn_cast<VarTemplateDecl>(TD))
4301 return VTD->getTemplatedDecl()->getType().getAsString(Policy);
4302 if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(TD))
4303 return FTD->getTemplatedDecl()->getReturnType().getAsString(Policy);
4305 return "type";
4307 return "class";
4308 if (isa<ConceptDecl>(TD))
4309 return "concept";
4310 return "";
4311}
4312
4314 const TemplateDecl *TD, CodeCompletionBuilder &Builder, unsigned CurrentArg,
4315 const PrintingPolicy &Policy) {
4317 CodeCompletionBuilder OptionalBuilder(Builder.getAllocator(),
4318 Builder.getCodeCompletionTUInfo());
4319 std::string ResultType = templateResultType(TD, Policy);
4320 if (!ResultType.empty())
4321 Builder.AddResultTypeChunk(Builder.getAllocator().CopyString(ResultType));
4322 Builder.AddTextChunk(
4323 Builder.getAllocator().CopyString(TD->getNameAsString()));
4324 Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
4325 // Initially we're writing into the main string. Once we see an optional arg
4326 // (with default), we're writing into the nested optional chunk.
4327 CodeCompletionBuilder *Current = &Builder;
4328 for (unsigned I = 0; I < Params.size(); ++I) {
4329 bool Optional = false;
4330 std::string Placeholder =
4331 formatTemplateParameterPlaceholder(Params[I], Optional, Policy);
4332 if (Optional)
4333 Current = &OptionalBuilder;
4334 if (I > 0)
4336 Current->AddChunk(I == CurrentArg
4339 Current->getAllocator().CopyString(Placeholder));
4340 }
4341 // Add the optional chunk to the main string if we ever used it.
4342 if (Current == &OptionalBuilder)
4343 Builder.AddOptionalChunk(OptionalBuilder.TakeString());
4344 Builder.AddChunk(CodeCompletionString::CK_RightAngle);
4345 // For function templates, ResultType was the function's return type.
4346 // Give some clue this is a function. (Don't show the possibly-bulky params).
4348 Builder.AddInformativeChunk("()");
4349 return Builder.TakeString();
4350}
4351
4354 unsigned CurrentArg, Sema &S, CodeCompletionAllocator &Allocator,
4355 CodeCompletionTUInfo &CCTUInfo, bool IncludeBriefComments,
4356 bool Braced) const {
4358 // Show signatures of constructors as they are declared:
4359 // vector(int n) rather than vector<string>(int n)
4360 // This is less noisy without being less clear, and avoids tricky cases.
4362
4363 // FIXME: Set priority, availability appropriately.
4364 CodeCompletionBuilder Result(Allocator, CCTUInfo, 1,
4366
4367 if (getKind() == CK_Template)
4368 return createTemplateSignatureString(getTemplate(), Result, CurrentArg,
4369 Policy);
4370
4371 FunctionDecl *FDecl = getFunction();
4372 const FunctionProtoType *Proto =
4373 dyn_cast_or_null<FunctionProtoType>(getFunctionType());
4374
4375 // First, the name/type of the callee.
4376 if (getKind() == CK_Aggregate) {
4377 Result.AddTextChunk(
4378 Result.getAllocator().CopyString(getAggregate()->getName()));
4379 } else if (FDecl) {
4380 if (IncludeBriefComments) {
4381 if (auto RC = getParameterComment(S.getASTContext(), *this, CurrentArg))
4382 Result.addBriefComment(RC->getBriefText(S.getASTContext()));
4383 }
4384 AddResultTypeChunk(S.Context, Policy, FDecl, QualType(), Result);
4385
4386 std::string Name;
4387 llvm::raw_string_ostream OS(Name);
4388 FDecl->getDeclName().print(OS, Policy);
4389 Result.AddTextChunk(Result.getAllocator().CopyString(Name));
4390 } else {
4391 // Function without a declaration. Just give the return type.
4392 Result.AddResultTypeChunk(Result.getAllocator().CopyString(
4393 getFunctionType()->getReturnType().getAsString(Policy)));
4394 }
4395
4396 // Next, the brackets and parameters.
4399 if (getKind() == CK_Aggregate)
4400 AddOverloadAggregateChunks(getAggregate(), Policy, Result, CurrentArg);
4401 else
4402 AddOverloadParameterChunks(S.getASTContext(), Policy, FDecl, Proto,
4403 getFunctionProtoTypeLoc(), Result, CurrentArg);
4406
4407 return Result.TakeString();
4408}
4409
4410unsigned clang::getMacroUsagePriority(StringRef MacroName,
4411 const LangOptions &LangOpts,
4412 bool PreferredTypeIsPointer) {
4413 unsigned Priority = CCP_Macro;
4414
4415 // Treat the "nil", "Nil" and "NULL" macros as null pointer constants.
4416 if (MacroName == "nil" || MacroName == "NULL" || MacroName == "Nil") {
4417 Priority = CCP_Constant;
4418 if (PreferredTypeIsPointer)
4419 Priority = Priority / CCF_SimilarTypeMatch;
4420 }
4421 // Treat "YES", "NO", "true", and "false" as constants.
4422 else if (MacroName == "YES" || MacroName == "NO" || MacroName == "true" ||
4423 MacroName == "false")
4424 Priority = CCP_Constant;
4425 // Treat "bool" as a type.
4426 else if (MacroName == "bool")
4427 Priority = CCP_Type + (LangOpts.ObjC ? CCD_bool_in_ObjC : 0);
4428
4429 return Priority;
4430}
4431
4432CXCursorKind clang::getCursorKindForDecl(const Decl *D) {
4433 if (!D)
4435
4436 switch (D->getKind()) {
4437 case Decl::Enum:
4438 return CXCursor_EnumDecl;
4439 case Decl::EnumConstant:
4441 case Decl::Field:
4442 return CXCursor_FieldDecl;
4443 case Decl::Function:
4444 return CXCursor_FunctionDecl;
4445 case Decl::ObjCCategory:
4447 case Decl::ObjCCategoryImpl:
4449 case Decl::ObjCImplementation:
4451
4452 case Decl::ObjCInterface:
4454 case Decl::ObjCIvar:
4455 return CXCursor_ObjCIvarDecl;
4456 case Decl::ObjCMethod:
4457 return cast<ObjCMethodDecl>(D)->isInstanceMethod()
4460 case Decl::CXXMethod:
4461 return CXCursor_CXXMethod;
4462 case Decl::CXXConstructor:
4463 return CXCursor_Constructor;
4464 case Decl::CXXDestructor:
4465 return CXCursor_Destructor;
4466 case Decl::CXXConversion:
4468 case Decl::ObjCProperty:
4470 case Decl::ObjCProtocol:
4472 case Decl::ParmVar:
4473 return CXCursor_ParmDecl;
4474 case Decl::Typedef:
4475 return CXCursor_TypedefDecl;
4476 case Decl::TypeAlias:
4478 case Decl::TypeAliasTemplate:
4480 case Decl::Var:
4481 return CXCursor_VarDecl;
4482 case Decl::Namespace:
4483 return CXCursor_Namespace;
4484 case Decl::NamespaceAlias:
4486 case Decl::TemplateTypeParm:
4488 case Decl::NonTypeTemplateParm:
4490 case Decl::TemplateTemplateParm:
4492 case Decl::FunctionTemplate:
4494 case Decl::ClassTemplate:
4496 case Decl::AccessSpec:
4498 case Decl::ClassTemplatePartialSpecialization:
4500 case Decl::UsingDirective:
4502 case Decl::StaticAssert:
4503 return CXCursor_StaticAssert;
4504 case Decl::Friend:
4505 case Decl::FriendTemplate:
4506 return CXCursor_FriendDecl;
4507 case Decl::TranslationUnit:
4509
4510 case Decl::Using:
4511 case Decl::UnresolvedUsingValue:
4512 case Decl::UnresolvedUsingTypename:
4514
4515 case Decl::UsingEnum:
4516 return CXCursor_EnumDecl;
4517
4518 case Decl::ObjCPropertyImpl:
4519 switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) {
4522
4525 }
4526 llvm_unreachable("Unexpected Kind!");
4527
4528 case Decl::Import:
4530
4531 case Decl::ObjCTypeParam:
4533
4534 case Decl::Concept:
4535 return CXCursor_ConceptDecl;
4536
4537 case Decl::LinkageSpec:
4538 return CXCursor_LinkageSpec;
4539
4540 default:
4541 if (const auto *TD = dyn_cast<TagDecl>(D)) {
4542 switch (TD->getTagKind()) {
4543 case TagTypeKind::Interface: // fall through
4545 return CXCursor_StructDecl;
4546 case TagTypeKind::Class:
4547 return CXCursor_ClassDecl;
4548 case TagTypeKind::Union:
4549 return CXCursor_UnionDecl;
4550 case TagTypeKind::Enum:
4551 return CXCursor_EnumDecl;
4552 }
4553 }
4554 }
4555
4557}
4558
4559static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results,
4560 bool LoadExternal, bool IncludeUndefined,
4561 bool TargetTypeIsPointer = false) {
4563
4564 Results.EnterNewScope();
4565
4566 for (const auto &M : PP.macros(LoadExternal)) {
4567 auto MD = PP.getMacroDefinition(M.first);
4568 if (IncludeUndefined || MD) {
4569 MacroInfo *MI = MD.getMacroInfo();
4570 if (MI && MI->isUsedForHeaderGuard())
4571 continue;
4572
4573 Results.AddResult(
4574 Result(M.first, MI,
4575 getMacroUsagePriority(M.first->getName(), PP.getLangOpts(),
4576 TargetTypeIsPointer)));
4577 }
4578 }
4579
4580 Results.ExitScope();
4581}
4582
4583static void AddPrettyFunctionResults(const LangOptions &LangOpts,
4584 ResultBuilder &Results) {
4586
4587 Results.EnterNewScope();
4588
4589 Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant));
4590 Results.AddResult(Result("__FUNCTION__", CCP_Constant));
4591 if (LangOpts.C99 || LangOpts.CPlusPlus11)
4592 Results.AddResult(Result("__func__", CCP_Constant));
4593 Results.ExitScope();
4594}
4595
4597 CodeCompleteConsumer *CodeCompleter,
4598 const CodeCompletionContext &Context,
4599 CodeCompletionResult *Results,
4600 unsigned NumResults) {
4601 if (CodeCompleter)
4602 CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults);
4603}
4604
4605static CodeCompletionContext
4608 switch (PCC) {
4611
4614
4617
4620
4623
4626 if (S.CurContext->isFileContext())
4628 if (S.CurContext->isRecord())
4631
4634
4636 if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 ||
4637 S.getLangOpts().ObjC)
4639 else
4641
4646 S.getASTContext().BoolTy);
4647
4650
4653
4656
4661 }
4662
4663 llvm_unreachable("Invalid ParserCompletionContext!");
4664}
4665
4666/// If we're in a C++ virtual member function, add completion results
4667/// that invoke the functions we override, since it's common to invoke the
4668/// overridden function as well as adding new functionality.
4669///
4670/// \param S The semantic analysis object for which we are generating results.
4671///
4672/// \param InContext This context in which the nested-name-specifier preceding
4673/// the code-completion point
4674static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext,
4675 ResultBuilder &Results) {
4676 // Look through blocks.
4677 DeclContext *CurContext = S.CurContext;
4678 while (isa<BlockDecl>(CurContext))
4679 CurContext = CurContext->getParent();
4680
4681 CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext);
4682 if (!Method || !Method->isVirtual())
4683 return;
4684
4685 // We need to have names for all of the parameters, if we're going to
4686 // generate a forwarding call.
4687 for (auto *P : Method->parameters())
4688 if (!P->getDeclName())
4689 return;
4690
4692 for (const CXXMethodDecl *Overridden : Method->overridden_methods()) {
4693 CodeCompletionBuilder Builder(Results.getAllocator(),
4694 Results.getCodeCompletionTUInfo());
4695 if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl())
4696 continue;
4697
4698 // If we need a nested-name-specifier, add one now.
4699 if (!InContext) {
4701 S.Context, CurContext, Overridden->getDeclContext());
4702 if (NNS) {
4703 std::string Str;
4704 llvm::raw_string_ostream OS(Str);
4705 NNS.print(OS, Policy);
4706 Builder.AddTextChunk(Results.getAllocator().CopyString(Str));
4707 }
4708 } else if (!InContext->Equals(Overridden->getDeclContext()))
4709 continue;
4710
4711 Builder.AddTypedTextChunk(
4712 Results.getAllocator().CopyString(Overridden->getNameAsString()));
4713 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
4714 bool FirstParam = true;
4715 for (auto *P : Method->parameters()) {
4716 if (FirstParam)
4717 FirstParam = false;
4718 else
4719 Builder.AddChunk(CodeCompletionString::CK_Comma);
4720
4721 Builder.AddPlaceholderChunk(
4722 Results.getAllocator().CopyString(P->getIdentifier()->getName()));
4723 }
4724 Builder.AddChunk(CodeCompletionString::CK_RightParen);
4725 Results.AddResult(CodeCompletionResult(
4726 Builder.TakeString(), CCP_SuperCompletion, CXCursor_CXXMethod,
4727 CXAvailability_Available, Overridden));
4728 Results.Ignore(Overridden);
4729 }
4730}
4731
4733 ModuleIdPath Path) {
4735 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
4736 CodeCompleter->getCodeCompletionTUInfo(),
4738 Results.EnterNewScope();
4739
4740 CodeCompletionAllocator &Allocator = Results.getAllocator();
4741 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
4743 if (Path.empty()) {
4744 // Enumerate all top-level modules.
4746 SemaRef.PP.getHeaderSearchInfo().collectAllModules(Modules);
4747 // Determine the primary module interface name of the current file's
4748 // declared module, if any. Prefer Sema's view, but fall back to the
4749 // preprocessor's module declaration state: module declarations are
4750 // processed as preprocessor directives, so the preprocessor may know the
4751 // declared module before Sema has acted on it (e.g. when completing an
4752 // import right after the module declaration).
4753 StringRef CurrentPrimary;
4754 if (Module *CurrentModule = SemaRef.getCurrentModule())
4755 CurrentPrimary = CurrentModule->getPrimaryModuleInterfaceName();
4756 else if (SemaRef.PP.isInNamedModule())
4757 CurrentPrimary = SemaRef.PP.getNamedModuleName().split(':').first;
4758 llvm::StringSet<> AddedModules;
4759 for (unsigned I = 0, N = Modules.size(); I != N; ++I) {
4760 // Skip module partitions that don't belong to the current file's declared
4761 // module.
4762 if (Modules[I]->isModulePartition()) {
4763 if (CurrentPrimary.empty() ||
4764 Modules[I]->getPrimaryModuleInterfaceName() != CurrentPrimary)
4765 continue;
4766 }
4767 Builder.AddTypedTextChunk(
4768 Builder.getAllocator().CopyString(Modules[I]->Name));
4769 Results.AddResult(Result(
4770 Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl,
4771 Modules[I]->isAvailable() ? CXAvailability_Available
4773 AddedModules.insert(Modules[I]->Name);
4774 }
4775
4776 // Also suggest C++20 named modules from -fmodule-file=<name>=<path> that
4777 // haven't been loaded into the module map yet.
4778 for (const auto &Entry : SemaRef.PP.getHeaderSearchInfo()
4779 .getHeaderSearchOpts()
4780 .PrebuiltModuleFiles) {
4781 if (AddedModules.count(Entry.first))
4782 continue;
4783 StringRef Name = Entry.first;
4784 // Apply the same partition filtering as above.
4785 if (auto [Primary, Partition] = Name.split(':'); !Partition.empty()) {
4786 if (CurrentPrimary.empty() || Primary != CurrentPrimary)
4787 continue;
4788 }
4789 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Name));
4790 Results.AddResult(Result(Builder.TakeString(), CCP_Declaration,
4793 }
4794 } else if (getLangOpts().Modules) {
4795 // Load the named module.
4796 Module *Mod = SemaRef.PP.getModuleLoader().loadModule(
4797 ImportLoc, Path, Module::AllVisible,
4798 /*IsInclusionDirective=*/false);
4799 // Enumerate submodules.
4800 if (Mod) {
4801 for (Module *Submodule : Mod->submodules()) {
4802 Builder.AddTypedTextChunk(
4803 Builder.getAllocator().CopyString(Submodule->Name));
4804 Results.AddResult(Result(
4805 Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl,
4806 Submodule->isAvailable() ? CXAvailability_Available
4808 }
4809 }
4810 }
4811 Results.ExitScope();
4813 Results.getCompletionContext(), Results.data(),
4814 Results.size());
4815}
4816
4818 Scope *S, SemaCodeCompletion::ParserCompletionContext CompletionContext) {
4819 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
4820 CodeCompleter->getCodeCompletionTUInfo(),
4821 mapCodeCompletionContext(SemaRef, CompletionContext));
4822 Results.EnterNewScope();
4823
4824 // Determine how to filter results, e.g., so that the names of
4825 // values (functions, enumerators, function templates, etc.) are
4826 // only allowed where we can have an expression.
4827 switch (CompletionContext) {
4828 case PCC_Namespace:
4829 case PCC_Class:
4830 case PCC_ObjCInterface:
4833 case PCC_Template:
4834 case PCC_MemberTemplate:
4835 case PCC_Type:
4837 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
4838 break;
4839
4840 case PCC_Statement:
4843 case PCC_Expression:
4844 case PCC_ForInit:
4845 case PCC_Condition:
4846 if (WantTypesInContext(CompletionContext, getLangOpts()))
4847 Results.setFilter(&ResultBuilder::IsOrdinaryName);
4848 else
4849 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
4850
4851 if (getLangOpts().CPlusPlus)
4852 MaybeAddOverrideCalls(SemaRef, /*InContext=*/nullptr, Results);
4853 break;
4854
4856 // Unfiltered
4857 break;
4858 }
4859
4860 auto ThisType = SemaRef.getCurrentThisType();
4861 if (ThisType.isNull()) {
4862 // check if function scope is an explicit object function
4863 if (auto *MethodDecl = llvm::dyn_cast_if_present<CXXMethodDecl>(
4864 SemaRef.getCurFunctionDecl()))
4865 Results.setExplicitObjectMemberFn(
4866 MethodDecl->isExplicitObjectMemberFunction());
4867 } else {
4868 // If we are in a C++ non-static member function, check the qualifiers on
4869 // the member function to filter/prioritize the results list.
4870 Results.setObjectTypeQualifiers(ThisType->getPointeeType().getQualifiers(),
4871 VK_LValue);
4872 }
4873
4874 CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
4875 SemaRef.LookupVisibleDecls(S, SemaRef.LookupOrdinaryName, Consumer,
4876 CodeCompleter->includeGlobals(),
4877 CodeCompleter->loadExternal());
4878
4879 AddOrdinaryNameResults(CompletionContext, S, SemaRef, Results);
4880 Results.ExitScope();
4881
4882 switch (CompletionContext) {
4884 case PCC_Expression:
4885 case PCC_Statement:
4888 if (S->getFnParent())
4890 break;
4891
4892 case PCC_Namespace:
4893 case PCC_Class:
4894 case PCC_ObjCInterface:
4897 case PCC_Template:
4898 case PCC_MemberTemplate:
4899 case PCC_ForInit:
4900 case PCC_Condition:
4901 case PCC_Type:
4903 break;
4904 }
4905
4906 if (CodeCompleter->includeMacros())
4907 AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false);
4908
4910 Results.getCompletionContext(), Results.data(),
4911 Results.size());
4912}
4913
4914static void
4915AddClassMessageCompletions(Sema &SemaRef, Scope *S, ParsedType Receiver,
4917 bool AtArgumentExpression, bool IsSuper,
4918 ResultBuilder &Results);
4919
4921 bool AllowNonIdentifiers,
4922 bool AllowNestedNameSpecifiers) {
4924 ResultBuilder Results(
4925 SemaRef, CodeCompleter->getAllocator(),
4926 CodeCompleter->getCodeCompletionTUInfo(),
4927 AllowNestedNameSpecifiers
4928 // FIXME: Try to separate codepath leading here to deduce whether we
4929 // need an existing symbol or a new one.
4932 Results.EnterNewScope();
4933
4934 // Type qualifiers can come after names.
4935 Results.AddResult(Result("const"));
4936 Results.AddResult(Result("volatile"));
4937 if (getLangOpts().C99)
4938 Results.AddResult(Result("restrict"));
4939
4940 if (getLangOpts().CPlusPlus) {
4941 if (getLangOpts().CPlusPlus11 &&
4944 Results.AddResult("final");
4945
4946 if (AllowNonIdentifiers) {
4947 Results.AddResult(Result("operator"));
4948 }
4949
4950 // Add nested-name-specifiers.
4951 if (AllowNestedNameSpecifiers) {
4952 Results.allowNestedNameSpecifiers();
4953 Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy);
4954 CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
4955 SemaRef.LookupVisibleDecls(S, Sema::LookupNestedNameSpecifierName,
4956 Consumer, CodeCompleter->includeGlobals(),
4957 CodeCompleter->loadExternal());
4958 Results.setFilter(nullptr);
4959 }
4960 }
4961 Results.ExitScope();
4962
4963 // If we're in a context where we might have an expression (rather than a
4964 // declaration), and what we've seen so far is an Objective-C type that could
4965 // be a receiver of a class message, this may be a class message send with
4966 // the initial opening bracket '[' missing. Add appropriate completions.
4967 if (AllowNonIdentifiers && !AllowNestedNameSpecifiers &&
4972 !DS.isTypeAltiVecVector() && S &&
4973 (S->getFlags() & Scope::DeclScope) != 0 &&
4976 0) {
4977 ParsedType T = DS.getRepAsType();
4978 if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType())
4979 AddClassMessageCompletions(SemaRef, S, T, {}, false, false, Results);
4980 }
4981
4982 // Note that we intentionally suppress macro results here, since we do not
4983 // encourage using macros to produce the names of entities.
4984
4986 Results.getCompletionContext(), Results.data(),
4987 Results.size());
4988}
4989
4990static const char *underscoreAttrScope(llvm::StringRef Scope) {
4991 if (Scope == "clang")
4992 return "_Clang";
4993 if (Scope == "gnu")
4994 return "__gnu__";
4995 return nullptr;
4996}
4997
4998static const char *noUnderscoreAttrScope(llvm::StringRef Scope) {
4999 if (Scope == "_Clang")
5000 return "clang";
5001 if (Scope == "__gnu__")
5002 return "gnu";
5003 return nullptr;
5004}
5005
5008 const IdentifierInfo *InScope) {
5009 if (Completion == AttributeCompletion::None)
5010 return;
5011 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
5012 CodeCompleter->getCodeCompletionTUInfo(),
5014
5015 // We're going to iterate over the normalized spellings of the attribute.
5016 // These don't include "underscore guarding": the normalized spelling is
5017 // clang::foo but you can also write _Clang::__foo__.
5018 //
5019 // (Clang supports a mix like clang::__foo__ but we won't suggest it: either
5020 // you care about clashing with macros or you don't).
5021 //
5022 // So if we're already in a scope, we determine its canonical spellings
5023 // (for comparison with normalized attr spelling) and remember whether it was
5024 // underscore-guarded (so we know how to spell contained attributes).
5025 llvm::StringRef InScopeName;
5026 bool InScopeUnderscore = false;
5027 if (InScope) {
5028 InScopeName = InScope->getName();
5029 if (const char *NoUnderscore = noUnderscoreAttrScope(InScopeName)) {
5030 InScopeName = NoUnderscore;
5031 InScopeUnderscore = true;
5032 }
5033 }
5034 bool SyntaxSupportsGuards = Syntax == AttributeCommonInfo::AS_GNU ||
5037
5038 llvm::DenseSet<llvm::StringRef> FoundScopes;
5039 auto AddCompletions = [&](const ParsedAttrInfo &A) {
5040 if (A.IsTargetSpecific &&
5041 !A.existsInTarget(getASTContext().getTargetInfo()))
5042 return;
5043 if (!A.acceptsLangOpts(getLangOpts()))
5044 return;
5045 for (const auto &S : A.Spellings) {
5046 if (S.Syntax != Syntax)
5047 continue;
5048 llvm::StringRef Name = S.NormalizedFullName;
5049 llvm::StringRef Scope;
5050 if ((Syntax == AttributeCommonInfo::AS_CXX11 ||
5051 Syntax == AttributeCommonInfo::AS_C23)) {
5052 std::tie(Scope, Name) = Name.split("::");
5053 if (Name.empty()) // oops, unscoped
5054 std::swap(Name, Scope);
5055 }
5056
5057 // Do we just want a list of scopes rather than attributes?
5058 if (Completion == AttributeCompletion::Scope) {
5059 // Make sure to emit each scope only once.
5060 if (!Scope.empty() && FoundScopes.insert(Scope).second) {
5061 Results.AddResult(
5062 CodeCompletionResult(Results.getAllocator().CopyString(Scope)));
5063 // Include alternate form (__gnu__ instead of gnu).
5064 if (const char *Scope2 = underscoreAttrScope(Scope))
5065 Results.AddResult(CodeCompletionResult(Scope2));
5066 }
5067 continue;
5068 }
5069
5070 // If a scope was specified, it must match but we don't need to print it.
5071 if (!InScopeName.empty()) {
5072 if (Scope != InScopeName)
5073 continue;
5074 Scope = "";
5075 }
5076
5077 auto Add = [&](llvm::StringRef Scope, llvm::StringRef Name,
5078 bool Underscores) {
5079 CodeCompletionBuilder Builder(Results.getAllocator(),
5080 Results.getCodeCompletionTUInfo());
5082 if (!Scope.empty()) {
5083 Text.append(Scope);
5084 Text.append("::");
5085 }
5086 if (Underscores)
5087 Text.append("__");
5088 Text.append(Name);
5089 if (Underscores)
5090 Text.append("__");
5091 Builder.AddTypedTextChunk(Results.getAllocator().CopyString(Text));
5092
5093 if (!A.ArgNames.empty()) {
5094 Builder.AddChunk(CodeCompletionString::CK_LeftParen, "(");
5095 bool First = true;
5096 for (const char *Arg : A.ArgNames) {
5097 if (!First)
5098 Builder.AddChunk(CodeCompletionString::CK_Comma, ", ");
5099 First = false;
5100 Builder.AddPlaceholderChunk(Arg);
5101 }
5102 Builder.AddChunk(CodeCompletionString::CK_RightParen, ")");
5103 }
5104
5105 Results.AddResult(Builder.TakeString());
5106 };
5107
5108 // Generate the non-underscore-guarded result.
5109 // Note this is (a suffix of) the NormalizedFullName, no need to copy.
5110 // If an underscore-guarded scope was specified, only the
5111 // underscore-guarded attribute name is relevant.
5112 if (!InScopeUnderscore)
5113 Add(Scope, Name, /*Underscores=*/false);
5114
5115 // Generate the underscore-guarded version, for syntaxes that support it.
5116 // We skip this if the scope was already spelled and not guarded, or
5117 // we must spell it and can't guard it.
5118 if (!(InScope && !InScopeUnderscore) && SyntaxSupportsGuards) {
5119 if (Scope.empty()) {
5120 Add(Scope, Name, /*Underscores=*/true);
5121 } else {
5122 const char *GuardedScope = underscoreAttrScope(Scope);
5123 if (!GuardedScope)
5124 continue;
5125 Add(GuardedScope, Name, /*Underscores=*/true);
5126 }
5127 }
5128
5129 // It may be nice to include the Kind so we can look up the docs later.
5130 }
5131 };
5132
5133 for (const auto *A : ParsedAttrInfo::getAllBuiltin())
5134 AddCompletions(*A);
5135 for (const auto &Entry : ParsedAttrInfoRegistry::entries())
5136 AddCompletions(*Entry.instantiate());
5137
5139 Results.getCompletionContext(), Results.data(),
5140 Results.size());
5141}
5142
5155
5156namespace {
5157/// Information that allows to avoid completing redundant enumerators.
5158struct CoveredEnumerators {
5160 NestedNameSpecifier SuggestedQualifier = std::nullopt;
5161};
5162} // namespace
5163
5164static void AddEnumerators(ResultBuilder &Results, ASTContext &Context,
5165 EnumDecl *Enum, DeclContext *CurContext,
5166 const CoveredEnumerators &Enumerators) {
5167 NestedNameSpecifier Qualifier = Enumerators.SuggestedQualifier;
5168 if (Context.getLangOpts().CPlusPlus && !Qualifier && Enumerators.Seen.empty()) {
5169 // If there are no prior enumerators in C++, check whether we have to
5170 // qualify the names of the enumerators that we suggest, because they
5171 // may not be visible in this scope.
5172 Qualifier = getRequiredQualification(Context, CurContext, Enum);
5173 }
5174
5175 Results.EnterNewScope();
5176 for (auto *E : Enum->enumerators()) {
5177 if (Enumerators.Seen.count(E))
5178 continue;
5179
5180 CodeCompletionResult R(E, CCP_EnumInCase, Qualifier);
5181 Results.AddResult(R, CurContext, nullptr, false);
5182 }
5183 Results.ExitScope();
5184}
5185
5186/// Try to find a corresponding FunctionProtoType for function-like types (e.g.
5187/// function pointers, std::function, etc).
5189 assert(!T.isNull());
5190 // Try to extract first template argument from std::function<> and similar.
5191 // Note we only handle the sugared types, they closely match what users wrote.
5192 // We explicitly choose to not handle ClassTemplateSpecializationDecl.
5193 if (auto *Specialization = T->getAs<TemplateSpecializationType>()) {
5194 if (Specialization->template_arguments().size() != 1)
5195 return nullptr;
5196 const TemplateArgument &Argument = Specialization->template_arguments()[0];
5197 if (Argument.getKind() != TemplateArgument::Type)
5198 return nullptr;
5199 return Argument.getAsType()->getAs<FunctionProtoType>();
5200 }
5201 // Handle other cases.
5202 if (T->isPointerType())
5203 T = T->getPointeeType();
5204 return T->getAs<FunctionProtoType>();
5205}
5206
5207/// Adds a pattern completion for a lambda expression with the specified
5208/// parameter types and placeholders for parameter names.
5209static void AddLambdaCompletion(ResultBuilder &Results,
5210 llvm::ArrayRef<QualType> Parameters,
5211 const LangOptions &LangOpts) {
5212 if (!Results.includeCodePatterns())
5213 return;
5214 CodeCompletionBuilder Completion(Results.getAllocator(),
5215 Results.getCodeCompletionTUInfo());
5216 // [](<parameters>) {}
5218 Completion.AddPlaceholderChunk("=");
5220 if (!Parameters.empty()) {
5222 bool First = true;
5223 for (auto Parameter : Parameters) {
5224 if (!First)
5226 else
5227 First = false;
5228
5229 constexpr llvm::StringLiteral NamePlaceholder = "!#!NAME_GOES_HERE!#!";
5230 std::string Type = std::string(NamePlaceholder);
5231 Parameter.getAsStringInternal(Type, PrintingPolicy(LangOpts));
5232 llvm::StringRef Prefix, Suffix;
5233 std::tie(Prefix, Suffix) = llvm::StringRef(Type).split(NamePlaceholder);
5234 Prefix = Prefix.rtrim();
5235 Suffix = Suffix.ltrim();
5236
5237 Completion.AddTextChunk(Completion.getAllocator().CopyString(Prefix));
5239 Completion.AddPlaceholderChunk("parameter");
5240 Completion.AddTextChunk(Completion.getAllocator().CopyString(Suffix));
5241 };
5243 }
5247 Completion.AddPlaceholderChunk("body");
5250
5251 Results.AddResult(Completion.TakeString());
5252}
5253
5254/// Perform code-completion in an expression context when we know what
5255/// type we're looking for.
5257 Scope *S, const CodeCompleteExpressionData &Data, bool IsAddressOfOperand) {
5258 ResultBuilder Results(
5259 SemaRef, CodeCompleter->getAllocator(),
5260 CodeCompleter->getCodeCompletionTUInfo(),
5262 Data.IsParenthesized
5265 Data.PreferredType));
5266 auto PCC =
5268 if (Data.ObjCCollection)
5269 Results.setFilter(&ResultBuilder::IsObjCCollection);
5270 else if (Data.IntegralConstantExpression)
5271 Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
5272 else if (WantTypesInContext(PCC, getLangOpts()))
5273 Results.setFilter(&ResultBuilder::IsOrdinaryName);
5274 else
5275 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
5276
5277 if (!Data.PreferredType.isNull())
5278 Results.setPreferredType(Data.PreferredType.getNonReferenceType());
5279
5280 // Ignore any declarations that we were told that we don't care about.
5281 for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I)
5282 Results.Ignore(Data.IgnoreDecls[I]);
5283
5284 CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
5285 Consumer.setIsAddressOfOperand(IsAddressOfOperand);
5286 SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
5287 CodeCompleter->includeGlobals(),
5288 CodeCompleter->loadExternal());
5289
5290 Results.EnterNewScope();
5291 AddOrdinaryNameResults(PCC, S, SemaRef, Results);
5292 Results.ExitScope();
5293
5294 bool PreferredTypeIsPointer = false;
5295 if (!Data.PreferredType.isNull()) {
5296 PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() ||
5297 Data.PreferredType->isMemberPointerType() ||
5298 Data.PreferredType->isBlockPointerType();
5299 if (auto *Enum = Data.PreferredType->getAsEnumDecl()) {
5300 // FIXME: collect covered enumerators in cases like:
5301 // if (x == my_enum::one) { ... } else if (x == ^) {}
5302 AddEnumerators(Results, getASTContext(), Enum, SemaRef.CurContext,
5303 CoveredEnumerators());
5304 }
5305 }
5306
5307 if (S->getFnParent() && !Data.ObjCCollection &&
5308 !Data.IntegralConstantExpression)
5310
5311 if (CodeCompleter->includeMacros())
5312 AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false,
5313 PreferredTypeIsPointer);
5314
5315 // Complete a lambda expression when preferred type is a function.
5316 if (!Data.PreferredType.isNull() && getLangOpts().CPlusPlus11) {
5317 if (const FunctionProtoType *F =
5318 TryDeconstructFunctionLike(Data.PreferredType))
5319 AddLambdaCompletion(Results, F->getParamTypes(), getLangOpts());
5320 }
5321
5323 Results.getCompletionContext(), Results.data(),
5324 Results.size());
5325}
5326
5328 QualType PreferredType,
5329 bool IsParenthesized,
5330 bool IsAddressOfOperand) {
5332 S, CodeCompleteExpressionData(PreferredType, IsParenthesized),
5333 IsAddressOfOperand);
5334}
5335
5337 QualType PreferredType) {
5338 if (E.isInvalid())
5339 CodeCompleteExpression(S, PreferredType);
5340 else if (getLangOpts().ObjC)
5341 CodeCompleteObjCInstanceMessage(S, E.get(), {}, false);
5342}
5343
5344/// The set of properties that have already been added, referenced by
5345/// property name.
5347
5348/// Retrieve the container definition, if any?
5350 if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) {
5351 if (Interface->hasDefinition())
5352 return Interface->getDefinition();
5353
5354 return Interface;
5355 }
5356
5357 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
5358 if (Protocol->hasDefinition())
5359 return Protocol->getDefinition();
5360
5361 return Protocol;
5362 }
5363 return Container;
5364}
5365
5366/// Adds a block invocation code completion result for the given block
5367/// declaration \p BD.
5368static void AddObjCBlockCall(ASTContext &Context, const PrintingPolicy &Policy,
5369 CodeCompletionBuilder &Builder,
5370 const NamedDecl *BD,
5371 const FunctionTypeLoc &BlockLoc,
5372 const FunctionProtoTypeLoc &BlockProtoLoc) {
5373 Builder.AddResultTypeChunk(
5374 GetCompletionTypeString(BlockLoc.getReturnLoc().getType(), Context,
5375 Policy, Builder.getAllocator()));
5376
5377 AddTypedNameChunk(Context, Policy, BD, Builder);
5378 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
5379
5380 if (BlockProtoLoc && BlockProtoLoc.getTypePtr()->isVariadic()) {
5381 Builder.AddPlaceholderChunk("...");
5382 } else {
5383 for (unsigned I = 0, N = BlockLoc.getNumParams(); I != N; ++I) {
5384 if (I)
5385 Builder.AddChunk(CodeCompletionString::CK_Comma);
5386
5387 // Format the placeholder string.
5388 std::string PlaceholderStr =
5389 FormatFunctionParameter(Policy, BlockLoc.getParam(I));
5390
5391 if (I == N - 1 && BlockProtoLoc &&
5392 BlockProtoLoc.getTypePtr()->isVariadic())
5393 PlaceholderStr += ", ...";
5394
5395 // Add the placeholder string.
5396 Builder.AddPlaceholderChunk(
5397 Builder.getAllocator().CopyString(PlaceholderStr));
5398 }
5399 }
5400
5401 Builder.AddChunk(CodeCompletionString::CK_RightParen);
5402}
5403
5404static void
5406 ObjCContainerDecl *Container, bool AllowCategories,
5407 bool AllowNullaryMethods, DeclContext *CurContext,
5408 AddedPropertiesSet &AddedProperties, ResultBuilder &Results,
5409 bool IsBaseExprStatement = false,
5410 bool IsClassProperty = false, bool InOriginalClass = true) {
5412
5413 // Retrieve the definition.
5414 Container = getContainerDef(Container);
5415
5416 // Add properties in this container.
5417 const auto AddProperty = [&](const ObjCPropertyDecl *P) {
5418 if (!AddedProperties.insert(P->getIdentifier()).second)
5419 return;
5420
5421 // FIXME: Provide block invocation completion for non-statement
5422 // expressions.
5423 if (!P->getType().getTypePtr()->isBlockPointerType() ||
5424 !IsBaseExprStatement) {
5425 Result R =
5426 Result(P, Results.getBasePriority(P), /*Qualifier=*/std::nullopt);
5427 if (!InOriginalClass)
5428 setInBaseClass(R);
5429 Results.MaybeAddResult(R, CurContext);
5430 return;
5431 }
5432
5433 // Block setter and invocation completion is provided only when we are able
5434 // to find the FunctionProtoTypeLoc with parameter names for the block.
5435 FunctionTypeLoc BlockLoc;
5436 FunctionProtoTypeLoc BlockProtoLoc;
5437 findTypeLocationForBlockDecl(P->getTypeSourceInfo(), BlockLoc,
5438 BlockProtoLoc);
5439 if (!BlockLoc) {
5440 Result R =
5441 Result(P, Results.getBasePriority(P), /*Qualifier=*/std::nullopt);
5442 if (!InOriginalClass)
5443 setInBaseClass(R);
5444 Results.MaybeAddResult(R, CurContext);
5445 return;
5446 }
5447
5448 // The default completion result for block properties should be the block
5449 // invocation completion when the base expression is a statement.
5450 CodeCompletionBuilder Builder(Results.getAllocator(),
5451 Results.getCodeCompletionTUInfo());
5452 AddObjCBlockCall(Container->getASTContext(),
5453 getCompletionPrintingPolicy(Results.getSema()), Builder, P,
5454 BlockLoc, BlockProtoLoc);
5455 Result R = Result(Builder.TakeString(), P, Results.getBasePriority(P));
5456 if (!InOriginalClass)
5457 setInBaseClass(R);
5458 Results.MaybeAddResult(R, CurContext);
5459
5460 // Provide additional block setter completion iff the base expression is a
5461 // statement and the block property is mutable.
5462 if (!P->isReadOnly()) {
5463 CodeCompletionBuilder Builder(Results.getAllocator(),
5464 Results.getCodeCompletionTUInfo());
5465 AddResultTypeChunk(Container->getASTContext(),
5466 getCompletionPrintingPolicy(Results.getSema()), P,
5467 CCContext.getBaseType(), Builder);
5468 Builder.AddTypedTextChunk(
5469 Results.getAllocator().CopyString(P->getName()));
5470 Builder.AddChunk(CodeCompletionString::CK_Equal);
5471
5472 std::string PlaceholderStr = formatBlockPlaceholder(
5473 getCompletionPrintingPolicy(Results.getSema()), P, BlockLoc,
5474 BlockProtoLoc, /*SuppressBlockName=*/true);
5475 // Add the placeholder string.
5476 Builder.AddPlaceholderChunk(
5477 Builder.getAllocator().CopyString(PlaceholderStr));
5478
5479 // When completing blocks properties that return void the default
5480 // property completion result should show up before the setter,
5481 // otherwise the setter completion should show up before the default
5482 // property completion, as we normally want to use the result of the
5483 // call.
5484 Result R =
5485 Result(Builder.TakeString(), P,
5486 Results.getBasePriority(P) +
5487 (BlockLoc.getTypePtr()->getReturnType()->isVoidType()
5490 if (!InOriginalClass)
5491 setInBaseClass(R);
5492 Results.MaybeAddResult(R, CurContext);
5493 }
5494 };
5495
5496 if (IsClassProperty) {
5497 for (const auto *P : Container->class_properties())
5498 AddProperty(P);
5499 } else {
5500 for (const auto *P : Container->instance_properties())
5501 AddProperty(P);
5502 }
5503
5504 // Add nullary methods or implicit class properties
5505 if (AllowNullaryMethods) {
5506 ASTContext &Context = Container->getASTContext();
5507 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
5508 // Adds a method result
5509 const auto AddMethod = [&](const ObjCMethodDecl *M) {
5510 const IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0);
5511 if (!Name)
5512 return;
5513 if (!AddedProperties.insert(Name).second)
5514 return;
5515 CodeCompletionBuilder Builder(Results.getAllocator(),
5516 Results.getCodeCompletionTUInfo());
5517 AddResultTypeChunk(Context, Policy, M, CCContext.getBaseType(), Builder);
5518 Builder.AddTypedTextChunk(
5519 Results.getAllocator().CopyString(Name->getName()));
5520 Result R = Result(Builder.TakeString(), M,
5522 if (!InOriginalClass)
5523 setInBaseClass(R);
5524 Results.MaybeAddResult(R, CurContext);
5525 };
5526
5527 if (IsClassProperty) {
5528 for (const auto *M : Container->methods()) {
5529 // Gather the class method that can be used as implicit property
5530 // getters. Methods with arguments or methods that return void aren't
5531 // added to the results as they can't be used as a getter.
5532 if (!M->getSelector().isUnarySelector() ||
5533 M->getReturnType()->isVoidType() || M->isInstanceMethod())
5534 continue;
5535 AddMethod(M);
5536 }
5537 } else {
5538 for (auto *M : Container->methods()) {
5539 if (M->getSelector().isUnarySelector())
5540 AddMethod(M);
5541 }
5542 }
5543 }
5544
5545 // Add properties in referenced protocols.
5546 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
5547 for (auto *P : Protocol->protocols())
5548 AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods,
5549 CurContext, AddedProperties, Results,
5550 IsBaseExprStatement, IsClassProperty,
5551 /*InOriginalClass*/ false);
5552 } else if (ObjCInterfaceDecl *IFace =
5553 dyn_cast<ObjCInterfaceDecl>(Container)) {
5554 if (AllowCategories) {
5555 // Look through categories.
5556 for (auto *Cat : IFace->known_categories())
5557 AddObjCProperties(CCContext, Cat, AllowCategories, AllowNullaryMethods,
5558 CurContext, AddedProperties, Results,
5559 IsBaseExprStatement, IsClassProperty,
5560 InOriginalClass);
5561 }
5562
5563 // Look through protocols.
5564 for (auto *I : IFace->all_referenced_protocols())
5565 AddObjCProperties(CCContext, I, AllowCategories, AllowNullaryMethods,
5566 CurContext, AddedProperties, Results,
5567 IsBaseExprStatement, IsClassProperty,
5568 /*InOriginalClass*/ false);
5569
5570 // Look in the superclass.
5571 if (IFace->getSuperClass())
5572 AddObjCProperties(CCContext, IFace->getSuperClass(), AllowCategories,
5573 AllowNullaryMethods, CurContext, AddedProperties,
5574 Results, IsBaseExprStatement, IsClassProperty,
5575 /*InOriginalClass*/ false);
5576 } else if (const auto *Category =
5577 dyn_cast<ObjCCategoryDecl>(Container)) {
5578 // Look through protocols.
5579 for (auto *P : Category->protocols())
5580 AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods,
5581 CurContext, AddedProperties, Results,
5582 IsBaseExprStatement, IsClassProperty,
5583 /*InOriginalClass*/ false);
5584 }
5585}
5586
5587static void
5588AddRecordMembersCompletionResults(Sema &SemaRef, ResultBuilder &Results,
5589 Scope *S, QualType BaseType,
5590 ExprValueKind BaseKind, RecordDecl *RD,
5591 std::optional<FixItHint> AccessOpFixIt) {
5592 // Indicate that we are performing a member access, and the cv-qualifiers
5593 // for the base object type.
5594 Results.setObjectTypeQualifiers(BaseType.getQualifiers(), BaseKind);
5595
5596 // Access to a C/C++ class, struct, or union.
5597 Results.allowNestedNameSpecifiers();
5598 std::vector<FixItHint> FixIts;
5599 if (AccessOpFixIt)
5600 FixIts.emplace_back(*AccessOpFixIt);
5601 CodeCompletionDeclConsumer Consumer(Results, RD, BaseType, std::move(FixIts));
5602 SemaRef.LookupVisibleDecls(
5603 RD, Sema::LookupMemberName, Consumer,
5605 /*IncludeDependentBases=*/true,
5607
5608 if (SemaRef.getLangOpts().CPlusPlus) {
5609 if (!Results.empty()) {
5610 // The "template" keyword can follow "->" or "." in the grammar.
5611 // However, we only want to suggest the template keyword if something
5612 // is dependent.
5613 bool IsDependent = BaseType->isDependentType();
5614 if (!IsDependent) {
5615 for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent())
5616 if (DeclContext *Ctx = DepScope->getEntity()) {
5617 IsDependent = Ctx->isDependentContext();
5618 break;
5619 }
5620 }
5621
5622 if (IsDependent)
5623 Results.AddResult(CodeCompletionResult("template"));
5624 }
5625 }
5626}
5627
5628// Returns the RecordDecl inside the BaseType, falling back to primary template
5629// in case of specializations. Since we might not have a decl for the
5630// instantiation/specialization yet, e.g. dependent code.
5632 HeuristicResolver &Resolver) {
5633 BaseType = Resolver.simplifyType(BaseType, nullptr, /*UnwrapPointer=*/false);
5634 return dyn_cast_if_present<RecordDecl>(
5635 Resolver.resolveTypeToTagDecl(BaseType));
5636}
5637
5638namespace {
5639// Collects completion-relevant information about a concept-constrainted type T.
5640// In particular, examines the constraint expressions to find members of T.
5641//
5642// The design is very simple: we walk down each constraint looking for
5643// expressions of the form T.foo().
5644// If we're extra lucky, the return type is specified.
5645// We don't do any clever handling of && or || in constraint expressions, we
5646// take members from both branches.
5647//
5648// For example, given:
5649// template <class T> concept X = requires (T t, string& s) { t.print(s); };
5650// template <X U> void foo(U u) { u.^ }
5651// We want to suggest the inferred member function 'print(string)'.
5652// We see that u has type U, so X<U> holds.
5653// X<U> requires t.print(s) to be valid, where t has type U (substituted for T).
5654// By looking at the CallExpr we find the signature of print().
5655//
5656// While we tend to know in advance which kind of members (access via . -> ::)
5657// we want, it's simpler just to gather them all and post-filter.
5658//
5659// FIXME: some of this machinery could be used for non-concept type-parms too,
5660// enabling completion for type parameters based on other uses of that param.
5661//
5662// FIXME: there are other cases where a type can be constrained by a concept,
5663// e.g. inside `if constexpr(ConceptSpecializationExpr) { ... }`
5664class ConceptInfo {
5665public:
5666 // Describes a likely member of a type, inferred by concept constraints.
5667 // Offered as a code completion for T. T-> and T:: contexts.
5668 struct Member {
5669 // Always non-null: we only handle members with ordinary identifier names.
5670 const IdentifierInfo *Name = nullptr;
5671 // Set for functions we've seen called.
5672 // We don't have the declared parameter types, only the actual types of
5673 // arguments we've seen. These are still valuable, as it's hard to render
5674 // a useful function completion with neither parameter types nor names!
5675 std::optional<SmallVector<QualType, 1>> ArgTypes;
5676 // Whether this is accessed as T.member, T->member, or T::member.
5677 enum AccessOperator {
5678 Colons,
5679 Arrow,
5680 Dot,
5681 } Operator = Dot;
5682 // What's known about the type of a variable or return type of a function.
5683 const TypeConstraint *ResultType = nullptr;
5684 // FIXME: also track:
5685 // - kind of entity (function/variable/type), to expose structured results
5686 // - template args kinds/types, as a proxy for template params
5687
5688 // For now we simply return these results as "pattern" strings.
5689 CodeCompletionString *render(Sema &S, CodeCompletionAllocator &Alloc,
5690 CodeCompletionTUInfo &Info) const {
5691 CodeCompletionBuilder B(Alloc, Info);
5692 // Result type
5693 if (ResultType) {
5694 std::string AsString;
5695 {
5696 llvm::raw_string_ostream OS(AsString);
5697 QualType ExactType = deduceType(*ResultType);
5698 if (!ExactType.isNull())
5699 ExactType.print(OS, getCompletionPrintingPolicy(S));
5700 else
5701 ResultType->print(OS, getCompletionPrintingPolicy(S));
5702 }
5703 B.AddResultTypeChunk(Alloc.CopyString(AsString));
5704 }
5705 // Member name
5706 B.AddTypedTextChunk(Alloc.CopyString(Name->getName()));
5707 // Function argument list
5708 if (ArgTypes) {
5710 bool First = true;
5711 for (QualType Arg : *ArgTypes) {
5712 if (First)
5713 First = false;
5714 else {
5717 }
5718 B.AddPlaceholderChunk(Alloc.CopyString(
5719 Arg.getAsString(getCompletionPrintingPolicy(S))));
5720 }
5722 }
5723 return B.TakeString();
5724 }
5725 };
5726
5727 // BaseType is the type parameter T to infer members from.
5728 // T must be accessible within S, as we use it to find the template entity
5729 // that T is attached to in order to gather the relevant constraints.
5730 ConceptInfo(const TemplateTypeParmType &BaseType, Scope *S) {
5731 auto *TemplatedEntity = getTemplatedEntity(BaseType.getDecl(), S);
5732 for (const AssociatedConstraint &AC :
5733 constraintsForTemplatedEntity(TemplatedEntity))
5734 believe(AC.ConstraintExpr, &BaseType);
5735 }
5736
5737 std::vector<Member> members() {
5738 std::vector<Member> Results;
5739 for (const auto &E : this->Results)
5740 Results.push_back(E.second);
5741 llvm::sort(Results, [](const Member &L, const Member &R) {
5742 return L.Name->getName() < R.Name->getName();
5743 });
5744 return Results;
5745 }
5746
5747private:
5748 // Infer members of T, given that the expression E (dependent on T) is true.
5749 void believe(const Expr *E, const TemplateTypeParmType *T) {
5750 if (!E || !T)
5751 return;
5752 if (auto *CSE = dyn_cast<ConceptSpecializationExpr>(E)) {
5753 // If the concept is
5754 // template <class A, class B> concept CD = f<A, B>();
5755 // And the concept specialization is
5756 // CD<int, T>
5757 // Then we're substituting T for B, so we want to make f<A, B>() true
5758 // by adding members to B - i.e. believe(f<A, B>(), B);
5759 //
5760 // For simplicity:
5761 // - we don't attempt to substitute int for A
5762 // - when T is used in other ways (like CD<T*>) we ignore it
5763 ConceptDecl *CD = CSE->getConceptDecl();
5764 TemplateParameterList *Params = CD->getTemplateParameters();
5765 unsigned Index = 0;
5766 for (const auto &Arg : CSE->getTemplateArguments()) {
5767 if (Index >= Params->size())
5768 break; // Won't happen in valid code.
5769 if (isApprox(Arg, T)) {
5770 auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Params->getParam(Index));
5771 if (!TTPD)
5772 continue;
5773 // T was used as an argument, and bound to the parameter TT.
5774 auto *TT = cast<TemplateTypeParmType>(TTPD->getTypeForDecl());
5775 // So now we know the constraint as a function of TT is true.
5776 believe(CD->getConstraintExpr(), TT);
5777 // (concepts themselves have no associated constraints to require)
5778 }
5779
5780 ++Index;
5781 }
5782 } else if (auto *BO = dyn_cast<BinaryOperator>(E)) {
5783 // For A && B, we can infer members from both branches.
5784 // For A || B, the union is still more useful than the intersection.
5785 if (BO->getOpcode() == BO_LAnd || BO->getOpcode() == BO_LOr) {
5786 believe(BO->getLHS(), T);
5787 believe(BO->getRHS(), T);
5788 }
5789 } else if (auto *RE = dyn_cast<RequiresExpr>(E)) {
5790 // A requires(){...} lets us infer members from each requirement.
5791 for (const concepts::Requirement *Req : RE->getRequirements()) {
5792 if (!Req->isDependent())
5793 continue; // Can't tell us anything about T.
5794 // Now Req cannot a substitution-error: those aren't dependent.
5795
5796 if (auto *TR = dyn_cast<concepts::TypeRequirement>(Req)) {
5797 // Do a full traversal so we get `foo` from `typename T::foo::bar`.
5798 QualType AssertedType = TR->getType()->getType();
5799 ValidVisitor(this, T).TraverseType(AssertedType);
5800 } else if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
5801 ValidVisitor Visitor(this, T);
5802 // If we have a type constraint on the value of the expression,
5803 // AND the whole outer expression describes a member, then we'll
5804 // be able to use the constraint to provide the return type.
5805 if (ER->getReturnTypeRequirement().isTypeConstraint()) {
5806 Visitor.OuterType =
5807 ER->getReturnTypeRequirement().getTypeConstraint();
5808 Visitor.OuterExpr = ER->getExpr();
5809 }
5810 Visitor.TraverseStmt(ER->getExpr());
5811 } else if (auto *NR = dyn_cast<concepts::NestedRequirement>(Req)) {
5812 believe(NR->getConstraintExpr(), T);
5813 }
5814 }
5815 }
5816 }
5817
5818 // This visitor infers members of T based on traversing expressions/types
5819 // that involve T. It is invoked with code known to be valid for T.
5820 class ValidVisitor : public DynamicRecursiveASTVisitor {
5821 ConceptInfo *Outer;
5822 const TemplateTypeParmType *T;
5823
5824 CallExpr *Caller = nullptr;
5825 Expr *Callee = nullptr;
5826
5827 public:
5828 // If set, OuterExpr is constrained by OuterType.
5829 Expr *OuterExpr = nullptr;
5830 const TypeConstraint *OuterType = nullptr;
5831
5832 ValidVisitor(ConceptInfo *Outer, const TemplateTypeParmType *T)
5833 : Outer(Outer), T(T) {
5834 assert(T);
5835 }
5836
5837 // In T.foo or T->foo, `foo` is a member function/variable.
5838 bool
5839 VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) override {
5840 const Type *Base = E->getBaseType().getTypePtr();
5841 bool IsArrow = E->isArrow();
5842 if (Base->isPointerType() && IsArrow) {
5843 IsArrow = false;
5844 Base = Base->getPointeeType().getTypePtr();
5845 }
5846 if (isApprox(Base, T))
5847 addValue(E, E->getMember(), IsArrow ? Member::Arrow : Member::Dot);
5848 return true;
5849 }
5850
5851 // In T::foo, `foo` is a static member function/variable.
5852 bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) override {
5853 NestedNameSpecifier Qualifier = E->getQualifier();
5854 if (Qualifier.getKind() == NestedNameSpecifier::Kind::Type &&
5855 isApprox(Qualifier.getAsType(), T))
5856 addValue(E, E->getDeclName(), Member::Colons);
5857 return true;
5858 }
5859
5860 // In T::typename foo, `foo` is a type.
5861 bool VisitDependentNameType(DependentNameType *DNT) override {
5862 NestedNameSpecifier Q = DNT->getQualifier();
5863 if (Q.getKind() == NestedNameSpecifier::Kind::Type &&
5864 isApprox(Q.getAsType(), T))
5865 addType(DNT->getIdentifier());
5866 return true;
5867 }
5868
5869 // In T::foo::bar, `foo` must be a type.
5870 // VisitNNS() doesn't exist, and TraverseNNS isn't always called :-(
5871 bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNSL) override {
5872 if (NNSL) {
5873 NestedNameSpecifier NNS = NNSL.getNestedNameSpecifier();
5874 if (NNS.getKind() == NestedNameSpecifier::Kind::Type) {
5875 const Type *NNST = NNS.getAsType();
5876 if (NestedNameSpecifier Q = NNST->getPrefix();
5877 Q.getKind() == NestedNameSpecifier::Kind::Type &&
5878 isApprox(Q.getAsType(), T))
5879 if (const auto *DNT = dyn_cast_or_null<DependentNameType>(NNST))
5880 addType(DNT->getIdentifier());
5881 }
5882 }
5883 // FIXME: also handle T::foo<X>::bar
5885 }
5886
5887 // FIXME also handle T::foo<X>
5888
5889 // Track the innermost caller/callee relationship so we can tell if a
5890 // nested expr is being called as a function.
5891 bool VisitCallExpr(CallExpr *CE) override {
5892 Caller = CE;
5893 Callee = CE->getCallee();
5894 return true;
5895 }
5896
5897 private:
5898 void addResult(Member &&M) {
5899 auto R = Outer->Results.try_emplace(M.Name);
5900 Member &O = R.first->second;
5901 // Overwrite existing if the new member has more info.
5902 // The preference of . vs :: vs -> is fairly arbitrary.
5903 if (/*Inserted*/ R.second ||
5904 std::make_tuple(M.ArgTypes.has_value(), M.ResultType != nullptr,
5905 M.Operator) > std::make_tuple(O.ArgTypes.has_value(),
5906 O.ResultType != nullptr,
5907 O.Operator))
5908 O = std::move(M);
5909 }
5910
5911 void addType(const IdentifierInfo *Name) {
5912 if (!Name)
5913 return;
5914 Member M;
5915 M.Name = Name;
5916 M.Operator = Member::Colons;
5917 addResult(std::move(M));
5918 }
5919
5920 void addValue(Expr *E, DeclarationName Name,
5921 Member::AccessOperator Operator) {
5922 if (!Name.isIdentifier())
5923 return;
5924 Member Result;
5925 Result.Name = Name.getAsIdentifierInfo();
5926 Result.Operator = Operator;
5927 // If this is the callee of an immediately-enclosing CallExpr, then
5928 // treat it as a method, otherwise it's a variable.
5929 if (Caller != nullptr && Callee == E) {
5930 Result.ArgTypes.emplace();
5931 for (const auto *Arg : Caller->arguments())
5932 Result.ArgTypes->push_back(Arg->getType());
5933 if (Caller == OuterExpr) {
5934 Result.ResultType = OuterType;
5935 }
5936 } else {
5937 if (E == OuterExpr)
5938 Result.ResultType = OuterType;
5939 }
5940 addResult(std::move(Result));
5941 }
5942 };
5943
5944 static bool isApprox(const TemplateArgument &Arg, const Type *T) {
5945 return Arg.getKind() == TemplateArgument::Type &&
5946 isApprox(Arg.getAsType().getTypePtr(), T);
5947 }
5948
5949 static bool isApprox(const Type *T1, const Type *T2) {
5950 return T1 && T2 &&
5953 }
5954
5955 // Returns the DeclContext immediately enclosed by the template parameter
5956 // scope. For primary templates, this is the templated (e.g.) CXXRecordDecl.
5957 // For specializations, this is e.g. ClassTemplatePartialSpecializationDecl.
5958 static DeclContext *getTemplatedEntity(const TemplateTypeParmDecl *D,
5959 Scope *S) {
5960 if (D == nullptr)
5961 return nullptr;
5962 Scope *Inner = nullptr;
5963 while (S) {
5964 if (S->isTemplateParamScope() && S->isDeclScope(D))
5965 return Inner ? Inner->getEntity() : nullptr;
5966 Inner = S;
5967 S = S->getParent();
5968 }
5969 return nullptr;
5970 }
5971
5972 // Gets all the type constraint expressions that might apply to the type
5973 // variables associated with DC (as returned by getTemplatedEntity()).
5974 static SmallVector<AssociatedConstraint, 1>
5975 constraintsForTemplatedEntity(DeclContext *DC) {
5976 SmallVector<AssociatedConstraint, 1> Result;
5977 if (DC == nullptr)
5978 return Result;
5979 // Primary templates can have constraints.
5980 if (const auto *TD = cast<Decl>(DC)->getDescribedTemplate())
5981 TD->getAssociatedConstraints(Result);
5982 // Partial specializations may have constraints.
5983 if (const auto *CTPSD =
5984 dyn_cast<ClassTemplatePartialSpecializationDecl>(DC))
5985 CTPSD->getAssociatedConstraints(Result);
5986 if (const auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(DC))
5987 VTPSD->getAssociatedConstraints(Result);
5988 return Result;
5989 }
5990
5991 // Attempt to find the unique type satisfying a constraint.
5992 // This lets us show e.g. `int` instead of `std::same_as<int>`.
5993 static QualType deduceType(const TypeConstraint &T) {
5994 // Assume a same_as<T> return type constraint is std::same_as or equivalent.
5995 // In this case the return type is T.
5996 DeclarationName DN =
5997 T.getConceptReference()->getConceptNameInfo().getName();
5998 if (DN.isIdentifier() && DN.getAsIdentifierInfo()->isStr("same_as"))
5999 if (const auto *Args = T.getTemplateArgsAsWritten())
6000 if (Args->getNumTemplateArgs() == 1) {
6001 const auto &Arg = Args->arguments().front().getArgument();
6002 if (Arg.getKind() == TemplateArgument::Type)
6003 return Arg.getAsType();
6004 }
6005 return {};
6006 }
6007
6008 llvm::DenseMap<const IdentifierInfo *, Member> Results;
6009};
6010
6011// Returns a type for E that yields acceptable member completions.
6012// In particular, when E->getType() is DependentTy, try to guess a likely type.
6013// We accept some lossiness (like dropping parameters).
6014// We only try to handle common expressions on the LHS of MemberExpr.
6015QualType getApproximateType(const Expr *E, HeuristicResolver &Resolver) {
6016 QualType Result = Resolver.resolveExprToType(E);
6017 if (Result.isNull())
6018 return Result;
6019 Result = Resolver.simplifyType(Result.getNonReferenceType(), E, false);
6020 if (Result.isNull())
6021 return Result;
6022 return Result.getNonReferenceType();
6023}
6024
6025// If \p Base is ParenListExpr, assume a chain of comma operators and pick the
6026// last expr. We expect other ParenListExprs to be resolved to e.g. constructor
6027// calls before here. (So the ParenListExpr should be nonempty, but check just
6028// in case)
6029Expr *unwrapParenList(Expr *Base) {
6030 if (auto *PLE = llvm::dyn_cast_or_null<ParenListExpr>(Base)) {
6031 if (PLE->getNumExprs() == 0)
6032 return nullptr;
6033 Base = PLE->getExpr(PLE->getNumExprs() - 1);
6034 }
6035 return Base;
6036}
6037
6038} // namespace
6039
6041 Scope *S, Expr *Base, Expr *OtherOpBase, SourceLocation OpLoc, bool IsArrow,
6042 bool IsBaseExprStatement, QualType PreferredType) {
6043 Base = unwrapParenList(Base);
6044 OtherOpBase = unwrapParenList(OtherOpBase);
6045 if (!Base || !CodeCompleter)
6046 return;
6047
6048 ExprResult ConvertedBase =
6049 SemaRef.PerformMemberExprBaseConversion(Base, IsArrow);
6050 if (ConvertedBase.isInvalid())
6051 return;
6052 QualType ConvertedBaseType =
6053 getApproximateType(ConvertedBase.get(), Resolver);
6054
6055 enum CodeCompletionContext::Kind contextKind;
6056
6057 if (IsArrow) {
6058 if (QualType PointeeType = Resolver.getPointeeType(ConvertedBaseType);
6059 !PointeeType.isNull()) {
6060 ConvertedBaseType = PointeeType;
6061 }
6062 }
6063
6064 if (IsArrow) {
6066 } else {
6067 if (ConvertedBaseType->isObjCObjectPointerType() ||
6068 ConvertedBaseType->isObjCObjectOrInterfaceType()) {
6070 } else {
6072 }
6073 }
6074
6075 CodeCompletionContext CCContext(contextKind, ConvertedBaseType);
6076 CCContext.setPreferredType(PreferredType);
6077 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6078 CodeCompleter->getCodeCompletionTUInfo(), CCContext,
6079 &ResultBuilder::IsMember);
6080
6081 auto DoCompletion = [&](Expr *Base, bool IsArrow,
6082 std::optional<FixItHint> AccessOpFixIt) -> bool {
6083 if (!Base)
6084 return false;
6085
6086 ExprResult ConvertedBase =
6087 SemaRef.PerformMemberExprBaseConversion(Base, IsArrow);
6088 if (ConvertedBase.isInvalid())
6089 return false;
6090 Base = ConvertedBase.get();
6091
6092 QualType BaseType = getApproximateType(Base, Resolver);
6093 if (BaseType.isNull())
6094 return false;
6095 ExprValueKind BaseKind = Base->getValueKind();
6096
6097 if (IsArrow) {
6098 if (QualType PointeeType = Resolver.getPointeeType(BaseType);
6099 !PointeeType.isNull()) {
6100 BaseType = PointeeType;
6101 BaseKind = VK_LValue;
6102 } else if (BaseType->isObjCObjectPointerType() ||
6103 BaseType->isTemplateTypeParmType()) {
6104 // Both cases (dot/arrow) handled below.
6105 } else {
6106 return false;
6107 }
6108 }
6109
6110 if (RecordDecl *RD = getAsRecordDecl(BaseType, Resolver)) {
6111 AddRecordMembersCompletionResults(SemaRef, Results, S, BaseType, BaseKind,
6112 RD, std::move(AccessOpFixIt));
6113 } else if (const auto *TTPT =
6114 dyn_cast<TemplateTypeParmType>(BaseType.getTypePtr())) {
6115 auto Operator =
6116 IsArrow ? ConceptInfo::Member::Arrow : ConceptInfo::Member::Dot;
6117 for (const auto &R : ConceptInfo(*TTPT, S).members()) {
6118 if (R.Operator != Operator)
6119 continue;
6121 R.render(SemaRef, CodeCompleter->getAllocator(),
6122 CodeCompleter->getCodeCompletionTUInfo()));
6123 if (AccessOpFixIt)
6124 Result.FixIts.push_back(*AccessOpFixIt);
6125 Results.AddResult(std::move(Result));
6126 }
6127 } else if (!IsArrow && BaseType->isObjCObjectPointerType()) {
6128 // Objective-C property reference. Bail if we're performing fix-it code
6129 // completion since Objective-C properties are normally backed by ivars,
6130 // most Objective-C fix-its here would have little value.
6131 if (AccessOpFixIt) {
6132 return false;
6133 }
6134 AddedPropertiesSet AddedProperties;
6135
6136 if (const ObjCObjectPointerType *ObjCPtr =
6137 BaseType->getAsObjCInterfacePointerType()) {
6138 // Add property results based on our interface.
6139 assert(ObjCPtr && "Non-NULL pointer guaranteed above!");
6140 AddObjCProperties(CCContext, ObjCPtr->getInterfaceDecl(), true,
6141 /*AllowNullaryMethods=*/true, SemaRef.CurContext,
6142 AddedProperties, Results, IsBaseExprStatement);
6143 }
6144
6145 // Add properties from the protocols in a qualified interface.
6146 for (auto *I : BaseType->castAs<ObjCObjectPointerType>()->quals())
6147 AddObjCProperties(CCContext, I, true, /*AllowNullaryMethods=*/true,
6148 SemaRef.CurContext, AddedProperties, Results,
6149 IsBaseExprStatement, /*IsClassProperty*/ false,
6150 /*InOriginalClass*/ false);
6151 } else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
6152 (!IsArrow && BaseType->isObjCObjectType())) {
6153 // Objective-C instance variable access. Bail if we're performing fix-it
6154 // code completion since Objective-C properties are normally backed by
6155 // ivars, most Objective-C fix-its here would have little value.
6156 if (AccessOpFixIt) {
6157 return false;
6158 }
6159 ObjCInterfaceDecl *Class = nullptr;
6160 if (const ObjCObjectPointerType *ObjCPtr =
6161 BaseType->getAs<ObjCObjectPointerType>())
6162 Class = ObjCPtr->getInterfaceDecl();
6163 else
6164 Class = BaseType->castAs<ObjCObjectType>()->getInterface();
6165
6166 // Add all ivars from this class and its superclasses.
6167 if (Class) {
6168 CodeCompletionDeclConsumer Consumer(Results, Class, BaseType);
6169 Results.setFilter(&ResultBuilder::IsObjCIvar);
6170 SemaRef.LookupVisibleDecls(Class, Sema::LookupMemberName, Consumer,
6171 CodeCompleter->includeGlobals(),
6172 /*IncludeDependentBases=*/false,
6173 CodeCompleter->loadExternal());
6174 }
6175 }
6176
6177 // FIXME: How do we cope with isa?
6178 return true;
6179 };
6180
6181 Results.EnterNewScope();
6182
6183 bool CompletionSucceded = DoCompletion(Base, IsArrow, std::nullopt);
6184 if (CodeCompleter->includeFixIts()) {
6185 const CharSourceRange OpRange =
6186 CharSourceRange::getTokenRange(OpLoc, OpLoc);
6187 CompletionSucceded |= DoCompletion(
6188 OtherOpBase, !IsArrow,
6189 FixItHint::CreateReplacement(OpRange, IsArrow ? "." : "->"));
6190 }
6191
6192 Results.ExitScope();
6193
6194 if (!CompletionSucceded)
6195 return;
6196
6197 // Hand off the results found for code completion.
6199 Results.getCompletionContext(), Results.data(),
6200 Results.size());
6201}
6202
6204 Scope *S, const IdentifierInfo &ClassName, SourceLocation ClassNameLoc,
6205 bool IsBaseExprStatement) {
6206 const IdentifierInfo *ClassNamePtr = &ClassName;
6207 ObjCInterfaceDecl *IFace =
6208 SemaRef.ObjC().getObjCInterfaceDecl(ClassNamePtr, ClassNameLoc);
6209 if (!IFace)
6210 return;
6211 CodeCompletionContext CCContext(
6213 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6214 CodeCompleter->getCodeCompletionTUInfo(), CCContext,
6215 &ResultBuilder::IsMember);
6216 Results.EnterNewScope();
6217 AddedPropertiesSet AddedProperties;
6218 AddObjCProperties(CCContext, IFace, true,
6219 /*AllowNullaryMethods=*/true, SemaRef.CurContext,
6220 AddedProperties, Results, IsBaseExprStatement,
6221 /*IsClassProperty=*/true);
6222 Results.ExitScope();
6224 Results.getCompletionContext(), Results.data(),
6225 Results.size());
6226}
6227
6228void SemaCodeCompletion::CodeCompleteTag(Scope *S, unsigned TagSpec) {
6229 if (!CodeCompleter)
6230 return;
6231
6232 ResultBuilder::LookupFilter Filter = nullptr;
6233 enum CodeCompletionContext::Kind ContextKind =
6235 switch ((DeclSpec::TST)TagSpec) {
6236 case DeclSpec::TST_enum:
6237 Filter = &ResultBuilder::IsEnum;
6239 break;
6240
6242 Filter = &ResultBuilder::IsUnion;
6244 break;
6245
6249 Filter = &ResultBuilder::IsClassOrStruct;
6251 break;
6252
6253 default:
6254 llvm_unreachable("Unknown type specifier kind in CodeCompleteTag");
6255 }
6256
6257 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6258 CodeCompleter->getCodeCompletionTUInfo(), ContextKind);
6259 CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
6260
6261 // First pass: look for tags.
6262 Results.setFilter(Filter);
6263 SemaRef.LookupVisibleDecls(S, Sema::LookupTagName, Consumer,
6264 CodeCompleter->includeGlobals(),
6265 CodeCompleter->loadExternal());
6266
6267 if (CodeCompleter->includeGlobals()) {
6268 // Second pass: look for nested name specifiers.
6269 Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
6270 SemaRef.LookupVisibleDecls(S, Sema::LookupNestedNameSpecifierName, Consumer,
6271 CodeCompleter->includeGlobals(),
6272 CodeCompleter->loadExternal());
6273 }
6274
6276 Results.getCompletionContext(), Results.data(),
6277 Results.size());
6278}
6279
6280static void AddTypeQualifierResults(DeclSpec &DS, ResultBuilder &Results,
6281 const LangOptions &LangOpts) {
6283 Results.AddResult("const");
6285 Results.AddResult("volatile");
6286 if (LangOpts.C99 && !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict))
6287 Results.AddResult("restrict");
6288 if (LangOpts.C11 && !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic))
6289 Results.AddResult("_Atomic");
6290 if (LangOpts.MSVCCompat && !(DS.getTypeQualifiers() & DeclSpec::TQ_unaligned))
6291 Results.AddResult("__unaligned");
6292}
6293
6295 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6296 CodeCompleter->getCodeCompletionTUInfo(),
6298 Results.EnterNewScope();
6299 AddTypeQualifierResults(DS, Results, getLangOpts());
6300 Results.ExitScope();
6302 Results.getCompletionContext(), Results.data(),
6303 Results.size());
6304}
6305
6307 DeclSpec &DS, Declarator &D, const VirtSpecifiers *VS) {
6308 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6309 CodeCompleter->getCodeCompletionTUInfo(),
6311 Results.EnterNewScope();
6312 AddTypeQualifierResults(DS, Results, getLangOpts());
6313 if (getLangOpts().CPlusPlus11) {
6314 Results.AddResult("noexcept");
6316 !D.isStaticMember()) {
6317 if (!VS || !VS->isFinalSpecified())
6318 Results.AddResult("final");
6319 if (!VS || !VS->isOverrideSpecified())
6320 Results.AddResult("override");
6321 }
6322 }
6323 Results.ExitScope();
6325 Results.getCompletionContext(), Results.data(),
6326 Results.size());
6327}
6328
6332
6334 if (SemaRef.getCurFunction()->SwitchStack.empty() || !CodeCompleter)
6335 return;
6336
6338 SemaRef.getCurFunction()->SwitchStack.back().getPointer();
6339 // Condition expression might be invalid, do not continue in this case.
6340 if (!Switch->getCond())
6341 return;
6342 QualType type = Switch->getCond()->IgnoreImplicit()->getType();
6343 EnumDecl *Enum = type->getAsEnumDecl();
6344 if (!Enum) {
6346 Data.IntegralConstantExpression = true;
6348 return;
6349 }
6350
6351 // Determine which enumerators we have already seen in the switch statement.
6352 // FIXME: Ideally, we would also be able to look *past* the code-completion
6353 // token, in case we are code-completing in the middle of the switch and not
6354 // at the end. However, we aren't able to do so at the moment.
6355 CoveredEnumerators Enumerators;
6356 for (SwitchCase *SC = Switch->getSwitchCaseList(); SC;
6357 SC = SC->getNextSwitchCase()) {
6358 CaseStmt *Case = dyn_cast<CaseStmt>(SC);
6359 if (!Case)
6360 continue;
6361
6362 Expr *CaseVal = Case->getLHS()->IgnoreParenCasts();
6363 if (auto *DRE = dyn_cast<DeclRefExpr>(CaseVal))
6364 if (auto *Enumerator =
6365 dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
6366 // We look into the AST of the case statement to determine which
6367 // enumerator was named. Alternatively, we could compute the value of
6368 // the integral constant expression, then compare it against the
6369 // values of each enumerator. However, value-based approach would not
6370 // work as well with C++ templates where enumerators declared within a
6371 // template are type- and value-dependent.
6372 Enumerators.Seen.insert(Enumerator);
6373
6374 // If this is a qualified-id, keep track of the nested-name-specifier
6375 // so that we can reproduce it as part of code completion, e.g.,
6376 //
6377 // switch (TagD.getKind()) {
6378 // case TagDecl::TK_enum:
6379 // break;
6380 // case XXX
6381 //
6382 // At the XXX, our completions are TagDecl::TK_union,
6383 // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union,
6384 // TK_struct, and TK_class.
6385 Enumerators.SuggestedQualifier = DRE->getQualifier();
6386 }
6387 }
6388
6389 // Add any enumerators that have not yet been mentioned.
6390 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6391 CodeCompleter->getCodeCompletionTUInfo(),
6393 AddEnumerators(Results, getASTContext(), Enum, SemaRef.CurContext,
6394 Enumerators);
6395
6396 if (CodeCompleter->includeMacros()) {
6397 AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false);
6398 }
6400 Results.getCompletionContext(), Results.data(),
6401 Results.size());
6402}
6403
6405 if (Args.size() && !Args.data())
6406 return true;
6407
6408 for (unsigned I = 0; I != Args.size(); ++I)
6409 if (!Args[I])
6410 return true;
6411
6412 return false;
6413}
6414
6416
6418 Sema &SemaRef, SmallVectorImpl<ResultCandidate> &Results,
6419 OverloadCandidateSet &CandidateSet, SourceLocation Loc, size_t ArgSize) {
6420 // Sort the overload candidate set by placing the best overloads first.
6421 llvm::stable_sort(CandidateSet, [&](const OverloadCandidate &X,
6422 const OverloadCandidate &Y) {
6423 return isBetterOverloadCandidate(SemaRef, X, Y, Loc, CandidateSet.getKind(),
6424 /*PartialOverloading=*/true);
6425 });
6426
6427 // Add the remaining viable overload candidates as code-completion results.
6428 for (OverloadCandidate &Candidate : CandidateSet) {
6429 if (Candidate.Function) {
6430 if (Candidate.Function->isDeleted())
6431 continue;
6432 if (shouldEnforceArgLimit(/*PartialOverloading=*/true,
6433 Candidate.Function) &&
6434 Candidate.Function->getNumParams() <= ArgSize &&
6435 // Having zero args is annoying, normally we don't surface a function
6436 // with 2 params, if you already have 2 params, because you are
6437 // inserting the 3rd now. But with zero, it helps the user to figure
6438 // out there are no overloads that take any arguments. Hence we are
6439 // keeping the overload.
6440 ArgSize > 0)
6441 continue;
6442 }
6443 if (Candidate.Viable)
6444 Results.push_back(ResultCandidate(Candidate.Function));
6445 }
6446}
6447
6448/// Get the type of the Nth parameter from a given set of overload
6449/// candidates.
6451 ArrayRef<ResultCandidate> Candidates, unsigned N) {
6452
6453 // Given the overloads 'Candidates' for a function call matching all arguments
6454 // up to N, return the type of the Nth parameter if it is the same for all
6455 // overload candidates.
6456 QualType ParamType;
6457 for (auto &Candidate : Candidates) {
6458 QualType CandidateParamType = Candidate.getParamType(N);
6459 if (CandidateParamType.isNull())
6460 continue;
6461 if (ParamType.isNull()) {
6462 ParamType = CandidateParamType;
6463 continue;
6464 }
6465 if (!SemaRef.Context.hasSameUnqualifiedType(
6466 ParamType.getNonReferenceType(),
6467 CandidateParamType.getNonReferenceType()))
6468 // Two conflicting types, give up.
6469 return QualType();
6470 }
6471
6472 return ParamType;
6473}
6474
6475static QualType
6477 unsigned CurrentArg, SourceLocation OpenParLoc,
6478 bool Braced) {
6479 if (Candidates.empty())
6480 return QualType();
6483 SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc,
6484 Braced);
6485 return getParamType(SemaRef, Candidates, CurrentArg);
6486}
6487
6488QualType
6490 SourceLocation OpenParLoc) {
6491 Fn = unwrapParenList(Fn);
6492 if (!CodeCompleter || !Fn)
6493 return QualType();
6494
6495 // FIXME: Provide support for variadic template functions.
6496 // Ignore type-dependent call expressions entirely.
6497 if (Fn->isTypeDependent() || anyNullArguments(Args))
6498 return QualType();
6499 // In presence of dependent args we surface all possible signatures using the
6500 // non-dependent args in the prefix. Afterwards we do a post filtering to make
6501 // sure provided candidates satisfy parameter count restrictions.
6502 auto ArgsWithoutDependentTypes =
6503 Args.take_while([](Expr *Arg) { return !Arg->isTypeDependent(); });
6504
6506
6507 Expr *NakedFn = Fn->IgnoreParenCasts();
6508 // Build an overload candidate set based on the functions we find.
6509 SourceLocation Loc = Fn->getExprLoc();
6510 OverloadCandidateSet CandidateSet(Loc,
6512
6513 if (auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) {
6514 SemaRef.AddOverloadedCallCandidates(ULE, ArgsWithoutDependentTypes,
6515 CandidateSet,
6516 /*PartialOverloading=*/true);
6517 } else if (auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) {
6518 TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr;
6519 if (UME->hasExplicitTemplateArgs()) {
6520 UME->copyTemplateArgumentsInto(TemplateArgsBuffer);
6521 TemplateArgs = &TemplateArgsBuffer;
6522 }
6523
6524 // Add the base as first argument (use a nullptr if the base is implicit).
6525 SmallVector<Expr *, 12> ArgExprs(
6526 1, UME->isImplicitAccess() ? nullptr : UME->getBase());
6527 ArgExprs.append(ArgsWithoutDependentTypes.begin(),
6528 ArgsWithoutDependentTypes.end());
6529 UnresolvedSet<8> Decls;
6530 Decls.append(UME->decls_begin(), UME->decls_end());
6531 const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase();
6532 SemaRef.AddFunctionCandidates(Decls, ArgExprs, CandidateSet, TemplateArgs,
6533 /*SuppressUserConversions=*/false,
6534 /*PartialOverloading=*/true,
6535 FirstArgumentIsBase);
6536 } else {
6537 FunctionDecl *FD = nullptr;
6538 if (auto *MCE = dyn_cast<MemberExpr>(NakedFn))
6539 FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl());
6540 else if (auto *DRE = dyn_cast<DeclRefExpr>(NakedFn))
6541 FD = dyn_cast<FunctionDecl>(DRE->getDecl());
6542 if (FD) { // We check whether it's a resolved function declaration.
6543 if (!getLangOpts().CPlusPlus ||
6544 !FD->getType()->getAs<FunctionProtoType>())
6545 Results.push_back(ResultCandidate(FD));
6546 else
6547 SemaRef.AddOverloadCandidate(FD,
6549 ArgsWithoutDependentTypes, CandidateSet,
6550 /*SuppressUserConversions=*/false,
6551 /*PartialOverloading=*/true);
6552
6553 } else if (auto DC = NakedFn->getType()->getAsCXXRecordDecl()) {
6554 // If expression's type is CXXRecordDecl, it may overload the function
6555 // call operator, so we check if it does and add them as candidates.
6556 // A complete type is needed to lookup for member function call operators.
6557 if (SemaRef.isCompleteType(Loc, NakedFn->getType())) {
6558 DeclarationName OpName =
6559 getASTContext().DeclarationNames.getCXXOperatorName(OO_Call);
6561 SemaRef.LookupQualifiedName(R, DC);
6562 R.suppressDiagnostics();
6563 SmallVector<Expr *, 12> ArgExprs(1, NakedFn);
6564 ArgExprs.append(ArgsWithoutDependentTypes.begin(),
6565 ArgsWithoutDependentTypes.end());
6566 SemaRef.AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs,
6567 CandidateSet,
6568 /*ExplicitArgs=*/nullptr,
6569 /*SuppressUserConversions=*/false,
6570 /*PartialOverloading=*/true,
6571 /*FirstArgumentIsBase=*/true);
6572 }
6573 } else {
6574 // Lastly we check whether expression's type is function pointer or
6575 // function.
6576
6577 FunctionProtoTypeLoc P = Resolver.getFunctionProtoTypeLoc(NakedFn);
6578 QualType T = NakedFn->getType();
6579 if (!T->getPointeeType().isNull())
6580 T = T->getPointeeType();
6581
6582 if (auto FP = T->getAs<FunctionProtoType>()) {
6583 if (!SemaRef.TooManyArguments(FP->getNumParams(),
6584 ArgsWithoutDependentTypes.size(),
6585 /*PartialOverloading=*/true) ||
6586 FP->isVariadic()) {
6587 if (P) {
6588 Results.push_back(ResultCandidate(P));
6589 } else {
6590 Results.push_back(ResultCandidate(FP));
6591 }
6592 }
6593 } else if (auto FT = T->getAs<FunctionType>())
6594 // No prototype and declaration, it may be a K & R style function.
6595 Results.push_back(ResultCandidate(FT));
6596 }
6597 }
6598 mergeCandidatesWithResults(SemaRef, Results, CandidateSet, Loc, Args.size());
6599 QualType ParamType = ProduceSignatureHelp(SemaRef, Results, Args.size(),
6600 OpenParLoc, /*Braced=*/false);
6601 return !CandidateSet.empty() ? ParamType : QualType();
6602}
6603
6604// Determine which param to continue aggregate initialization from after
6605// a designated initializer.
6606//
6607// Given struct S { int a,b,c,d,e; }:
6608// after `S{.b=1,` we want to suggest c to continue
6609// after `S{.b=1, 2,` we continue with d (this is legal C and ext in C++)
6610// after `S{.b=1, .a=2,` we continue with b (this is legal C and ext in C++)
6611//
6612// Possible outcomes:
6613// - we saw a designator for a field, and continue from the returned index.
6614// Only aggregate initialization is allowed.
6615// - we saw a designator, but it was complex or we couldn't find the field.
6616// Only aggregate initialization is possible, but we can't assist with it.
6617// Returns an out-of-range index.
6618// - we saw no designators, just positional arguments.
6619// Returns std::nullopt.
6620static std::optional<unsigned>
6622 ArrayRef<Expr *> Args) {
6623 static constexpr unsigned Invalid = std::numeric_limits<unsigned>::max();
6624 assert(Aggregate.getKind() == ResultCandidate::CK_Aggregate);
6625
6626 // Look for designated initializers.
6627 // They're in their syntactic form, not yet resolved to fields.
6628 const IdentifierInfo *DesignatedFieldName = nullptr;
6629 unsigned ArgsAfterDesignator = 0;
6630 for (const Expr *Arg : Args) {
6631 if (const auto *DIE = dyn_cast<DesignatedInitExpr>(Arg)) {
6632 if (DIE->size() == 1 && DIE->getDesignator(0)->isFieldDesignator()) {
6633 DesignatedFieldName = DIE->getDesignator(0)->getFieldName();
6634 ArgsAfterDesignator = 0;
6635 } else {
6636 return Invalid; // Complicated designator.
6637 }
6638 } else if (isa<DesignatedInitUpdateExpr>(Arg)) {
6639 return Invalid; // Unsupported.
6640 } else {
6641 ++ArgsAfterDesignator;
6642 }
6643 }
6644 if (!DesignatedFieldName)
6645 return std::nullopt;
6646
6647 // Find the index within the class's fields.
6648 // (Probing getParamDecl() directly would be quadratic in number of fields).
6649 unsigned DesignatedIndex = 0;
6650 const FieldDecl *DesignatedField = nullptr;
6651 for (const auto *Field : Aggregate.getAggregate()->fields()) {
6652 if (Field->getIdentifier() == DesignatedFieldName) {
6653 DesignatedField = Field;
6654 break;
6655 }
6656 ++DesignatedIndex;
6657 }
6658 if (!DesignatedField)
6659 return Invalid; // Designator referred to a missing field, give up.
6660
6661 // Find the index within the aggregate (which may have leading bases).
6662 unsigned AggregateSize = Aggregate.getNumParams();
6663 while (DesignatedIndex < AggregateSize &&
6664 Aggregate.getParamDecl(DesignatedIndex) != DesignatedField)
6665 ++DesignatedIndex;
6666
6667 // Continue from the index after the last named field.
6668 return DesignatedIndex + ArgsAfterDesignator + 1;
6669}
6670
6673 SourceLocation OpenParLoc, bool Braced) {
6674 if (!CodeCompleter)
6675 return QualType();
6677
6678 // A complete type is needed to lookup for constructors.
6679 RecordDecl *RD =
6680 SemaRef.isCompleteType(Loc, Type) ? Type->getAsRecordDecl() : nullptr;
6681 if (!RD)
6682 return Type;
6683 CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD);
6684
6685 // Consider aggregate initialization.
6686 // We don't check that types so far are correct.
6687 // We also don't handle C99/C++17 brace-elision, we assume init-list elements
6688 // are 1:1 with fields.
6689 // FIXME: it would be nice to support "unwrapping" aggregates that contain
6690 // a single subaggregate, like std::array<T, N> -> T __elements[N].
6691 if (Braced && !RD->isUnion() &&
6692 (!getLangOpts().CPlusPlus || (CRD && CRD->isAggregate()))) {
6693 ResultCandidate AggregateSig(RD);
6694 unsigned AggregateSize = AggregateSig.getNumParams();
6695
6696 if (auto NextIndex =
6697 getNextAggregateIndexAfterDesignatedInit(AggregateSig, Args)) {
6698 // A designator was used, only aggregate init is possible.
6699 if (*NextIndex >= AggregateSize)
6700 return Type;
6701 Results.push_back(AggregateSig);
6702 return ProduceSignatureHelp(SemaRef, Results, *NextIndex, OpenParLoc,
6703 Braced);
6704 }
6705
6706 // Describe aggregate initialization, but also constructors below.
6707 if (Args.size() < AggregateSize)
6708 Results.push_back(AggregateSig);
6709 }
6710
6711 // FIXME: Provide support for member initializers.
6712 // FIXME: Provide support for variadic template constructors.
6713
6714 if (CRD) {
6715 OverloadCandidateSet CandidateSet(Loc,
6717 for (NamedDecl *C : SemaRef.LookupConstructors(CRD)) {
6718 if (auto *FD = dyn_cast<FunctionDecl>(C)) {
6719 // FIXME: we can't yet provide correct signature help for initializer
6720 // list constructors, so skip them entirely.
6721 if (Braced && getLangOpts().CPlusPlus &&
6722 SemaRef.isInitListConstructor(FD))
6723 continue;
6724 SemaRef.AddOverloadCandidate(
6725 FD, DeclAccessPair::make(FD, C->getAccess()), Args, CandidateSet,
6726 /*SuppressUserConversions=*/false,
6727 /*PartialOverloading=*/true,
6728 /*AllowExplicit*/ true);
6729 } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(C)) {
6730 if (Braced && getLangOpts().CPlusPlus &&
6731 SemaRef.isInitListConstructor(FTD->getTemplatedDecl()))
6732 continue;
6733
6734 SemaRef.AddTemplateOverloadCandidate(
6735 FTD, DeclAccessPair::make(FTD, C->getAccess()),
6736 /*ExplicitTemplateArgs=*/nullptr, Args, CandidateSet,
6737 /*SuppressUserConversions=*/false,
6738 /*PartialOverloading=*/true);
6739 }
6740 }
6741 mergeCandidatesWithResults(SemaRef, Results, CandidateSet, Loc,
6742 Args.size());
6743 }
6744
6745 return ProduceSignatureHelp(SemaRef, Results, Args.size(), OpenParLoc,
6746 Braced);
6747}
6748
6750 Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy,
6751 ArrayRef<Expr *> ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc,
6752 bool Braced) {
6753 if (!CodeCompleter)
6754 return QualType();
6755
6757 dyn_cast<CXXConstructorDecl>(ConstructorDecl);
6758 if (!Constructor)
6759 return QualType();
6760 // FIXME: Add support for Base class constructors as well.
6761 if (ValueDecl *MemberDecl = SemaRef.tryLookupCtorInitMemberDecl(
6762 Constructor->getParent(), SS, TemplateTypeTy, II))
6763 return ProduceConstructorSignatureHelp(MemberDecl->getType(),
6764 MemberDecl->getLocation(), ArgExprs,
6765 OpenParLoc, Braced);
6766 return QualType();
6767}
6768
6770 unsigned Index,
6771 const TemplateParameterList &Params) {
6772 const NamedDecl *Param;
6773 if (Index < Params.size())
6774 Param = Params.getParam(Index);
6775 else if (Params.hasParameterPack())
6776 Param = Params.asArray().back();
6777 else
6778 return false; // too many args
6779
6780 switch (Arg.getKind()) {
6782 return llvm::isa<TemplateTypeParmDecl>(Param); // constraints not checked
6784 return llvm::isa<NonTypeTemplateParmDecl>(Param); // type not checked
6786 return llvm::isa<TemplateTemplateParmDecl>(Param); // signature not checked
6787 }
6788 llvm_unreachable("Unhandled switch case");
6789}
6790
6792 TemplateTy ParsedTemplate, ArrayRef<ParsedTemplateArgument> Args,
6793 SourceLocation LAngleLoc) {
6794 if (!CodeCompleter || !ParsedTemplate)
6795 return QualType();
6796
6798 auto Consider = [&](const TemplateDecl *TD) {
6799 // Only add if the existing args are compatible with the template.
6800 bool Matches = true;
6801 for (unsigned I = 0; I < Args.size(); ++I) {
6802 if (!argMatchesTemplateParams(Args[I], I, *TD->getTemplateParameters())) {
6803 Matches = false;
6804 break;
6805 }
6806 }
6807 if (Matches)
6808 Results.emplace_back(TD);
6809 };
6810
6811 TemplateName Template = ParsedTemplate.get();
6812 if (const auto *TD = Template.getAsTemplateDecl()) {
6813 Consider(TD);
6814 } else if (const auto *OTS = Template.getAsOverloadedTemplate()) {
6815 for (const NamedDecl *ND : *OTS)
6816 if (const auto *TD = llvm::dyn_cast<TemplateDecl>(ND))
6817 Consider(TD);
6818 }
6819 return ProduceSignatureHelp(SemaRef, Results, Args.size(), LAngleLoc,
6820 /*Braced=*/false);
6821}
6822
6823// Direct member lookup, used by designated initializers: only fields declared
6824// in `RD` itself (including indirect fields from anonymous members) are valid.
6825static const FieldDecl *lookupDirectField(RecordDecl *RD, const Designator &D) {
6826 for (const auto *Member : RD->lookup(D.getFieldDecl())) {
6827 if (const auto *FD = llvm::dyn_cast<FieldDecl>(Member))
6828 return FD;
6829 if (const auto *IFD = llvm::dyn_cast<IndirectFieldDecl>(Member))
6830 return IFD->getAnonField();
6831 }
6832 return nullptr;
6833}
6834
6836 ASTContext &Context, QualType BaseType, const Designation &Desig,
6837 HeuristicResolver &Resolver,
6838 llvm::function_ref<const FieldDecl *(RecordDecl *, const Designator &)>
6839 LookupField) {
6840 for (unsigned I = 0; I < Desig.getNumDesignators(); ++I) {
6841 if (BaseType.isNull())
6842 break;
6843
6844 const auto &D = Desig.getDesignator(I);
6845 if (D.isArrayDesignator() || D.isArrayRangeDesignator()) {
6846 if (BaseType->isDependentType()) {
6847 BaseType = Context.DependentTy;
6848 continue;
6849 }
6850 const ArrayType *AT = Context.getAsArrayType(BaseType);
6851 if (!AT)
6852 return QualType();
6853 BaseType = AT->getElementType();
6854 continue;
6855 }
6856
6857 assert(D.isFieldDesignator());
6858 if (BaseType->isDependentType()) {
6859 BaseType = Context.DependentTy;
6860 continue;
6861 }
6862
6863 RecordDecl *RD = getAsRecordDecl(BaseType, Resolver);
6864 if (!RD || !RD->isCompleteDefinition())
6865 return QualType();
6866
6867 const FieldDecl *MemberDecl = LookupField(RD, D);
6868 if (!MemberDecl)
6869 return QualType();
6870
6871 BaseType = MemberDecl->getType().getNonReferenceType();
6872 }
6873 return BaseType;
6874}
6875
6877 QualType BaseType, llvm::ArrayRef<Expr *> InitExprs, const Designation &D) {
6878 BaseType = getDesignatedType(SemaRef.Context, BaseType, D, Resolver,
6880 if (BaseType.isNull())
6881 return;
6882 const auto *RD = getAsRecordDecl(BaseType, Resolver);
6883 if (!RD || RD->fields().empty())
6884 return;
6885
6887 BaseType);
6888 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6889 CodeCompleter->getCodeCompletionTUInfo(), CCC);
6890
6891 Results.EnterNewScope();
6892 for (const Decl *D : RD->decls()) {
6893 const FieldDecl *FD;
6894 if (auto *IFD = dyn_cast<IndirectFieldDecl>(D))
6895 FD = IFD->getAnonField();
6896 else if (auto *DFD = dyn_cast<FieldDecl>(D))
6897 FD = DFD;
6898 else
6899 continue;
6900
6901 // FIXME: Make use of previous designators to mark any fields before those
6902 // inaccessible, and also compute the next initializer priority.
6903 ResultBuilder::Result Result(FD, Results.getBasePriority(FD));
6904 Results.AddResult(Result, SemaRef.CurContext, /*Hiding=*/nullptr);
6905 }
6906 Results.ExitScope();
6908 Results.getCompletionContext(), Results.data(),
6909 Results.size());
6910}
6911
6913 const Designation &D) {
6914 // offsetof allows inherited fields and follows normal qualified name lookup,
6915 // not the direct-member iteration used by designated initializers.
6916 auto LookupQualified = [&](RecordDecl *RD,
6917 const Designator &Des) -> const FieldDecl * {
6918 LookupResult R(SemaRef, Des.getFieldDecl(), Des.getFieldLoc(),
6920 SemaRef.LookupQualifiedName(R, RD);
6921 // Peel via getUnderlyingDecl so a field exposed by `using Base::f;`
6922 // resolves through its UsingShadowDecl.
6923 for (NamedDecl *ND : R) {
6924 ND = ND->getUnderlyingDecl();
6925 if (auto *FD = dyn_cast<FieldDecl>(ND))
6926 return FD;
6927 if (auto *IFD = dyn_cast<IndirectFieldDecl>(ND))
6928 return IFD->getAnonField();
6929 }
6930 return nullptr;
6931 };
6932 BaseType = getDesignatedType(SemaRef.Context, BaseType, D, Resolver,
6933 LookupQualified);
6934 if (BaseType.isNull())
6935 return;
6936
6937 RecordDecl *RD = getAsRecordDecl(BaseType, Resolver);
6938 if (!RD)
6939 return;
6940
6942 BaseType);
6943 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6944 CodeCompleter->getCodeCompletionTUInfo(), CCC,
6945 &ResultBuilder::IsOffsetofField);
6946
6947 Results.EnterNewScope();
6948 CodeCompletionDeclConsumer Consumer(Results, RD, BaseType);
6949 // LookupVisibleDecls traverses base classes (required for inherited fields)
6950 // and dependent bases (best-effort for templates). Globals are skipped:
6951 // offsetof designators name only members of the surrounding type.
6952 SemaRef.LookupVisibleDecls(RD, Sema::LookupMemberName, Consumer,
6953 /*IncludeGlobalScope=*/false,
6954 /*IncludeDependentBases=*/true,
6955 CodeCompleter->loadExternal());
6956 Results.ExitScope();
6957
6959 Results.getCompletionContext(), Results.data(),
6960 Results.size());
6961}
6962
6964 ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
6965 if (!VD) {
6967 return;
6968 }
6969
6971 Data.PreferredType = VD->getType();
6972 // Ignore VD to avoid completing the variable itself, e.g. in 'int foo = ^'.
6973 Data.IgnoreDecls.push_back(VD);
6974
6976}
6977
6979 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6980 CodeCompleter->getCodeCompletionTUInfo(),
6982 CodeCompletionBuilder Builder(Results.getAllocator(),
6983 Results.getCodeCompletionTUInfo());
6984 if (getLangOpts().CPlusPlus17) {
6985 if (!AfterExclaim) {
6986 if (Results.includeCodePatterns()) {
6987 Builder.AddTypedTextChunk("constexpr");
6989 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
6990 Builder.AddPlaceholderChunk("condition");
6991 Builder.AddChunk(CodeCompletionString::CK_RightParen);
6993 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
6995 Builder.AddPlaceholderChunk("statements");
6997 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
6998 Results.AddResult({Builder.TakeString()});
6999 } else {
7000 Results.AddResult({"constexpr"});
7001 }
7002 }
7003 }
7004 if (getLangOpts().CPlusPlus23) {
7005 if (Results.includeCodePatterns()) {
7006 Builder.AddTypedTextChunk("consteval");
7008 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
7010 Builder.AddPlaceholderChunk("statements");
7012 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7013 Results.AddResult({Builder.TakeString()});
7014 } else {
7015 Results.AddResult({"consteval"});
7016 }
7017 }
7018
7020 Results.getCompletionContext(), Results.data(),
7021 Results.size());
7022}
7023
7025 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7026 CodeCompleter->getCodeCompletionTUInfo(),
7028 Results.setFilter(&ResultBuilder::IsOrdinaryName);
7029 Results.EnterNewScope();
7030
7031 CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
7032 SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
7033 CodeCompleter->includeGlobals(),
7034 CodeCompleter->loadExternal());
7035
7037
7038 // "else" block
7039 CodeCompletionBuilder Builder(Results.getAllocator(),
7040 Results.getCodeCompletionTUInfo());
7041
7042 auto AddElseBodyPattern = [&] {
7043 if (IsBracedThen) {
7045 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
7047 Builder.AddPlaceholderChunk("statements");
7049 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7050 } else {
7053 Builder.AddPlaceholderChunk("statement");
7054 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
7055 }
7056 };
7057 Builder.AddTypedTextChunk("else");
7058 if (Results.includeCodePatterns())
7059 AddElseBodyPattern();
7060 Results.AddResult(Builder.TakeString());
7061
7062 // "else if" block
7063 Builder.AddTypedTextChunk("else if");
7065 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7066 if (getLangOpts().CPlusPlus)
7067 Builder.AddPlaceholderChunk("condition");
7068 else
7069 Builder.AddPlaceholderChunk("expression");
7070 Builder.AddChunk(CodeCompletionString::CK_RightParen);
7071 if (Results.includeCodePatterns()) {
7072 AddElseBodyPattern();
7073 }
7074 Results.AddResult(Builder.TakeString());
7075
7076 Results.ExitScope();
7077
7078 if (S->getFnParent())
7080
7081 if (CodeCompleter->includeMacros())
7082 AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false);
7083
7085 Results.getCompletionContext(), Results.data(),
7086 Results.size());
7087}
7088
7090 Scope *S, CXXScopeSpec &SS, bool EnteringContext, bool IsUsingDeclaration,
7091 bool IsAddressOfOperand, bool IsInDeclarationContext, QualType BaseType,
7092 QualType PreferredType) {
7093 if (SS.isEmpty() || !CodeCompleter)
7094 return;
7095
7097 CC.setIsUsingDeclaration(IsUsingDeclaration);
7098 CC.setCXXScopeSpecifier(SS);
7099
7100 // We want to keep the scope specifier even if it's invalid (e.g. the scope
7101 // "a::b::" is not corresponding to any context/namespace in the AST), since
7102 // it can be useful for global code completion which have information about
7103 // contexts/symbols that are not in the AST.
7104 if (SS.isInvalid()) {
7105 // As SS is invalid, we try to collect accessible contexts from the current
7106 // scope with a dummy lookup so that the completion consumer can try to
7107 // guess what the specified scope is.
7108 ResultBuilder DummyResults(SemaRef, CodeCompleter->getAllocator(),
7109 CodeCompleter->getCodeCompletionTUInfo(), CC);
7110 if (!PreferredType.isNull())
7111 DummyResults.setPreferredType(PreferredType);
7112 if (S->getEntity()) {
7113 CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(),
7114 BaseType);
7115 SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
7116 /*IncludeGlobalScope=*/false,
7117 /*LoadExternal=*/false);
7118 }
7120 DummyResults.getCompletionContext(), nullptr, 0);
7121 return;
7122 }
7123 // Always pretend to enter a context to ensure that a dependent type
7124 // resolves to a dependent record.
7125 DeclContext *Ctx = SemaRef.computeDeclContext(SS, /*EnteringContext=*/true);
7126
7127 std::optional<Sema::ContextRAII> SimulateContext;
7128 // When completing a definition, simulate that we are in class scope to access
7129 // private methods.
7130 if (IsInDeclarationContext && Ctx != nullptr)
7131 SimulateContext.emplace(SemaRef, Ctx);
7132
7133 // Try to instantiate any non-dependent declaration contexts before
7134 // we look in them. Bail out if we fail.
7136 if (NNS && !NNS.isDependent()) {
7137 if (Ctx == nullptr || SemaRef.RequireCompleteDeclContext(SS, Ctx))
7138 return;
7139 }
7140
7141 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7142 CodeCompleter->getCodeCompletionTUInfo(), CC);
7143 if (!PreferredType.isNull())
7144 Results.setPreferredType(PreferredType);
7145 Results.EnterNewScope();
7146
7147 // The "template" keyword can follow "::" in the grammar, but only
7148 // put it into the grammar if the nested-name-specifier is dependent.
7149 // FIXME: results is always empty, this appears to be dead.
7150 if (!Results.empty() && NNS.isDependent())
7151 Results.AddResult("template");
7152
7153 // If the scope is a concept-constrained type parameter, infer nested
7154 // members based on the constraints.
7156 if (const auto *TTPT = dyn_cast<TemplateTypeParmType>(NNS.getAsType())) {
7157 for (const auto &R : ConceptInfo(*TTPT, S).members()) {
7158 if (R.Operator != ConceptInfo::Member::Colons)
7159 continue;
7160 Results.AddResult(CodeCompletionResult(
7161 R.render(SemaRef, CodeCompleter->getAllocator(),
7162 CodeCompleter->getCodeCompletionTUInfo())));
7163 }
7164 }
7165 }
7166
7167 // Add calls to overridden virtual functions, if there are any.
7168 //
7169 // FIXME: This isn't wonderful, because we don't know whether we're actually
7170 // in a context that permits expressions. This is a general issue with
7171 // qualified-id completions.
7172 if (Ctx && !EnteringContext)
7173 MaybeAddOverrideCalls(SemaRef, Ctx, Results);
7174 Results.ExitScope();
7175
7176 if (Ctx &&
7177 (CodeCompleter->includeNamespaceLevelDecls() || !Ctx->isFileContext())) {
7178 CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType);
7179 Consumer.setIsInDeclarationContext(IsInDeclarationContext);
7180 Consumer.setIsAddressOfOperand(IsAddressOfOperand);
7181 SemaRef.LookupVisibleDecls(Ctx, Sema::LookupOrdinaryName, Consumer,
7182 /*IncludeGlobalScope=*/true,
7183 /*IncludeDependentBases=*/true,
7184 CodeCompleter->loadExternal());
7185 }
7186 SimulateContext.reset();
7188 Results.getCompletionContext(), Results.data(),
7189 Results.size());
7190}
7191
7193 if (!CodeCompleter)
7194 return;
7195
7196 // This can be both a using alias or using declaration, in the former we
7197 // expect a new name and a symbol in the latter case.
7199 Context.setIsUsingDeclaration(true);
7200
7201 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7202 CodeCompleter->getCodeCompletionTUInfo(), Context,
7203 &ResultBuilder::IsNestedNameSpecifier);
7204 Results.EnterNewScope();
7205
7206 // If we aren't in class scope, we could see the "namespace" keyword.
7207 if (!S->isClassScope())
7208 Results.AddResult(CodeCompletionResult("namespace"));
7209
7210 // After "using", we can see anything that would start a
7211 // nested-name-specifier.
7212 CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
7213 SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
7214 CodeCompleter->includeGlobals(),
7215 CodeCompleter->loadExternal());
7216 Results.ExitScope();
7217
7219 Results.getCompletionContext(), Results.data(),
7220 Results.size());
7221}
7222
7224 if (!CodeCompleter)
7225 return;
7226
7227 // After "using namespace", we expect to see a namespace name or namespace
7228 // alias.
7229 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7230 CodeCompleter->getCodeCompletionTUInfo(),
7232 &ResultBuilder::IsNamespaceOrAlias);
7233 Results.EnterNewScope();
7234 CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
7235 SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
7236 CodeCompleter->includeGlobals(),
7237 CodeCompleter->loadExternal());
7238 Results.ExitScope();
7240 Results.getCompletionContext(), Results.data(),
7241 Results.size());
7242}
7243
7245 if (!CodeCompleter)
7246 return;
7247
7248 DeclContext *Ctx = S->getEntity();
7249 if (!S->getParent())
7250 Ctx = getASTContext().getTranslationUnitDecl();
7251
7252 bool SuppressedGlobalResults =
7253 Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
7254
7255 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7256 CodeCompleter->getCodeCompletionTUInfo(),
7257 SuppressedGlobalResults
7260 &ResultBuilder::IsNamespace);
7261
7262 if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
7263 // We only want to see those namespaces that have already been defined
7264 // within this scope, because its likely that the user is creating an
7265 // extended namespace declaration. Keep track of the most recent
7266 // definition of each namespace.
7267 std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
7269 NS(Ctx->decls_begin()),
7270 NSEnd(Ctx->decls_end());
7271 NS != NSEnd; ++NS)
7272 OrigToLatest[NS->getFirstDecl()] = *NS;
7273
7274 // Add the most recent definition (or extended definition) of each
7275 // namespace to the list of results.
7276 Results.EnterNewScope();
7277 for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
7278 NS = OrigToLatest.begin(),
7279 NSEnd = OrigToLatest.end();
7280 NS != NSEnd; ++NS)
7281 Results.AddResult(
7282 CodeCompletionResult(NS->second, Results.getBasePriority(NS->second),
7283 /*Qualifier=*/std::nullopt),
7284 SemaRef.CurContext, nullptr, false);
7285 Results.ExitScope();
7286 }
7287
7289 Results.getCompletionContext(), Results.data(),
7290 Results.size());
7291}
7292
7294 if (!CodeCompleter)
7295 return;
7296
7297 // After "namespace", we expect to see a namespace or alias.
7298 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7299 CodeCompleter->getCodeCompletionTUInfo(),
7301 &ResultBuilder::IsNamespaceOrAlias);
7302 CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
7303 SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
7304 CodeCompleter->includeGlobals(),
7305 CodeCompleter->loadExternal());
7307 Results.getCompletionContext(), Results.data(),
7308 Results.size());
7309}
7310
7312 if (!CodeCompleter)
7313 return;
7314
7316 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7317 CodeCompleter->getCodeCompletionTUInfo(),
7319 &ResultBuilder::IsType);
7320 Results.EnterNewScope();
7321
7322 // Add the names of overloadable operators. Note that OO_Conditional is not
7323 // actually overloadable.
7324#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \
7325 if (OO_##Name != OO_Conditional) \
7326 Results.AddResult(Result(Spelling));
7327#include "clang/Basic/OperatorKinds.def"
7328
7329 // Add any type names visible from the current scope
7330 Results.allowNestedNameSpecifiers();
7331 CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
7332 SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
7333 CodeCompleter->includeGlobals(),
7334 CodeCompleter->loadExternal());
7335
7336 // Add any type specifiers
7338 Results.ExitScope();
7339
7341 Results.getCompletionContext(), Results.data(),
7342 Results.size());
7343}
7344
7346 Decl *ConstructorD, ArrayRef<CXXCtorInitializer *> Initializers) {
7347 if (!ConstructorD)
7348 return;
7349
7350 SemaRef.AdjustDeclIfTemplate(ConstructorD);
7351
7352 auto *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD);
7353 if (!Constructor)
7354 return;
7355
7356 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7357 CodeCompleter->getCodeCompletionTUInfo(),
7359 Results.EnterNewScope();
7360
7361 // Fill in any already-initialized fields or base classes.
7362 llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
7363 llvm::SmallPtrSet<CanQualType, 4> InitializedBases;
7364 for (unsigned I = 0, E = Initializers.size(); I != E; ++I) {
7365 if (Initializers[I]->isBaseInitializer())
7366 InitializedBases.insert(getASTContext().getCanonicalType(
7367 QualType(Initializers[I]->getBaseClass(), 0)));
7368 else
7369 InitializedFields.insert(
7370 cast<FieldDecl>(Initializers[I]->getAnyMember()));
7371 }
7372
7373 // Add completions for base classes.
7375 bool SawLastInitializer = Initializers.empty();
7376 CXXRecordDecl *ClassDecl = Constructor->getParent();
7377
7378 auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) {
7379 CodeCompletionBuilder Builder(Results.getAllocator(),
7380 Results.getCodeCompletionTUInfo());
7381 Builder.AddTypedTextChunk(Name);
7382 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7383 if (const auto *Function = dyn_cast<FunctionDecl>(ND))
7384 AddFunctionParameterChunks(SemaRef.PP, Policy, Function, Builder);
7385 else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND))
7387 FunTemplDecl->getTemplatedDecl(), Builder);
7388 Builder.AddChunk(CodeCompletionString::CK_RightParen);
7389 return Builder.TakeString();
7390 };
7391 auto AddDefaultCtorInit = [&](const char *Name, const char *Type,
7392 const NamedDecl *ND) {
7393 CodeCompletionBuilder Builder(Results.getAllocator(),
7394 Results.getCodeCompletionTUInfo());
7395 Builder.AddTypedTextChunk(Name);
7396 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7397 Builder.AddPlaceholderChunk(Type);
7398 Builder.AddChunk(CodeCompletionString::CK_RightParen);
7399 if (ND) {
7400 auto CCR = CodeCompletionResult(
7401 Builder.TakeString(), ND,
7402 SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration);
7403 if (isa<FieldDecl>(ND))
7404 CCR.CursorKind = CXCursor_MemberRef;
7405 return Results.AddResult(CCR);
7406 }
7407 return Results.AddResult(CodeCompletionResult(
7408 Builder.TakeString(),
7409 SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration));
7410 };
7411 auto AddCtorsWithName = [&](const CXXRecordDecl *RD, unsigned int Priority,
7412 const char *Name, const FieldDecl *FD) {
7413 if (!RD)
7414 return AddDefaultCtorInit(Name,
7415 FD ? Results.getAllocator().CopyString(
7416 FD->getType().getAsString(Policy))
7417 : Name,
7418 FD);
7419 auto Ctors = getConstructors(getASTContext(), RD);
7420 if (Ctors.begin() == Ctors.end())
7421 return AddDefaultCtorInit(Name, Name, RD);
7422 for (const NamedDecl *Ctor : Ctors) {
7423 auto CCR = CodeCompletionResult(GenerateCCS(Ctor, Name), RD, Priority);
7424 CCR.CursorKind = getCursorKindForDecl(Ctor);
7425 Results.AddResult(CCR);
7426 }
7427 };
7428 auto AddBase = [&](const CXXBaseSpecifier &Base) {
7429 const char *BaseName =
7430 Results.getAllocator().CopyString(Base.getType().getAsString(Policy));
7431 const auto *RD = Base.getType()->getAsCXXRecordDecl();
7432 AddCtorsWithName(
7433 RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
7434 BaseName, nullptr);
7435 };
7436 auto AddField = [&](const FieldDecl *FD) {
7437 const char *FieldName =
7438 Results.getAllocator().CopyString(FD->getIdentifier()->getName());
7439 const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl();
7440 AddCtorsWithName(
7441 RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration,
7442 FieldName, FD);
7443 };
7444
7445 for (const auto &Base : ClassDecl->bases()) {
7446 if (!InitializedBases
7447 .insert(getASTContext().getCanonicalType(Base.getType()))
7448 .second) {
7449 SawLastInitializer =
7450 !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
7451 getASTContext().hasSameUnqualifiedType(
7452 Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
7453 continue;
7454 }
7455
7456 AddBase(Base);
7457 SawLastInitializer = false;
7458 }
7459
7460 // Add completions for virtual base classes.
7461 for (const auto &Base : ClassDecl->vbases()) {
7462 if (!InitializedBases
7463 .insert(getASTContext().getCanonicalType(Base.getType()))
7464 .second) {
7465 SawLastInitializer =
7466 !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
7467 getASTContext().hasSameUnqualifiedType(
7468 Base.getType(), QualType(Initializers.back()->getBaseClass(), 0));
7469 continue;
7470 }
7471
7472 AddBase(Base);
7473 SawLastInitializer = false;
7474 }
7475
7476 // Add completions for members.
7477 for (auto *Field : ClassDecl->fields()) {
7478 if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))
7479 .second) {
7480 SawLastInitializer = !Initializers.empty() &&
7481 Initializers.back()->isAnyMemberInitializer() &&
7482 Initializers.back()->getAnyMember() == Field;
7483 continue;
7484 }
7485
7486 if (!Field->getDeclName())
7487 continue;
7488
7489 AddField(Field);
7490 SawLastInitializer = false;
7491 }
7492 Results.ExitScope();
7493
7495 Results.getCompletionContext(), Results.data(),
7496 Results.size());
7497}
7498
7499/// Determine whether this scope denotes a namespace.
7500static bool isNamespaceScope(Scope *S) {
7501 DeclContext *DC = S->getEntity();
7502 if (!DC)
7503 return false;
7504
7505 return DC->isFileContext();
7506}
7507
7509 LambdaIntroducer &Intro,
7510 bool AfterAmpersand) {
7511 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7512 CodeCompleter->getCodeCompletionTUInfo(),
7514 Results.EnterNewScope();
7515
7516 // Note what has already been captured.
7518 bool IncludedThis = false;
7519 for (const auto &C : Intro.Captures) {
7520 if (C.Kind == LCK_This) {
7521 IncludedThis = true;
7522 continue;
7523 }
7524
7525 Known.insert(C.Id);
7526 }
7527
7528 // Look for other capturable variables.
7529 for (; S && !isNamespaceScope(S); S = S->getParent()) {
7530 for (const auto *D : S->decls()) {
7531 const auto *Var = dyn_cast<VarDecl>(D);
7532 if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>())
7533 continue;
7534
7535 if (Known.insert(Var->getIdentifier()).second)
7536 Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration),
7537 SemaRef.CurContext, nullptr, false);
7538 }
7539 }
7540
7541 // Add 'this', if it would be valid.
7542 if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy)
7543 addThisCompletion(SemaRef, Results);
7544
7545 Results.ExitScope();
7546
7548 Results.getCompletionContext(), Results.data(),
7549 Results.size());
7550}
7551
7553 if (!getLangOpts().CPlusPlus11)
7554 return;
7555 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7556 CodeCompleter->getCodeCompletionTUInfo(),
7558 auto ShouldAddDefault = [&D, this]() {
7559 if (!D.isFunctionDeclarator())
7560 return false;
7561 auto &Id = D.getName();
7562 if (Id.getKind() == UnqualifiedIdKind::IK_DestructorName)
7563 return true;
7564 // FIXME(liuhui): Ideally, we should check the constructor parameter list to
7565 // verify that it is the default, copy or move constructor?
7566 if (Id.getKind() == UnqualifiedIdKind::IK_ConstructorName &&
7568 return true;
7569 if (Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId) {
7570 auto Op = Id.OperatorFunctionId.Operator;
7571 // FIXME(liuhui): Ideally, we should check the function parameter list to
7572 // verify that it is the copy or move assignment?
7573 if (Op == OverloadedOperatorKind::OO_Equal)
7574 return true;
7575 if (getLangOpts().CPlusPlus20 &&
7576 (Op == OverloadedOperatorKind::OO_EqualEqual ||
7577 Op == OverloadedOperatorKind::OO_ExclaimEqual ||
7578 Op == OverloadedOperatorKind::OO_Less ||
7579 Op == OverloadedOperatorKind::OO_LessEqual ||
7580 Op == OverloadedOperatorKind::OO_Greater ||
7581 Op == OverloadedOperatorKind::OO_GreaterEqual ||
7582 Op == OverloadedOperatorKind::OO_Spaceship))
7583 return true;
7584 }
7585 return false;
7586 };
7587
7588 Results.EnterNewScope();
7589 if (ShouldAddDefault())
7590 Results.AddResult("default");
7591 // FIXME(liuhui): Ideally, we should only provide `delete` completion for the
7592 // first function declaration.
7593 Results.AddResult("delete");
7594 Results.ExitScope();
7596 Results.getCompletionContext(), Results.data(),
7597 Results.size());
7598}
7599
7600/// Macro that optionally prepends an "@" to the string literal passed in via
7601/// Keyword, depending on whether NeedAt is true or false.
7602#define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword)
7603
7604static void AddObjCImplementationResults(const LangOptions &LangOpts,
7605 ResultBuilder &Results, bool NeedAt) {
7607 // Since we have an implementation, we can end it.
7608 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
7609
7610 CodeCompletionBuilder Builder(Results.getAllocator(),
7611 Results.getCodeCompletionTUInfo());
7612 if (LangOpts.ObjC) {
7613 // @dynamic
7614 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "dynamic"));
7616 Builder.AddPlaceholderChunk("property");
7617 Results.AddResult(Result(Builder.TakeString()));
7618
7619 // @synthesize
7620 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synthesize"));
7622 Builder.AddPlaceholderChunk("property");
7623 Results.AddResult(Result(Builder.TakeString()));
7624 }
7625}
7626
7627static void AddObjCInterfaceResults(const LangOptions &LangOpts,
7628 ResultBuilder &Results, bool NeedAt) {
7630
7631 // Since we have an interface or protocol, we can end it.
7632 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end")));
7633
7634 if (LangOpts.ObjC) {
7635 // @property
7636 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "property")));
7637
7638 // @required
7639 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "required")));
7640
7641 // @optional
7642 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "optional")));
7643 }
7644}
7645
7646static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) {
7648 CodeCompletionBuilder Builder(Results.getAllocator(),
7649 Results.getCodeCompletionTUInfo());
7650
7651 // @class name ;
7652 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "class"));
7654 Builder.AddPlaceholderChunk("name");
7655 Results.AddResult(Result(Builder.TakeString()));
7656
7657 if (Results.includeCodePatterns()) {
7658 // @interface name
7659 // FIXME: Could introduce the whole pattern, including superclasses and
7660 // such.
7661 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "interface"));
7663 Builder.AddPlaceholderChunk("class");
7664 Results.AddResult(Result(Builder.TakeString()));
7665
7666 // @protocol name
7667 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
7669 Builder.AddPlaceholderChunk("protocol");
7670 Results.AddResult(Result(Builder.TakeString()));
7671
7672 // @implementation name
7673 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "implementation"));
7675 Builder.AddPlaceholderChunk("class");
7676 Results.AddResult(Result(Builder.TakeString()));
7677 }
7678
7679 // @compatibility_alias name
7680 Builder.AddTypedTextChunk(
7681 OBJC_AT_KEYWORD_NAME(NeedAt, "compatibility_alias"));
7683 Builder.AddPlaceholderChunk("alias");
7685 Builder.AddPlaceholderChunk("class");
7686 Results.AddResult(Result(Builder.TakeString()));
7687
7688 if (Results.getSema().getLangOpts().Modules) {
7689 // @import name
7690 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import"));
7692 Builder.AddPlaceholderChunk("module");
7693 Results.AddResult(Result(Builder.TakeString()));
7694 }
7695}
7696
7698 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7699 CodeCompleter->getCodeCompletionTUInfo(),
7701 Results.EnterNewScope();
7702 if (isa<ObjCImplDecl>(SemaRef.CurContext))
7703 AddObjCImplementationResults(getLangOpts(), Results, false);
7704 else if (SemaRef.CurContext->isObjCContainer())
7705 AddObjCInterfaceResults(getLangOpts(), Results, false);
7706 else
7707 AddObjCTopLevelResults(Results, false);
7708 Results.ExitScope();
7710 Results.getCompletionContext(), Results.data(),
7711 Results.size());
7712}
7713
7714static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {
7716 CodeCompletionBuilder Builder(Results.getAllocator(),
7717 Results.getCodeCompletionTUInfo());
7718
7719 // @encode ( type-name )
7720 const char *EncodeType = "char[]";
7721 if (Results.getSema().getLangOpts().CPlusPlus ||
7722 Results.getSema().getLangOpts().ConstStrings)
7723 EncodeType = "const char[]";
7724 Builder.AddResultTypeChunk(EncodeType);
7725 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "encode"));
7726 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7727 Builder.AddPlaceholderChunk("type-name");
7728 Builder.AddChunk(CodeCompletionString::CK_RightParen);
7729 Results.AddResult(Result(Builder.TakeString()));
7730
7731 // @protocol ( protocol-name )
7732 Builder.AddResultTypeChunk("Protocol *");
7733 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol"));
7734 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7735 Builder.AddPlaceholderChunk("protocol-name");
7736 Builder.AddChunk(CodeCompletionString::CK_RightParen);
7737 Results.AddResult(Result(Builder.TakeString()));
7738
7739 // @selector ( selector )
7740 Builder.AddResultTypeChunk("SEL");
7741 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "selector"));
7742 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7743 Builder.AddPlaceholderChunk("selector");
7744 Builder.AddChunk(CodeCompletionString::CK_RightParen);
7745 Results.AddResult(Result(Builder.TakeString()));
7746
7747 // @"string"
7748 Builder.AddResultTypeChunk("NSString *");
7749 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "\""));
7750 Builder.AddPlaceholderChunk("string");
7751 Builder.AddTextChunk("\"");
7752 Results.AddResult(Result(Builder.TakeString()));
7753
7754 // @[objects, ...]
7755 Builder.AddResultTypeChunk("NSArray *");
7756 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "["));
7757 Builder.AddPlaceholderChunk("objects, ...");
7758 Builder.AddChunk(CodeCompletionString::CK_RightBracket);
7759 Results.AddResult(Result(Builder.TakeString()));
7760
7761 // @{key : object, ...}
7762 Builder.AddResultTypeChunk("NSDictionary *");
7763 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "{"));
7764 Builder.AddPlaceholderChunk("key");
7765 Builder.AddChunk(CodeCompletionString::CK_Colon);
7767 Builder.AddPlaceholderChunk("object, ...");
7768 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7769 Results.AddResult(Result(Builder.TakeString()));
7770
7771 // @(expression)
7772 Builder.AddResultTypeChunk("id");
7773 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "("));
7774 Builder.AddPlaceholderChunk("expression");
7775 Builder.AddChunk(CodeCompletionString::CK_RightParen);
7776 Results.AddResult(Result(Builder.TakeString()));
7777}
7778
7779static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {
7781 CodeCompletionBuilder Builder(Results.getAllocator(),
7782 Results.getCodeCompletionTUInfo());
7783
7784 if (Results.includeCodePatterns()) {
7785 // @try { statements } @catch ( declaration ) { statements } @finally
7786 // { statements }
7787 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "try"));
7788 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
7789 Builder.AddPlaceholderChunk("statements");
7790 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7791 Builder.AddTextChunk("@catch");
7792 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7793 Builder.AddPlaceholderChunk("parameter");
7794 Builder.AddChunk(CodeCompletionString::CK_RightParen);
7795 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
7796 Builder.AddPlaceholderChunk("statements");
7797 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7798 Builder.AddTextChunk("@finally");
7799 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
7800 Builder.AddPlaceholderChunk("statements");
7801 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7802 Results.AddResult(Result(Builder.TakeString()));
7803 }
7804
7805 // @throw
7806 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "throw"));
7808 Builder.AddPlaceholderChunk("expression");
7809 Results.AddResult(Result(Builder.TakeString()));
7810
7811 if (Results.includeCodePatterns()) {
7812 // @synchronized ( expression ) { statements }
7813 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synchronized"));
7815 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
7816 Builder.AddPlaceholderChunk("expression");
7817 Builder.AddChunk(CodeCompletionString::CK_RightParen);
7818 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
7819 Builder.AddPlaceholderChunk("statements");
7820 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
7821 Results.AddResult(Result(Builder.TakeString()));
7822 }
7823}
7824
7825static void AddObjCVisibilityResults(const LangOptions &LangOpts,
7826 ResultBuilder &Results, bool NeedAt) {
7828 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "private")));
7829 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "protected")));
7830 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "public")));
7831 if (LangOpts.ObjC)
7832 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "package")));
7833}
7834
7836 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7837 CodeCompleter->getCodeCompletionTUInfo(),
7839 Results.EnterNewScope();
7840 AddObjCVisibilityResults(getLangOpts(), Results, false);
7841 Results.ExitScope();
7843 Results.getCompletionContext(), Results.data(),
7844 Results.size());
7845}
7846
7848 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7849 CodeCompleter->getCodeCompletionTUInfo(),
7851 Results.EnterNewScope();
7852 AddObjCStatementResults(Results, false);
7853 AddObjCExpressionResults(Results, false);
7854 Results.ExitScope();
7856 Results.getCompletionContext(), Results.data(),
7857 Results.size());
7858}
7859
7861 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7862 CodeCompleter->getCodeCompletionTUInfo(),
7864 Results.EnterNewScope();
7865 AddObjCExpressionResults(Results, false);
7866 Results.ExitScope();
7868 Results.getCompletionContext(), Results.data(),
7869 Results.size());
7870}
7871
7872/// Determine whether the addition of the given flag to an Objective-C
7873/// property's attributes will cause a conflict.
7874static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
7875 // Check if we've already added this flag.
7876 if (Attributes & NewFlag)
7877 return true;
7878
7879 Attributes |= NewFlag;
7880
7881 // Check for collisions with "readonly".
7882 if ((Attributes & ObjCPropertyAttribute::kind_readonly) &&
7884 return true;
7885
7886 // Check for more than one of { assign, copy, retain, strong, weak }.
7887 unsigned AssignCopyRetMask =
7888 Attributes &
7893 if (AssignCopyRetMask &&
7894 AssignCopyRetMask != ObjCPropertyAttribute::kind_assign &&
7895 AssignCopyRetMask != ObjCPropertyAttribute::kind_unsafe_unretained &&
7896 AssignCopyRetMask != ObjCPropertyAttribute::kind_copy &&
7897 AssignCopyRetMask != ObjCPropertyAttribute::kind_retain &&
7898 AssignCopyRetMask != ObjCPropertyAttribute::kind_strong &&
7899 AssignCopyRetMask != ObjCPropertyAttribute::kind_weak)
7900 return true;
7901
7902 return false;
7903}
7904
7906 ObjCDeclSpec &ODS) {
7907 if (!CodeCompleter)
7908 return;
7909
7910 unsigned Attributes = ODS.getPropertyAttributes();
7911
7912 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7913 CodeCompleter->getCodeCompletionTUInfo(),
7915 Results.EnterNewScope();
7916 if (!ObjCPropertyFlagConflicts(Attributes,
7918 Results.AddResult(CodeCompletionResult("readonly"));
7919 if (!ObjCPropertyFlagConflicts(Attributes,
7921 Results.AddResult(CodeCompletionResult("assign"));
7922 if (!ObjCPropertyFlagConflicts(Attributes,
7924 Results.AddResult(CodeCompletionResult("unsafe_unretained"));
7925 if (!ObjCPropertyFlagConflicts(Attributes,
7927 Results.AddResult(CodeCompletionResult("readwrite"));
7928 if (!ObjCPropertyFlagConflicts(Attributes,
7930 Results.AddResult(CodeCompletionResult("retain"));
7931 if (!ObjCPropertyFlagConflicts(Attributes,
7933 Results.AddResult(CodeCompletionResult("strong"));
7935 Results.AddResult(CodeCompletionResult("copy"));
7936 if (!ObjCPropertyFlagConflicts(Attributes,
7938 Results.AddResult(CodeCompletionResult("nonatomic"));
7939 if (!ObjCPropertyFlagConflicts(Attributes,
7941 Results.AddResult(CodeCompletionResult("atomic"));
7942
7943 // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC.
7944 if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC)
7945 if (!ObjCPropertyFlagConflicts(Attributes,
7947 Results.AddResult(CodeCompletionResult("weak"));
7948
7949 if (!ObjCPropertyFlagConflicts(Attributes,
7951 CodeCompletionBuilder Setter(Results.getAllocator(),
7952 Results.getCodeCompletionTUInfo());
7953 Setter.AddTypedTextChunk("setter");
7954 Setter.AddTextChunk("=");
7955 Setter.AddPlaceholderChunk("method");
7956 Results.AddResult(CodeCompletionResult(Setter.TakeString()));
7957 }
7958 if (!ObjCPropertyFlagConflicts(Attributes,
7960 CodeCompletionBuilder Getter(Results.getAllocator(),
7961 Results.getCodeCompletionTUInfo());
7962 Getter.AddTypedTextChunk("getter");
7963 Getter.AddTextChunk("=");
7964 Getter.AddPlaceholderChunk("method");
7965 Results.AddResult(CodeCompletionResult(Getter.TakeString()));
7966 }
7967 if (!ObjCPropertyFlagConflicts(Attributes,
7969 Results.AddResult(CodeCompletionResult("nonnull"));
7970 Results.AddResult(CodeCompletionResult("nullable"));
7971 Results.AddResult(CodeCompletionResult("null_unspecified"));
7972 Results.AddResult(CodeCompletionResult("null_resettable"));
7973 }
7974 Results.ExitScope();
7976 Results.getCompletionContext(), Results.data(),
7977 Results.size());
7978}
7979
7980/// Describes the kind of Objective-C method that we want to find
7981/// via code completion.
7983 MK_Any, ///< Any kind of method, provided it means other specified criteria.
7984 MK_ZeroArgSelector, ///< Zero-argument (unary) selector.
7985 MK_OneArgSelector ///< One-argument selector.
7986};
7987
7990 bool AllowSameLength = true) {
7991 unsigned NumSelIdents = SelIdents.size();
7992 if (NumSelIdents > Sel.getNumArgs())
7993 return false;
7994
7995 switch (WantKind) {
7996 case MK_Any:
7997 break;
7998 case MK_ZeroArgSelector:
7999 return Sel.isUnarySelector();
8000 case MK_OneArgSelector:
8001 return Sel.getNumArgs() == 1;
8002 }
8003
8004 if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs())
8005 return false;
8006
8007 for (unsigned I = 0; I != NumSelIdents; ++I)
8008 if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I))
8009 return false;
8010
8011 return true;
8012}
8013
8015 ObjCMethodKind WantKind,
8017 bool AllowSameLength = true) {
8018 return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents,
8019 AllowSameLength);
8020}
8021
8022/// A set of selectors, which is used to avoid introducing multiple
8023/// completions with the same selector into the result set.
8025
8026/// Add all of the Objective-C methods in the given Objective-C
8027/// container to the set of results.
8028///
8029/// The container will be a class, protocol, category, or implementation of
8030/// any of the above. This mether will recurse to include methods from
8031/// the superclasses of classes along with their categories, protocols, and
8032/// implementations.
8033///
8034/// \param Container the container in which we'll look to find methods.
8035///
8036/// \param WantInstanceMethods Whether to add instance methods (only); if
8037/// false, this routine will add factory methods (only).
8038///
8039/// \param CurContext the context in which we're performing the lookup that
8040/// finds methods.
8041///
8042/// \param AllowSameLength Whether we allow a method to be added to the list
8043/// when it has the same number of parameters as we have selector identifiers.
8044///
8045/// \param Results the structure into which we'll add results.
8046static void AddObjCMethods(ObjCContainerDecl *Container,
8047 bool WantInstanceMethods, ObjCMethodKind WantKind,
8049 DeclContext *CurContext,
8050 VisitedSelectorSet &Selectors, bool AllowSameLength,
8051 ResultBuilder &Results, bool InOriginalClass = true,
8052 bool IsRootClass = false) {
8054 Container = getContainerDef(Container);
8055 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container);
8056 IsRootClass = IsRootClass || (IFace && !IFace->getSuperClass());
8057 for (ObjCMethodDecl *M : Container->methods()) {
8058 // The instance methods on the root class can be messaged via the
8059 // metaclass.
8060 if (M->isInstanceMethod() == WantInstanceMethods ||
8061 (IsRootClass && !WantInstanceMethods)) {
8062 // Check whether the selector identifiers we've been given are a
8063 // subset of the identifiers for this particular method.
8064 if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength))
8065 continue;
8066
8067 if (!Selectors.insert(M->getSelector()).second)
8068 continue;
8069
8070 Result R =
8071 Result(M, Results.getBasePriority(M), /*Qualifier=*/std::nullopt);
8072 R.StartParameter = SelIdents.size();
8073 R.AllParametersAreInformative = (WantKind != MK_Any);
8074 if (!InOriginalClass)
8075 setInBaseClass(R);
8076 Results.MaybeAddResult(R, CurContext);
8077 }
8078 }
8079
8080 // Visit the protocols of protocols.
8081 if (const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
8082 if (Protocol->hasDefinition()) {
8083 const ObjCList<ObjCProtocolDecl> &Protocols =
8084 Protocol->getReferencedProtocols();
8085 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
8086 E = Protocols.end();
8087 I != E; ++I)
8088 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
8089 Selectors, AllowSameLength, Results, false, IsRootClass);
8090 }
8091 }
8092
8093 if (!IFace || !IFace->hasDefinition())
8094 return;
8095
8096 // Add methods in protocols.
8097 for (ObjCProtocolDecl *I : IFace->protocols())
8098 AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext,
8099 Selectors, AllowSameLength, Results, false, IsRootClass);
8100
8101 // Add methods in categories.
8102 for (ObjCCategoryDecl *CatDecl : IFace->known_categories()) {
8103 AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
8104 CurContext, Selectors, AllowSameLength, Results,
8105 InOriginalClass, IsRootClass);
8106
8107 // Add a categories protocol methods.
8108 const ObjCList<ObjCProtocolDecl> &Protocols =
8109 CatDecl->getReferencedProtocols();
8110 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
8111 E = Protocols.end();
8112 I != E; ++I)
8113 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
8114 Selectors, AllowSameLength, Results, false, IsRootClass);
8115
8116 // Add methods in category implementations.
8117 if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())
8118 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
8119 Selectors, AllowSameLength, Results, InOriginalClass,
8120 IsRootClass);
8121 }
8122
8123 // Add methods in superclass.
8124 // Avoid passing in IsRootClass since root classes won't have super classes.
8125 if (IFace->getSuperClass())
8126 AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,
8127 SelIdents, CurContext, Selectors, AllowSameLength, Results,
8128 /*IsRootClass=*/false);
8129
8130 // Add methods in our implementation, if any.
8131 if (ObjCImplementationDecl *Impl = IFace->getImplementation())
8132 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
8133 Selectors, AllowSameLength, Results, InOriginalClass,
8134 IsRootClass);
8135}
8136
8138 // Try to find the interface where getters might live.
8140 dyn_cast_or_null<ObjCInterfaceDecl>(SemaRef.CurContext);
8141 if (!Class) {
8142 if (ObjCCategoryDecl *Category =
8143 dyn_cast_or_null<ObjCCategoryDecl>(SemaRef.CurContext))
8144 Class = Category->getClassInterface();
8145
8146 if (!Class)
8147 return;
8148 }
8149
8150 // Find all of the potential getters.
8151 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8152 CodeCompleter->getCodeCompletionTUInfo(),
8154 Results.EnterNewScope();
8155
8156 VisitedSelectorSet Selectors;
8157 AddObjCMethods(Class, true, MK_ZeroArgSelector, {}, SemaRef.CurContext,
8158 Selectors,
8159 /*AllowSameLength=*/true, Results);
8160 Results.ExitScope();
8162 Results.getCompletionContext(), Results.data(),
8163 Results.size());
8164}
8165
8167 // Try to find the interface where setters might live.
8169 dyn_cast_or_null<ObjCInterfaceDecl>(SemaRef.CurContext);
8170 if (!Class) {
8171 if (ObjCCategoryDecl *Category =
8172 dyn_cast_or_null<ObjCCategoryDecl>(SemaRef.CurContext))
8173 Class = Category->getClassInterface();
8174
8175 if (!Class)
8176 return;
8177 }
8178
8179 // Find all of the potential getters.
8180 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8181 CodeCompleter->getCodeCompletionTUInfo(),
8183 Results.EnterNewScope();
8184
8185 VisitedSelectorSet Selectors;
8186 AddObjCMethods(Class, true, MK_OneArgSelector, {}, SemaRef.CurContext,
8187 Selectors,
8188 /*AllowSameLength=*/true, Results);
8189
8190 Results.ExitScope();
8192 Results.getCompletionContext(), Results.data(),
8193 Results.size());
8194}
8195
8197 bool IsParameter) {
8198 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8199 CodeCompleter->getCodeCompletionTUInfo(),
8201 Results.EnterNewScope();
8202
8203 // Add context-sensitive, Objective-C parameter-passing keywords.
8204 bool AddedInOut = false;
8205 if ((DS.getObjCDeclQualifier() &
8207 Results.AddResult("in");
8208 Results.AddResult("inout");
8209 AddedInOut = true;
8210 }
8211 if ((DS.getObjCDeclQualifier() &
8213 Results.AddResult("out");
8214 if (!AddedInOut)
8215 Results.AddResult("inout");
8216 }
8217 if ((DS.getObjCDeclQualifier() &
8219 ObjCDeclSpec::DQ_Oneway)) == 0) {
8220 Results.AddResult("bycopy");
8221 Results.AddResult("byref");
8222 Results.AddResult("oneway");
8223 }
8225 Results.AddResult("nonnull");
8226 Results.AddResult("nullable");
8227 Results.AddResult("null_unspecified");
8228 }
8229
8230 // If we're completing the return type of an Objective-C method and the
8231 // identifier IBAction refers to a macro, provide a completion item for
8232 // an action, e.g.,
8233 // IBAction)<#selector#>:(id)sender
8234 if (DS.getObjCDeclQualifier() == 0 && !IsParameter &&
8235 SemaRef.PP.isMacroDefined("IBAction")) {
8236 CodeCompletionBuilder Builder(Results.getAllocator(),
8237 Results.getCodeCompletionTUInfo(),
8239 Builder.AddTypedTextChunk("IBAction");
8240 Builder.AddChunk(CodeCompletionString::CK_RightParen);
8241 Builder.AddPlaceholderChunk("selector");
8242 Builder.AddChunk(CodeCompletionString::CK_Colon);
8243 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
8244 Builder.AddTextChunk("id");
8245 Builder.AddChunk(CodeCompletionString::CK_RightParen);
8246 Builder.AddTextChunk("sender");
8247 Results.AddResult(CodeCompletionResult(Builder.TakeString()));
8248 }
8249
8250 // If we're completing the return type, provide 'instancetype'.
8251 if (!IsParameter) {
8252 Results.AddResult(CodeCompletionResult("instancetype"));
8253 }
8254
8255 // Add various builtin type names and specifiers.
8257 Results.ExitScope();
8258
8259 // Add the various type names
8260 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
8261 CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
8262 SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
8263 CodeCompleter->includeGlobals(),
8264 CodeCompleter->loadExternal());
8265
8266 if (CodeCompleter->includeMacros())
8267 AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false);
8268
8270 Results.getCompletionContext(), Results.data(),
8271 Results.size());
8272}
8273
8274/// When we have an expression with type "id", we may assume
8275/// that it has some more-specific class type based on knowledge of
8276/// common uses of Objective-C. This routine returns that class type,
8277/// or NULL if no better result could be determined.
8279 auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
8280 if (!Msg)
8281 return nullptr;
8282
8283 Selector Sel = Msg->getSelector();
8284 if (Sel.isNull())
8285 return nullptr;
8286
8287 const IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0);
8288 if (!Id)
8289 return nullptr;
8290
8291 ObjCMethodDecl *Method = Msg->getMethodDecl();
8292 if (!Method)
8293 return nullptr;
8294
8295 // Determine the class that we're sending the message to.
8296 ObjCInterfaceDecl *IFace = nullptr;
8297 switch (Msg->getReceiverKind()) {
8299 if (const ObjCObjectType *ObjType =
8300 Msg->getClassReceiver()->getAs<ObjCObjectType>())
8301 IFace = ObjType->getInterface();
8302 break;
8303
8305 QualType T = Msg->getInstanceReceiver()->getType();
8306 if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
8307 IFace = Ptr->getInterfaceDecl();
8308 break;
8309 }
8310
8313 break;
8314 }
8315
8316 if (!IFace)
8317 return nullptr;
8318
8319 ObjCInterfaceDecl *Super = IFace->getSuperClass();
8320 if (Method->isInstanceMethod())
8321 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
8322 .Case("retain", IFace)
8323 .Case("strong", IFace)
8324 .Case("autorelease", IFace)
8325 .Case("copy", IFace)
8326 .Case("copyWithZone", IFace)
8327 .Case("mutableCopy", IFace)
8328 .Case("mutableCopyWithZone", IFace)
8329 .Case("awakeFromCoder", IFace)
8330 .Case("replacementObjectFromCoder", IFace)
8331 .Case("class", IFace)
8332 .Case("classForCoder", IFace)
8333 .Case("superclass", Super)
8334 .Default(nullptr);
8335
8336 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName())
8337 .Case("new", IFace)
8338 .Case("alloc", IFace)
8339 .Case("allocWithZone", IFace)
8340 .Case("class", IFace)
8341 .Case("superclass", Super)
8342 .Default(nullptr);
8343}
8344
8345// Add a special completion for a message send to "super", which fills in the
8346// most likely case of forwarding all of our arguments to the superclass
8347// function.
8348///
8349/// \param S The semantic analysis object.
8350///
8351/// \param NeedSuperKeyword Whether we need to prefix this completion with
8352/// the "super" keyword. Otherwise, we just need to provide the arguments.
8353///
8354/// \param SelIdents The identifiers in the selector that have already been
8355/// provided as arguments for a send to "super".
8356///
8357/// \param Results The set of results to augment.
8358///
8359/// \returns the Objective-C method declaration that would be invoked by
8360/// this "super" completion. If NULL, no completion was added.
8361static ObjCMethodDecl *
8362AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,
8364 ResultBuilder &Results) {
8365 ObjCMethodDecl *CurMethod = S.getCurMethodDecl();
8366 if (!CurMethod)
8367 return nullptr;
8368
8369 ObjCInterfaceDecl *Class = CurMethod->getClassInterface();
8370 if (!Class)
8371 return nullptr;
8372
8373 // Try to find a superclass method with the same selector.
8374 ObjCMethodDecl *SuperMethod = nullptr;
8375 while ((Class = Class->getSuperClass()) && !SuperMethod) {
8376 // Check in the class
8377 SuperMethod = Class->getMethod(CurMethod->getSelector(),
8378 CurMethod->isInstanceMethod());
8379
8380 // Check in categories or class extensions.
8381 if (!SuperMethod) {
8382 for (const auto *Cat : Class->known_categories()) {
8383 if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(),
8384 CurMethod->isInstanceMethod())))
8385 break;
8386 }
8387 }
8388 }
8389
8390 if (!SuperMethod)
8391 return nullptr;
8392
8393 // Check whether the superclass method has the same signature.
8394 if (CurMethod->param_size() != SuperMethod->param_size() ||
8395 CurMethod->isVariadic() != SuperMethod->isVariadic())
8396 return nullptr;
8397
8398 for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(),
8399 CurPEnd = CurMethod->param_end(),
8400 SuperP = SuperMethod->param_begin();
8401 CurP != CurPEnd; ++CurP, ++SuperP) {
8402 // Make sure the parameter types are compatible.
8403 if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(),
8404 (*SuperP)->getType()))
8405 return nullptr;
8406
8407 // Make sure we have a parameter name to forward!
8408 if (!(*CurP)->getIdentifier())
8409 return nullptr;
8410 }
8411
8412 // We have a superclass method. Now, form the send-to-super completion.
8413 CodeCompletionBuilder Builder(Results.getAllocator(),
8414 Results.getCodeCompletionTUInfo());
8415
8416 // Give this completion a return type.
8418 Results.getCompletionContext().getBaseType(), Builder);
8419
8420 // If we need the "super" keyword, add it (plus some spacing).
8421 if (NeedSuperKeyword) {
8422 Builder.AddTypedTextChunk("super");
8424 }
8425
8426 Selector Sel = CurMethod->getSelector();
8427 if (Sel.isUnarySelector()) {
8428 if (NeedSuperKeyword)
8429 Builder.AddTextChunk(
8430 Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
8431 else
8432 Builder.AddTypedTextChunk(
8433 Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
8434 } else {
8435 ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();
8436 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) {
8437 if (I > SelIdents.size())
8439
8440 if (I < SelIdents.size())
8441 Builder.AddInformativeChunk(
8442 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
8443 else if (NeedSuperKeyword || I > SelIdents.size()) {
8444 Builder.AddTextChunk(
8445 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
8446 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
8447 (*CurP)->getIdentifier()->getName()));
8448 } else {
8449 Builder.AddTypedTextChunk(
8450 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
8451 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
8452 (*CurP)->getIdentifier()->getName()));
8453 }
8454 }
8455 }
8456
8457 Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod,
8459 return SuperMethod;
8460}
8461
8464 ResultBuilder Results(
8465 SemaRef, CodeCompleter->getAllocator(),
8466 CodeCompleter->getCodeCompletionTUInfo(),
8469 ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
8470 : &ResultBuilder::IsObjCMessageReceiver);
8471
8472 CodeCompletionDeclConsumer Consumer(Results, SemaRef.CurContext);
8473 Results.EnterNewScope();
8474 SemaRef.LookupVisibleDecls(S, Sema::LookupOrdinaryName, Consumer,
8475 CodeCompleter->includeGlobals(),
8476 CodeCompleter->loadExternal());
8477
8478 // If we are in an Objective-C method inside a class that has a superclass,
8479 // add "super" as an option.
8480 if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl())
8481 if (ObjCInterfaceDecl *Iface = Method->getClassInterface())
8482 if (Iface->getSuperClass()) {
8483 Results.AddResult(Result("super"));
8484
8485 AddSuperSendCompletion(SemaRef, /*NeedSuperKeyword=*/true, {}, Results);
8486 }
8487
8489 addThisCompletion(SemaRef, Results);
8490
8491 Results.ExitScope();
8492
8493 if (CodeCompleter->includeMacros())
8494 AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), false);
8496 Results.getCompletionContext(), Results.data(),
8497 Results.size());
8498}
8499
8501 Scope *S, SourceLocation SuperLoc,
8502 ArrayRef<const IdentifierInfo *> SelIdents, bool AtArgumentExpression) {
8503 ObjCInterfaceDecl *CDecl = nullptr;
8504 if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) {
8505 // Figure out which interface we're in.
8506 CDecl = CurMethod->getClassInterface();
8507 if (!CDecl)
8508 return;
8509
8510 // Find the superclass of this class.
8511 CDecl = CDecl->getSuperClass();
8512 if (!CDecl)
8513 return;
8514
8515 if (CurMethod->isInstanceMethod()) {
8516 // We are inside an instance method, which means that the message
8517 // send [super ...] is actually calling an instance method on the
8518 // current object.
8519 return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents,
8520 AtArgumentExpression, CDecl);
8521 }
8522
8523 // Fall through to send to the superclass in CDecl.
8524 } else {
8525 // "super" may be the name of a type or variable. Figure out which
8526 // it is.
8527 const IdentifierInfo *Super = SemaRef.getSuperIdentifier();
8528 NamedDecl *ND =
8529 SemaRef.LookupSingleName(S, Super, SuperLoc, Sema::LookupOrdinaryName);
8530 if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
8531 // "super" names an interface. Use it.
8532 } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
8533 if (const ObjCObjectType *Iface =
8534 getASTContext().getTypeDeclType(TD)->getAs<ObjCObjectType>())
8535 CDecl = Iface->getInterface();
8536 } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
8537 // "super" names an unresolved type; we can't be more specific.
8538 } else {
8539 // Assume that "super" names some kind of value and parse that way.
8540 CXXScopeSpec SS;
8541 SourceLocation TemplateKWLoc;
8542 UnqualifiedId id;
8543 id.setIdentifier(Super, SuperLoc);
8544 ExprResult SuperExpr =
8545 SemaRef.ActOnIdExpression(S, SS, TemplateKWLoc, id,
8546 /*HasTrailingLParen=*/false,
8547 /*IsAddressOfOperand=*/false);
8548 return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(),
8549 SelIdents, AtArgumentExpression);
8550 }
8551
8552 // Fall through
8553 }
8554
8555 ParsedType Receiver;
8556 if (CDecl)
8557 Receiver = ParsedType::make(getASTContext().getObjCInterfaceType(CDecl));
8558 return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
8559 AtArgumentExpression,
8560 /*IsSuper=*/true);
8561}
8562
8563/// Given a set of code-completion results for the argument of a message
8564/// send, determine the preferred type (if any) for that argument expression.
8566 unsigned NumSelIdents) {
8568 ASTContext &Context = Results.getSema().Context;
8569
8570 QualType PreferredType;
8571 unsigned BestPriority = CCP_Unlikely * 2;
8572 Result *ResultsData = Results.data();
8573 for (unsigned I = 0, N = Results.size(); I != N; ++I) {
8574 Result &R = ResultsData[I];
8575 if (R.Kind == Result::RK_Declaration &&
8576 isa<ObjCMethodDecl>(R.Declaration)) {
8577 if (R.Priority <= BestPriority) {
8578 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration);
8579 if (NumSelIdents <= Method->param_size()) {
8580 QualType MyPreferredType =
8581 Method->parameters()[NumSelIdents - 1]->getType();
8582 if (R.Priority < BestPriority || PreferredType.isNull()) {
8583 BestPriority = R.Priority;
8584 PreferredType = MyPreferredType;
8585 } else if (!Context.hasSameUnqualifiedType(PreferredType,
8586 MyPreferredType)) {
8587 PreferredType = QualType();
8588 }
8589 }
8590 }
8591 }
8592 }
8593
8594 return PreferredType;
8595}
8596
8597static void
8600 bool AtArgumentExpression, bool IsSuper,
8601 ResultBuilder &Results) {
8603 ObjCInterfaceDecl *CDecl = nullptr;
8604
8605 // If the given name refers to an interface type, retrieve the
8606 // corresponding declaration.
8607 if (Receiver) {
8608 QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr);
8609 if (!T.isNull())
8610 if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>())
8611 CDecl = Interface->getInterface();
8612 }
8613
8614 // Add all of the factory methods in this Objective-C class, its protocols,
8615 // superclasses, categories, implementation, etc.
8616 Results.EnterNewScope();
8617
8618 // If this is a send-to-super, try to add the special "super" send
8619 // completion.
8620 if (IsSuper) {
8621 if (ObjCMethodDecl *SuperMethod =
8622 AddSuperSendCompletion(SemaRef, false, SelIdents, Results))
8623 Results.Ignore(SuperMethod);
8624 }
8625
8626 // If we're inside an Objective-C method definition, prefer its selector to
8627 // others.
8628 if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
8629 Results.setPreferredSelector(CurMethod->getSelector());
8630
8631 VisitedSelectorSet Selectors;
8632 if (CDecl)
8633 AddObjCMethods(CDecl, false, MK_Any, SelIdents, SemaRef.CurContext,
8634 Selectors, AtArgumentExpression, Results);
8635 else {
8636 // We're messaging "id" as a type; provide all class/factory methods.
8637
8638 // If we have an external source, load the entire class method
8639 // pool from the AST file.
8640 if (SemaRef.getExternalSource()) {
8641 for (uint32_t I = 0,
8643 I != N; ++I) {
8645 if (Sel.isNull() || SemaRef.ObjC().MethodPool.count(Sel))
8646 continue;
8647
8648 SemaRef.ObjC().ReadMethodPool(Sel);
8649 }
8650 }
8651
8652 for (SemaObjC::GlobalMethodPool::iterator
8653 M = SemaRef.ObjC().MethodPool.begin(),
8654 MEnd = SemaRef.ObjC().MethodPool.end();
8655 M != MEnd; ++M) {
8656 for (ObjCMethodList *MethList = &M->second.second;
8657 MethList && MethList->getMethod(); MethList = MethList->getNext()) {
8658 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
8659 continue;
8660
8661 Result R(MethList->getMethod(),
8662 Results.getBasePriority(MethList->getMethod()),
8663 /*Qualifier=*/std::nullopt);
8664 R.StartParameter = SelIdents.size();
8665 R.AllParametersAreInformative = false;
8666 Results.MaybeAddResult(R, SemaRef.CurContext);
8667 }
8668 }
8669 }
8670
8671 Results.ExitScope();
8672}
8673
8675 Scope *S, ParsedType Receiver, ArrayRef<const IdentifierInfo *> SelIdents,
8676 bool AtArgumentExpression, bool IsSuper) {
8677
8678 QualType T = SemaRef.GetTypeFromParser(Receiver);
8679
8680 ResultBuilder Results(
8681 SemaRef, CodeCompleter->getAllocator(),
8682 CodeCompleter->getCodeCompletionTUInfo(),
8684 SelIdents));
8685
8686 AddClassMessageCompletions(SemaRef, S, Receiver, SelIdents,
8687 AtArgumentExpression, IsSuper, Results);
8688
8689 // If we're actually at the argument expression (rather than prior to the
8690 // selector), we're actually performing code completion for an expression.
8691 // Determine whether we have a single, best method. If so, we can
8692 // code-complete the expression using the corresponding parameter type as
8693 // our preferred type, improving completion results.
8694 if (AtArgumentExpression) {
8695 QualType PreferredType =
8696 getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
8697 if (PreferredType.isNull())
8699 else
8700 CodeCompleteExpression(S, PreferredType);
8701 return;
8702 }
8703
8705 Results.getCompletionContext(), Results.data(),
8706 Results.size());
8707}
8708
8710 Scope *S, Expr *RecExpr, ArrayRef<const IdentifierInfo *> SelIdents,
8711 bool AtArgumentExpression, ObjCInterfaceDecl *Super) {
8713 ASTContext &Context = getASTContext();
8714
8715 // If necessary, apply function/array conversion to the receiver.
8716 // C99 6.7.5.3p[7,8].
8717 if (RecExpr) {
8718 // If the receiver expression has no type (e.g., a parenthesized C-style
8719 // cast that hasn't been resolved), bail out to avoid dereferencing a null
8720 // type.
8721 if (RecExpr->getType().isNull())
8722 return;
8723 ExprResult Conv = SemaRef.DefaultFunctionArrayLvalueConversion(RecExpr);
8724 if (Conv.isInvalid()) // conversion failed. bail.
8725 return;
8726 RecExpr = Conv.get();
8727 }
8728 QualType ReceiverType = RecExpr
8729 ? RecExpr->getType()
8730 : Super ? Context.getObjCObjectPointerType(
8731 Context.getObjCInterfaceType(Super))
8732 : Context.getObjCIdType();
8733
8734 // If we're messaging an expression with type "id" or "Class", check
8735 // whether we know something special about the receiver that allows
8736 // us to assume a more-specific receiver type.
8737 if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) {
8738 if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) {
8739 if (ReceiverType->isObjCClassType())
8741 S, ParsedType::make(Context.getObjCInterfaceType(IFace)), SelIdents,
8742 AtArgumentExpression, Super);
8743
8744 ReceiverType =
8745 Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace));
8746 }
8747 } else if (RecExpr && getLangOpts().CPlusPlus) {
8748 ExprResult Conv = SemaRef.PerformContextuallyConvertToObjCPointer(RecExpr);
8749 if (Conv.isUsable()) {
8750 RecExpr = Conv.get();
8751 ReceiverType = RecExpr->getType();
8752 }
8753 }
8754
8755 // Build the set of methods we can see.
8756 ResultBuilder Results(
8757 SemaRef, CodeCompleter->getAllocator(),
8758 CodeCompleter->getCodeCompletionTUInfo(),
8760 ReceiverType, SelIdents));
8761
8762 Results.EnterNewScope();
8763
8764 // If this is a send-to-super, try to add the special "super" send
8765 // completion.
8766 if (Super) {
8767 if (ObjCMethodDecl *SuperMethod =
8768 AddSuperSendCompletion(SemaRef, false, SelIdents, Results))
8769 Results.Ignore(SuperMethod);
8770 }
8771
8772 // If we're inside an Objective-C method definition, prefer its selector to
8773 // others.
8774 if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl())
8775 Results.setPreferredSelector(CurMethod->getSelector());
8776
8777 // Keep track of the selectors we've already added.
8778 VisitedSelectorSet Selectors;
8779
8780 // Handle messages to Class. This really isn't a message to an instance
8781 // method, so we treat it the same way we would treat a message send to a
8782 // class method.
8783 if (ReceiverType->isObjCClassType() ||
8784 ReceiverType->isObjCQualifiedClassType()) {
8785 if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) {
8786 if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface())
8787 AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, SemaRef.CurContext,
8788 Selectors, AtArgumentExpression, Results);
8789 }
8790 }
8791 // Handle messages to a qualified ID ("id<foo>").
8792 else if (const ObjCObjectPointerType *QualID =
8793 ReceiverType->getAsObjCQualifiedIdType()) {
8794 // Search protocols for instance methods.
8795 for (auto *I : QualID->quals())
8796 AddObjCMethods(I, true, MK_Any, SelIdents, SemaRef.CurContext, Selectors,
8797 AtArgumentExpression, Results);
8798 }
8799 // Handle messages to a pointer to interface type.
8800 else if (const ObjCObjectPointerType *IFacePtr =
8801 ReceiverType->getAsObjCInterfacePointerType()) {
8802 // Search the class, its superclasses, etc., for instance methods.
8803 AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents,
8804 SemaRef.CurContext, Selectors, AtArgumentExpression,
8805 Results);
8806
8807 // Search protocols for instance methods.
8808 for (auto *I : IFacePtr->quals())
8809 AddObjCMethods(I, true, MK_Any, SelIdents, SemaRef.CurContext, Selectors,
8810 AtArgumentExpression, Results);
8811 }
8812 // Handle messages to "id".
8813 else if (ReceiverType->isObjCIdType()) {
8814 // We're messaging "id", so provide all instance methods we know
8815 // about as code-completion results.
8816
8817 // If we have an external source, load the entire class method
8818 // pool from the AST file.
8819 if (SemaRef.ExternalSource) {
8820 for (uint32_t I = 0,
8821 N = SemaRef.ExternalSource->GetNumExternalSelectors();
8822 I != N; ++I) {
8823 Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I);
8824 if (Sel.isNull() || SemaRef.ObjC().MethodPool.count(Sel))
8825 continue;
8826
8827 SemaRef.ObjC().ReadMethodPool(Sel);
8828 }
8829 }
8830
8831 for (SemaObjC::GlobalMethodPool::iterator
8832 M = SemaRef.ObjC().MethodPool.begin(),
8833 MEnd = SemaRef.ObjC().MethodPool.end();
8834 M != MEnd; ++M) {
8835 for (ObjCMethodList *MethList = &M->second.first;
8836 MethList && MethList->getMethod(); MethList = MethList->getNext()) {
8837 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
8838 continue;
8839
8840 if (!Selectors.insert(MethList->getMethod()->getSelector()).second)
8841 continue;
8842
8843 Result R(MethList->getMethod(),
8844 Results.getBasePriority(MethList->getMethod()),
8845 /*Qualifier=*/std::nullopt);
8846 R.StartParameter = SelIdents.size();
8847 R.AllParametersAreInformative = false;
8848 Results.MaybeAddResult(R, SemaRef.CurContext);
8849 }
8850 }
8851 }
8852 Results.ExitScope();
8853
8854 // If we're actually at the argument expression (rather than prior to the
8855 // selector), we're actually performing code completion for an expression.
8856 // Determine whether we have a single, best method. If so, we can
8857 // code-complete the expression using the corresponding parameter type as
8858 // our preferred type, improving completion results.
8859 if (AtArgumentExpression) {
8860 QualType PreferredType =
8861 getPreferredArgumentTypeForMessageSend(Results, SelIdents.size());
8862 if (PreferredType.isNull())
8864 else
8865 CodeCompleteExpression(S, PreferredType);
8866 return;
8867 }
8868
8870 Results.getCompletionContext(), Results.data(),
8871 Results.size());
8872}
8873
8875 Scope *S, DeclGroupPtrTy IterationVar) {
8877 Data.ObjCCollection = true;
8878
8879 if (IterationVar.getAsOpaquePtr()) {
8880 DeclGroupRef DG = IterationVar.get();
8881 for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {
8882 if (*I)
8883 Data.IgnoreDecls.push_back(*I);
8884 }
8885 }
8886
8888}
8889
8892 // If we have an external source, load the entire class method
8893 // pool from the AST file.
8894 if (SemaRef.ExternalSource) {
8895 for (uint32_t I = 0, N = SemaRef.ExternalSource->GetNumExternalSelectors();
8896 I != N; ++I) {
8897 Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I);
8898 if (Sel.isNull() || SemaRef.ObjC().MethodPool.count(Sel))
8899 continue;
8900
8901 SemaRef.ObjC().ReadMethodPool(Sel);
8902 }
8903 }
8904
8905 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8906 CodeCompleter->getCodeCompletionTUInfo(),
8908 Results.EnterNewScope();
8909 for (SemaObjC::GlobalMethodPool::iterator
8910 M = SemaRef.ObjC().MethodPool.begin(),
8911 MEnd = SemaRef.ObjC().MethodPool.end();
8912 M != MEnd; ++M) {
8913
8914 Selector Sel = M->first;
8915 if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents))
8916 continue;
8917
8918 CodeCompletionBuilder Builder(Results.getAllocator(),
8919 Results.getCodeCompletionTUInfo());
8920 if (Sel.isUnarySelector()) {
8921 Builder.AddTypedTextChunk(
8922 Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
8923 Results.AddResult(Builder.TakeString());
8924 continue;
8925 }
8926
8927 std::string Accumulator;
8928 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) {
8929 if (I == SelIdents.size()) {
8930 if (!Accumulator.empty()) {
8931 Builder.AddInformativeChunk(
8932 Builder.getAllocator().CopyString(Accumulator));
8933 Accumulator.clear();
8934 }
8935 }
8936
8937 Accumulator += Sel.getNameForSlot(I);
8938 Accumulator += ':';
8939 }
8940 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator));
8941 Results.AddResult(Builder.TakeString());
8942 }
8943 Results.ExitScope();
8944
8946 Results.getCompletionContext(), Results.data(),
8947 Results.size());
8948}
8949
8950/// Add all of the protocol declarations that we find in the given
8951/// (translation unit) context.
8952static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext,
8953 bool OnlyForwardDeclarations,
8954 ResultBuilder &Results) {
8956
8957 for (const auto *D : Ctx->decls()) {
8958 // Record any protocols we find.
8959 if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D))
8960 if (!OnlyForwardDeclarations || !Proto->hasDefinition())
8961 Results.AddResult(Result(Proto, Results.getBasePriority(Proto),
8962 /*Qualifier=*/std::nullopt),
8963 CurContext, nullptr, false);
8964 }
8965}
8966
8968 ArrayRef<IdentifierLoc> Protocols) {
8969 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8970 CodeCompleter->getCodeCompletionTUInfo(),
8972
8973 if (CodeCompleter->includeGlobals()) {
8974 Results.EnterNewScope();
8975
8976 // Tell the result set to ignore all of the protocols we have
8977 // already seen.
8978 // FIXME: This doesn't work when caching code-completion results.
8979 for (const IdentifierLoc &Pair : Protocols)
8980 if (ObjCProtocolDecl *Protocol = SemaRef.ObjC().LookupProtocol(
8981 Pair.getIdentifierInfo(), Pair.getLoc()))
8982 Results.Ignore(Protocol);
8983
8984 // Add all protocols.
8985 AddProtocolResults(getASTContext().getTranslationUnitDecl(),
8986 SemaRef.CurContext, false, Results);
8987
8988 Results.ExitScope();
8989 }
8990
8992 Results.getCompletionContext(), Results.data(),
8993 Results.size());
8994}
8995
8997 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8998 CodeCompleter->getCodeCompletionTUInfo(),
9000
9001 if (CodeCompleter->includeGlobals()) {
9002 Results.EnterNewScope();
9003
9004 // Add all protocols.
9005 AddProtocolResults(getASTContext().getTranslationUnitDecl(),
9006 SemaRef.CurContext, true, Results);
9007
9008 Results.ExitScope();
9009 }
9010
9012 Results.getCompletionContext(), Results.data(),
9013 Results.size());
9014}
9015
9016/// Add all of the Objective-C interface declarations that we find in
9017/// the given (translation unit) context.
9018static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext,
9019 bool OnlyForwardDeclarations,
9020 bool OnlyUnimplemented,
9021 ResultBuilder &Results) {
9023
9024 for (const auto *D : Ctx->decls()) {
9025 // Record any interfaces we find.
9026 if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
9027 if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
9028 (!OnlyUnimplemented || !Class->getImplementation()))
9029 Results.AddResult(Result(Class, Results.getBasePriority(Class),
9030 /*Qualifier=*/std::nullopt),
9031 CurContext, nullptr, false);
9032 }
9033}
9034
9036 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9037 CodeCompleter->getCodeCompletionTUInfo(),
9039 Results.EnterNewScope();
9040
9041 if (CodeCompleter->includeGlobals()) {
9042 // Add all classes.
9043 AddInterfaceResults(getASTContext().getTranslationUnitDecl(),
9044 SemaRef.CurContext, false, false, Results);
9045 }
9046
9047 Results.ExitScope();
9048
9050 Results.getCompletionContext(), Results.data(),
9051 Results.size());
9052}
9053
9055 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9056 CodeCompleter->getCodeCompletionTUInfo(),
9058 Results.EnterNewScope();
9059
9060 if (CodeCompleter->includeGlobals()) {
9061 // Add all classes.
9062 AddInterfaceResults(getASTContext().getTranslationUnitDecl(),
9063 SemaRef.CurContext, false, false, Results);
9064 }
9065
9066 Results.ExitScope();
9067
9069 Results.getCompletionContext(), Results.data(),
9070 Results.size());
9071}
9072
9074 Scope *S, IdentifierInfo *ClassName, SourceLocation ClassNameLoc) {
9075 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9076 CodeCompleter->getCodeCompletionTUInfo(),
9078 Results.EnterNewScope();
9079
9080 // Make sure that we ignore the class we're currently defining.
9081 NamedDecl *CurClass = SemaRef.LookupSingleName(
9082 SemaRef.TUScope, ClassName, ClassNameLoc, Sema::LookupOrdinaryName);
9083 if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
9084 Results.Ignore(CurClass);
9085
9086 if (CodeCompleter->includeGlobals()) {
9087 // Add all classes.
9088 AddInterfaceResults(getASTContext().getTranslationUnitDecl(),
9089 SemaRef.CurContext, false, false, Results);
9090 }
9091
9092 Results.ExitScope();
9093
9095 Results.getCompletionContext(), Results.data(),
9096 Results.size());
9097}
9098
9100 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9101 CodeCompleter->getCodeCompletionTUInfo(),
9103 Results.EnterNewScope();
9104
9105 if (CodeCompleter->includeGlobals()) {
9106 // Add all unimplemented classes.
9107 AddInterfaceResults(getASTContext().getTranslationUnitDecl(),
9108 SemaRef.CurContext, false, true, Results);
9109 }
9110
9111 Results.ExitScope();
9112
9114 Results.getCompletionContext(), Results.data(),
9115 Results.size());
9116}
9117
9119 Scope *S, IdentifierInfo *ClassName, SourceLocation ClassNameLoc) {
9121
9122 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9123 CodeCompleter->getCodeCompletionTUInfo(),
9125
9126 // Ignore any categories we find that have already been implemented by this
9127 // interface.
9129 NamedDecl *CurClass = SemaRef.LookupSingleName(
9130 SemaRef.TUScope, ClassName, ClassNameLoc, Sema::LookupOrdinaryName);
9132 dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) {
9133 for (const auto *Cat : Class->visible_categories())
9134 CategoryNames.insert(Cat->getIdentifier());
9135 }
9136
9137 // Add all of the categories we know about.
9138 Results.EnterNewScope();
9139 TranslationUnitDecl *TU = getASTContext().getTranslationUnitDecl();
9140 for (const auto *D : TU->decls())
9141 if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D))
9142 if (CategoryNames.insert(Category->getIdentifier()).second)
9143 Results.AddResult(Result(Category, Results.getBasePriority(Category),
9144 /*Qualifier=*/std::nullopt),
9145 SemaRef.CurContext, nullptr, false);
9146 Results.ExitScope();
9147
9149 Results.getCompletionContext(), Results.data(),
9150 Results.size());
9151}
9152
9154 Scope *S, IdentifierInfo *ClassName, SourceLocation ClassNameLoc) {
9156
9157 // Find the corresponding interface. If we couldn't find the interface, the
9158 // program itself is ill-formed. However, we'll try to be helpful still by
9159 // providing the list of all of the categories we know about.
9160 NamedDecl *CurClass = SemaRef.LookupSingleName(
9161 SemaRef.TUScope, ClassName, ClassNameLoc, Sema::LookupOrdinaryName);
9162 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass);
9163 if (!Class)
9164 return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
9165
9166 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9167 CodeCompleter->getCodeCompletionTUInfo(),
9169
9170 // Add all of the categories that have corresponding interface
9171 // declarations in this class and any of its superclasses, except for
9172 // already-implemented categories in the class itself.
9174 Results.EnterNewScope();
9175 bool IgnoreImplemented = true;
9176 while (Class) {
9177 for (const auto *Cat : Class->visible_categories()) {
9178 if ((!IgnoreImplemented || !Cat->getImplementation()) &&
9179 CategoryNames.insert(Cat->getIdentifier()).second)
9180 Results.AddResult(Result(Cat, Results.getBasePriority(Cat),
9181 /*Qualifier=*/std::nullopt),
9182 SemaRef.CurContext, nullptr, false);
9183 }
9184
9185 Class = Class->getSuperClass();
9186 IgnoreImplemented = false;
9187 }
9188 Results.ExitScope();
9189
9191 Results.getCompletionContext(), Results.data(),
9192 Results.size());
9193}
9194
9197 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9198 CodeCompleter->getCodeCompletionTUInfo(), CCContext);
9199
9200 // Figure out where this @synthesize lives.
9201 ObjCContainerDecl *Container =
9202 dyn_cast_or_null<ObjCContainerDecl>(SemaRef.CurContext);
9203 if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
9204 !isa<ObjCCategoryImplDecl>(Container)))
9205 return;
9206
9207 // Ignore any properties that have already been implemented.
9208 Container = getContainerDef(Container);
9209 for (const auto *D : Container->decls())
9210 if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D))
9211 Results.Ignore(PropertyImpl->getPropertyDecl());
9212
9213 // Add any properties that we find.
9214 AddedPropertiesSet AddedProperties;
9215 Results.EnterNewScope();
9216 if (ObjCImplementationDecl *ClassImpl =
9217 dyn_cast<ObjCImplementationDecl>(Container))
9218 AddObjCProperties(CCContext, ClassImpl->getClassInterface(), false,
9219 /*AllowNullaryMethods=*/false, SemaRef.CurContext,
9220 AddedProperties, Results);
9221 else
9222 AddObjCProperties(CCContext,
9223 cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
9224 false, /*AllowNullaryMethods=*/false, SemaRef.CurContext,
9225 AddedProperties, Results);
9226 Results.ExitScope();
9227
9229 Results.getCompletionContext(), Results.data(),
9230 Results.size());
9231}
9232
9234 Scope *S, IdentifierInfo *PropertyName) {
9236 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9237 CodeCompleter->getCodeCompletionTUInfo(),
9239
9240 // Figure out where this @synthesize lives.
9241 ObjCContainerDecl *Container =
9242 dyn_cast_or_null<ObjCContainerDecl>(SemaRef.CurContext);
9243 if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
9244 !isa<ObjCCategoryImplDecl>(Container)))
9245 return;
9246
9247 // Figure out which interface we're looking into.
9248 ObjCInterfaceDecl *Class = nullptr;
9249 if (ObjCImplementationDecl *ClassImpl =
9250 dyn_cast<ObjCImplementationDecl>(Container))
9251 Class = ClassImpl->getClassInterface();
9252 else
9254 ->getCategoryDecl()
9255 ->getClassInterface();
9256
9257 // Determine the type of the property we're synthesizing.
9258 QualType PropertyType = getASTContext().getObjCIdType();
9259 if (Class) {
9260 if (ObjCPropertyDecl *Property = Class->FindPropertyDeclaration(
9262 PropertyType =
9263 Property->getType().getNonReferenceType().getUnqualifiedType();
9264
9265 // Give preference to ivars
9266 Results.setPreferredType(PropertyType);
9267 }
9268 }
9269
9270 // Add all of the instance variables in this class and its superclasses.
9271 Results.EnterNewScope();
9272 bool SawSimilarlyNamedIvar = false;
9273 std::string NameWithPrefix;
9274 NameWithPrefix += '_';
9275 NameWithPrefix += PropertyName->getName();
9276 std::string NameWithSuffix = PropertyName->getName().str();
9277 NameWithSuffix += '_';
9278 for (; Class; Class = Class->getSuperClass()) {
9279 for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar;
9280 Ivar = Ivar->getNextIvar()) {
9281 Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar),
9282 /*Qualifier=*/std::nullopt),
9283 SemaRef.CurContext, nullptr, false);
9284
9285 // Determine whether we've seen an ivar with a name similar to the
9286 // property.
9287 if ((PropertyName == Ivar->getIdentifier() ||
9288 NameWithPrefix == Ivar->getName() ||
9289 NameWithSuffix == Ivar->getName())) {
9290 SawSimilarlyNamedIvar = true;
9291
9292 // Reduce the priority of this result by one, to give it a slight
9293 // advantage over other results whose names don't match so closely.
9294 if (Results.size() &&
9295 Results.data()[Results.size() - 1].Kind ==
9297 Results.data()[Results.size() - 1].Declaration == Ivar)
9298 Results.data()[Results.size() - 1].Priority--;
9299 }
9300 }
9301 }
9302
9303 if (!SawSimilarlyNamedIvar) {
9304 // Create ivar result _propName, that the user can use to synthesize
9305 // an ivar of the appropriate type.
9306 unsigned Priority = CCP_MemberDeclaration + 1;
9308 CodeCompletionAllocator &Allocator = Results.getAllocator();
9309 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(),
9310 Priority, CXAvailability_Available);
9311
9313 Builder.AddResultTypeChunk(GetCompletionTypeString(
9314 PropertyType, getASTContext(), Policy, Allocator));
9315 Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
9316 Results.AddResult(
9317 Result(Builder.TakeString(), Priority, CXCursor_ObjCIvarDecl));
9318 }
9319
9320 Results.ExitScope();
9321
9323 Results.getCompletionContext(), Results.data(),
9324 Results.size());
9325}
9326
9327// Mapping from selectors to the methods that implement that selector, along
9328// with the "in original class" flag.
9329typedef llvm::DenseMap<Selector,
9330 llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>>
9332
9333/// Find all of the methods that reside in the given container
9334/// (and its superclasses, protocols, etc.) that meet the given
9335/// criteria. Insert those methods into the map of known methods,
9336/// indexed by selector so they can be easily found.
9338 ObjCContainerDecl *Container,
9339 std::optional<bool> WantInstanceMethods,
9340 QualType ReturnType,
9341 KnownMethodsMap &KnownMethods,
9342 bool InOriginalClass = true) {
9343 if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) {
9344 // Make sure we have a definition; that's what we'll walk.
9345 if (!IFace->hasDefinition())
9346 return;
9347
9348 IFace = IFace->getDefinition();
9349 Container = IFace;
9350
9351 const ObjCList<ObjCProtocolDecl> &Protocols =
9352 IFace->getReferencedProtocols();
9353 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
9354 E = Protocols.end();
9355 I != E; ++I)
9356 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
9357 KnownMethods, InOriginalClass);
9358
9359 // Add methods from any class extensions and categories.
9360 for (auto *Cat : IFace->visible_categories()) {
9361 FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType,
9362 KnownMethods, false);
9363 }
9364
9365 // Visit the superclass.
9366 if (IFace->getSuperClass())
9367 FindImplementableMethods(Context, IFace->getSuperClass(),
9368 WantInstanceMethods, ReturnType, KnownMethods,
9369 false);
9370 }
9371
9372 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
9373 // Recurse into protocols.
9374 const ObjCList<ObjCProtocolDecl> &Protocols =
9375 Category->getReferencedProtocols();
9376 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
9377 E = Protocols.end();
9378 I != E; ++I)
9379 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
9380 KnownMethods, InOriginalClass);
9381
9382 // If this category is the original class, jump to the interface.
9383 if (InOriginalClass && Category->getClassInterface())
9384 FindImplementableMethods(Context, Category->getClassInterface(),
9385 WantInstanceMethods, ReturnType, KnownMethods,
9386 false);
9387 }
9388
9389 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
9390 // Make sure we have a definition; that's what we'll walk.
9391 if (!Protocol->hasDefinition())
9392 return;
9393 Protocol = Protocol->getDefinition();
9394 Container = Protocol;
9395
9396 // Recurse into protocols.
9397 const ObjCList<ObjCProtocolDecl> &Protocols =
9398 Protocol->getReferencedProtocols();
9399 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
9400 E = Protocols.end();
9401 I != E; ++I)
9402 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType,
9403 KnownMethods, false);
9404 }
9405
9406 // Add methods in this container. This operation occurs last because
9407 // we want the methods from this container to override any methods
9408 // we've previously seen with the same selector.
9409 for (auto *M : Container->methods()) {
9410 if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) {
9411 if (!ReturnType.isNull() &&
9412 !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType()))
9413 continue;
9414
9415 KnownMethods[M->getSelector()] =
9416 KnownMethodsMap::mapped_type(M, InOriginalClass);
9417 }
9418 }
9419}
9420
9421/// Add the parenthesized return or parameter type chunk to a code
9422/// completion string.
9423static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals,
9424 ASTContext &Context,
9425 const PrintingPolicy &Policy,
9426 CodeCompletionBuilder &Builder) {
9427 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9428 std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals, Type);
9429 if (!Quals.empty())
9430 Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
9431 Builder.AddTextChunk(
9432 GetCompletionTypeString(Type, Context, Policy, Builder.getAllocator()));
9433 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9434}
9435
9436/// Determine whether the given class is or inherits from a class by
9437/// the given name.
9438static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name) {
9439 if (!Class)
9440 return false;
9441
9442 if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
9443 return true;
9444
9445 return InheritsFromClassNamed(Class->getSuperClass(), Name);
9446}
9447
9448/// Add code completions for Objective-C Key-Value Coding (KVC) and
9449/// Key-Value Observing (KVO).
9451 bool IsInstanceMethod,
9452 QualType ReturnType, ASTContext &Context,
9453 VisitedSelectorSet &KnownSelectors,
9454 ResultBuilder &Results) {
9455 IdentifierInfo *PropName = Property->getIdentifier();
9456 if (!PropName || PropName->getLength() == 0)
9457 return;
9458
9459 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema());
9460
9461 // Builder that will create each code completion.
9463 CodeCompletionAllocator &Allocator = Results.getAllocator();
9464 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo());
9465
9466 // The selector table.
9467 SelectorTable &Selectors = Context.Selectors;
9468
9469 // The property name, copied into the code completion allocation region
9470 // on demand.
9471 struct KeyHolder {
9472 CodeCompletionAllocator &Allocator;
9473 StringRef Key;
9474 const char *CopiedKey;
9475
9476 KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key)
9477 : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {}
9478
9479 operator const char *() {
9480 if (CopiedKey)
9481 return CopiedKey;
9482
9483 return CopiedKey = Allocator.CopyString(Key);
9484 }
9485 } Key(Allocator, PropName->getName());
9486
9487 // The uppercased name of the property name.
9488 std::string UpperKey = std::string(PropName->getName());
9489 if (!UpperKey.empty())
9490 UpperKey[0] = toUppercase(UpperKey[0]);
9491
9492 bool ReturnTypeMatchesProperty =
9493 ReturnType.isNull() ||
9494 Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(),
9495 Property->getType());
9496 bool ReturnTypeMatchesVoid = ReturnType.isNull() || ReturnType->isVoidType();
9497
9498 // Add the normal accessor -(type)key.
9499 if (IsInstanceMethod &&
9500 KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second &&
9501 ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
9502 if (ReturnType.isNull())
9503 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
9504 Builder);
9505
9506 Builder.AddTypedTextChunk(Key);
9507 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
9509 }
9510
9511 // If we have an integral or boolean property (or the user has provided
9512 // an integral or boolean return type), add the accessor -(type)isKey.
9513 if (IsInstanceMethod &&
9514 ((!ReturnType.isNull() &&
9515 (ReturnType->isIntegerType() || ReturnType->isBooleanType())) ||
9516 (ReturnType.isNull() && (Property->getType()->isIntegerType() ||
9517 Property->getType()->isBooleanType())))) {
9518 std::string SelectorName = (Twine("is") + UpperKey).str();
9519 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9520 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
9521 .second) {
9522 if (ReturnType.isNull()) {
9523 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9524 Builder.AddTextChunk("BOOL");
9525 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9526 }
9527
9528 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
9529 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
9531 }
9532 }
9533
9534 // Add the normal mutator.
9535 if (IsInstanceMethod && ReturnTypeMatchesVoid &&
9536 !Property->getSetterMethodDecl()) {
9537 std::string SelectorName = (Twine("set") + UpperKey).str();
9538 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9539 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9540 if (ReturnType.isNull()) {
9541 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9542 Builder.AddTextChunk("void");
9543 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9544 }
9545
9546 Builder.AddTypedTextChunk(
9547 Allocator.CopyString(SelectorId->getName() + ":"));
9548 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy,
9549 Builder);
9550 Builder.AddTextChunk(Key);
9551 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
9553 }
9554 }
9555
9556 // Indexed and unordered accessors
9557 unsigned IndexedGetterPriority = CCP_CodePattern;
9558 unsigned IndexedSetterPriority = CCP_CodePattern;
9559 unsigned UnorderedGetterPriority = CCP_CodePattern;
9560 unsigned UnorderedSetterPriority = CCP_CodePattern;
9561 if (const auto *ObjCPointer =
9562 Property->getType()->getAs<ObjCObjectPointerType>()) {
9563 if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) {
9564 // If this interface type is not provably derived from a known
9565 // collection, penalize the corresponding completions.
9566 if (!InheritsFromClassNamed(IFace, "NSMutableArray")) {
9567 IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
9568 if (!InheritsFromClassNamed(IFace, "NSArray"))
9569 IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
9570 }
9571
9572 if (!InheritsFromClassNamed(IFace, "NSMutableSet")) {
9573 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
9574 if (!InheritsFromClassNamed(IFace, "NSSet"))
9575 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
9576 }
9577 }
9578 } else {
9579 IndexedGetterPriority += CCD_ProbablyNotObjCCollection;
9580 IndexedSetterPriority += CCD_ProbablyNotObjCCollection;
9581 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection;
9582 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection;
9583 }
9584
9585 // Add -(NSUInteger)countOf<key>
9586 if (IsInstanceMethod &&
9587 (ReturnType.isNull() || ReturnType->isIntegerType())) {
9588 std::string SelectorName = (Twine("countOf") + UpperKey).str();
9589 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9590 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
9591 .second) {
9592 if (ReturnType.isNull()) {
9593 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9594 Builder.AddTextChunk("NSUInteger");
9595 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9596 }
9597
9598 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName()));
9599 Results.AddResult(
9600 Result(Builder.TakeString(),
9601 std::min(IndexedGetterPriority, UnorderedGetterPriority),
9603 }
9604 }
9605
9606 // Indexed getters
9607 // Add -(id)objectInKeyAtIndex:(NSUInteger)index
9608 if (IsInstanceMethod &&
9609 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
9610 std::string SelectorName = (Twine("objectIn") + UpperKey + "AtIndex").str();
9611 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9612 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9613 if (ReturnType.isNull()) {
9614 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9615 Builder.AddTextChunk("id");
9616 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9617 }
9618
9619 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9620 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9621 Builder.AddTextChunk("NSUInteger");
9622 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9623 Builder.AddTextChunk("index");
9624 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
9626 }
9627 }
9628
9629 // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes
9630 if (IsInstanceMethod &&
9631 (ReturnType.isNull() ||
9632 (ReturnType->isObjCObjectPointerType() &&
9633 ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
9634 ReturnType->castAs<ObjCObjectPointerType>()
9636 ->getName() == "NSArray"))) {
9637 std::string SelectorName = (Twine(Property->getName()) + "AtIndexes").str();
9638 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9639 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9640 if (ReturnType.isNull()) {
9641 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9642 Builder.AddTextChunk("NSArray *");
9643 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9644 }
9645
9646 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9647 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9648 Builder.AddTextChunk("NSIndexSet *");
9649 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9650 Builder.AddTextChunk("indexes");
9651 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
9653 }
9654 }
9655
9656 // Add -(void)getKey:(type **)buffer range:(NSRange)inRange
9657 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9658 std::string SelectorName = (Twine("get") + UpperKey).str();
9659 const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
9660 &Context.Idents.get("range")};
9661
9662 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
9663 if (ReturnType.isNull()) {
9664 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9665 Builder.AddTextChunk("void");
9666 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9667 }
9668
9669 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9670 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9671 Builder.AddPlaceholderChunk("object-type");
9672 Builder.AddTextChunk(" **");
9673 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9674 Builder.AddTextChunk("buffer");
9676 Builder.AddTypedTextChunk("range:");
9677 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9678 Builder.AddTextChunk("NSRange");
9679 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9680 Builder.AddTextChunk("inRange");
9681 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority,
9683 }
9684 }
9685
9686 // Mutable indexed accessors
9687
9688 // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index
9689 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9690 std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str();
9691 const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get("insertObject"),
9692 &Context.Idents.get(SelectorName)};
9693
9694 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
9695 if (ReturnType.isNull()) {
9696 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9697 Builder.AddTextChunk("void");
9698 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9699 }
9700
9701 Builder.AddTypedTextChunk("insertObject:");
9702 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9703 Builder.AddPlaceholderChunk("object-type");
9704 Builder.AddTextChunk(" *");
9705 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9706 Builder.AddTextChunk("object");
9708 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9709 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9710 Builder.AddPlaceholderChunk("NSUInteger");
9711 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9712 Builder.AddTextChunk("index");
9713 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9715 }
9716 }
9717
9718 // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes
9719 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9720 std::string SelectorName = (Twine("insert") + UpperKey).str();
9721 const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
9722 &Context.Idents.get("atIndexes")};
9723
9724 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
9725 if (ReturnType.isNull()) {
9726 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9727 Builder.AddTextChunk("void");
9728 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9729 }
9730
9731 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9732 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9733 Builder.AddTextChunk("NSArray *");
9734 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9735 Builder.AddTextChunk("array");
9737 Builder.AddTypedTextChunk("atIndexes:");
9738 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9739 Builder.AddPlaceholderChunk("NSIndexSet *");
9740 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9741 Builder.AddTextChunk("indexes");
9742 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9744 }
9745 }
9746
9747 // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index
9748 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9749 std::string SelectorName =
9750 (Twine("removeObjectFrom") + UpperKey + "AtIndex").str();
9751 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9752 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9753 if (ReturnType.isNull()) {
9754 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9755 Builder.AddTextChunk("void");
9756 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9757 }
9758
9759 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9760 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9761 Builder.AddTextChunk("NSUInteger");
9762 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9763 Builder.AddTextChunk("index");
9764 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9766 }
9767 }
9768
9769 // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes
9770 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9771 std::string SelectorName = (Twine("remove") + UpperKey + "AtIndexes").str();
9772 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9773 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9774 if (ReturnType.isNull()) {
9775 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9776 Builder.AddTextChunk("void");
9777 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9778 }
9779
9780 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9781 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9782 Builder.AddTextChunk("NSIndexSet *");
9783 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9784 Builder.AddTextChunk("indexes");
9785 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9787 }
9788 }
9789
9790 // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object
9791 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9792 std::string SelectorName =
9793 (Twine("replaceObjectIn") + UpperKey + "AtIndex").str();
9794 const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
9795 &Context.Idents.get("withObject")};
9796
9797 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
9798 if (ReturnType.isNull()) {
9799 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9800 Builder.AddTextChunk("void");
9801 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9802 }
9803
9804 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9805 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9806 Builder.AddPlaceholderChunk("NSUInteger");
9807 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9808 Builder.AddTextChunk("index");
9810 Builder.AddTypedTextChunk("withObject:");
9811 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9812 Builder.AddTextChunk("id");
9813 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9814 Builder.AddTextChunk("object");
9815 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9817 }
9818 }
9819
9820 // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array
9821 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9822 std::string SelectorName1 =
9823 (Twine("replace") + UpperKey + "AtIndexes").str();
9824 std::string SelectorName2 = (Twine("with") + UpperKey).str();
9825 const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1),
9826 &Context.Idents.get(SelectorName2)};
9827
9828 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) {
9829 if (ReturnType.isNull()) {
9830 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9831 Builder.AddTextChunk("void");
9832 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9833 }
9834
9835 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":"));
9836 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9837 Builder.AddPlaceholderChunk("NSIndexSet *");
9838 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9839 Builder.AddTextChunk("indexes");
9841 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":"));
9842 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9843 Builder.AddTextChunk("NSArray *");
9844 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9845 Builder.AddTextChunk("array");
9846 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority,
9848 }
9849 }
9850
9851 // Unordered getters
9852 // - (NSEnumerator *)enumeratorOfKey
9853 if (IsInstanceMethod &&
9854 (ReturnType.isNull() ||
9855 (ReturnType->isObjCObjectPointerType() &&
9856 ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
9857 ReturnType->castAs<ObjCObjectPointerType>()
9859 ->getName() == "NSEnumerator"))) {
9860 std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str();
9861 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9862 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
9863 .second) {
9864 if (ReturnType.isNull()) {
9865 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9866 Builder.AddTextChunk("NSEnumerator *");
9867 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9868 }
9869
9870 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
9871 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
9873 }
9874 }
9875
9876 // - (type *)memberOfKey:(type *)object
9877 if (IsInstanceMethod &&
9878 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) {
9879 std::string SelectorName = (Twine("memberOf") + UpperKey).str();
9880 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9881 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9882 if (ReturnType.isNull()) {
9883 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9884 Builder.AddPlaceholderChunk("object-type");
9885 Builder.AddTextChunk(" *");
9886 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9887 }
9888
9889 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9890 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9891 if (ReturnType.isNull()) {
9892 Builder.AddPlaceholderChunk("object-type");
9893 Builder.AddTextChunk(" *");
9894 } else {
9895 Builder.AddTextChunk(GetCompletionTypeString(
9896 ReturnType, Context, Policy, Builder.getAllocator()));
9897 }
9898 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9899 Builder.AddTextChunk("object");
9900 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority,
9902 }
9903 }
9904
9905 // Mutable unordered accessors
9906 // - (void)addKeyObject:(type *)object
9907 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9908 std::string SelectorName =
9909 (Twine("add") + UpperKey + Twine("Object")).str();
9910 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9911 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9912 if (ReturnType.isNull()) {
9913 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9914 Builder.AddTextChunk("void");
9915 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9916 }
9917
9918 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9919 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9920 Builder.AddPlaceholderChunk("object-type");
9921 Builder.AddTextChunk(" *");
9922 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9923 Builder.AddTextChunk("object");
9924 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
9926 }
9927 }
9928
9929 // - (void)addKey:(NSSet *)objects
9930 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9931 std::string SelectorName = (Twine("add") + UpperKey).str();
9932 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9933 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9934 if (ReturnType.isNull()) {
9935 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9936 Builder.AddTextChunk("void");
9937 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9938 }
9939
9940 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9941 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9942 Builder.AddTextChunk("NSSet *");
9943 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9944 Builder.AddTextChunk("objects");
9945 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
9947 }
9948 }
9949
9950 // - (void)removeKeyObject:(type *)object
9951 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9952 std::string SelectorName =
9953 (Twine("remove") + UpperKey + Twine("Object")).str();
9954 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9955 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9956 if (ReturnType.isNull()) {
9957 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9958 Builder.AddTextChunk("void");
9959 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9960 }
9961
9962 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9963 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9964 Builder.AddPlaceholderChunk("object-type");
9965 Builder.AddTextChunk(" *");
9966 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9967 Builder.AddTextChunk("object");
9968 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
9970 }
9971 }
9972
9973 // - (void)removeKey:(NSSet *)objects
9974 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9975 std::string SelectorName = (Twine("remove") + UpperKey).str();
9976 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9977 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9978 if (ReturnType.isNull()) {
9979 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9980 Builder.AddTextChunk("void");
9981 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9982 }
9983
9984 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
9985 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
9986 Builder.AddTextChunk("NSSet *");
9987 Builder.AddChunk(CodeCompletionString::CK_RightParen);
9988 Builder.AddTextChunk("objects");
9989 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
9991 }
9992 }
9993
9994 // - (void)intersectKey:(NSSet *)objects
9995 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9996 std::string SelectorName = (Twine("intersect") + UpperKey).str();
9997 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9998 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) {
9999 if (ReturnType.isNull()) {
10000 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
10001 Builder.AddTextChunk("void");
10002 Builder.AddChunk(CodeCompletionString::CK_RightParen);
10003 }
10004
10005 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":"));
10006 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
10007 Builder.AddTextChunk("NSSet *");
10008 Builder.AddChunk(CodeCompletionString::CK_RightParen);
10009 Builder.AddTextChunk("objects");
10010 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority,
10012 }
10013 }
10014
10015 // Key-Value Observing
10016 // + (NSSet *)keyPathsForValuesAffectingKey
10017 if (!IsInstanceMethod &&
10018 (ReturnType.isNull() ||
10019 (ReturnType->isObjCObjectPointerType() &&
10020 ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() &&
10021 ReturnType->castAs<ObjCObjectPointerType>()
10023 ->getName() == "NSSet"))) {
10024 std::string SelectorName =
10025 (Twine("keyPathsForValuesAffecting") + UpperKey).str();
10026 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
10027 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
10028 .second) {
10029 if (ReturnType.isNull()) {
10030 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
10031 Builder.AddTextChunk("NSSet<NSString *> *");
10032 Builder.AddChunk(CodeCompletionString::CK_RightParen);
10033 }
10034
10035 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
10036 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
10038 }
10039 }
10040
10041 // + (BOOL)automaticallyNotifiesObserversForKey
10042 if (!IsInstanceMethod &&
10043 (ReturnType.isNull() || ReturnType->isIntegerType() ||
10044 ReturnType->isBooleanType())) {
10045 std::string SelectorName =
10046 (Twine("automaticallyNotifiesObserversOf") + UpperKey).str();
10047 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
10048 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))
10049 .second) {
10050 if (ReturnType.isNull()) {
10051 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
10052 Builder.AddTextChunk("BOOL");
10053 Builder.AddChunk(CodeCompletionString::CK_RightParen);
10054 }
10055
10056 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
10057 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern,
10059 }
10060 }
10061}
10062
10064 Scope *S, std::optional<bool> IsInstanceMethod, ParsedType ReturnTy) {
10065 ASTContext &Context = getASTContext();
10066 // Determine the return type of the method we're declaring, if
10067 // provided.
10068 QualType ReturnType = SemaRef.GetTypeFromParser(ReturnTy);
10069 Decl *IDecl = nullptr;
10070 if (SemaRef.CurContext->isObjCContainer()) {
10071 ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(SemaRef.CurContext);
10072 IDecl = OCD;
10073 }
10074 // Determine where we should start searching for methods.
10075 ObjCContainerDecl *SearchDecl = nullptr;
10076 bool IsInImplementation = false;
10077 if (Decl *D = IDecl) {
10078 if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) {
10079 SearchDecl = Impl->getClassInterface();
10080 IsInImplementation = true;
10081 } else if (ObjCCategoryImplDecl *CatImpl =
10082 dyn_cast<ObjCCategoryImplDecl>(D)) {
10083 SearchDecl = CatImpl->getCategoryDecl();
10084 IsInImplementation = true;
10085 } else
10086 SearchDecl = dyn_cast<ObjCContainerDecl>(D);
10087 }
10088
10089 if (!SearchDecl && S) {
10090 if (DeclContext *DC = S->getEntity())
10091 SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
10092 }
10093
10094 if (!SearchDecl) {
10097 return;
10098 }
10099
10100 // Find all of the methods that we could declare/implement here.
10101 KnownMethodsMap KnownMethods;
10102 FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, ReturnType,
10103 KnownMethods);
10104
10105 // Add declarations or definitions for each of the known methods.
10107 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10108 CodeCompleter->getCodeCompletionTUInfo(),
10110 Results.EnterNewScope();
10112 for (KnownMethodsMap::iterator M = KnownMethods.begin(),
10113 MEnd = KnownMethods.end();
10114 M != MEnd; ++M) {
10115 ObjCMethodDecl *Method = M->second.getPointer();
10116 CodeCompletionBuilder Builder(Results.getAllocator(),
10117 Results.getCodeCompletionTUInfo());
10118
10119 // Add the '-'/'+' prefix if it wasn't provided yet.
10120 if (!IsInstanceMethod) {
10121 Builder.AddTextChunk(Method->isInstanceMethod() ? "-" : "+");
10123 }
10124
10125 // If the result type was not already provided, add it to the
10126 // pattern as (type).
10127 if (ReturnType.isNull()) {
10128 QualType ResTy = Method->getSendResultType().stripObjCKindOfType(Context);
10129 AttributedType::stripOuterNullability(ResTy);
10130 AddObjCPassingTypeChunk(ResTy, Method->getObjCDeclQualifier(), Context,
10131 Policy, Builder);
10132 }
10133
10134 Selector Sel = Method->getSelector();
10135
10136 if (Sel.isUnarySelector()) {
10137 // Unary selectors have no arguments.
10138 Builder.AddTypedTextChunk(
10139 Builder.getAllocator().CopyString(Sel.getNameForSlot(0)));
10140 } else {
10141 // Add all parameters to the pattern.
10142 unsigned I = 0;
10143 for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
10144 PEnd = Method->param_end();
10145 P != PEnd; (void)++P, ++I) {
10146 // Add the part of the selector name.
10147 if (I == 0)
10148 Builder.AddTypedTextChunk(
10149 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
10150 else if (I < Sel.getNumArgs()) {
10152 Builder.AddTypedTextChunk(
10153 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":"));
10154 } else
10155 break;
10156
10157 // Add the parameter type.
10158 QualType ParamType;
10159 if ((*P)->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability)
10160 ParamType = (*P)->getType();
10161 else
10162 ParamType = (*P)->getOriginalType();
10163 ParamType = ParamType.substObjCTypeArgs(
10165 AttributedType::stripOuterNullability(ParamType);
10166 AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(),
10167 Context, Policy, Builder);
10168
10169 if (IdentifierInfo *Id = (*P)->getIdentifier())
10170 Builder.AddTextChunk(
10171 Builder.getAllocator().CopyString(Id->getName()));
10172 }
10173 }
10174
10175 if (Method->isVariadic()) {
10176 if (Method->param_size() > 0)
10177 Builder.AddChunk(CodeCompletionString::CK_Comma);
10178 Builder.AddTextChunk("...");
10179 }
10180
10181 if (IsInImplementation && Results.includeCodePatterns()) {
10182 // We will be defining the method here, so add a compound statement.
10184 Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
10186 if (!Method->getReturnType()->isVoidType()) {
10187 // If the result type is not void, add a return clause.
10188 Builder.AddTextChunk("return");
10190 Builder.AddPlaceholderChunk("expression");
10191 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
10192 } else
10193 Builder.AddPlaceholderChunk("statements");
10194
10196 Builder.AddChunk(CodeCompletionString::CK_RightBrace);
10197 }
10198
10199 unsigned Priority = CCP_CodePattern;
10200 auto R = Result(Builder.TakeString(), Method, Priority);
10201 if (!M->second.getInt())
10202 setInBaseClass(R);
10203 Results.AddResult(std::move(R));
10204 }
10205
10206 // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of
10207 // the properties in this class and its categories.
10208 if (Context.getLangOpts().ObjC) {
10210 Containers.push_back(SearchDecl);
10211
10212 VisitedSelectorSet KnownSelectors;
10213 for (KnownMethodsMap::iterator M = KnownMethods.begin(),
10214 MEnd = KnownMethods.end();
10215 M != MEnd; ++M)
10216 KnownSelectors.insert(M->first);
10217
10218 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl);
10219 if (!IFace)
10220 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl))
10221 IFace = Category->getClassInterface();
10222
10223 if (IFace)
10224 llvm::append_range(Containers, IFace->visible_categories());
10225
10226 if (IsInstanceMethod) {
10227 for (unsigned I = 0, N = Containers.size(); I != N; ++I)
10228 for (auto *P : Containers[I]->instance_properties())
10229 AddObjCKeyValueCompletions(P, *IsInstanceMethod, ReturnType, Context,
10230 KnownSelectors, Results);
10231 }
10232 }
10233
10234 Results.ExitScope();
10235
10237 Results.getCompletionContext(), Results.data(),
10238 Results.size());
10239}
10240
10242 Scope *S, bool IsInstanceMethod, bool AtParameterName, ParsedType ReturnTy,
10244 // If we have an external source, load the entire class method
10245 // pool from the AST file.
10246 if (SemaRef.ExternalSource) {
10247 for (uint32_t I = 0, N = SemaRef.ExternalSource->GetNumExternalSelectors();
10248 I != N; ++I) {
10249 Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I);
10250 if (Sel.isNull() || SemaRef.ObjC().MethodPool.count(Sel))
10251 continue;
10252
10253 SemaRef.ObjC().ReadMethodPool(Sel);
10254 }
10255 }
10256
10257 // Build the set of methods we can see.
10259 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10260 CodeCompleter->getCodeCompletionTUInfo(),
10262
10263 if (ReturnTy)
10264 Results.setPreferredType(
10265 SemaRef.GetTypeFromParser(ReturnTy).getNonReferenceType());
10266
10267 Results.EnterNewScope();
10268 for (SemaObjC::GlobalMethodPool::iterator
10269 M = SemaRef.ObjC().MethodPool.begin(),
10270 MEnd = SemaRef.ObjC().MethodPool.end();
10271 M != MEnd; ++M) {
10272 for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first
10273 : &M->second.second;
10274 MethList && MethList->getMethod(); MethList = MethList->getNext()) {
10275 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents))
10276 continue;
10277
10278 if (AtParameterName) {
10279 // Suggest parameter names we've seen before.
10280 unsigned NumSelIdents = SelIdents.size();
10281 if (NumSelIdents &&
10282 NumSelIdents <= MethList->getMethod()->param_size()) {
10283 ParmVarDecl *Param =
10284 MethList->getMethod()->parameters()[NumSelIdents - 1];
10285 if (Param->getIdentifier()) {
10286 CodeCompletionBuilder Builder(Results.getAllocator(),
10287 Results.getCodeCompletionTUInfo());
10288 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
10289 Param->getIdentifier()->getName()));
10290 Results.AddResult(Builder.TakeString());
10291 }
10292 }
10293
10294 continue;
10295 }
10296
10297 Result R(MethList->getMethod(),
10298 Results.getBasePriority(MethList->getMethod()),
10299 /*Qualifier=*/std::nullopt);
10300 R.StartParameter = SelIdents.size();
10301 R.AllParametersAreInformative = false;
10302 R.DeclaringEntity = true;
10303 Results.MaybeAddResult(R, SemaRef.CurContext);
10304 }
10305 }
10306
10307 Results.ExitScope();
10308
10309 if (!AtParameterName && !SelIdents.empty() &&
10310 SelIdents.front()->getName().starts_with("init")) {
10311 for (const auto &M : SemaRef.PP.macros()) {
10312 if (M.first->getName() != "NS_DESIGNATED_INITIALIZER")
10313 continue;
10314 Results.EnterNewScope();
10315 CodeCompletionBuilder Builder(Results.getAllocator(),
10316 Results.getCodeCompletionTUInfo());
10317 Builder.AddTypedTextChunk(
10318 Builder.getAllocator().CopyString(M.first->getName()));
10319 Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_Macro,
10321 Results.ExitScope();
10322 }
10323 }
10324
10326 Results.getCompletionContext(), Results.data(),
10327 Results.size());
10328}
10329
10331 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10332 CodeCompleter->getCodeCompletionTUInfo(),
10334 Results.EnterNewScope();
10335
10336 // #if <condition>
10337 CodeCompletionBuilder Builder(Results.getAllocator(),
10338 Results.getCodeCompletionTUInfo());
10339 Builder.AddTypedTextChunk("if");
10341 Builder.AddPlaceholderChunk("condition");
10342 Results.AddResult(Builder.TakeString());
10343
10344 // #ifdef <macro>
10345 Builder.AddTypedTextChunk("ifdef");
10347 Builder.AddPlaceholderChunk("macro");
10348 Results.AddResult(Builder.TakeString());
10349
10350 // #ifndef <macro>
10351 Builder.AddTypedTextChunk("ifndef");
10353 Builder.AddPlaceholderChunk("macro");
10354 Results.AddResult(Builder.TakeString());
10355
10356 if (InConditional) {
10357 // #elif <condition>
10358 Builder.AddTypedTextChunk("elif");
10360 Builder.AddPlaceholderChunk("condition");
10361 Results.AddResult(Builder.TakeString());
10362
10363 // #elifdef <macro>
10364 Builder.AddTypedTextChunk("elifdef");
10366 Builder.AddPlaceholderChunk("macro");
10367 Results.AddResult(Builder.TakeString());
10368
10369 // #elifndef <macro>
10370 Builder.AddTypedTextChunk("elifndef");
10372 Builder.AddPlaceholderChunk("macro");
10373 Results.AddResult(Builder.TakeString());
10374
10375 // #else
10376 Builder.AddTypedTextChunk("else");
10377 Results.AddResult(Builder.TakeString());
10378
10379 // #endif
10380 Builder.AddTypedTextChunk("endif");
10381 Results.AddResult(Builder.TakeString());
10382 }
10383
10384 // #include "header"
10385 Builder.AddTypedTextChunk("include");
10387 Builder.AddTextChunk("\"");
10388 Builder.AddPlaceholderChunk("header");
10389 Builder.AddTextChunk("\"");
10390 Results.AddResult(Builder.TakeString());
10391
10392 // #include <header>
10393 Builder.AddTypedTextChunk("include");
10395 Builder.AddTextChunk("<");
10396 Builder.AddPlaceholderChunk("header");
10397 Builder.AddTextChunk(">");
10398 Results.AddResult(Builder.TakeString());
10399
10400 // #define <macro>
10401 Builder.AddTypedTextChunk("define");
10403 Builder.AddPlaceholderChunk("macro");
10404 Results.AddResult(Builder.TakeString());
10405
10406 // #define <macro>(<args>)
10407 Builder.AddTypedTextChunk("define");
10409 Builder.AddPlaceholderChunk("macro");
10410 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
10411 Builder.AddPlaceholderChunk("args");
10412 Builder.AddChunk(CodeCompletionString::CK_RightParen);
10413 Results.AddResult(Builder.TakeString());
10414
10415 // #undef <macro>
10416 Builder.AddTypedTextChunk("undef");
10418 Builder.AddPlaceholderChunk("macro");
10419 Results.AddResult(Builder.TakeString());
10420
10421 // #line <number>
10422 Builder.AddTypedTextChunk("line");
10424 Builder.AddPlaceholderChunk("number");
10425 Results.AddResult(Builder.TakeString());
10426
10427 // #line <number> "filename"
10428 Builder.AddTypedTextChunk("line");
10430 Builder.AddPlaceholderChunk("number");
10432 Builder.AddTextChunk("\"");
10433 Builder.AddPlaceholderChunk("filename");
10434 Builder.AddTextChunk("\"");
10435 Results.AddResult(Builder.TakeString());
10436
10437 // #error <message>
10438 Builder.AddTypedTextChunk("error");
10440 Builder.AddPlaceholderChunk("message");
10441 Results.AddResult(Builder.TakeString());
10442
10443 // #pragma <arguments>
10444 Builder.AddTypedTextChunk("pragma");
10446 Builder.AddPlaceholderChunk("arguments");
10447 Results.AddResult(Builder.TakeString());
10448
10449 if (getLangOpts().ObjC) {
10450 // #import "header"
10451 Builder.AddTypedTextChunk("import");
10453 Builder.AddTextChunk("\"");
10454 Builder.AddPlaceholderChunk("header");
10455 Builder.AddTextChunk("\"");
10456 Results.AddResult(Builder.TakeString());
10457
10458 // #import <header>
10459 Builder.AddTypedTextChunk("import");
10461 Builder.AddTextChunk("<");
10462 Builder.AddPlaceholderChunk("header");
10463 Builder.AddTextChunk(">");
10464 Results.AddResult(Builder.TakeString());
10465 }
10466
10467 // #include_next "header"
10468 Builder.AddTypedTextChunk("include_next");
10470 Builder.AddTextChunk("\"");
10471 Builder.AddPlaceholderChunk("header");
10472 Builder.AddTextChunk("\"");
10473 Results.AddResult(Builder.TakeString());
10474
10475 // #include_next <header>
10476 Builder.AddTypedTextChunk("include_next");
10478 Builder.AddTextChunk("<");
10479 Builder.AddPlaceholderChunk("header");
10480 Builder.AddTextChunk(">");
10481 Results.AddResult(Builder.TakeString());
10482
10483 // #warning <message>
10484 Builder.AddTypedTextChunk("warning");
10486 Builder.AddPlaceholderChunk("message");
10487 Results.AddResult(Builder.TakeString());
10488
10489 if (getLangOpts().C23) {
10490 // #embed "file"
10491 Builder.AddTypedTextChunk("embed");
10493 Builder.AddTextChunk("\"");
10494 Builder.AddPlaceholderChunk("file");
10495 Builder.AddTextChunk("\"");
10496 Results.AddResult(Builder.TakeString());
10497
10498 // #embed <file>
10499 Builder.AddTypedTextChunk("embed");
10501 Builder.AddTextChunk("<");
10502 Builder.AddPlaceholderChunk("file");
10503 Builder.AddTextChunk(">");
10504 Results.AddResult(Builder.TakeString());
10505 }
10506
10507 // Note: #ident and #sccs are such crazy anachronisms that we don't provide
10508 // completions for them. And __include_macros is a Clang-internal extension
10509 // that we don't want to encourage anyone to use.
10510
10511 // FIXME: we don't support #assert or #unassert, so don't suggest them.
10512 Results.ExitScope();
10513
10515 Results.getCompletionContext(), Results.data(),
10516 Results.size());
10517}
10518
10525
10527 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10528 CodeCompleter->getCodeCompletionTUInfo(),
10531 if (!IsDefinition && CodeCompleter->includeMacros()) {
10532 // Add just the names of macros, not their arguments.
10533 CodeCompletionBuilder Builder(Results.getAllocator(),
10534 Results.getCodeCompletionTUInfo());
10535 Results.EnterNewScope();
10536 for (const auto &M : SemaRef.PP.macros()) {
10537 Builder.AddTypedTextChunk(
10538 Builder.getAllocator().CopyString(M.first->getName()));
10539 Results.AddResult(CodeCompletionResult(
10540 Builder.TakeString(), CCP_CodePattern, CXCursor_MacroDefinition));
10541 }
10542 Results.ExitScope();
10543 } else if (IsDefinition) {
10544 // FIXME: Can we detect when the user just wrote an include guard above?
10545 }
10546
10548 Results.getCompletionContext(), Results.data(),
10549 Results.size());
10550}
10551
10553 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10554 CodeCompleter->getCodeCompletionTUInfo(),
10556
10557 if (CodeCompleter->includeMacros())
10558 AddMacroResults(SemaRef.PP, Results, CodeCompleter->loadExternal(), true);
10559
10560 // defined (<macro>)
10561 Results.EnterNewScope();
10562 CodeCompletionBuilder Builder(Results.getAllocator(),
10563 Results.getCodeCompletionTUInfo());
10564 Builder.AddTypedTextChunk("defined");
10566 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
10567 Builder.AddPlaceholderChunk("macro");
10568 Builder.AddChunk(CodeCompletionString::CK_RightParen);
10569 Results.AddResult(Builder.TakeString());
10570 Results.ExitScope();
10571
10573 Results.getCompletionContext(), Results.data(),
10574 Results.size());
10575}
10576
10578 Scope *S, IdentifierInfo *Macro, MacroInfo *MacroInfo, unsigned Argument) {
10579 // FIXME: In the future, we could provide "overload" results, much like we
10580 // do for function calls.
10581
10582 // Now just ignore this. There will be another code-completion callback
10583 // for the expanded tokens.
10584}
10585
10586// This handles completion inside an #include filename, e.g. #include <foo/ba
10587// We look for the directory "foo" under each directory on the include path,
10588// list its files, and reassemble the appropriate #include.
10590 bool Angled) {
10591 // RelDir should use /, but unescaped \ is possible on windows!
10592 // Our completions will normalize to / for simplicity, this case is rare.
10593 std::string RelDir = llvm::sys::path::convert_to_slash(Dir);
10594 // We need the native slashes for the actual file system interactions.
10595 SmallString<128> NativeRelDir = StringRef(RelDir);
10596 llvm::sys::path::native(NativeRelDir);
10597 llvm::vfs::FileSystem &FS =
10598 SemaRef.getSourceManager().getFileManager().getVirtualFileSystem();
10599
10600 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10601 CodeCompleter->getCodeCompletionTUInfo(),
10603 llvm::DenseSet<StringRef> SeenResults; // To deduplicate results.
10604
10605 // Helper: adds one file or directory completion result.
10606 auto AddCompletion = [&](StringRef Filename, bool IsDirectory) {
10607 SmallString<64> TypedChunk = Filename;
10608 // Directory completion is up to the slash, e.g. <sys/
10609 TypedChunk.push_back(IsDirectory ? '/' : Angled ? '>' : '"');
10610 auto R = SeenResults.insert(TypedChunk);
10611 if (R.second) { // New completion
10612 const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk);
10613 *R.first = InternedTyped; // Avoid dangling StringRef.
10614 CodeCompletionBuilder Builder(CodeCompleter->getAllocator(),
10615 CodeCompleter->getCodeCompletionTUInfo());
10616 Builder.AddTypedTextChunk(InternedTyped);
10617 // The result is a "Pattern", which is pretty opaque.
10618 // We may want to include the real filename to allow smart ranking.
10619 Results.AddResult(CodeCompletionResult(Builder.TakeString()));
10620 }
10621 };
10622
10623 // Helper: scans IncludeDir for nice files, and adds results for each.
10624 auto AddFilesFromIncludeDir = [&](StringRef IncludeDir,
10625 bool IsSystem,
10626 DirectoryLookup::LookupType_t LookupType) {
10627 llvm::SmallString<128> Dir = IncludeDir;
10628 if (!NativeRelDir.empty()) {
10629 if (LookupType == DirectoryLookup::LT_Framework) {
10630 // For a framework dir, #include <Foo/Bar/> actually maps to
10631 // a path of Foo.framework/Headers/Bar/.
10632 auto Begin = llvm::sys::path::begin(NativeRelDir);
10633 auto End = llvm::sys::path::end(NativeRelDir);
10634
10635 llvm::sys::path::append(Dir, *Begin + ".framework", "Headers");
10636 llvm::sys::path::append(Dir, ++Begin, End);
10637 } else {
10638 llvm::sys::path::append(Dir, NativeRelDir);
10639 }
10640 }
10641
10642 const StringRef &Dirname = llvm::sys::path::filename(Dir);
10643 const bool isQt = Dirname.starts_with("Qt") || Dirname == "ActiveQt";
10644 const bool ExtensionlessHeaders =
10645 IsSystem || isQt || Dir.ends_with(".framework/Headers") ||
10646 IncludeDir.ends_with("/include") || IncludeDir.ends_with("\\include");
10647 std::error_code EC;
10648 unsigned Count = 0;
10649 for (auto It = FS.dir_begin(Dir, EC);
10650 !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) {
10651 if (++Count == 2500) // If we happen to hit a huge directory,
10652 break; // bail out early so we're not too slow.
10653 StringRef Filename = llvm::sys::path::filename(It->path());
10654
10655 // To know whether a symlink should be treated as file or a directory, we
10656 // have to stat it. This should be cheap enough as there shouldn't be many
10657 // symlinks.
10658 llvm::sys::fs::file_type Type = It->type();
10659 if (Type == llvm::sys::fs::file_type::symlink_file) {
10660 if (auto FileStatus = FS.status(It->path()))
10661 Type = FileStatus->getType();
10662 }
10663 switch (Type) {
10664 case llvm::sys::fs::file_type::directory_file:
10665 // All entries in a framework directory must have a ".framework" suffix,
10666 // but the suffix does not appear in the source code's include/import.
10667 if (LookupType == DirectoryLookup::LT_Framework &&
10668 NativeRelDir.empty() && !Filename.consume_back(".framework"))
10669 break;
10670
10671 AddCompletion(Filename, /*IsDirectory=*/true);
10672 break;
10673 case llvm::sys::fs::file_type::regular_file: {
10674 // Only files that really look like headers. (Except in special dirs).
10675 const bool IsHeader = Filename.ends_with_insensitive(".h") ||
10676 Filename.ends_with_insensitive(".hh") ||
10677 Filename.ends_with_insensitive(".hpp") ||
10678 Filename.ends_with_insensitive(".hxx") ||
10679 Filename.ends_with_insensitive(".inc") ||
10680 (ExtensionlessHeaders && !Filename.contains('.'));
10681 if (!IsHeader)
10682 break;
10683 AddCompletion(Filename, /*IsDirectory=*/false);
10684 break;
10685 }
10686 default:
10687 break;
10688 }
10689 }
10690 };
10691
10692 // Helper: adds results relative to IncludeDir, if possible.
10693 auto AddFilesFromDirLookup = [&](const DirectoryLookup &IncludeDir,
10694 bool IsSystem) {
10695 switch (IncludeDir.getLookupType()) {
10697 // header maps are not (currently) enumerable.
10698 break;
10700 AddFilesFromIncludeDir(IncludeDir.getDirRef()->getName(), IsSystem,
10702 break;
10704 AddFilesFromIncludeDir(IncludeDir.getFrameworkDirRef()->getName(),
10706 break;
10707 }
10708 };
10709
10710 // Finally with all our helpers, we can scan the include path.
10711 // Do this in standard order so deduplication keeps the right file.
10712 // (In case we decide to add more details to the results later).
10713 const auto &S = SemaRef.PP.getHeaderSearchInfo();
10714 using llvm::make_range;
10715 if (!Angled) {
10716 // The current directory is on the include path for "quoted" includes.
10717 if (auto CurFile = SemaRef.PP.getCurrentFileLexer()->getFileEntry())
10718 AddFilesFromIncludeDir(CurFile->getDir().getName(), false,
10720 for (const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end()))
10721 AddFilesFromDirLookup(D, false);
10722 }
10723 for (const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end()))
10724 AddFilesFromDirLookup(D, false);
10725 for (const auto &D : make_range(S.system_dir_begin(), S.system_dir_end()))
10726 AddFilesFromDirLookup(D, true);
10727
10729 Results.getCompletionContext(), Results.data(),
10730 Results.size());
10731}
10732
10738
10740 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10741 CodeCompleter->getCodeCompletionTUInfo(),
10743 Results.EnterNewScope();
10744 static const char *Platforms[] = {"macOS", "iOS", "watchOS", "tvOS"};
10745 for (const char *Platform : llvm::ArrayRef(Platforms)) {
10746 Results.AddResult(CodeCompletionResult(Platform));
10747 Results.AddResult(CodeCompletionResult(Results.getAllocator().CopyString(
10748 Twine(Platform) + "ApplicationExtension")));
10749 }
10750 Results.ExitScope();
10752 Results.getCompletionContext(), Results.data(),
10753 Results.size());
10754}
10755
10757 CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo,
10759 ResultBuilder Builder(SemaRef, Allocator, CCTUInfo,
10761 if (!CodeCompleter || CodeCompleter->includeGlobals()) {
10762 CodeCompletionDeclConsumer Consumer(
10763 Builder, getASTContext().getTranslationUnitDecl());
10764 SemaRef.LookupVisibleDecls(getASTContext().getTranslationUnitDecl(),
10765 Sema::LookupAnyName, Consumer,
10766 !CodeCompleter || CodeCompleter->loadExternal());
10767 }
10768
10769 if (!CodeCompleter || CodeCompleter->includeMacros())
10770 AddMacroResults(SemaRef.PP, Builder,
10771 !CodeCompleter || CodeCompleter->loadExternal(), true);
10772
10773 Results.clear();
10774 Results.insert(Results.end(), Builder.data(),
10775 Builder.data() + Builder.size());
10776}
10777
10779 CodeCompleteConsumer *CompletionConsumer)
10780 : SemaBase(S), CodeCompleter(CompletionConsumer),
10781 Resolver(S.getASTContext()) {}
This file provides AST data structures related to concepts.
bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc QualifierLoc)
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines Expressions and AST nodes for C++2a concepts.
bool Optional
Is optional and can be removed.
Token Tok
The Token.
Result
Implement __builtin_bit_cast and related operations.
#define X(type, name)
Definition Value.h:97
llvm::MachO::Record Record
Definition MachO.h:31
Defines the clang::MacroInfo and clang::MacroDirective classes.
Defines an enumeration for C++ overloaded operators.
Defines the clang::Preprocessor interface.
static AccessResult IsAccessible(Sema &S, const EffectiveContext &EC, AccessTarget &Entity, TemplateSpecCandidateSet *FailedTSC)
Determines whether the accessed entity is accessible.
CastType
Definition SemaCast.cpp:51
static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, unsigned NumSelIdents)
Given a set of code-completion results for the argument of a message send, determine the preferred ty...
static void printOverrideString(const CodeCompletionString &CCS, std::string &BeforeName, std::string &NameAndSignature)
static bool isConstructor(const Decl *ND)
static void findTypeLocationForBlockDecl(const TypeSourceInfo *TSInfo, FunctionTypeLoc &Block, FunctionProtoTypeLoc &BlockProto, bool SuppressBlock=false)
Tries to find the most appropriate type location for an Objective-C block placeholder.
static bool isObjCReceiverType(ASTContext &C, QualType T)
static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, bool LoadExternal, bool IncludeUndefined, bool TargetTypeIsPointer=false)
static std::string formatTemplateParameterPlaceholder(const NamedDecl *Param, bool &Optional, const PrintingPolicy &Policy)
static std::string formatBlockPlaceholder(const PrintingPolicy &Policy, const NamedDecl *BlockDecl, FunctionTypeLoc &Block, FunctionProtoTypeLoc &BlockProto, bool SuppressBlockName=false, bool SuppressBlock=false, std::optional< ArrayRef< QualType > > ObjCSubsts=std::nullopt)
Returns a placeholder string that corresponds to an Objective-C block declaration.
static void AddQualifierToCompletionString(CodeCompletionBuilder &Result, NestedNameSpecifier Qualifier, bool QualifierIsInformative, ASTContext &Context, const PrintingPolicy &Policy)
Add a qualifier to the given code-completion string, if the provided nested-name-specifier is non-NUL...
static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt)
llvm::SmallPtrSet< const IdentifierInfo *, 16 > AddedPropertiesSet
The set of properties that have already been added, referenced by property name.
static bool argMatchesTemplateParams(const ParsedTemplateArgument &Arg, unsigned Index, const TemplateParameterList &Params)
static void setInBaseClass(ResultBuilder::Result &R)
static void AddObjCMethods(ObjCContainerDecl *Container, bool WantInstanceMethods, ObjCMethodKind WantKind, ArrayRef< const IdentifierInfo * > SelIdents, DeclContext *CurContext, VisitedSelectorSet &Selectors, bool AllowSameLength, ResultBuilder &Results, bool InOriginalClass=true, bool IsRootClass=false)
Add all of the Objective-C methods in the given Objective-C container to the set of results.
static bool shouldIgnoreDueToReservedName(const NamedDecl *ND, Sema &SemaRef)
static CodeCompletionString * createTemplateSignatureString(const TemplateDecl *TD, CodeCompletionBuilder &Builder, unsigned CurrentArg, const PrintingPolicy &Policy)
static QualType getParamType(Sema &SemaRef, ArrayRef< ResultCandidate > Candidates, unsigned N)
Get the type of the Nth parameter from a given set of overload candidates.
static void AddStorageSpecifiers(SemaCodeCompletion::ParserCompletionContext CCC, const LangOptions &LangOpts, ResultBuilder &Results)
static const NamedDecl * extractFunctorCallOperator(const NamedDecl *ND)
static void AddFunctionSpecifiers(SemaCodeCompletion::ParserCompletionContext CCC, const LangOptions &LangOpts, ResultBuilder &Results)
static QualType ProduceSignatureHelp(Sema &SemaRef, MutableArrayRef< ResultCandidate > Candidates, unsigned CurrentArg, SourceLocation OpenParLoc, bool Braced)
static std::string FormatFunctionParameter(const PrintingPolicy &Policy, const DeclaratorDecl *Param, bool SuppressName=false, bool SuppressBlock=false, std::optional< ArrayRef< QualType > > ObjCSubsts=std::nullopt)
static void AddFunctionParameterChunks(Preprocessor &PP, const PrintingPolicy &Policy, const FunctionDecl *Function, CodeCompletionBuilder &Result, unsigned Start=0, bool InOptional=false, bool FunctionCanBeCall=true, bool IsInDeclarationContext=false)
Add function parameter chunks to the given code completion string.
static RecordDecl * getAsRecordDecl(QualType BaseType, HeuristicResolver &Resolver)
static void AddOverrideResults(ResultBuilder &Results, const CodeCompletionContext &CCContext, CodeCompletionBuilder &Builder)
static std::string formatObjCParamQualifiers(unsigned ObjCQuals, QualType &Type)
llvm::SmallPtrSet< Selector, 16 > VisitedSelectorSet
A set of selectors, which is used to avoid introducing multiple completions with the same selector in...
static void AddOverloadAggregateChunks(const RecordDecl *RD, const PrintingPolicy &Policy, CodeCompletionBuilder &Result, unsigned CurrentArg)
static void AddTypedefResult(ResultBuilder &Results)
static void AddPrettyFunctionResults(const LangOptions &LangOpts, ResultBuilder &Results)
static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals, ASTContext &Context, const PrintingPolicy &Policy, CodeCompletionBuilder &Builder)
Add the parenthesized return or parameter type chunk to a code completion string.
static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, bool IsInstanceMethod, QualType ReturnType, ASTContext &Context, VisitedSelectorSet &KnownSelectors, ResultBuilder &Results)
Add code completions for Objective-C Key-Value Coding (KVC) and Key-Value Observing (KVO).
static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt)
static QualType getDesignatedType(ASTContext &Context, QualType BaseType, const Designation &Desig, HeuristicResolver &Resolver, llvm::function_ref< const FieldDecl *(RecordDecl *, const Designator &)> LookupField)
static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag)
Determine whether the addition of the given flag to an Objective-C property's attributes will cause a...
static void AddEnumerators(ResultBuilder &Results, ASTContext &Context, EnumDecl *Enum, DeclContext *CurContext, const CoveredEnumerators &Enumerators)
llvm::DenseMap< Selector, llvm::PointerIntPair< ObjCMethodDecl *, 1, bool > > KnownMethodsMap
static const FunctionProtoType * TryDeconstructFunctionLike(QualType T)
Try to find a corresponding FunctionProtoType for function-like types (e.g.
static DeclContext::lookup_result getConstructors(ASTContext &Context, const CXXRecordDecl *Record)
static void AddResultTypeChunk(ASTContext &Context, const PrintingPolicy &Policy, const NamedDecl *ND, QualType BaseType, CodeCompletionBuilder &Result)
If the given declaration has an associated type, add it as a result type chunk.
static void AddObjCVisibilityResults(const LangOptions &LangOpts, ResultBuilder &Results, bool NeedAt)
static void addThisCompletion(Sema &S, ResultBuilder &Results)
Add a completion for "this", if we're in a member function.
static NestedNameSpecifier getRequiredQualification(ASTContext &Context, const DeclContext *CurContext, const DeclContext *TargetContext)
Compute the qualification required to get from the current context (CurContext) to the target context...
static void AddObjCImplementationResults(const LangOptions &LangOpts, ResultBuilder &Results, bool NeedAt)
static ObjCMethodDecl * AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, ArrayRef< const IdentifierInfo * > SelIdents, ResultBuilder &Results)
static void AddRecordMembersCompletionResults(Sema &SemaRef, ResultBuilder &Results, Scope *S, QualType BaseType, ExprValueKind BaseKind, RecordDecl *RD, std::optional< FixItHint > AccessOpFixIt)
static void AddObjCBlockCall(ASTContext &Context, const PrintingPolicy &Policy, CodeCompletionBuilder &Builder, const NamedDecl *BD, const FunctionTypeLoc &BlockLoc, const FunctionProtoTypeLoc &BlockProtoLoc)
Adds a block invocation code completion result for the given block declaration BD.
static void AddLambdaCompletion(ResultBuilder &Results, llvm::ArrayRef< QualType > Parameters, const LangOptions &LangOpts)
Adds a pattern completion for a lambda expression with the specified parameter types and placeholders...
static void AddTypeSpecifierResults(const LangOptions &LangOpts, ResultBuilder &Results)
Add type specifiers for the current language as keyword results.
static std::optional< unsigned > getNextAggregateIndexAfterDesignatedInit(const ResultCandidate &Aggregate, ArrayRef< Expr * > Args)
static std::string GetDefaultValueString(const ParmVarDecl *Param, const SourceManager &SM, const LangOptions &LangOpts)
static void AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, const FunctionDecl *Function, bool AsInformativeChunks=true)
static CodeCompletionContext mapCodeCompletionContext(Sema &S, SemaCodeCompletion::ParserCompletionContext PCC)
static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, bool OnlyForwardDeclarations, bool OnlyUnimplemented, ResultBuilder &Results)
Add all of the Objective-C interface declarations that we find in the given (translation unit) contex...
static OverloadCompare compareOverloads(const CXXMethodDecl &Candidate, const CXXMethodDecl &Incumbent, const Qualifiers &ObjectQuals, ExprValueKind ObjectKind, const ASTContext &Ctx)
static const FieldDecl * lookupDirectField(RecordDecl *RD, const Designator &D)
static void AddTemplateParameterChunks(ASTContext &Context, const PrintingPolicy &Policy, const TemplateDecl *Template, CodeCompletionBuilder &Result, unsigned MaxParameters=0, unsigned Start=0, bool InDefaultArg=false, bool AsInformativeChunk=false)
Add template parameter chunks to the given code completion string.
static void FindImplementableMethods(ASTContext &Context, ObjCContainerDecl *Container, std::optional< bool > WantInstanceMethods, QualType ReturnType, KnownMethodsMap &KnownMethods, bool InOriginalClass=true)
Find all of the methods that reside in the given container (and its superclasses, protocols,...
static bool anyNullArguments(ArrayRef< Expr * > Args)
static const char * noUnderscoreAttrScope(llvm::StringRef Scope)
static void AddFunctionTypeQuals(CodeCompletionBuilder &Result, const Qualifiers Quals, bool AsInformativeChunk=true)
static void MaybeAddSentinel(Preprocessor &PP, const NamedDecl *FunctionOrMethod, CodeCompletionBuilder &Result)
static void AddOverloadParameterChunks(ASTContext &Context, const PrintingPolicy &Policy, const FunctionDecl *Function, const FunctionProtoType *Prototype, FunctionProtoTypeLoc PrototypeLoc, CodeCompletionBuilder &Result, unsigned CurrentArg, unsigned Start=0, bool InOptional=false)
Add function overload parameter chunks to the given code completion string.
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)
static void HandleCodeCompleteResults(Sema *S, CodeCompleteConsumer *CodeCompleter, const CodeCompletionContext &Context, CodeCompletionResult *Results, unsigned NumResults)
static void AddTypeQualifierResults(DeclSpec &DS, ResultBuilder &Results, const LangOptions &LangOpts)
static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, ResultBuilder &Results)
If we're in a C++ virtual member function, add completion results that invoke the functions we overri...
static ObjCContainerDecl * getContainerDef(ObjCContainerDecl *Container)
Retrieve the container definition, if any?
static const char * underscoreAttrScope(llvm::StringRef Scope)
static bool isAcceptableObjCMethod(ObjCMethodDecl *Method, ObjCMethodKind WantKind, ArrayRef< const IdentifierInfo * > SelIdents, bool AllowSameLength=true)
static void AddFunctionExceptSpecToCompletionString(std::string &NameAndSignature, const FunctionDecl *Function)
static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt)
static bool WantTypesInContext(SemaCodeCompletion::ParserCompletionContext CCC, const LangOptions &LangOpts)
CodeCompleteConsumer::OverloadCandidate ResultCandidate
static std::string templateResultType(const TemplateDecl *TD, const PrintingPolicy &Policy)
static void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy, const NamedDecl *ND, CodeCompletionBuilder &Result)
Add the name of the given declaration.
static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, ParsedType Receiver, ArrayRef< const IdentifierInfo * > SelIdents, bool AtArgumentExpression, bool IsSuper, ResultBuilder &Results)
static const char * GetCompletionTypeString(QualType T, ASTContext &Context, const PrintingPolicy &Policy, CodeCompletionAllocator &Allocator)
Retrieve the string representation of the given type as a string that has the appropriate lifetime fo...
static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name)
Determine whether the given class is or inherits from a class by the given name.
#define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword)
Macro that optionally prepends an "@" to the string literal passed in via Keyword,...
static bool isAcceptableObjCSelector(Selector Sel, ObjCMethodKind WantKind, ArrayRef< const IdentifierInfo * > SelIdents, bool AllowSameLength=true)
static QualType getPreferredTypeOfBinaryRHS(Sema &S, Expr *LHS, tok::TokenKind Op)
static void AddOrdinaryNameResults(SemaCodeCompletion::ParserCompletionContext CCC, Scope *S, Sema &SemaRef, ResultBuilder &Results)
Add language constructs that show up for "ordinary" names.
static QualType getPreferredTypeOfUnaryArg(Sema &S, QualType ContextType, tok::TokenKind Op)
Get preferred type for an argument of an unary expression.
static void AddUsingAliasResult(CodeCompletionBuilder &Builder, ResultBuilder &Results)
static ObjCInterfaceDecl * GetAssumedMessageSendExprType(Expr *E)
When we have an expression with type "id", we may assume that it has some more-specific class type ba...
ObjCMethodKind
Describes the kind of Objective-C method that we want to find via code completion.
@ MK_OneArgSelector
One-argument selector.
@ MK_ZeroArgSelector
Zero-argument (unary) selector.
@ MK_Any
Any kind of method, provided it means other specified criteria.
static void mergeCandidatesWithResults(Sema &SemaRef, SmallVectorImpl< ResultCandidate > &Results, OverloadCandidateSet &CandidateSet, SourceLocation Loc, size_t ArgSize)
static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, bool OnlyForwardDeclarations, ResultBuilder &Results)
Add all of the protocol declarations that we find in the given (translation unit) context.
static void AddStaticAssertResult(CodeCompletionBuilder &Builder, ResultBuilder &Results, const LangOptions &LangOpts)
static void AddObjCInterfaceResults(const LangOptions &LangOpts, ResultBuilder &Results, bool NeedAt)
static bool isNamespaceScope(Scope *S)
Determine whether this scope denotes a namespace.
static PrintingPolicy getCompletionPrintingPolicy(const ASTContext &Context, const Preprocessor &PP)
This file declares facilities that support code completion.
This file declares semantic analysis for Objective-C.
static TemplateDecl * getDescribedTemplate(Decl *Templated)
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
friend bool operator!=(const iterator &X, const iterator &Y)
iterator(const NamedDecl *SingleDecl, unsigned Index)
iterator(const DeclIndexPair *Iterator)
friend bool operator==(const iterator &X, const iterator &Y)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:245
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
CanQualType BoolTy
CanQualType IntTy
QualType getTagType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TagDecl *TD, bool OwnsTag) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
const RawComment * getRawCommentForAnyRedecl(RawCommentLookupKey Key, const Decl **OriginalDecl=nullptr) const
Return the documentation comment attached to a given declaration or macro.
PtrTy get() const
Definition Ownership.h:171
bool isInvalid() const
Definition Ownership.h:167
bool isUsable() const
Definition Ownership.h:169
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3820
QualType getElementType() const
Definition TypeBase.h:3832
Syntax
The style used to specify an attribute.
Type source information for an attributed type.
Definition TypeLoc.h:1008
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4856
Wrapper for source info for block pointers.
Definition TypeLoc.h:1557
Pointer to a block type.
Definition TypeBase.h:3653
This class is used for builtin types like 'int'.
Definition TypeBase.h:3245
Represents a base class of a C++ class.
Definition DeclCXX.h:146
Represents a C++ constructor within a class.
Definition DeclCXX.h:2645
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Definition ExprCXX.h:4023
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
Definition ExprCXX.h:4062
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2153
overridden_method_range overridden_methods() const
Definition DeclCXX.cpp:2828
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this method.
Definition DeclCXX.h:2346
Qualifiers getMethodQualifiers() const
Definition DeclCXX.h:2331
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
bool isAggregate() const
Determine whether this class is an aggregate (C++ [dcl.init.aggr]), which is a class with no user-dec...
Definition DeclCXX.h:1153
base_class_range bases()
Definition DeclCXX.h:609
CXXRecordDecl * getDefinition() const
Definition DeclCXX.h:549
base_class_range vbases()
Definition DeclCXX.h:626
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:523
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
Represents a C++ nested-name-specifier or a global scope specifier.
Definition DeclSpec.h:77
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
Definition DeclSpec.h:98
bool isInvalid() const
An error occurred during parsing of the scope specifier.
Definition DeclSpec.h:187
bool isEmpty() const
No scope specifier.
Definition DeclSpec.h:182
Expr * getCallee()
Definition Expr.h:3159
arg_range arguments()
Definition Expr.h:3264
bool isNull() const
CaseStmt - Represent a case statement.
Definition Stmt.h:1931
Expr * getLHS()
Definition Stmt.h:2014
Represents a byte-granular source range.
static CharSourceRange getTokenRange(SourceRange R)
Declaration of a class template.
CodeCompletionString * CreateSignatureString(unsigned CurrentArg, Sema &S, CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo, bool IncludeBriefComments, bool Braced) const
Create a new code-completion string that describes the function signature of this overload candidate.
const FunctionType * getFunctionType() const
Retrieve the function type of the entity, regardless of how the function is stored.
CandidateKind getKind() const
Determine the kind of overload candidate.
const RecordDecl * getAggregate() const
Retrieve the aggregate type being initialized.
FunctionDecl * getFunction() const
Retrieve the function overload candidate or the templated function declaration for a function templat...
const FunctionProtoTypeLoc getFunctionProtoTypeLoc() const
Retrieve the function ProtoTypeLoc candidate.
@ CK_Aggregate
The candidate is aggregate initialization of a record type.
@ CK_Template
The candidate is a template, template arguments are being completed.
unsigned getNumParams() const
Get the number of parameters in this signature.
Abstract interface for a consumer of code-completion information.
bool includeGlobals() const
Whether to include global (top-level) declaration results.
virtual void ProcessCodeCompleteResults(Sema &S, CodeCompletionContext Context, CodeCompletionResult *Results, unsigned NumResults)
Process the finalized code-completion results.
bool loadExternal() const
Hint whether to load data from the external AST in order to provide full results.
virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, OverloadCandidate *Candidates, unsigned NumCandidates, SourceLocation OpenParLoc, bool Braced)
An allocator used specifically for the purpose of code completion.
const char * CopyString(const Twine &String)
Copy the given string into this allocator.
A builder class used to construct new code-completion strings.
CodeCompletionString * TakeString()
Take the resulting completion string.
void AddPlaceholderChunk(const char *Placeholder)
Add a new placeholder chunk.
void AddTextChunk(const char *Text)
Add a new text chunk.
void AddCurrentParameterChunk(const char *CurrentParameter)
Add a new current-parameter chunk.
void AddOptionalChunk(CodeCompletionString *Optional)
Add a new optional chunk.
void AddTypedTextChunk(const char *Text)
Add a new typed-text chunk.
void AddChunk(CodeCompletionString::ChunkKind CK, const char *Text="")
Add a new chunk.
CodeCompletionAllocator & getAllocator() const
Retrieve the allocator into which the code completion strings should be allocated.
The context in which code completion occurred, so that the code-completion consumer can process the r...
Kind getKind() const
Retrieve the kind of code-completion context.
void setCXXScopeSpecifier(CXXScopeSpec SS)
Sets the scope specifier that comes before the completion token.
@ CCC_TypeQualifiers
Code completion within a type-qualifier list.
@ CCC_ObjCMessageReceiver
Code completion occurred where an Objective-C message receiver is expected.
@ CCC_PreprocessorExpression
Code completion occurred within a preprocessor expression.
@ CCC_ObjCCategoryName
Code completion where an Objective-C category name is expected.
@ CCC_ObjCIvarList
Code completion occurred within the instance variable list of an Objective-C interface,...
@ CCC_Statement
Code completion occurred where a statement (or declaration) is expected in a function,...
@ CCC_Type
Code completion occurred where a type name is expected.
@ CCC_ArrowMemberAccess
Code completion occurred on the right-hand side of a member access expression using the arrow operato...
@ CCC_ClassStructUnion
Code completion occurred within a class, struct, or union.
@ CCC_ObjCInterface
Code completion occurred within an Objective-C interface, protocol, or category interface.
@ CCC_ObjCPropertyAccess
Code completion occurred on the right-hand side of an Objective-C property access expression.
@ CCC_Expression
Code completion occurred where an expression is expected.
@ CCC_SelectorName
Code completion for a selector, as in an @selector expression.
@ CCC_TopLevelOrExpression
Code completion at a top level, i.e.
@ CCC_EnumTag
Code completion occurred after the "enum" keyword, to indicate an enumeration name.
@ CCC_UnionTag
Code completion occurred after the "union" keyword, to indicate a union name.
@ CCC_ParenthesizedExpression
Code completion in a parenthesized expression, which means that we may also have types here in C and ...
@ CCC_TopLevel
Code completion occurred within a "top-level" completion context, e.g., at namespace or global scope.
@ CCC_ClassOrStructTag
Code completion occurred after the "struct" or "class" keyword, to indicate a struct or class name.
@ CCC_ObjCClassMessage
Code completion where an Objective-C class message is expected.
@ CCC_ObjCImplementation
Code completion occurred within an Objective-C implementation or category implementation.
@ CCC_IncludedFile
Code completion inside the filename part of a include directive.
@ CCC_ObjCInstanceMessage
Code completion where an Objective-C instance message is expected.
@ CCC_SymbolOrNewName
Code completion occurred where both a new name and an existing symbol is permissible.
@ CCC_Recovery
An unknown context, in which we are recovering from a parsing error and don't know which completions ...
@ CCC_ObjCProtocolName
Code completion occurred where a protocol name is expected.
@ CCC_NewName
Code completion occurred where a new name is expected.
@ CCC_MacroNameUse
Code completion occurred where a macro name is expected (without any arguments, in the case of a func...
@ CCC_Symbol
Code completion occurred where an existing name(such as type, functionor variable) is expected.
@ CCC_Attribute
Code completion of an attribute name.
@ CCC_Other
An unspecified code-completion context.
@ CCC_DotMemberAccess
Code completion occurred on the right-hand side of a member access expression using the dot operator.
@ CCC_MacroName
Code completion occurred where an macro is being defined.
@ CCC_Namespace
Code completion occurred where a namespace or namespace alias is expected.
@ CCC_PreprocessorDirective
Code completion occurred where a preprocessor directive is expected.
@ CCC_NaturalLanguage
Code completion occurred in a context where natural language is expected, e.g., a comment or string l...
@ CCC_ObjCInterfaceName
Code completion where the name of an Objective-C class is expected.
QualType getBaseType() const
Retrieve the type of the base object in a member-access expression.
bool wantConstructorResults() const
Determines whether we want C++ constructors as results within this context.
Captures a result of code completion.
bool DeclaringEntity
Whether we're completing a declaration of the given entity, rather than a use of that entity.
ResultKind Kind
The kind of result stored here.
const char * Keyword
When Kind == RK_Keyword, the string representing the keyword or symbol's spelling.
CXAvailabilityKind Availability
The availability of this result.
CodeCompletionString * CreateCodeCompletionString(Sema &S, const CodeCompletionContext &CCContext, CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo, bool IncludeBriefComments)
Create a new code-completion string that describes how to insert this result into a program.
bool QualifierIsInformative
Whether this result was found via lookup into a base class.
NestedNameSpecifier Qualifier
If the result should have a nested-name-specifier, this is it.
const NamedDecl * Declaration
When Kind == RK_Declaration or RK_Pattern, the declaration we are referring to.
CodeCompletionString * createCodeCompletionStringForDecl(Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result, bool IncludeBriefComments, const CodeCompletionContext &CCContext, PrintingPolicy &Policy)
CodeCompletionString * CreateCodeCompletionStringForMacro(Preprocessor &PP, CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo)
Creates a new code-completion string for the macro result.
unsigned StartParameter
Specifies which parameter (of a function, Objective-C method, macro, etc.) we should start with when ...
unsigned Priority
The priority of this particular code-completion result.
bool StartsNestedNameSpecifier
Whether this declaration is the beginning of a nested-name-specifier and, therefore,...
CodeCompletionString * Pattern
When Kind == RK_Pattern, the code-completion string that describes the completion text to insert.
bool FunctionCanBeCall
When completing a function, whether it can be a call.
bool AllParametersAreInformative
Whether all parameters (of a function, Objective-C method, etc.) should be considered "informative".
CodeCompletionString * createCodeCompletionStringForOverride(Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result, bool IncludeBriefComments, const CodeCompletionContext &CCContext, PrintingPolicy &Policy)
const IdentifierInfo * Macro
When Kind == RK_Macro, the identifier that refers to a macro.
@ RK_Pattern
Refers to a precomputed pattern.
@ RK_Declaration
Refers to a declaration.
@ RK_Keyword
Refers to a keyword or symbol.
A "string" used to describe how code completion can be performed for an entity.
@ CK_Optional
A code completion string that is entirely optional.
@ CK_CurrentParameter
A piece of text that describes the parameter that corresponds to the code-completion location within ...
@ CK_Comma
A comma separator (',').
@ CK_Placeholder
A string that acts as a placeholder for, e.g., a function call argument.
@ CK_LeftParen
A left parenthesis ('(').
@ CK_HorizontalSpace
Horizontal whitespace (' ').
@ CK_RightAngle
A right angle bracket ('>').
@ CK_LeftBracket
A left bracket ('[').
@ CK_RightParen
A right parenthesis (')').
@ CK_RightBrace
A right brace ('}').
@ CK_VerticalSpace
Vertical whitespace ('\n' or '\r\n', depending on the platform).
@ CK_TypedText
The piece of text that the user is expected to type to match the code-completion string,...
@ CK_RightBracket
A right bracket (']').
@ CK_LeftAngle
A left angle bracket ('<').
Expr * getConstraintExpr() const
const TypeClass * getTypePtr() const
Definition TypeLoc.h:433
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
Definition DeclBase.h:2425
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1467
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2108
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
Definition DeclBase.h:2261
bool isRequiresExprBody() const
Definition DeclBase.h:2213
bool isFileContext() const
Definition DeclBase.h:2199
DeclContextLookupResult lookup_result
Definition DeclBase.h:2609
ASTContext & getParentASTContext() const
Definition DeclBase.h:2137
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
Definition DeclBase.h:2204
bool isRecord() const
Definition DeclBase.h:2208
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
decl_iterator decls_end() const
Definition DeclBase.h:2407
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Definition DeclBase.h:2405
bool isFunctionOrMethod() const
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
Definition DeclBase.h:2163
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
decl_iterator decls_begin() const
iterator begin()
Definition DeclGroup.h:95
Captures information about "declaration specifiers".
Definition DeclSpec.h:279
static const TST TST_typename
Definition DeclSpec.h:338
TST getTypeSpecType() const
Definition DeclSpec.h:588
static const TST TST_interface
Definition DeclSpec.h:336
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
Definition DeclSpec.h:668
static const TST TST_union
Definition DeclSpec.h:334
TSC getTypeSpecComplex() const
Definition DeclSpec.h:584
ParsedType getRepAsType() const
Definition DeclSpec.h:598
static const TST TST_enum
Definition DeclSpec.h:333
static const TST TST_class
Definition DeclSpec.h:337
TypeSpecifierType TST
Definition DeclSpec.h:309
unsigned getParsedSpecifiers() const
Return a bitmask of which flavors of specifiers this DeclSpec includes.
Definition DeclSpec.cpp:444
bool isTypeAltiVecVector() const
Definition DeclSpec.h:589
TypeSpecifierSign getTypeSpecSign() const
Definition DeclSpec.h:585
static const TST TST_struct
Definition DeclSpec.h:335
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition DeclBase.h:1244
T * getAttr() const
Definition DeclBase.h:582
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:550
@ FOK_Undeclared
A friend of a previously-undeclared entity.
Definition DeclBase.h:1237
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
Definition DeclBase.cpp:273
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
Definition DeclBase.h:198
@ OBJC_TQ_CSNullability
The nullability qualifier is set when the nullability of the result or parameter was expressed via a ...
Definition DeclBase.h:210
unsigned getIdentifierNamespace() const
Definition DeclBase.h:907
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
Definition DeclBase.h:568
SourceLocation getLocation() const
Definition DeclBase.h:448
@ IDNS_Ordinary
Ordinary names.
Definition DeclBase.h:144
@ IDNS_Member
Members, declared with object declarations within tag definitions.
Definition DeclBase.h:136
@ IDNS_ObjCProtocol
Objective C @protocol.
Definition DeclBase.h:147
@ IDNS_Namespace
Namespaces, declared with 'namespace foo {}'.
Definition DeclBase.h:140
@ IDNS_LocalExtern
This declaration is a function-local extern declaration of a variable or function.
Definition DeclBase.h:175
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
Definition DeclBase.h:125
DeclContext * getDeclContext()
Definition DeclBase.h:457
AccessSpecifier getAccess() const
Definition DeclBase.h:516
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:936
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:996
Kind getKind() const
Definition DeclBase.h:451
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
void print(raw_ostream &OS, const PrintingPolicy &Policy) const
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
NameKind getNameKind() const
Determine what kind of name this is.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:782
Information about one declarator, including the parsed type information and the identifier.
Definition DeclSpec.h:1996
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
Definition DeclSpec.h:2559
DeclaratorContext getContext() const
Definition DeclSpec.h:2171
bool isCtorOrDtor()
Returns true if this declares a constructor or a destructor.
Definition DeclSpec.cpp:412
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
Definition DeclSpec.h:2165
bool isStaticMember()
Returns true if this declares a static member.
Definition DeclSpec.cpp:391
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
Definition DeclSpec.h:2590
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies this declaration.
Definition ExprCXX.h:3616
DeclarationName getDeclName() const
Retrieve the name that this expression refers to.
Definition ExprCXX.h:3603
Designation - Represent a full designation, which is a sequence of designators.
Definition Designator.h:221
const Designator & getDesignator(unsigned Idx) const
Definition Designator.h:232
unsigned getNumDesignators() const
Definition Designator.h:231
Designator - A designator in a C99 designated initializer.
Definition Designator.h:38
const IdentifierInfo * getFieldDecl() const
Definition Designator.h:123
DirectoryLookup - This class represents one entry in the search list that specifies the search order ...
virtual bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS)
Represents an enum.
Definition Decl.h:4192
This represents one expression.
Definition Expr.h:114
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
Definition Expr.cpp:3134
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition Expr.h:196
QualType getType() const
Definition Expr.h:146
virtual Selector GetExternalSelector(uint32_t ID)
Resolve a selector ID into a selector.
virtual uint32_t GetNumExternalSelectors()
Returns the number of selectors known to the external AST source.
Represents a member of a struct/union/class.
Definition Decl.h:3341
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Definition Diagnostic.h:140
Represents a function declaration or definition.
Definition Decl.h:2082
const ParmVarDecl * getParamDecl(unsigned i) const
Definition Decl.h:2974
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
Definition Decl.cpp:3925
ArrayRef< ParmVarDecl * > parameters() const
Definition Decl.h:2947
bool isVariadic() const
Whether this function is variadic.
Definition Decl.cpp:3137
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition Decl.cpp:3899
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5548
ExceptionSpecInfo getExceptionSpecInfo() const
Return all the available information about this type's exception spec.
Definition TypeBase.h:5881
bool isVariadic() const
Whether this function prototype is variadic.
Definition TypeBase.h:5952
Declaration of a template function.
Wrapper for source info for functions.
Definition TypeLoc.h:1675
unsigned getNumParams() const
Definition TypeLoc.h:1747
ParmVarDecl * getParam(unsigned i) const
Definition TypeLoc.h:1753
TypeLoc getReturnLoc() const
Definition TypeLoc.h:1756
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4744
QualType getReturnType() const
Definition TypeBase.h:5084
QualType simplifyType(QualType Type, const Expr *E, bool UnwrapPointer)
TagDecl * resolveTypeToTagDecl(QualType T) const
QualType resolveExprToType(const Expr *E) const
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
StringRef deuglifiedName() const
If the identifier is an "uglified" reserved name, return a cleaned form.
StringRef getName() const
Return the actual identifier string.
A simple pair of identifier info and location.
const TypeClass * getTypePtr() const
Definition TypeLoc.h:526
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
Definition Lexer.cpp:1075
Represents the results of name lookup.
Definition Lookup.h:147
Encapsulates the data about a macro definition (e.g.
Definition MacroInfo.h:40
bool isC99Varargs() const
Definition MacroInfo.h:208
bool isFunctionLike() const
Definition MacroInfo.h:202
param_iterator param_begin() const
Definition MacroInfo.h:183
IdentifierInfo *const * param_iterator
Parameters - The list of parameters for a function-like macro.
Definition MacroInfo.h:181
bool isVariadic() const
Definition MacroInfo.h:210
param_iterator param_end() const
Definition MacroInfo.h:184
bool isUsedForHeaderGuard() const
Determine whether this macro was used for a header guard.
Definition MacroInfo.h:295
Describes a module or submodule.
Definition Module.h:340
@ AllVisible
All of the names in this module are visible.
Definition Module.h:650
ModuleKind Kind
The kind of this module.
Definition Module.h:385
llvm::iterator_range< submodule_iterator > submodules()
Definition Module.h:1079
@ ImplicitGlobalModuleFragment
This is an implicit fragment of the global module which contains only language linkage declarations (...
Definition Module.h:381
@ ModulePartitionInterface
This is a C++20 module partition interface.
Definition Module.h:366
@ ModuleInterfaceUnit
This is a C++20 module interface unit.
Definition Module.h:360
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
Definition Module.h:376
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
Definition Module.h:373
This represents a decl that may have a name.
Definition Decl.h:276
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
Definition Decl.h:489
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:297
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Definition Decl.h:303
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:342
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
Definition Decl.h:319
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine if the declaration obeys the reserved identifier rules of the given language.
Definition Decl.cpp:1134
Represent a C++ namespace.
Definition Decl.h:594
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false, bool PrintFinalScopeResOp=true) const
Print this nested name specifier to the given output stream.
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
ObjCCategoryDecl - Represents a category declaration.
Definition DeclObjC.h:2335
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Definition DeclObjC.h:2551
ObjCContainerDecl - Represents a container for method declarations.
Definition DeclObjC.h:954
method_range methods() const
Definition DeclObjC.h:1022
instprop_range instance_properties() const
Definition DeclObjC.h:988
classprop_range class_properties() const
Definition DeclObjC.h:1005
Captures information about "declaration specifiers" specific to Objective-C.
Definition DeclSpec.h:982
ObjCPropertyAttribute::Kind getPropertyAttributes() const
Definition DeclSpec.h:1016
ObjCDeclQualifier getObjCDeclQualifier() const
Definition DeclSpec.h:1006
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition DeclObjC.h:2603
Represents an ObjC class declaration.
Definition DeclObjC.h:1160
bool hasDefinition() const
Determine whether this class has been defined.
Definition DeclObjC.h:1534
protocol_range protocols() const
Definition DeclObjC.h:1365
known_categories_range known_categories() const
Definition DeclObjC.h:1693
ObjCImplementationDecl * getImplementation() const
visible_categories_range visible_categories() const
Definition DeclObjC.h:1659
ObjCInterfaceDecl * getSuperClass() const
Definition DeclObjC.cpp:349
ObjCIvarDecl - Represents an ObjC instance variable.
Definition DeclObjC.h:1958
ObjCList - This is a simple template class used to hold various lists of decls etc,...
Definition DeclObjC.h:82
iterator end() const
Definition DeclObjC.h:91
iterator begin() const
Definition DeclObjC.h:90
T *const * iterator
Definition DeclObjC.h:88
@ SuperInstance
The receiver is the instance of the superclass object.
Definition ExprObjC.h:986
@ Instance
The receiver is an object instance.
Definition ExprObjC.h:980
@ SuperClass
The receiver is a superclass.
Definition ExprObjC.h:983
@ Class
The receiver is a class.
Definition ExprObjC.h:977
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
unsigned param_size() const
Definition DeclObjC.h:350
param_const_iterator param_end() const
Definition DeclObjC.h:361
param_const_iterator param_begin() const
Definition DeclObjC.h:357
bool isVariadic() const
Definition DeclObjC.h:434
const ParmVarDecl *const * param_const_iterator
Definition DeclObjC.h:352
Selector getSelector() const
Definition DeclObjC.h:330
bool isInstanceMethod() const
Definition DeclObjC.h:429
ParmVarDecl *const * param_iterator
Definition DeclObjC.h:353
ObjCInterfaceDecl * getClassInterface()
Represents a pointer to an Objective C object.
Definition TypeBase.h:8219
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
Definition TypeBase.h:8271
qual_range quals() const
Definition TypeBase.h:8338
Represents one property declaration in an Objective-C interface.
Definition DeclObjC.h:734
static ObjCPropertyDecl * findPropertyDecl(const DeclContext *DC, const IdentifierInfo *propertyID, ObjCPropertyQueryKind queryKind)
Lookup a property by name in the specified DeclContext.
Definition DeclObjC.cpp:176
Selector getGetterName() const
Definition DeclObjC.h:891
Represents an Objective-C protocol declaration.
Definition DeclObjC.h:2090
void * getAsOpaquePtr() const
Definition Ownership.h:91
PtrTy get() const
Definition Ownership.h:81
static OpaquePtr make(QualType P)
Definition Ownership.h:61
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
Definition Overload.h:1164
@ CSK_CodeCompletion
When doing overload resolution during code completion, we want to show all viable candidates,...
Definition Overload.h:1194
CandidateSetKind getKind() const
Definition Overload.h:1353
Represents a parameter to a function.
Definition Decl.h:1832
Represents the parsed form of a C++ template argument.
KindType getKind() const
Determine what kind of template argument we have.
@ Type
A template type parameter, stored as a type.
@ Template
A template template argument, stored as a template name.
@ NonType
A non-type template parameter, stored as an expression.
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3403
void enterFunctionArgument(SourceLocation Tok, llvm::function_ref< QualType()> ComputeType)
Computing a type for the function argument may require running overloading, so we postpone its comput...
void enterCondition(Sema &S, SourceLocation Tok)
void enterTypeCast(SourceLocation Tok, QualType CastType)
Handles all type casts, including C-style cast, C++ casts, etc.
void enterMemAccess(Sema &S, SourceLocation Tok, Expr *Base)
void enterSubscript(Sema &S, SourceLocation Tok, Expr *LHS)
void enterUnary(Sema &S, SourceLocation Tok, tok::TokenKind OpKind, SourceLocation OpLoc)
void enterReturn(Sema &S, SourceLocation Tok)
void enterDesignatedInitializer(SourceLocation Tok, QualType BaseType, const Designation &D)
Handles e.g. BaseType{ .D = Tok...
void enterBinary(Sema &S, SourceLocation Tok, Expr *LHS, tok::TokenKind Op)
void enterParenExpr(SourceLocation Tok, SourceLocation LParLoc)
void enterVariableInit(SourceLocation Tok, Decl *D)
QualType get(SourceLocation Tok) const
Get the expected type associated with this location, if any.
Definition Sema.h:334
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
const MacroInfo * getMacroInfo(const IdentifierInfo *II) const
llvm::iterator_range< macro_iterator > macros(bool IncludeExternalMacros=true) const
SourceManager & getSourceManager() const
MacroDefinition getMacroDefinition(const IdentifierInfo *II)
bool isMacroDefined(StringRef Id)
const LangOptions & getLangOpts() const
bool isCodeCompletionReached() const
Returns true if code-completion is enabled and we have hit the code-completion point.
A (possibly-)qualified type.
Definition TypeBase.h:938
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1005
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition TypeBase.h:8578
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
Definition TypeBase.h:8763
QualType substObjCTypeArgs(ASTContext &ctx, ArrayRef< QualType > typeArgs, ObjCSubstitutionContext context) const
Substitute type arguments for the Objective-C type parameters used in the subject type.
Definition Type.cpp:1810
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Definition TypeBase.h:1348
Wrapper of type source information for a type with non-trivial direct qualifiers.
Definition TypeLoc.h:300
The collection of all-type qualifiers we support.
Definition TypeBase.h:332
bool hasOnlyConst() const
Definition TypeBase.h:459
bool hasConst() const
Definition TypeBase.h:458
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
Definition TypeBase.h:728
bool hasRestrict() const
Definition TypeBase.h:478
bool hasVolatile() const
Definition TypeBase.h:468
bool hasOnlyVolatile() const
Definition TypeBase.h:469
bool hasOnlyRestrict() const
Definition TypeBase.h:479
Represents a struct/union/class.
Definition Decl.h:4506
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
Definition Decl.cpp:5354
field_range fields() const
Definition Decl.h:4709
Base for LValueReferenceType and RValueReferenceType.
Definition TypeBase.h:3678
QualType getPointeeType() const
Definition TypeBase.h:3700
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
bool isClassScope() const
isClassScope - Return true if this scope is a class/struct/union scope.
Definition Scope.h:414
const Scope * getFnParent() const
getFnParent - Return the closest scope that is a function body.
Definition Scope.h:284
unsigned getFlags() const
getFlags - Return the flags for this scope.
Definition Scope.h:269
Scope * getContinueParent()
getContinueParent - Return the closest scope that a continue statement would be affected by.
Definition Scope.h:294
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
Definition Scope.h:384
DeclContext * getEntity() const
Get the entity corresponding to this scope.
Definition Scope.h:387
bool isTemplateParamScope() const
isTemplateParamScope - Return true if this scope is a C++ template parameter scope.
Definition Scope.h:467
Scope * getBreakParent()
getBreakParent - Return the closest scope that a break statement would be affected by.
Definition Scope.h:308
decl_range decls() const
Definition Scope.h:342
const Scope * getParent() const
getParent - Return the scope that this is nested in.
Definition Scope.h:280
bool isClassInheritanceScope() const
Determines whether this scope is between inheritance colon and the real class/struct definition.
Definition Scope.h:418
@ FunctionPrototypeScope
This is a scope that corresponds to the parameters within a function prototype.
Definition Scope.h:85
@ AtCatchScope
This is a scope that corresponds to the Objective-C @catch statement.
Definition Scope.h:95
@ TemplateParamScope
This is a scope that corresponds to the template parameters of a C++ template.
Definition Scope.h:81
@ ClassScope
The scope of a struct/union/class definition.
Definition Scope.h:69
@ DeclScope
This is a scope that can contain a declaration.
Definition Scope.h:63
This table allows us to fully hide how we implement multi-keyword caching.
Selector getNullarySelector(const IdentifierInfo *ID)
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Selector getUnarySelector(const IdentifierInfo *ID)
Smart pointer class that efficiently represents Objective-C method names.
StringRef getNameForSlot(unsigned argIndex) const
Retrieve the name at a given position in the selector.
const IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
bool isUnarySelector() const
bool isNull() const
Determine whether this is the empty selector.
unsigned getNumArgs() const
SemaBase(Sema &S)
Definition SemaBase.cpp:7
ASTContext & getASTContext() const
Definition SemaBase.cpp:9
Sema & SemaRef
Definition SemaBase.h:40
const LangOptions & getLangOpts() const
Definition SemaBase.cpp:11
void CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, ArrayRef< const IdentifierInfo * > SelIdents, bool AtArgumentExpression, ObjCInterfaceDecl *Super=nullptr)
void CodeCompleteObjCPropertySynthesizeIvar(Scope *S, IdentifierInfo *PropertyName)
void CodeCompleteAttribute(AttributeCommonInfo::Syntax Syntax, AttributeCompletion Completion=AttributeCompletion::Attribute, const IdentifierInfo *Scope=nullptr)
QualType ProduceTemplateArgumentSignatureHelp(TemplateTy, ArrayRef< ParsedTemplateArgument >, SourceLocation LAngleLoc)
QualType ProduceCtorInitMemberSignatureHelp(Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy, ArrayRef< Expr * > ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc, bool Braced)
void CodeCompleteObjCClassForwardDecl(Scope *S)
void CodeCompleteNamespaceAliasDecl(Scope *S)
void GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo, SmallVectorImpl< CodeCompletionResult > &Results)
void CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, bool EnteringContext, bool IsUsingDeclaration, bool IsAddressOfOperand, bool IsInDeclarationContext, QualType BaseType, QualType PreferredType)
void CodeCompleteObjCAtStatement(Scope *S)
void CodeCompleteObjCMessageReceiver(Scope *S)
void CodeCompleteUsingDirective(Scope *S)
void CodeCompleteObjCProtocolDecl(Scope *S)
void CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS)
ParserCompletionContext
Describes the context in which code completion occurs.
@ PCC_LocalDeclarationSpecifiers
Code completion occurs within a sequence of declaration specifiers within a function,...
@ PCC_MemberTemplate
Code completion occurs following one or more template headers within a class.
@ PCC_Condition
Code completion occurs within the condition of an if, while, switch, or for statement.
@ PCC_ParenthesizedExpression
Code completion occurs in a parenthesized expression, which might also be a type cast.
@ PCC_TopLevelOrExpression
Code completion occurs at top-level in a REPL session.
@ PCC_Class
Code completion occurs within a class, struct, or union.
@ PCC_ForInit
Code completion occurs at the beginning of the initialization statement (or expression) in a for loop...
@ PCC_Type
Code completion occurs where only a type is permitted.
@ PCC_ObjCImplementation
Code completion occurs within an Objective-C implementation or category implementation.
@ PCC_ObjCInterface
Code completion occurs within an Objective-C interface, protocol, or category.
@ PCC_Namespace
Code completion occurs at top-level or namespace context.
@ PCC_Expression
Code completion occurs within an expression.
@ PCC_RecoveryInFunction
Code completion occurs within the body of a function on a recovery path, where we do not have a speci...
@ PCC_ObjCInstanceVariableList
Code completion occurs within the list of instance variables in an Objective-C interface,...
@ PCC_Template
Code completion occurs following one or more template headers.
@ PCC_Statement
Code completion occurs within a statement, which may also be an expression or a declaration.
void CodeCompleteObjCAtDirective(Scope *S)
void CodeCompleteObjCPropertySetter(Scope *S)
void CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, bool AfterAmpersand)
void CodeCompleteObjCImplementationCategory(Scope *S, IdentifierInfo *ClassName, SourceLocation ClassNameLoc)
void CodeCompleteObjCInterfaceDecl(Scope *S)
void CodeCompleteFunctionQualifiers(DeclSpec &DS, Declarator &D, const VirtSpecifiers *VS=nullptr)
void CodeCompletePreprocessorMacroName(bool IsDefinition)
void CodeCompleteInPreprocessorConditionalExclusion(Scope *S)
void CodeCompleteObjCAtExpression(Scope *S)
void CodeCompleteTypeQualifiers(DeclSpec &DS)
void CodeCompleteObjCPropertyDefinition(Scope *S)
void CodeCompleteExpression(Scope *S, const CodeCompleteExpressionData &Data, bool IsAddressOfOperand=false)
Perform code-completion in an expression context when we know what type we're looking for.
void CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, ArrayRef< const IdentifierInfo * > SelIdents, bool AtArgumentExpression)
CodeCompleteConsumer * CodeCompleter
Code-completion consumer.
void CodeCompleteAfterFunctionEquals(Declarator &D)
QualType ProduceConstructorSignatureHelp(QualType Type, SourceLocation Loc, ArrayRef< Expr * > Args, SourceLocation OpenParLoc, bool Braced)
OpaquePtr< TemplateName > TemplateTy
QualType ProduceCallSignatureHelp(Expr *Fn, ArrayRef< Expr * > Args, SourceLocation OpenParLoc)
Determines the preferred type of the current function argument, by examining the signatures of all po...
void CodeCompleteObjCMethodDeclSelector(Scope *S, bool IsInstanceMethod, bool AtParameterName, ParsedType ReturnType, ArrayRef< const IdentifierInfo * > SelIdents)
void CodeCompleteIncludedFile(llvm::StringRef Dir, bool IsAngled)
void CodeCompletePreprocessorMacroArgument(Scope *S, IdentifierInfo *Macro, MacroInfo *MacroInfo, unsigned Argument)
void CodeCompleteModuleImport(SourceLocation ImportLoc, ModuleIdPath Path)
void CodeCompleteObjCInterfaceCategory(Scope *S, IdentifierInfo *ClassName, SourceLocation ClassNameLoc)
void CodeCompleteObjCSelector(Scope *S, ArrayRef< const IdentifierInfo * > SelIdents)
void CodeCompleteConstructorInitializer(Decl *Constructor, ArrayRef< CXXCtorInitializer * > Initializers)
void CodeCompleteObjCImplementationDecl(Scope *S)
void CodeCompleteAfterIf(Scope *S, bool IsBracedThen)
void CodeCompleteObjCMethodDecl(Scope *S, std::optional< bool > IsInstanceMethod, ParsedType ReturnType)
void CodeCompleteOrdinaryName(Scope *S, ParserCompletionContext CompletionContext)
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
void CodeCompleteObjCClassPropertyRefExpr(Scope *S, const IdentifierInfo &ClassName, SourceLocation ClassNameLoc, bool IsBaseExprStatement)
void CodeCompleteInitializer(Scope *S, Decl *D)
void CodeCompleteObjCProtocolReferences(ArrayRef< IdentifierLoc > Protocols)
void CodeCompleteDesignator(const QualType BaseType, llvm::ArrayRef< Expr * > InitExprs, const Designation &D)
Trigger code completion for a record of BaseType.
void CodeCompletePreprocessorDirective(bool InConditional)
SemaCodeCompletion(Sema &S, CodeCompleteConsumer *CompletionConsumer)
void CodeCompleteOffsetOfDesignator(QualType BaseType, const Designation &D)
Trigger code completion for a position inside a __builtin_offsetof member designator (after the type'...
void CodeCompleteBracketDeclarator(Scope *S)
void CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, SourceLocation ClassNameLoc)
void CodeCompleteKeywordAfterIf(bool AfterExclaim) const
void CodeCompleteObjCAtVisibility(Scope *S)
void CodeCompleteTag(Scope *S, unsigned TagSpec)
void CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, ArrayRef< const IdentifierInfo * > SelIdents, bool AtArgumentExpression, bool IsSuper=false)
void CodeCompleteObjCForCollection(Scope *S, DeclGroupPtrTy IterationVar)
void CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, Expr *OtherOpBase, SourceLocation OpLoc, bool IsArrow, bool IsBaseExprStatement, QualType PreferredType)
void CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, bool IsParameter)
void CodeCompleteObjCPropertyGetter(Scope *S)
void CodeCompleteDeclSpec(Scope *S, DeclSpec &DS, bool AllowNonIdentifiers, bool AllowNestedNameSpecifiers)
void CodeCompletePostfixExpression(Scope *S, ExprResult LHS, QualType PreferredType)
GlobalMethodPool MethodPool
Method Pool - allows efficient lookup when typechecking messages to "id".
Definition SemaObjC.h:220
void ReadMethodPool(Selector Sel)
Read the contents of the method pool for a given selector from external storage.
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:862
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9529
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
Definition Sema.h:9548
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition Sema.h:9537
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
Definition Sema.h:9532
@ LookupAnyName
Look up any declaration with any name.
Definition Sema.h:9574
Preprocessor & getPreprocessor() const
Definition Sema.h:933
ASTContext & Context
Definition Sema.h:1331
SemaObjC & ObjC()
Definition Sema.h:1543
ASTContext & getASTContext() const
Definition Sema.h:934
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Definition Sema.h:1235
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
Definition Sema.cpp:1784
const LangOptions & getLangOpts() const
Definition Sema.h:927
void LookupVisibleDecls(Scope *S, LookupNameKind Kind, VisibleDeclConsumer &Consumer, bool IncludeGlobalScope=true, bool LoadExternal=true)
SemaCodeCompletion & CodeCompletion()
Definition Sema.h:1493
Preprocessor & PP
Definition Sema.h:1330
sema::FunctionScopeInfo * getCurFunction() const
Definition Sema.h:1366
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition Sema.h:10057
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
Definition Sema.cpp:2694
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1471
ExternalSemaSource * getExternalSource() const
Definition Sema.h:937
bool isAcceptableNestedNameSpecifier(const NamedDecl *SD, bool *CanCorrect=nullptr)
Determines whether the given declaration is an valid acceptable result for name lookup of a nested-na...
SourceManager & SourceMgr
Definition Sema.h:1334
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
Definition Sema.h:13165
Encodes a location in the source.
This class handles loading and caching of source files into memory.
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SwitchStmt - This represents a 'switch' stmt.
Definition Stmt.h:2520
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3898
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3999
bool isUnion() const
Definition Decl.h:4109
A convenient class for passing around template argument information.
Represents a template argument.
QualType getAsType() const
Retrieve the type for a type template argument.
@ Type
The template argument is a type.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
NamedDecl ** iterator
Iterates through the template parameters in this list.
bool hasParameterPack() const
Determine whether this template parameter list contains a parameter pack.
ArrayRef< NamedDecl * > asArray()
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
Declaration of a template type parameter.
The top declaration context.
Definition Decl.h:107
void print(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const
Definition ASTConcept.h:279
Represents a declaration of a type.
Definition Decl.h:3694
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
Definition TypeLoc.h:349
QualType getType() const
Get the type for which this source info wrapper provides information.
Definition TypeLoc.h:133
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition TypeLoc.h:89
TypeLoc IgnoreParens() const
Definition TypeLoc.h:1468
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition TypeLoc.h:2766
A container of type source information.
Definition TypeBase.h:8549
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition TypeLoc.h:267
The base class of the type hierarchy.
Definition TypeBase.h:1879
bool isBlockPointerType() const
Definition TypeBase.h:8835
bool isVoidType() const
Definition TypeBase.h:9200
bool isBooleanType() const
Definition TypeBase.h:9341
const ObjCObjectPointerType * getAsObjCQualifiedIdType() const
Definition Type.cpp:2044
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
Definition Type.h:41
bool isPointerType() const
Definition TypeBase.h:8815
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:9248
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9498
const ObjCObjectPointerType * getAsObjCInterfacePointerType() const
Definition Type.cpp:2072
NestedNameSpecifier getPrefix() const
If this type represents a qualified-id, this returns its nested name specifier.
Definition Type.cpp:2099
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:885
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
Definition TypeBase.h:9326
bool isObjCObjectOrInterfaceType() const
Definition TypeBase.h:9002
bool isMemberPointerType() const
Definition TypeBase.h:8896
bool isObjCIdType() const
Definition TypeBase.h:9027
bool isObjCObjectPointerType() const
Definition TypeBase.h:8994
bool isObjCQualifiedClassType() const
Definition TypeBase.h:9021
bool isObjCClassType() const
Definition TypeBase.h:9033
std::optional< ArrayRef< QualType > > getObjCSubstitutions(const DeclContext *dc) const
Retrieve the set of substitutions required when accessing a member of the Objective-C receiver type t...
Definition Type.cpp:1849
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9431
Wrapper for source info for typedefs.
Definition TypeLoc.h:777
Represents a C++ unqualified-id that has been parsed.
Definition DeclSpec.h:1110
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
Definition DeclSpec.h:1198
void append(iterator I, iterator E)
A set of unresolved declarations.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3437
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:714
QualType getType() const
Definition Decl.h:725
QualType getType() const
Definition Value.cpp:238
Represents a C++11 virt-specifier-seq.
Definition DeclSpec.h:2888
bool isOverrideSpecified() const
Definition DeclSpec.h:2907
bool isFinalSpecified() const
Definition DeclSpec.h:2910
Consumes visible declarations found when searching for all visible names within a given scope or cont...
Definition Lookup.h:838
Retains information about a block that is currently being parsed.
Definition ScopeInfo.h:791
QualType ReturnType
ReturnType - The target type of return statements in this context, or null if unknown.
Definition ScopeInfo.h:733
SmallVector< SwitchInfo, 8 > SwitchStack
SwitchStack - This is the current set of active switch statements in the block.
Definition ScopeInfo.h:214
@ CXCursor_ObjCInterfaceDecl
An Objective-C @interface.
Definition Index.h:1220
@ CXCursor_Namespace
A C++ namespace.
Definition Index.h:1242
@ CXCursor_TypedefDecl
A typedef.
Definition Index.h:1238
@ CXCursor_CXXAccessSpecifier
An access specifier.
Definition Index.h:1276
@ CXCursor_EnumConstantDecl
An enumerator constant.
Definition Index.h:1212
@ CXCursor_ConversionFunction
A C++ conversion function.
Definition Index.h:1250
@ CXCursor_ConceptDecl
a concept declaration.
Definition Index.h:2324
@ CXCursor_ClassTemplate
A C++ class template.
Definition Index.h:1260
@ CXCursor_UnionDecl
A C or C++ union.
Definition Index.h:1201
@ CXCursor_ObjCSynthesizeDecl
An Objective-C @synthesize definition.
Definition Index.h:1272
@ CXCursor_ParmDecl
A function or method parameter.
Definition Index.h:1218
@ CXCursor_FieldDecl
A field (in C) or non-static data member (in C++) in a struct, union, or C++ class.
Definition Index.h:1210
@ CXCursor_CXXMethod
A C++ class method.
Definition Index.h:1240
@ CXCursor_EnumDecl
An enumeration.
Definition Index.h:1205
@ CXCursor_ObjCClassMethodDecl
An Objective-C class method.
Definition Index.h:1232
@ CXCursor_TranslationUnit
Cursor that represents the translation unit itself.
Definition Index.h:2245
@ CXCursor_ClassTemplatePartialSpecialization
A C++ class template partial specialization.
Definition Index.h:1262
@ CXCursor_ObjCProtocolDecl
An Objective-C @protocol declaration.
Definition Index.h:1224
@ CXCursor_FunctionTemplate
A C++ function template.
Definition Index.h:1258
@ CXCursor_ObjCImplementationDecl
An Objective-C @implementation.
Definition Index.h:1234
@ CXCursor_NonTypeTemplateParameter
A C++ non-type template parameter.
Definition Index.h:1254
@ CXCursor_FunctionDecl
A function.
Definition Index.h:1214
@ CXCursor_ObjCPropertyDecl
An Objective-C @property declaration.
Definition Index.h:1226
@ CXCursor_Destructor
A C++ destructor.
Definition Index.h:1248
@ CXCursor_ObjCIvarDecl
An Objective-C instance variable.
Definition Index.h:1228
@ CXCursor_TypeAliasTemplateDecl
Definition Index.h:2312
@ CXCursor_ObjCCategoryImplDecl
An Objective-C @implementation for a category.
Definition Index.h:1236
@ CXCursor_ObjCDynamicDecl
An Objective-C @dynamic definition.
Definition Index.h:1274
@ CXCursor_MacroDefinition
Definition Index.h:2300
@ CXCursor_VarDecl
A variable.
Definition Index.h:1216
@ CXCursor_TemplateTypeParameter
A C++ template type parameter.
Definition Index.h:1252
@ CXCursor_TemplateTemplateParameter
A C++ template template parameter.
Definition Index.h:1256
@ CXCursor_UnexposedDecl
A declaration whose specific kind is not exposed via this interface.
Definition Index.h:1197
@ CXCursor_ObjCInstanceMethodDecl
An Objective-C instance method.
Definition Index.h:1230
@ CXCursor_StructDecl
A C or C++ struct.
Definition Index.h:1199
@ CXCursor_UsingDeclaration
A C++ using declaration.
Definition Index.h:1268
@ CXCursor_LinkageSpec
A linkage specification, e.g.
Definition Index.h:1244
@ CXCursor_ClassDecl
A C++ class.
Definition Index.h:1203
@ CXCursor_ObjCCategoryDecl
An Objective-C @interface for a category.
Definition Index.h:1222
@ CXCursor_StaticAssert
A static_assert or _Static_assert node.
Definition Index.h:2316
@ CXCursor_ModuleImportDecl
A module import declaration.
Definition Index.h:2311
@ CXCursor_MemberRef
A reference to a member of a struct, union, or class that occurs in some non-expression context,...
Definition Index.h:1316
@ CXCursor_NamespaceAlias
A C++ namespace alias declaration.
Definition Index.h:1264
@ CXCursor_Constructor
A C++ constructor.
Definition Index.h:1246
@ CXCursor_FriendDecl
a friend declaration.
Definition Index.h:2320
@ CXCursor_TypeAliasDecl
A C++ alias declaration.
Definition Index.h:1270
@ CXCursor_UsingDirective
A C++ using directive.
Definition Index.h:1266
@ CXAvailability_Available
The entity is available.
Definition Index.h:134
@ CXAvailability_Deprecated
The entity is available, but has been deprecated (and its use is not recommended).
Definition Index.h:139
@ CXAvailability_NotAvailable
The entity is not available; any use of it will be an error.
Definition Index.h:143
@ kind_nullability
Indicates that the nullability of the type was spelled with a property attribute rather than a type q...
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
bool Alloc(InterpState &S, CodePtr OpPC, const Descriptor *Desc)
Definition Interp.h:3920
bool Add(InterpState &S, CodePtr OpPC)
Definition Interp.h:397
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Definition TokenKinds.h:33
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ CPlusPlus23
@ CPlusPlus20
@ CPlusPlus
@ CPlusPlus11
@ CPlusPlus17
@ CCP_Type
Priority for a type.
@ CCP_ObjC_cmd
Priority for the Objective-C "_cmd" implicit parameter.
@ CCP_Keyword
Priority for a language keyword (that isn't any of the other categories).
@ CCP_Macro
Priority for a preprocessor macro.
@ CCP_LocalDeclaration
Priority for a declaration that is in the local scope.
@ CCP_Unlikely
Priority for a result that isn't likely to be what the user wants, but is included for completeness.
@ CCP_NestedNameSpecifier
Priority for a nested-name-specifier.
@ CCP_SuperCompletion
Priority for a send-to-super completion.
@ CCP_NextInitializer
Priority for the next initialization in a constructor initializer list.
@ CCP_Declaration
Priority for a non-type declaration.
@ CCP_Constant
Priority for a constant value (e.g., enumerator).
@ CCP_MemberDeclaration
Priority for a member declaration found from the current method or member function.
@ CCP_EnumInCase
Priority for an enumeration constant inside a switch whose condition is of the enumeration type.
@ CCP_CodePattern
Priority for a code pattern.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
Definition Template.h:50
bool isBetterOverloadCandidate(Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2, SourceLocation Loc, OverloadCandidateSet::CandidateSetKind Kind, bool PartialOverloading=false)
isBetterOverloadCandidate - Determines whether the first overload candidate is a better candidate tha...
bool isReservedInAllContexts(ReservedIdentifierStatus Status)
Determine whether an identifier is reserved in all contexts.
ArrayRef< IdentifierLoc > ModuleIdPath
A sequence of identifier/location pairs used to describe a particular module or submodule,...
@ Nullable
Values of this type can be null.
Definition Specifiers.h:354
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
Definition Specifiers.h:359
@ NonNull
Values of this type can never be null.
Definition Specifiers.h:352
CXCursorKind getCursorKindForDecl(const Decl *D)
Determine the libclang cursor kind associated with the given declaration.
RefQualifierKind
The kind of C++11 ref-qualifier associated with a function type.
Definition TypeBase.h:1799
@ RQ_None
No ref-qualifier was provided.
Definition TypeBase.h:1801
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
Definition TypeBase.h:1804
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
Definition TypeBase.h:1807
const RawComment * getParameterComment(const ASTContext &Ctx, const CodeCompleteConsumer::OverloadCandidate &Result, unsigned ArgIndex)
Get the documentation comment used to produce CodeCompletionString::BriefComment for OverloadCandidat...
@ LCK_This
Capturing the *this object by reference.
Definition Lambda.h:34
@ CCD_SelectorMatch
The selector of the given message exactly matches the selector of the current method,...
@ CCD_ObjectQualifierMatch
The result is a C++ non-static member function whose qualifiers exactly match the object type on whic...
@ CCD_bool_in_ObjC
Adjustment to the "bool" type in Objective-C, where the typedef "BOOL" is preferred.
@ CCD_InBaseClass
The result is in a base class.
@ CCD_ProbablyNotObjCCollection
Adjustment for KVC code pattern priorities when it doesn't look like the.
@ CCD_BlockPropertySetter
An Objective-C block property completed as a setter with a block placeholder.
@ CCD_MethodAsProperty
An Objective-C method being used as a property.
@ IK_ConstructorName
A constructor name.
Definition DeclSpec.h:1096
@ IK_DestructorName
A destructor name.
Definition DeclSpec.h:1100
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
Definition DeclSpec.h:1090
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Property
The type of a property.
Definition TypeBase.h:912
@ Parameter
The parameter type of a method or function.
Definition TypeBase.h:909
@ Result
The result type of a method or function.
Definition TypeBase.h:906
SimplifiedTypeClass
A simplified classification of types used when determining "similar" types for code completion.
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
const RawComment * getPatternCompletionComment(const ASTContext &Ctx, const NamedDecl *Decl)
Get the documentation comment used to produce CodeCompletionString::BriefComment for RK_Pattern.
@ Interface
The "__interface" keyword.
Definition TypeBase.h:6176
@ Struct
The "struct" keyword.
Definition TypeBase.h:6173
@ Class
The "class" keyword.
Definition TypeBase.h:6182
@ Union
The "union" keyword.
Definition TypeBase.h:6179
@ Enum
The "enum" keyword.
Definition TypeBase.h:6185
LLVM_READONLY char toUppercase(char c)
Converts the given ASCII character to its uppercase equivalent.
Definition CharInfo.h:233
@ NonType
The name was classified as a specific non-type, non-template declaration.
Definition Sema.h:561
@ OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
Definition Sema.h:574
const RawComment * getCompletionComment(const ASTContext &Ctx, const NamedDecl *Decl)
Get the documentation comment used to produce CodeCompletionString::BriefComment for RK_Declaration.
@ CCF_ExactTypeMatch
Divide by this factor when a code-completion result's type exactly matches the type we expect.
@ CCF_SimilarTypeMatch
Divide by this factor when a code-completion result's type is similar to the type we expect (e....
SimplifiedTypeClass getSimplifiedTypeClass(CanQualType T)
Determine the simplified type class of the given canonical type.
@ Deduced
The normal deduced case.
Definition TypeBase.h:1818
@ LCD_ByCopy
Definition Lambda.h:24
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition Specifiers.h:136
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
Definition Specifiers.h:148
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:143
unsigned getMacroUsagePriority(StringRef MacroName, const LangOptions &LangOpts, bool PreferredTypeIsPointer=false)
Determine the priority to be given to a macro code completion result with the given name.
bool shouldEnforceArgLimit(bool PartialOverloading, FunctionDecl *Function)
llvm::StringRef getAsString(SyncScope S)
Definition SyncScope.h:63
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Enumerator
Enumerator value with fixed underlying type.
Definition Sema.h:833
QualType getDeclUsageType(ASTContext &C, NestedNameSpecifier Qualifier, const NamedDecl *ND)
Determine the type that this declaration will have if it is used as a type or in an expression.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Definition Ownership.h:230
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6151
@ None
No keyword precedes the qualified type name.
Definition TypeBase.h:6167
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6157
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6160
ReservedIdentifierStatus
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
#define false
Definition stdbool.h:26
CodeCompleteExpressionData(QualType PreferredType=QualType(), bool IsParenthesized=false)
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
Definition DeclSpec.h:1491
Represents a complete lambda introducer.
Definition DeclSpec.h:2940
SmallVector< LambdaCapture, 4 > Captures
Definition DeclSpec.h:2965
LambdaCaptureDefault Default
Definition DeclSpec.h:2964
a linked list of methods with the same selector name but different signatures.
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
Definition Overload.h:937
static ArrayRef< const ParsedAttrInfo * > getAllBuiltin()
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressUnwrittenScope
Suppress printing parts of scope specifiers that are never written, e.g., for anonymous namespaces.
unsigned SuppressStrongLifetime
When true, suppress printing of the __strong lifetime qualifier in ARC.
@ Plain
E.g., (anonymous enum)/(unnamed struct)/etc.
unsigned SuppressTemplateArgsInCXXConstructors
When true, suppresses printing template arguments in names of C++ constructors.
unsigned ResolveDecltype
Use whitespace and punctuation like MSVC does.